使用驅動程式驗證器來識別進階使用者的 Windows 驅動程序問題

自 Windows 2000 起,每個 Windows 版本都包含驅動程式驗證器工具。 它可用來偵測並疑難解答許多已知會導致系統損毀、失敗或其他無法預測行為的驅動程序問題。 本文說明如何使用驅動程序驗證器來隔離和疑難解答系統中的驅動程式。

適用於:Windows Server 2012 Foundation、Windows Server 2012 Essentials、Windows Server 2012 Standard、Windows Server 2012 Datacenter
原始 KB 編號: 244617

驅動程式驗證器功能

若要使用驅動程式驗證器,請執行 Verifier.exe,然後重新啟動您的電腦。 您不需要進行任何其他變更,即可開始分析系統中的驅動程式。 您的用戶帳戶需要系統管理員許可權才能執行 Verifier.exe。

驅動程式驗證器可以檢查驅動程式行為的許多不同層面。 這些功能會分組為使用旗標所啟用的選項或設定。 (驅動程式驗證器檔中通常可以交換字詞選項、設定和旗標。它們代表類似的概念。)

如需每個旗標的詳細資訊,請參閱 驅動程式驗證器選項和規則類別

標準選項

下列選項一起代表系統中所有驅動程式不應違反的規則。 當您選擇在驅動程式驗證器 GUI 中啟用標準設定,或在使用命令行設定驅動程式驗證器時指定 /standard 參數時,會啟用這些選項。

自動檢查

無論選取了哪些選項,這些檢查一律會在正在驗證的驅動程式上完成。

自動檢查的範例:

  • IRQL 檢查
    • 引發的 IRQL (表示目前的 IRQL 小於目標 IRQL) 。
    • 降低的 IRQL (表示目前的 IRQL 大於目標 IRQL) 。
  • SpinLocks:
    • 雙次放開微調鎖定。
    • 微調鎖定取得/發行是在適當的 IRQL 進行。
  • 記憶體設定:
    • 分頁集區配置/可用專案是在正確的 IRQL (APC_LEVEL 或低於) 。
    • 非分頁集區配置/可用專案是在正確的 IRQL (DISPATCH_LEVEL 或低於) 。
    • 這些應用程式開發介面 (API) 未指定隨機 (未初始化) 值。
    • 釋放的配置不會指向作用中的定時器物件。
  • 驅動程式卸除檢查:
    • 確認驅動程式在卸除時沒有擱置中的作業,例如擱置中的 DDPC 或背景工作線程。
  • 其他驅動程序行為:
    • 不正確地切換線程堆疊。
    • 嘗試在 IRQL >= DISPATCH_LEVEL 呼叫 KeWaitXxx。
    • 延遲已經有參考計數為0的物件。

特殊集區

當此選項為作用中時,驅動程式驗證器會從特殊集區配置大部分的驅動程式記憶體要求。 此特殊集區會監視記憶體溢出、記憶體不足,以及釋放後所存取的記憶體。

強制 IRQL 檢查

當此選項為作用中時,驅動程式驗證程式會使可分頁程式代碼失效,對驅動程式造成極大的記憶體壓力。 如果驅動程式嘗試在錯誤的 IRQL 或持有微調鎖定時存取分頁記憶體,驅動程式驗證程式會偵測到此行為。

集區追蹤

當此選項為作用中時,驅動程式驗證程式會檢查驅動程式是否已在卸除時釋放其所有記憶體配置。 它會顯示記憶體流失。

I/O 驗證

當此選項為作用中時,驅動程式驗證程式會從特殊集區配置驅動程式的IP,並監視驅動程式的I/O處理。 它會偵測到 I/O 例程的使用不合法或不一致。

開啟 I/O 驗證器時:

  • 如果可以的話,所有透過IoAllocateIrp配置的IRP都會從特殊集區配置。
  • 會在IoCallDriver、IoCompleteRequest和IoFreeIrp中進行檢查,以攔截驅動程式錯誤訊息。
  • 所有 I/O 驗證器失敗錯誤都會檢查程式代碼DRIVER_VERIFIER_IOMANAGER_VIOLATION (0xC9) 。

注意事項

在 Windows 7 和更新版本的 Windows 作業系統中,增強型 I/O 驗證的所有功能都包含在 I/O 驗證中,也不再提供,也不需要在驅動程式驗證器管理員或命令行中選取 [增強的 I/O 驗證] 選項。

死結偵測

當此選項為作用中時,驅動程式驗證器會監視驅動程式使用微調鎖定、Mutex 和快速 Mutex。 它會偵測驅動程式的程式代碼是否可能在某個時間點造成死結。

增強的 I/O 驗證

當此選項為作用中時,驅動程式驗證器會監視數個 I/O 管理員例程的呼叫,並執行 PnP IRP、電源 IRP 和 WMI IMP 的壓力測試。

注意事項

在 Windows 7 和更新版本中,增強型 I/O 驗證的所有功能都會包含在 I/O 驗證中。 驅動程式驗證器管理員或命令行不再提供或需要此選項。

DMA 驗證

當此選項為作用中時,驅動程式驗證器會監視驅動程式對 DMA 例程的使用。 它會偵測到 DMA 緩衝區、配接器和地圖緩存器的使用不正確。

安全檢查

當此選項為作用中時,驅動程式驗證程式會尋找可能導致安全性弱點的常見錯誤,例如,內核模式例程對使用者模式地址的參考。

其他檢查

當此選項為作用中時,驅動程式驗證程式會尋找驅動程式當機的常見原因,例如釋放的記憶體處理錯誤。

DDI 合規性檢查

當此選項為作用中時,驅動程式驗證程式會套用一組設備驅動器介面 (DDI) 規則,以檢查驅動程式與操作系統核心介面之間的適當互動。

DDI 合規性檢查選項是使用稱為 VerifierExt.sys 的核心模式連結庫來實作。 如果發現其中一個 DDI 合規性檢查規則違規,VerifierExt.sys 會是針對系統錯誤檢查所呼叫的模組。

其他選項

這些選項是專為特定案例測試而設計,或是將失敗或延遲插入特定 DDI 例程以模擬極端壓力狀況的選項。

驅動程式驗證器需求

唯一的需求是您必須安裝 Windows Server 2012。 您可以在零售版和已核取的 Windows 版本上啟用驅動程式驗證程式。 如果已安裝 Norton 防病毒軟體,請勿啟用驅動程式驗證器的死結偵測。

啟用驅動程式驗證器

您可以使用 Verifier.exe 啟用驅動程式驗證器。 Verifier.exe 隨附於每個 Windows 複本。 它會自動安裝到 System32 資料夾中。 Verifier.exe 具有 GUI) 介面 (命令行和圖形使用者介面,因此您可以指定驅動程式和適當的驗證層級。 您也可以即時查看驅動程式驗證器統計數據。 如需詳細資訊,請參閱 驅動程序驗證器管理員 (Verifier.exe) 一節。

對驅動程式驗證器違規進行偵錯

如果驅動程式驗證程式偵測到違規,標準行為是以錯誤方式檢查系統,以提供偵錯問題的可能最大資訊。 一旦發生錯誤檢查,連線到調試程序的系統就會停止。

所有驅動程式驗證器違規都會導致錯誤檢查,但最常見的 (,但不一定是所有) :

  • 0xC1:SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION
  • 0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION
  • 0xC6:DRIVER_CAUGHT_MODIFYING_FREED_POOL
  • 0xC9:DRIVER_VERIFIER_IOMANAGER_VIOLATION
  • 0xD6:DRIVER_PAGE_FAULT_BEYOND_END_OF_ALLOCATION
  • 0xE6:DRIVER_VERIFIER_DMA_VIOLATION

!analyze -v 是啟動新的偵錯會話時使用的最佳命令。 此命令會傳回有用的資訊,並嘗試找出錯誤驅動程式。

驅動程式驗證器專屬的除錯程式擴充功能:

  • !verifier 將會傾印擷取的驅動程式驗證器統計數據。 !verifier -? 會顯示所有可用的選項。
  • !deadlock 傾印死結偵測所追蹤之鎖定或對象的相關信息。 !deadlock -? 會顯示所有可用的選項。
  • !iovirp [address] 將會傾印與 I/O 驗證器追蹤之 IRP 相關的資訊。
  • !ruleinfo [RuleID] 將會傾印違反 DDI 合規性檢查規則的相關信息, (RuleID 一律是錯誤檢查的第一個自變數,所有 DDI 合規性檢查規則標識碼的格式為 0x200nn) 。

驅動程式驗證器和圖形驅動程式

印表機和顯示驅動程式 DLL 等 Windows 核心模式圖形驅動程式會受到限制,無法直接呼叫集區進入點。 集區配置是使用圖形設備驅動器介面 (DDI) 回呼來間接執行,以 Win32k.sys。 例如,EngAllocMem 是圖形驅動程式呼叫以明確配置集區內存的回呼。 其他特製化回呼,例如 EngCreatePalette 和 EngCreateBitmap,也會傳回集區內存。

若要為圖形驅動程式提供相同的自動化測試,某些驅動程式驗證器函式的支援會併入 Win32k.sys。 因為圖形驅動程式比其他內核模式驅動程式受到更多限制,所以只需要驅動程序驗證器功能的子集。 具體而言,不需要 IRQL 檢查和 I/O 驗證。 其他功能,也就是使用特殊集區、集區配置隨機失敗,以及集區追蹤,在不同的圖形 DDI 回呼中受到不同程度的支援。

下列圖形 DDI 回呼函式支援隨機失敗:

  • EngAllocMem
  • EngAllocUserMem
  • EngCreateBitmap
  • EngCreateDeviceSurface
  • EngCreateDeviceBitmap
  • EngCreatePalette
  • EngCreateClip
  • EngCreatePath
  • EngCreateWnd
  • EngCreateDriverObj
  • BRUSHOBJ_pvAllocRbrush
  • CLIPOBJ_ppoGetPath

此外,EngAllocMem 也支援使用特殊集區和集區追蹤。

為圖形驅動程式啟用驅動程式驗證程式與其他驅動程式相同。 如需詳細資訊,請參閱 啟用驅動程序驗證程式一 節。 會忽略不支援的旗標,例如 IRQL 檢查。 此外,您可以使用 !gdikdx.verifier 內核調試程式命令來檢查圖形驅動程式的目前驅動程式驗證程序狀態和集區追蹤。

注意事項

您應該只使用隨機設定失敗設定來進行強固性測試。 使用此設定可能會導致轉譯錯誤訊息,因此您不應該使用此設定搭配驗證測試來檢查圖形驅動程序實作的正確性 (例如,藉由比較圖形驅動程序輸出與參考影像) 。

驅動程式驗證器管理員 (Verifier.exe)

驅動程式驗證器管理員工具 (Verifier.exe) 是建立和修改驅動程式驗證器設定,以及從驅動程式驗證器收集統計數據的慣用方式。 Verifier.exe 位於每個 Windows 安裝的 %WinDir%\System32 資料夾中。

驅動程式驗證器管理員是 Windows 隨附的 GUI,可設定驅動程式驗證器。 使用不含任何其他命令行參數的 verifier.exe 啟動驅動程序驗證器管理員。 每當包含參數時,就會使用以命令行為基礎的公用程式版本。

如需設定驅動程式驗證程式的說明,請 verifier.exe /? 從系統管理員 CMD 視窗執行 。

驅動程序狀態

[驅動程序狀態] 屬性頁會提供驅動程式驗證器目前狀態的影像。 您可以檢視驗證器偵測到的驅動程式。 狀態可以是下列其中一個值:

  • 已載入:驅動程式目前已載入並驗證。
  • 已卸除:驅動程式目前未載入,但自從您重新啟動計算機後至少載入一次。
  • 從未載入:從未載入驅動程式。 此狀態可能表示驅動程式的映像檔已損毀,或您指定了系統中遺失的驅動程序名稱。

選取清單標頭,依驅動程式名稱或狀態排序列表。 在對話框的右上方區域中,您可以檢視目前生效的驗證類型。 如果您未切換到手動重新整理模式,驅動程式的狀態會自動更新。 您可以使用對話框左下方區域中的單選按鈕來修改重新整理速率。 若要強制更新狀態,請選取 [ 立即更新]

如果您啟用特殊集區旗標,且只有不到 95% 的集區配置已移至特殊集區,則此頁面上會顯示警告訊息。 這表示您需要選取一組較小的驅動程式來進行驗證,或將更多物理記憶體新增至計算機,以取得更佳的集區配置驗證涵蓋範圍。

全域計數器

此屬性頁會顯示驅動程式驗證器所維護之某些計數器的目前值。 計數器的零值可能表示未啟用相關聯的驅動程序驗證器旗標。 例如,Other/Faults 計數器的值為 0 表示未啟用低資源模擬旗標。 您可以監視驗證器的活動,因為計數器的值預設會自動更新。 您可以變更重新整理速率、切換至手動重新整理,或使用對話框左下方區域中的控件群組強制重新整理。

集區追蹤

此屬性頁會顯示從驅動程序驗證器收集的更多統計數據。 此頁面上顯示的所有計數器都與驗證器的集區追蹤旗標相關。 大部分都是每個驅動程式計數器,例如目前的配置、目前配置的位元組等等。 您必須從頂端組合方塊中選取驅動程式名稱,才能檢視該特定驅動程式的計數器。

設定

您可以使用此頁面來建立和修改驅動程式驗證器設定。 設定會儲存在登錄中,您必須重新啟動電腦,設定才會生效。 您可以使用清單來檢視目前安裝的驅動程式。 每個驅動程式都可以處於下列其中一種狀態:

  • 驗證已啟用:驅動程式目前已驗證。
  • 驗證已停用:驅動程式目前未驗證。
  • 確認已啟用 (需要重新啟動) :只有在下次重新啟動之後,才會驗證驅動程式。
  • 確認已停用 (需要重新啟動) :驅動程式目前已驗證,但在下次重新啟動后未驗證。

您可以從清單中選取一或多個驅動程式,並使用清單底下的兩個按鈕來切換狀態。 您也可以以滑鼠右鍵按下驅動程式名稱來顯示操作選單,這可讓您執行狀態切換。

在對話框底部,您可以指定更多驅動程式 (以空格分隔,) 您想要在下次重新啟動之後進行驗證。 當您想要安裝尚未載入的新驅動程式時,通常會使用此編輯控制件。

如果清單頂端的單選按鈕群組設定為 [ 驗證所有驅動程式],則清單和 [驗證和不驗證] 按鈕和編輯控件都無法使用。 這表示在下次重新啟動之後,系統中的所有驅動程式都會經過驗證。

您可以使用對話框右上方區域中的複選框來設定驗證類型。 您可以在層級 1 或層級 2 啟用 I/O 驗證。 層級 2 驗證比層級 1 更強。

選取 [套用],以儲存對設定的任何修改。 此頁面中還有兩個按鈕:

  • 慣用設定:它會選取一些常用的設定 (所有已驗證) 驅動程式。
  • 全部重設:它會清除所有驅動程序驗證程序設定,如此一來就不會驗證任何驅動程式。

選取 [ 套用] 之後,您必須重新啟動計算機,變更才會生效。

變動性設定

您可以使用此屬性頁立即變更驅動程式驗證器旗標。 您只能切換某些驅動程式驗證器旗標的狀態。 而且您無法變更正在驗證的驅動程式清單。 變更某些複選框的狀態之後,請選取 [ 用] 以讓變更生效。 變更會立即生效。 它們會持續到您進行其他變更,或直到您重新啟動電腦為止。

命令行介面

您也可以從命令行 (執行 Verifier.exe,以取得詳細資訊,請在命令提示字 元中輸入verifier.exe / ?) 。 命令列上可以使用多個參數,例如:

Verifier.exe /flags 0x209BB /driver MyDriver1.sys MyFilterDriver1.sys

下列清單顯示最常使用的命令列旗標:

設定 (旗標) 選項

  • verifier.exe /flags

    Value 是十六進位數位, (必須有 0x 前置詞,) 代表要啟用之旗標的集體值。 輸出中會顯示每個旗標的 verifier /? 值。

    標準旗標:

    0x00000000:自動檢查
    0x00000001:特殊集區
    0x00000002:強制 IRQL 檢查
    0x00000008:集區追蹤
    0x00000010:I/O 驗證
    0x00000020:死結偵測
    0x00000080:DMA 檢查
    0x00000100:安全性檢查
    0x00000800:其他檢查
    0x00020000:DDI 合規性檢查

    其他旗標:

    0x00000004:隨機低資源模擬
    0x00000040:僅限 Vista (增強型 I/O 驗證)
    0x00000200:強制擱置 I/O 要求
    0x00000400:IRP 記錄
    0x00002000:堆疊的非變異 MDL 檢查
    0x00004000:Driver0x00008000 的非變異 MDL 檢查:Power Framework 延遲模糊處理

    例如,若只要啟用特殊集區、I/O 驗證及其他檢查:

    verifier.exe /flags 0x811
    

    若要啟用所有標準設定 (任一範例都可) :

    verifier.exe /standard
    
    verifier.exe /flags 0x209BB
    
  • 設定驅動程式以驗證

    verifier.exe /driver driver1.sys [driver2.sys driver3.sys ...]
    

    此命令會指定要驗證的特定驅動程式或驅動程式。 在以空格分隔的清單中提供其他驅動程式。

    verifier.exe /all
    

    此命令會驗證系統中的所有驅動程式。

  • 使用動態模式進行設定

    verifier.exe /volatile /flags *value /adddriver MyDriver1.sys*
    

    此命令會立即變更驗證器旗標,並新增 MyDriver1.sys 進行驗證。

  • 查詢目前的驗證器統計數據

    verifier /query
    

    將目前的驅動程式驗證器狀態和計數器傾印至標準輸出。

  • 查詢目前的驗證器設定

    verifier /querysettings
    

    將目前的驅動程式驗證器設定傾印至標準輸出。

  • 清除驗證器設定

    verifier.exe /reset
    

    此命令會清除所有目前的驅動程式驗證器設定。

驅動程式開發人員的其他資訊

下列各節說明驅動程式開發人員可能感興趣之驅動程式驗證器設定的更多詳細數據。 IT 專業人員通常不需要這些設定。

重要事項

這個章節、方法或工作包含修改登錄的步驟。 然而,不當修改登錄可能會發生嚴重的問題。 因此,請務必謹慎地依照這些步驟執行。 為了有多一層保護,請先備份登錄再進行修改。 如此一來,您就可以在發生問題時還原登錄。 如需進一步了解如何備份及還原登錄的相關資訊,請參閱如何在 Windows 中備份及還原登錄

若要藉由編輯登錄來啟用驅動程式驗證器,請遵循下列步驟:

  1. 啟動登錄 編輯器 (Regedt32) 。

  2. 找到下列登錄機碼:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDrivers

  3. 編輯金 REG_SZ 鑰。

將索 REG_SZ 引鍵設定為您想要測試之驅動程式的不區分大小寫名稱。 您可以指定多個驅動程式,但只能使用一個驅動程式。 如此一來,您就可以確定可用的系統資源不會提前耗盡。 資源太早耗盡不會造成任何系統可靠性問題,但可能會導致略過某些驅動程序檢查。

下列清單顯示索引鍵的值 REG_SZ 範例:

  • Ntfs.sys
  • Win32k.sys ftdisk.sys
  • *.sys

您可以在下列登入機碼中指定驅動程式驗證層級:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDriverLevel

索引鍵的值是 DWORD,代表所有已啟用旗標的集合。