從 Windows 2000 開始,所有 Windows 版本都提供 Driver Verifier。 每個版本都會引入新功能,並檢查 Windows 驅動程式中的 Bug。 本節摘要說明變更,並提供相關文件的連結。
- Windows 10 中的 驅動程式驗證器
- Windows 8.1 驅動程式驗證器
- Windows 8 中的 驅動程式驗證器
- Windows 7 驅動程式驗證器
- Windows Vista 中的 驅動程式驗證器
- Windows XP 中的 驅動程式驗證器
Windows 11 中的驅動程序驗證器 (更新日期:2021 年 9 月 30 日)
從 Windows 11 開始,現在會使用與 揮發性語法不同的命令語法來啟用許多旗標,而不需重新啟動。 如需新語法的詳細資訊,請參閱 驅動程序驗證器命令語法。
Windows 10 中的驅動程序驗證器 (更新日期:2018 年 5 月 8 日)
- 您仍然可以在驅動程式驗證器
/standard
旗標中啟用 WDF 驗證。 如需詳細資訊,請參閱 驅動程式驗證器命令語法。 - 如果您啟用具有語法
/flags 0x209BB
的 DV,此變更將影響您,因為 WDF 驗證將不再自動啟用。
從 Windows 10 開始,驅動程式驗證器包含下列技術的新驅動程式驗證規則:
Windows 8-1 中的驅動程序驗證器 (更新日期:2013 年 6 月 17 日)
從 Windows 8.1 開始,驅動程式驗證器引進了四個新選項來偵測錯誤。
NDIS/WIFI 驗證 選項會套用一組 NDIS 和無線 LAN 規則,以檢查 NDIS 迷你埠驅動程式與作系統核心之間的適當互動。
系統性低資源模擬 選項會在核心模式驅動程式中導入資源失敗。
核心同步處理延遲模糊 選項會隨機化線程排程,以協助偵測驅動程式中的並行錯誤。
VM 交換器驗證 選項會監視在 Hyper-V Extensible Switch內執行的篩選驅動程式(可延伸交換器擴充功能)。
新的調試程式擴充功能:!ruleinfo
Windows 8 中的驅動程序驗證器 (更新:2012 年 10 月 20 日)
從 Windows 8 開始,驅動程式驗證器引進了五個新選項來偵測錯誤。
- Power Framework 延遲模糊 選項會插入隨機執行延遲,以協助偵測使用電源管理架構 (PoFx) 驅動程式的並行錯誤。 這些執行延遲有上限時間。 不建議針對未直接使用電源管理架構 (PoFx) 的驅動程式使用此選項。
- DDI 合規性檢查 選項會套用與 靜態驅動程式驗證器 相同的設備驅動介面(DDI)使用規則,以驗證驅動程式是否在函式要求的 IRQL 水準下呼叫這些函式。 DDI 合規性檢查會作為標準驅動程序驗證器選項的一部分執行。
- Invariant MDL Checking for Stack 選項會監視驅動程式如何處理跨驅動程式堆疊的不變異 MDL 緩衝區。
- 驅動程式 的不變異 MDL 檢查選項會監控驅動程式處理不變異 MDL 緩衝區的方式,並基於每個驅動程式進行監控。
- 堆疊式失敗注入 選項會在核心模式驅動程式中引入資源分配失敗的情況。
當您使用 Visual Studio 2012 和適用於 Windows 8 的 WDK 建置、部署及測試驅動程式時,您也可以在部署驅動程式進行測試時,將驅動程式驗證器設定為在測試計算機上執行。
Windows 7 中的驅動程序驗證器 (更新日期:2012 年 10 月 22 日)
針對 Windows 7,驅動程式驗證器已透過新的測試和功能增強,可讓驅動程式驗證器公開更多一般驅動程式 Bug 類別。
- 來自核心驅動程式的使用者句柄參考不正確
- I/O 驗證改善
- 特殊資源池、資源池追蹤及低資源模擬改進
- 同步處理機制的使用不正確
- 不正確的對象參考
- 來自 DPC 例程的集區配額費用
- 系統關機封鎖或延遲
- 改善強制擱置 I/O 要求
在 Windows 7 中,驅動程式驗證器會提供對佇列旋轉鎖定的檢查,這些檢查類似於在舊版 Windows 中對旋轉鎖定所提供的檢查。 這些檢查包括下列各項:
驗證不應降低中斷請求層級(IRQL)值的操作,例如 KeAcquireInStackQueuedSpinLock,實際上確保不會降低 IRQL 值。
確認應該降低 IRQL 值的作業,例如 KeReleaseInStackQueuedSpinLock,實際上不會提高 IRQL 值。
如果已啟用 強制 IRQL 檢查 選項,則在 IRQL 提升到 DISPATCH_LEVEL 或更高時,修剪系統進程的工作集,以嘗試在驅動程式以提升的 IRQL 運行時,暴露對可分頁記憶體的可能引用。
啟用死結偵測選項時,預測可能的死結。
嘗試在啟用死結偵測選項時,同時以微調鎖和堆疊佇列微調鎖的方式使用相同的KSPIN_LOCK數據結構。
檢查明顯不正確的指標值,例如使用者模式虛擬位址被用作自旋鎖地址。
在驅動程式驗證程式 IRQL 記錄檔中記錄 IRQL 轉換。 當您使用 Windows 調試程式的 !verifier 8 擴充功能時,會出現此資訊。 請參閱 !verifier。
其他偵錯資訊
在 Windows 7 中,驅動程式驗證器提供下列有助於偵錯的其他資訊:
有一個記錄,其堆疊追蹤的時間順序為最近從已驗證的驅動程式呼叫 KeEnterCriticalRegion 和 KeLeaveCriticalRegion。 記錄內容會使用 Windows 偵錯工具的 !verifier 0x200 偵錯延伸模組來顯示。 這項資訊對於了解線程意外在重要區域中執行,或嘗試讓已離開的重要區域的情況很有用。
您可以使用 !verifier 0x40 調試程序擴充功能,顯示 強制擱置 I/O 要求 記錄檔中的其他資訊。 較早版本的 Windows 中,記錄只包含驅動程式驗證程式強制擱置的每個 IRP 的一個堆疊追蹤資訊。 這是強制擱置 IRP 第一次呼叫 IoCompleteRequest 時的堆疊追蹤。 Windows 7 針對每個強制等待的 IRP,至少有兩個日誌條目,可能超過兩個:
- 當驅動程式驗證器挑選要強制擱置的 IRP 時的堆疊追蹤。 當其中一個已驗證的驅動程式呼叫 IoCallDriver時,驅動程式驗證工具會選擇一些 IRP 進行強制擱置。
- 在完成到達已驗證的驅動程式之前,每個 IoCompleteRequest 呼叫的強制擱置 IRP 進行堆疊追蹤。 一個以上的 IoCompleteRequest 呼叫可以針對相同的 IRP 存在,因為某個驅動程式可能會暫時從其完成例程中停止完成並再度呼叫 IoCompleteRequest 來恢復完成。
IRQL 轉換記錄檔中有更多有效的堆疊追蹤。 此記錄會使用 !verifier 8來顯示。 在 Windows 7 之前的 Windows 版本中,驅動程式驗證器可能會嘗試在較高的中斷請求層級(IRQL)記錄其中一些堆疊追蹤,但由於 IRQL 值過高而無法擷取堆疊追蹤。 在 Windows 7 中,驅動程式驗證器會嘗試擷取這些堆疊追蹤:
- 例如,在提升 IRQL 等級之前,當經過驗證的驅動程式呼叫 KeAcquireSpinLock時。
- 降低 IRQL 之後,當已驗證的驅動程式呼叫 KeReleaseSpinLock時。
如此一來,驅動程式驗證器可以擷取更多這些 IRQL 轉換堆疊追蹤資訊。
!analyze 可以協助排查由增強型 I/O 驗證器檢查所揭示的問題(這是 Windows 7 中 I/O 驗證程式的一部分)。 在舊版 Windows 中,增強型 I/O 驗證器錯誤報告包含顯示驅動程式驗證器偵測到的驅動程式瑕疵描述,後面接著中斷調試程式。 在此類故障發生後,執行 !analyze 無法提供對多數此類故障進行有效的分類,因為 !analyze 無法利用調試器中顯示的錯誤描述文字中的信息。 在 Windows 7 中,驅動程式驗證器會在記憶體中儲存這些驅動程式瑕疵的有意義資訊。 !analyze 可以找到這項資訊,並針對其中許多中斷執行更有意義的自動分級。
Windows Vista 中的驅動程序驗證器 (更新日期:2009 年 2 月 9 日)
針對 Windows Vista,驅動程式驗證器已透過新的測試和功能增強。
- 啟用驅動程序驗證程式和變更設定而不重新啟動
- 增強型低資源模擬
- 強制擱置 I/O 要求
- 安全性檢查
- 更徹底的 I/O 驗證
- 增強式 IRQL 檢查
- 其他檢查
- 鎖定的記憶體頁面追蹤
- 其他自動檢查
Windows XP 中的驅動程序驗證器 (更新:2001 年 12 月 4 日)
驅動程式驗證器是監視 Windows 核心模式驅動程式和圖形驅動程式的工具。 Microsoft強烈建議硬體製造商使用驅動程式驗證器來測試其驅動程式,以確保驅動程式不會進行非法的函式呼叫或造成系統損毀。 驅動程式驗證器已針對 Microsoft Windows XP 增強了新測試和功能。
提交至 WHQL 進行測試的驅動程式必須通過驅動程式驗證器。 Windows XP 中的新驅動程序驗證器功能包括:
- 驅動程式驗證器管理員,這是適用於 verifier.exe 的全新圖形使用者介面 (GUI)
- 監視堆疊切換的新自動檢查
- DMA 驗證的新驅動程式驗證器選項(也稱為 HAL 驗證)、死結偵測和 SCSI 驗證
- 結合「層級 1」和「層級 2」測試的 I/O 驗證變更,選擇性的增強 I/O 驗證測試
- 新的調試程式延伸模組 !deadlock 和 !dma
- 新的錯誤檢查:0xE6(DRIVER_VERIFIER_DMA_VIOLATION)和0xF1(SCSI_VERIFIER_DETECTED_VIOLATION)
- 現有錯誤檢查碼 0xC4 和 0xC9 的附加子代碼
驅動程式驗證器功能也包括:
新的驗證程式命令行選項 verifier.exe 公用程式具有新的參數,VolatileDriverList,其可與 /adddriver 關鍵詞搭配使用,以指定要新增至動態設定的驅動程式清單。 VolatileDriverList 可以與 /removedriver 關鍵詞搭配使用,以指定要移除的驅動程序清單。
新的 !verifier 擴充功能 新增 !verifier 擴充功能在監控低資源或 IRQL 提升及自旋鎖定時顯示額外的日誌資訊。 您也可以使用線上說明。
- 旗標 設定為0x4會導致顯示包含驅動程式驗證工具在低資源模擬期間插入的錯誤記錄
- 標誌 設為0x8時,顯示會包括已驗證驅動程式所做的最近 IRQL 變更的記錄檔。
- 如果 旗標 完全等於0x4或0x8,Quantity 參數會指定要包含在顯示器中的記錄或記錄項目數目
- ? 參數會顯示簡短的說明文字
驅動程式驗證器管理員的在線說明驅動程式驗證器管理員在線說明可以透過下列其中一種方式來顯示:
- 選取並按住 [驅動程序驗證器管理員] 視窗中的項目,然後選擇 [什麼是?從快捷功能表。
- 選取視窗右上角的問號 (?),然後在 [驅動程序驗證器管理員] 視窗中選取專案。