自動檢查
驅動程式驗證器會在驗證一或多個驅動程式時執行下列檢查。 您無法啟用或停用這些檢查。 從 Windows 10 1709 版開始,這些自動檢查已移至相關的標準旗標。 因此,使用標準旗標啟用驅動程式驗證器的使用者應該不會看到套用的檢查減少。
監視 IRQL 和記憶體常式
驅動程式驗證器會監視選取的驅動程式是否有下列禁止動作:
藉由呼叫 KeLowerIrql 來引發 IRQL
藉由呼叫 KeRaiseIrql 來降低 IRQL
要求大小為零的記憶體配置
使用 IRQL > 配置或釋放分頁集區APC_LEVEL
使用 IRQL > 配置或釋放非分頁集區DISPATCH_LEVEL
嘗試釋放先前配置未傳回的位址
嘗試釋放已釋放的位址
使用 IRQL > APC_LEVEL取得或釋放快速 Mutex
取得或釋放 IRQL 的微調鎖定不等於DISPATCH_LEVEL
雙釋放微調鎖定。
標示配置要求MUST_SUCCEED。 不允許這類要求。
如果驅動程式驗證器沒有作用中,這些違規可能不會在所有情況下造成立即的系統損毀。 驅動程式驗證器會監視驅動程式的行為,並在發生上述任何違規時,0xC4問題檢查錯誤。 如需錯誤檢查參數的清單,請參閱 錯誤檢查0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) 。
監視堆疊切換
驅動程式驗證器會監視所驗證驅動程式的堆疊使用量。 如果驅動程式切換其堆疊,而新的堆疊不是執行緒堆疊或 DPC 堆疊,則會發出錯誤檢查。 (這是錯誤檢查0xC4,第一個參數等於 0x90.) KB 偵錯工具命令顯示的堆疊通常會顯示執行這項作業的驅動程式。
檢查驅動程式卸載
在經過驗證的驅動程式卸載之後,驅動程式驗證程式會執行數個檢查,以確保驅動程式已清除。
特別是,驅動程式驗證器會尋找:
未刪除的計時器
(DPC) 擱置的延遲程序呼叫
未刪除的外觀清單
未刪除的背景工作執行緒
未刪除的佇列
其他類似的資源
這類問題可能會導致在驅動程式卸載之後發出系統錯誤檢查,而且這些錯誤檢查的原因可能難以判斷。 當驅動程式驗證器處於作用中狀態時,這類違規會導致錯誤檢查0xC7在卸載驅動程式之後立即發出。 如需錯誤檢查參數的清單,請參閱 錯誤檢查0xC7 (TIMER_OR_DPC_INVALID) 。
監視記憶體描述元清單 (MDL) 使用量
在 Windows Vista 中,驅動程式驗證器也會監視選取的驅動程式是否有下列禁止動作:
在沒有適當旗標的 MDL 上呼叫 MmProbeAndLockPages 或 MmProbeAndLockProcessPages 。 例如,針對使用MmBuildMdlForNonPagedPool所建立的 MDL 呼叫MmProbeAndLockPages不正確。
在沒有適當旗標的 MDL 上呼叫 MmMapLockedPages 。 例如,針對已經對應至系統位址或未鎖定的 MDL 呼叫 MmMapLockedPages 不正確。
在部分 MDL 上呼叫MmUnlockPages 或 MmUnmapLockedPages,也就是使用IoBuildPartialMdl建立的 MDL。
在未對應至系統位址的 MDL 上呼叫 MmUnmapLockedPages 。
如果驅動程式驗證器沒有作用中,這些違規可能不會讓系統在所有情況下立即停止回應。 驅動程式驗證器會監視驅動程式的行為,並在發生上述任何違規時,0xC4問題檢查錯誤。 如需錯誤檢查參數的清單,請參閱 錯誤檢查0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) 。
來自 NonPagedPoolSession 記憶體的同步處理物件配置
從 Windows 7 開始,驅動程式驗證程式會檢查會話記憶體中的同步處理物件。
同步處理物件必須是不可分頁的。 它們也必須位於全域、全系統的虛擬位址空間中。
圖形驅動程式可以呼叫 EngAllocMem之類的 API 來配置會話記憶體。 不同于全域位址空間,會話位址空間會針對每個終端機伺服器會話虛擬化。 這表示兩個不同會話內容中使用的相同虛擬位址是指兩個不同的物件。 Windows 核心必須能夠從任何終端機伺服器會話存取同步處理物件。 嘗試從不同的會話參考會話記憶體位址有無法預期的結果,例如系統當機或另一個會話資料的無訊息損毀。
從 Windows 7 開始,當已驗證的驅動程式呼叫 KeInitializeEvent 或 KeInitializeMutex等 API 來初始化同步處理物件時,驅動程式驗證器會檢查物件的位址是否落在會話虛擬位址空間內。 如果驅動程式驗證器偵測到這種不正確的位址,它會發出 錯誤檢查0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION,且參數 1 值為 0xDF。
物件參考計數器從 0 變更為 1
從 Windows 7 開始,驅動程式驗證程式會檢查是否有其他不正確的物件參考類別。
當 Windows 核心物件管理員建立物件,例如 File 物件或 Thread 物件時,新物件的參考計數器會設定為 1。 參考計數器會藉由 呼叫 ObReferenceObjectByPointer 或 ObReferenceObjectByHandle等 API 來遞增。 參考計數器會由相同物件的每個 ObDereferenceObject 呼叫遞減。
當參考計數器達到 0 值之後,物件就有資格釋出。 物件管理員可能會立即釋放它,或稍後可能會釋出它。 呼叫 ObReferenceObjectByPointer 或 ObDereferenceObject ,並將參考計數器從 0 變更為 1 表示遞增已釋放物件的參考計數器。 這一定不正確,因為它可能會導致其他人的記憶體配置損毀。
系統關機區塊或延遲
從 Windows 7 開始,如果系統關機未在啟動 20 分鐘之後,驅動程式驗證程式就會中斷核心偵錯工具。 驅動程式驗證器會將系統關機的啟動指派為 Windows 核心開始關閉其各種子系統的時間,例如登錄、隨插即用或 I/O 管理員子系統。
如果核心偵錯工具未附加至系統,驅動程式驗證程式會發出 錯誤檢查0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION,參數 1 值為 0x115,而不是這個中斷點。
系統關機通常無法在 20 分鐘內完成,表示在該系統上執行的其中一個驅動程式故障。 從核心偵錯工具執行 !analyze -v 會顯示負責關機之系統背景工作執行緒的堆疊追蹤。 您應該檢查該堆疊追蹤,並判斷關機執行緒是否遭到其中一個正在測試的驅動程式封鎖。
有時候系統無法關閉,因為它受限於大量壓力測試,即使所有驅動程式都正常運作也一樣。 使用者可以選擇在此驅動程式驗證程式中斷點之後繼續執行,並檢查系統最終是否關閉。