共用方式為


自動檢查

驅動程式驗證器會在驗證一或多個驅動程式時執行下列檢查。 您無法啟用或停用這些檢查。 從 Windows 10 版本 1709 開始,這些自動檢查已移至相關的 標準旗標中。 因此,使用標準旗標啟用驅動程式驗證器的使用者應該不會看到套用的檢查減少。

監視 IRQL 和記憶體常式

驅動程式驗證器會監視選取的驅動程式,以監控下列禁止的行為:

  • 呼叫 KeLowerIrql 來提高 IRQL

  • 透過呼叫 KeLowerIrql 來降低 IRQL

  • 請求大小為零的記憶體配置

  • 使用 IRQL > APC_LEVEL配置或釋放分頁集區

  • 在 IRQL > DISPATCH_LEVEL下配置或釋放不分頁池

  • 嘗試釋放未從先前配置傳回的位址

  • 嘗試釋放已釋放的地址

  • 使用 IRQL > 取得或釋放快速互斥鍵APC_LEVEL

  • 取得或釋放自旋鎖且 IRQL 不等於 DISPATCH_LEVEL

  • 重複釋放旋轉鎖。

  • 標記配置要求MUST_SUCCEED。 此類請求是不允許的。

如果驅動程式驗證器未處於作用中狀態,這些違規可能不會在所有情況下造成立即系統當機。 驅動程式驗證器會監視驅動程式的行為,如果有任何這些違規發生,便會發出錯誤檢查 0xC4。 如需錯誤檢查參數的清單,請參閱 錯誤檢查0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION)。

監控堆疊切換

驅動程式驗證器會監視所驗證驅動程式的堆疊使用量。 如果驅動程式切換其堆疊,而且新的堆疊既不是執行緒堆疊,也不是 DPC 堆疊,則會發出錯誤檢查。 這將是錯誤檢查 0xC4,第一個參數等於 0x90。KB 偵錯工具命令顯示的堆疊通常會揭示執行此操作的驅動程式。

檢查驅動程式的卸載狀況

卸載正在驗證的驅動程式之後,驅動程式驗證器會執行數個檢查,以確保驅動程式已清除。

特別是,驅動程式驗證器會尋找:

  • 未刪除的計時器

  • 擱置的延遲程序呼叫 (DPC)

  • 未刪除的後備清單

  • 未刪除的背景工作執行緒

  • 未刪除的佇列

  • 其他類似資源

諸如此類的問題可能會導致驅動程式卸載後一段時間發出系統錯誤檢查,並且這些錯誤檢查的原因可能很難確定。 當驅動程式驗證器處於作用中狀態時,這類違規會導致在卸載驅動程式之後立即發出錯誤檢查0xC7。 如需錯誤檢查參數的清單,請參閱 Bug Check 0xC7(TIMER_OR_DPC_INVALID)。

監視記憶體描述元清單 (MDL) 使用情況

在 Windows Vista 中,驅動程式驗證器也會監視選取的驅動程式,避免下列禁止動作:

如果驅動程式驗證器未處於作用中狀態,這些違規可能不會導致系統在所有情況下立即停止回應。 驅動程式驗證器會監視驅動程式的行為,如果有任何這些違規發生,便會發出錯誤檢查 0xC4。 如需錯誤檢查參數的清單,請參閱 錯誤檢查0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION)。

來自 NonPagedPoolSession 記憶體的同步物件配置

從 Windows 7 開始,驅動程式驗證器會檢查會話記憶體中的同步處理物件。

同步處理物件必須是不可分頁的。 它們也必須位於全系統全域的全域虛擬位址空間中。

圖形驅動程式可以呼叫 EngAllocMem 等 API,來配置會話記憶體。 不同於全域位址空間,會話位址空間會針對每個終端機伺服器會話虛擬化。 這表示相同的虛擬位址在兩個不同工作階段的環境中會指向兩個不同的物件。 Windows 核心必須能夠從任何終端機伺服器會話存取同步處理物件。 嘗試從不同的會話引用會話記憶體位址會產生無法預測的結果,例如系統當機或另一個會話資料的無訊息損壞。

從 Windows 7 開始,當已驗證的驅動程式藉由呼叫 KeInitializeEventKeInitializeMutex 等 API 來初始化同步處理物件時,驅動程式驗證器會檢查物件的位址是否位於會話虛擬位址空間內。 如果驅動程式驗證器偵測到這種不正確的位址,它會發出 錯誤檢查0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION,參數 1 值為 0xDF。

物件參考計數器從 0 變更為 1

從 Windows 7 開始,驅動程式驗證器會檢查不正確物件參考的其他類別。

當 Windows 核心物件管理員建立物件時,例如 File 物件或 Thread 物件,新物件的參考計數器會設定為 1。 參考計數器會藉由呼叫 API 遞增,例如 ObReferenceObjectByPointerObReferenceObjectByHandle。 參考計數器會由對同一物件的每個ObDereferenceObject呼叫遞減。

在參考計數器達到 0 值之後,物件就符合釋放的資格。 物件管理程式可能會立即釋放它,或稍後可能會釋放它。 呼叫 ObReferenceObjectByPointerObDereferenceObject 並將參考計數器從 0 變更為 1 表示遞增已釋放物件的參考計數器。 這總是不正確的,因為它可能會導致損壞其他人的記憶體分配。

系統關閉阻塞或延遲

從 Windows 7 開始,如果系統關機在開始後 20 分鐘內未完成,驅動程式驗證器將導致進入核心偵錯工具的中斷。 驅動程式驗證器會將系統關機的開始指派為 Windows 核心開始關閉其各種子系統的時間,例如登錄、隨插即用或 I/O 管理員子系統。

如果核心偵錯工具未附加至系統,驅動程式驗證器會發出 Bug 檢查0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION,參數 1 值為 0x115,而不是此中斷點。

通常,無法在 20 分鐘內完成的系統關機表示在該系統上執行的其中一個驅動程式發生故障。 從核心偵錯工具執行 !analyze -v 會顯示負責關機之系統背景工作執行緒的堆疊追蹤。 您應該檢查該堆疊追蹤,並判斷關機執行緒是否受到其中一個正在測試的驅動程式所封鎖。

有時系統無法關閉,因為它需要進行大量壓力測試,即使所有驅動程式都正常運作。 使用者可以選擇在此驅動程式驗證器中斷點之後繼續執行,並檢查系統最終是否關閉。