I/O 驗證

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

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

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

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

層級 1 I/O 驗證

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

此外,驅動程式驗證器會檢查是否有不正確 I/O 呼叫,包括:

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

  • 將不正確裝置物件傳遞至 IoCallDriver

  • 將 IRP 傳遞至 IoCompleteRequest,其中包含無效狀態或仍然設定取消常式的IoCompleteRequest

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

  • 嘗試釋放與執行緒保持關聯的 IRP

  • 將裝置物件傳遞至已包含初始化計時器的IoInitializeTimer

  • 將無效緩衝區傳遞至 IoBuildAsynchronousFsdRequestIoBuildDeviceIoControlRequest

  • 將 I/O 狀態欄塊傳遞至 IRP,當此 I/O 狀態欄塊配置在太遠的堆疊上時

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

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

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

層級 2 I/O 驗證

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

在藍色畫面上,這些錯誤是由訊息 IO 系統驗證錯誤 和字串 WDM DRIVER ERRORXXX所指出,其中 XXX 是 I/O 錯誤碼。

在損毀傾印檔案中, 錯誤檢查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 驗證選項會檢查下列驅動程式錯誤:

此外,您可以使用此選項來偵測另一個常見的驅動程式錯誤,也就是重新初始化移除鎖定。 移除鎖定資料結構應該配置在裝置延伸模組內。 這可確保 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 驗證功能也會包含在標準設定中。 若要使用此功能,請在驅動程式驗證器管理員中,按一下 [建立標準設定]。