共用方式為


I/O 驗證

驅動程式驗證器有兩個層級的 I/O 驗證:

  • 每次選取 I/O 驗證時,層級 1 I/O 驗證 一律為作用中。

  • 每當 Windows XP 和更新版本中選取 I/O 驗證時,層級 2 I/O 驗證 一律為作用中。

另請參閱:在 Windows 7 和更新版本的 Windows 作業系統中增強型 I/O 驗證,當您選取 [I/O 驗證] 時,會自動啟用增強的 I/O 驗證。 它無法使用或必須將其選取為個別選項。

層級 1 I/O 驗證

啟用層級 1 I/O 驗證時,會從特殊集區配置透過 IoAllocateIrp 取得的所有 IRP ,並追蹤其使用。

此外,驅動程式驗證器會檢查無效的 I/O 呼叫,包括:

  • 嘗試釋放類型不是IO_TYPE_IRP的 IRP

  • 將無效的裝置對象傳遞至 IoCallDriver

  • 將 IRP 傳遞至包含無效狀態或仍有取消例程集的 IoCompleteRequest

  • 在呼叫驅動程式分派例程時變更 IRQL

  • 嘗試釋放與線程相關聯的 IRP

  • 將裝置對象傳遞至已包含初始化定時器的 IoInitializeTimer

  • 將無效的緩衝區傳遞至 IoBuildAsynchronousFsdRequestIoBuildDeviceIoControlRequest

  • 將 I/O 狀態區塊傳遞至 IRP,當此 I/O 狀態區塊配置在堆疊上已解除復原太遠時

  • 將事件對象傳遞至 IRP,當此事件物件配置在已解除太遠的堆疊上時

由於特殊 IRP 集區的大小有限,因此當 I/O 驗證一次只用於一個驅動程式時,最有效。

I/O 驗證層級 1 失敗會導致發出錯誤檢查0xC9。 這個錯誤檢查的第一個參數表示發生違規的情況。 如需完整的參數清單,請參閱 錯誤檢查0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION)。

層級 2 I/O 驗證

I/O 驗證層級 2 錯誤會以不同的方式顯示:在藍色畫面、損毀傾印檔案和核心調試程式中。

在藍色畫面上,訊息 IO 系統驗證錯誤和字串 WDM 驅動程式錯誤XXX 會指出這些錯誤,其中 XXX 是 I/O 錯誤碼。

在損毀傾印檔案中,BugCheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION) 訊息會指出這些錯誤的大部分,以及 I/O 錯誤碼。 在此情況下,I/O 錯誤碼會顯示為錯誤檢查的第一個參數0xC9。 其餘部分會由錯誤 檢查0xC4(DRIVER_VERIFIER_DETECTED_VIOLATION)訊息以及驅動程序驗證器錯誤碼來指出。 在此情況下,驅動程式驗證程序錯誤碼會顯示為錯誤檢查的第一個參數0xC4。

在核心調試程式 (KD 或 WinDbg) 中,這些錯誤是由訊息 WDM DRIVER ERROR 和描述性文字字串所記下。 當核心調試程式作用中時,可以忽略層級 2 錯誤並繼續系統作業。 (任何其他錯誤檢查都不可能這樣做。

藍色畫面、損毀傾印檔案和核心調試程式也會顯示其他資訊。 如需大部分 I/O 驗證層級 2 錯誤訊息的完整描述,請參閱 錯誤檢查0xC9。 如需其餘部分,請參閱錯誤檢查0xC4

從 Window Vista 開始,I/O 驗證選項會檢查下列驅動程式錯誤:

從 Windows 7 開始,I/O 驗證選項會檢查下列驅動程式錯誤:

  • 呼叫 ExFreePool 嘗試釋放 IRP 必須使用IoFreeIrp釋放IRP

此外,您可以使用這個選項來偵測另一個常見的驅動程序錯誤-重新初始化移除鎖定。 拿掉鎖定數據結構應該配置在裝置延伸模組內。 這可確保 I/O 管理員只會在刪除裝置物件時釋放保留IO_REMOVE_LOCK結構的記憶體。 如果驅動程式執行下列三個步驟,有可能在步驟 2 之後,應用程式或驅動程式仍保留 Device1 的參考:

  • 配置對應至 Device1 的IO_REMOVE_LOCK結構,但會執行 Device1 延伸模組以外的配置。
  • 在移除 Device1 時呼叫 IoReleaseRemoveLockAndWait
  • 針對相同的鎖定呼叫 IoInitializeRemoveLock ,以重複使用它作為 Device2 的移除鎖定。

在步驟 2 之後,應用程式或驅動程式仍可能會保留 Device1 的參考。 即使移除此裝置,應用程式或驅動程式仍然可以將要求傳送至 Device1。 因此,在 I/O 管理員刪除 Device1 之前,重複使用與新移除鎖定相同的記憶體並不安全。 當另一個線程嘗試取得鎖定時,重新初始化相同的鎖定可能會導致鎖定損毀,而驅動程式和整個系統的結果無法預測。

在 Windows 7 和更新版本的 Windows 作業系統中,當您選取 [I/O 驗證] 時, 會自動啟用增強的 I/O 驗證

啟用此選項

您可以使用驅動程式驗證器管理員或Verifier.exe命令行,為一或多個驅動程式啟用 I/O 驗證功能。 如需詳細資訊,請參閱 選取驅動程式驗證器選項

  • 在命令行。

    在命令行中,I/O 驗證選項是由 位 4 (0x10) 表示。 若要啟用 I/O 驗證,請使用旗標值 0x10,或將0x10新增至旗標值。 例如:

    verifier /flags 0x10 /driver MyDriver.sys
    

    下一次開機之後,此功能將會處於作用中狀態。

    您也可以藉由將 /volatile 參數新增至 命令,來啟動和停用 I/O 驗證,而不重新啟動計算機。 例如:

    verifier /volatile /flags 0x10 /adddriver MyDriver.sys
    

    此設定會立即生效,但會在您關閉或重新啟動電腦時遺失。 如需詳細資訊,請參閱 使用揮發性設定

    I/O 驗證功能也包含在標準設定中。 例如:

    verifier /standard /driver MyDriver.sys
    
  • 使用驅動程式驗證器管理員

    1. 選取 [建立自定義設定] (適用於程式代碼開發人員), 然後按 [ 下一步]。
    2. 從完整清單中選取 [選取個別設定]。
    3. 選取 [檢查] I/O 驗證

    I/O 驗證功能也包含在標準設定中。 若要使用此功能,請在 [驅動程序驗證器管理員] 中,按兩下 [ 建立標準設定]。