使用 KMDF 驗證器
架構提供內建的驗證功能,可讓您用來測試執行中的 KMDF 驅動程式。 這項功能稱為 KMDF 驗證器,會廣泛驗證驅動程式的狀態,以及驅動程式傳遞至架構物件方法的自變數。 您可以單獨使用架構的驗證器,或搭配一般用途 的驅動程序驗證器(Verifier.exe) 工具。
如果已啟用 KMDF 驗證器,架構會檢查鎖定取得和階層、確保對架構的呼叫發生在正確的 IRQL、驗證正確的 I/O 取消和佇列使用量,並確保驅動程式和架構遵循記載的合約。 它也可以模擬記憶體不足的情況,讓驅動程式開發人員可以測試驅動程式是否正確回應,而不會損毀、懸掛或無法卸除。
啟用 KMDF 驗證程式時,如果預設逾時期間 60 秒到期,則架構會中斷調試程式,然後才完成先前所述的一些事件。 此時,您可以對問題進行偵錯,或在調試程式中輸入 「g」 以重新啟動逾時期間。 您可以使用控制驗證程序行為中所述的 DbgWaitForSignalTimeoutInSec 登錄值來變更預設逾時期間。
建議您在測試期間執行驅動程序驗證器(Verifier.exe),並將您自己的驅動程式和wdf01000.sys新增至驗證清單。
注意
使用驅動程式驗證工具的 /standard
設定時,會自動啟用 KMDF 驗證器。 如果您使用 /flags
而非 /standard
驅動程式驗證器設定,請注意,在 Windows 10 版本 1803 或更新版本的組建上, /flags
已被取代,因此會優先使用 /ruleclasses
。 WDF 的規則類別是 34。 若要在不使用 時 /standard
啟用 WDF 驗證器, 請使用 /ruleclasses 34
。
您也可以使用 WDF 驗證器控制應用程式 (WdfVerifier.exe) 來啟用和停用 KMDF 驗證器。
啟用和停用架構的內建驗證
您可以使用此程式手動啟用 KMDF 驗證器:
如果您的驅動程式已載入,請使用 裝置管理員 來停用裝置。 停用裝置會導致卸除驅動程式。
使用 RegEdit 將 VerifierOn 設定為 Windows 登錄中HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 機碼之驅動程式 Parameters\Wdf 子機碼中的非零值。 非零值表示 KMDF 驗證器已啟用。
如果子機碼尚未存在,您可能需要手動將 VerifierOn 新增至子機碼。
使用 裝置管理員 重新連線裝置,藉此載入驅動程式。
當驅動程式呼叫 WdfDriverCreate 時,架構會檢查登錄,並在 VerifierOn 為非零值時啟用架構的驗證器。
若要停用架構的驗證器,請遵循相同的步驟,但將 VerifierOn 的值設定為零。
若要判斷架構的驗證器是否已啟用,請在驅動程式呼叫 WdfDriverCreate 並使用 !wdfdriverinfo 調試程序擴充功能命令之後,於某個位置設定斷點:
!wdfkd.wdfdriverinfo <drivername> **** 0x1
如需調試程式擴充功能命令的詳細資訊,請參閱 以 Framework 為基礎的驅動程式的調試程式擴充功能。
控制驗證器的行為
建議您使用 WDF 驗證器控制下 列選項。 不過,您可以直接修改登錄中的下列值。
相關值位於 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 機碼的 Parameters\Wdf 子機碼底下。
VerifyOn (REG_DWORD)
將此值設定為非零值,以啟用 WDFVERIFY 宏。
DbgBreakOnError (REG_DWORD)
如果此值設定為非零值,則每次驅動程式呼叫 WdfVerifierDbgBreakPoint 時,架構都會中斷調試程式(如果有的話)。
DbgWaitForSignalTimeoutInSec (REG_DWORD)
從 Windows 8 開始,當 VerifierOn 和 DbgBreakOnError 設定為非零值時,驅動程式可以藉由設定 DbgWaitForSignalTimeoutInSec 來變更預設逾時期間。
VerifierAllocateFailCount (REG_DWORD)
如果此值設定為 n 值,則架構會在第 n 個配置之後,每次嘗試配置驅動程式物件的記憶體時失敗。
TrackHandles (REG_MULTI_SZ)
如果此值設定為一或多個架構物件句柄的類型名稱清單,架構會追蹤符合指定句柄類型之所有物件句柄的參考。
EnhancedVerifierOptions (REG_DWORD)
僅限 KMDF
包含可用來啟用架構驗證器選擇性功能的點陣圖。
VerifyDownLevel (REG_DWORD)
如果設定為非零值,而且驅動程式是以比目前版本還舊的架構版本所建置,則架構的驗證器會包含建置驅動程序之後新增的測試。
一般規則是,如果您設定上述登錄值,請在不再需要這些值時加以刪除。
如需這些登錄值的完整描述,請參閱 偵錯架構型驅動程序的登錄值。