WDM (IrpProcessing 規則集)

使用這些規則來確認驅動程序正確地處理 I/O 要求封包, (IRP) 。

本節內容

主題 描述

CompleteRequest

CompleteRequest 規則會確認完成例程執行之後不會呼叫 IoCompleteRequest 例程,而且不會傳回STATUS_MORE_PROCESSING_REQUIRED。

CompleteRequestStatusCheck

CompleteRequestStatusCheck 規則會確認 IRP 中的 I/O 狀態值符合較低驅動程式傳回的狀態值。

CompletionRoutineRegistered

CompletionRoutineRegistered 規則會指定,如果分派例程使用 IoSetCompletionRoutineEx 註冊 IoCompletion 例程,則分派例程之後必須呼叫 IoCallDriver 或 PoCallDriver。

DoubleCompletion

DoubleCompletion (WDM) 規則指定驅動程式不得針對相同的 IRP 呼叫 IoCompleteRequest 例程兩次。

IoReuseIrp

IoReuseIrp 規則會指定驅動程式應該只在先前使用 IoAllocateIrp 配置的 IRP 上使用 IoReuseIrp。

IoReuseIrp2

IoReuseIrp2 規則會指定驅動程式應該只在先前在驅動程式內配置的 IRP 上使用 IoReuseIrp。

IoSetCompletionExCompleteIrp

IoSetCompletionExCompleteIrp 規則會指定 IoSetCompletionRoutineEx 例程會傳回 NTSTATUS 值。 驅動程式必須檢查此值,以判斷IoCompletion例程是否已在呼叫IoCallDriver或PoCallDriver之前成功註冊,以及IoSetCompletionRoutineEx是否失敗,則應該完成IRP並傳回分派例程。

IoSetCompletionRoutineExCheck

IoSetCompletionRoutineExCheck 規則會指定 IoSetCompletionRoutineEx 例程會傳回 NTSTATUS 值。 驅動程式必須檢查此值,以判斷是否已在呼叫 IoCallDriver 或 PoCallDriver 之前成功註冊 IoCompletion 例程。

IoSetCompletionRoutineExCheckDeviceObject

IoSetCompletionRoutineExCheckDeviceObject 規則會指定,如果目前的裝置物件未傳遞至 IoSetCompletionRoutineEx,而較低的裝置對像是,這可能會導致競爭條件,即使完成例程尚未執行,仍可卸除目前的裝置物件。

IoSetCompletionRoutineNonPnpDriver

IoSetCompletionRoutineNonPnpDriver 規則會指定不是 PnP 驅動程序的驅動程式應該使用 IoSetCompletionRoutineEx 而非 IoSetCompletionRoutine。

IrpCancelField

IrpCancelField 規則指定在 IRP 上設定已畫筆的取消例程時,驅動程式會檢查 Irp-Cancel> 成員的值。

IrpProcessingComplete

IrpProcessingComplete 規則會指定,如果分派例程傳回STATUS_SUCCESS,則驅動程式本身或較低層級驅動程序必須已完成 IRP。

LowerDriverReturn

LowerDriverReturn 規則指定在使用 PoCallDriver 或 IoCallDriver 呼叫較低的驅動程式之後,驅動程式會儲存呼叫的傳回狀態,並將收到的傳回狀態傳遞至分派例程。

SignalEventInCompletion

SignalEventInCompletion 規則會指定處理異步 IRP 時,驅動程式必須在設定 Irp-PendingReturned> 旗標時,在完成例程中呼叫 KeSetEvent。

SignalEventInCompletion2

SignalEventInCompletion2 規則指定在處理異步 IRP 時,驅動程式必須在設定 Irp-PendingReturned> 旗標時,在完成例程中呼叫 KeSetEvent。

SignalEventInCompletion3

SignalEventInCompletion3 規則會指定處理異步 IRP 時,驅動程式必須在設定 Irp-PendingReturned> 旗標時,在完成例程中呼叫 KeSetEvent。

StartIoCancel

StartIoCancel 規則會指定驅動程式在呼叫具有非 NULLCancel 例程的 IoSetCancelable 參數之前,必須先將 NonCancelable 參數設為 FALSE 來呼叫 IoSetStartIoAttributes。

StartIoRecursion

StartIoRecursion 規則會指定,如果驅動程式的 StartIo 例程包含對 IoStartNextPacket 的呼叫,驅動程式必須先呼叫 IoSetStartIoAttributes,並將 DeferredStartIo 屬性設定為 TRUE。 否則,可能會產生無限遞歸。

PnpRemove

PnpRemove 規則會指定驅動程式無法完成失敗IRP_MN_SURPRISE_REMOVAL、IRP_MN_CANCEL_REMOVE_DEVICE、IRP_MN_CANCEL_STOP_DEVICE或IRP_MN_REMOVE_DEVICE要求。

PnpSurpriseRemove

PnpSurpriseRemove 規則指定驅動程式不會在處理IRP_MN_SURPRISE_REMOVAL要求時呼叫 IoDeleteDevice 或 IoDetachDevice。

PowerDownAllocate

PowerDownAllocate 規則指定當處理從 s0 到 [S1... 的 SystemPowerState 轉換IRP_MN_SET_POWER要求時,FDO 和 FIDO 驅動程式不應該配置記憶體S5]。

PowerDownFail

PowerDownFail 規則指定當裝置關閉電源時,FDO 或 FIDO 驅動程式不應該失敗IRP_MN_SET_POWER要求。 此規則僅適用於 FDO 和 FIDO 驅動程式。

PowerIrpDIS

PowerIrpDIS 規則會指定當驅動程式處理具有IRP_MN_SET_POWER的系統或裝置IRP_MJ_POWER時,不應該呼叫只能在PASSIVE_LEVEL呼叫的 DIS。

PowerUpFail

PowerUpFail 規則會指定當裝置啟動時,FDO 或 FIDO 驅動程式不應該失敗IRP_MN_SET_POWER要求。

PnpIrpCompletion

PnpIrpCompletion 規則會驗證 FDO 驅動程式是否將 PnP IRP 傳遞至較低的驅動程式。

WmiComplete

WmiComplete 規則會指定在處理 WMI 次要 IRP 時,驅動程式會在從 DispatchSystemControl 例程傳回之前呼叫 IoCompleteRequest。

WmiForward

WmiForward 規則會指定當需要轉送時,驅動程式必須轉送 WMI 次要 IRP。

若要選取 IrpProcessing 規則集

  1. 在 Microsoft Visual Studio 中選取您的驅動程式專案 (.vcxProj) 。 從 [ 驅動程式] 功能表中,按兩下 [ 啟動靜態驅動程序驗證程式...]。

  2. 按兩下 [ 規則] 索引 標籤。在 [規則集] 底下,選取 [ IrpProcessing]。

    若要從 Visual Studio 開發人員命令提示字元視窗中選取預設規則集,請使用 /check 選項指定 IrpProcessing.sdv。 例如:

    msbuild /t:sdv /p:Inputs="/check:IrpProcessing.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

    如需詳細資訊,請參閱 使用靜態驅動程式驗證器在驅動程式 和 靜態驅動程式驗證器命令中尋找瑕疵, (MSBuild) 。