共用方式為


使用 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 驗證器:

  1. 如果您的驅動程式已載入,請使用 裝置管理員 來停用裝置。 停用裝置會導致卸除驅動程式。

  2. 使用 RegEdit 將 VerifierOn 設定為 Windows 登錄中HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 機碼之驅動程式 Parameters\Wdf 子機碼中的非零值。 非零值表示 KMDF 驗證器已啟用。

    如果子機碼尚未存在,您可能需要手動將 VerifierOn 新增至子機碼。

  3. 使用 裝置管理員 重新連線裝置,藉此載入驅動程式。

  4. 當驅動程式呼叫 WdfDriverCreate 時,架構會檢查登錄,並在 VerifierOn 為非零值時啟用架構的驗證器。

若要停用架構的驗證器,請遵循相同的步驟,但將 VerifierOn 的值設定為零。

若要判斷架構的驗證器是否已啟用,請在驅動程式呼叫 WdfDriverCreate 並使用 !wdfdriverinfo 調試程序擴充功能命令之後,於某個位置設定斷點:

!wdfkd.wdfdriverinfo <drivername> **** 0x1

如需調試程式擴充功能命令的詳細資訊,請參閱 以 Framework 為基礎的驅動程式的調試程式擴充功能。

控制驗證器的行為

建議您使用 WDF 驗證器控制下 列選項。 不過,您可以直接修改登錄中的下列值。

相關值位於 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 機碼的 Parameters\Wdf 子機碼底下

VerifyOnREG_DWORD
將此值設定為非零值,以啟用 WDFVERIFY 宏。

DbgBreakOnErrorREG_DWORD
如果此值設定為非零值,則每次驅動程式呼叫 WdfVerifierDbgBreakPoint 時,架構都會中斷調試程式(如果有的話)。

DbgWaitForSignalTimeoutInSecREG_DWORD
從 Windows 8 開始,當 VerifierOn 和 DbgBreakOnError 設定為非零值時,驅動程式可以藉由設定 DbgWaitForSignalTimeoutInSec 來變更預設逾時期間。

VerifierAllocateFailCountREG_DWORD
如果此值設定為 n,則架構會在第 n 個配置之後,每次嘗試配置驅動程式物件的記憶體時失敗。

TrackHandlesREG_MULTI_SZ
如果此值設定為一或多個架構物件句柄的類型名稱清單,架構會追蹤符合指定句柄類型之所有物件句柄的參考。

EnhancedVerifierOptionsREG_DWORD
僅限 KMDF

包含可用來啟用架構驗證器選擇性功能的點陣圖。

VerifyDownLevelREG_DWORD
如果設定為非零值,而且驅動程式是以比目前版本還舊的架構版本所建置,則架構的驗證器會包含建置驅動程序之後新增的測試。

一般規則是,如果您設定上述登錄值,請在不再需要這些值時加以刪除。

如需這些登錄值的完整描述,請參閱 偵錯架構型驅動程序的登錄值。