共用方式為


WDM (IrpProcessing 規則集)

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

本節內容

主題 描述

CompleteRequest

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

CompleteRequestStatusCheck

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

CompletionRoutineRegistered

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

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 值。 驅動程式必須檢查此值,以判斷是否已在呼叫 IoCallDriverPoCallDriver 之前成功註冊 IoCompletion 例程。

IoSetCompletionRoutineExCheckDeviceObject

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

IoSetCompletionRoutineNonPnpDriver

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

IrpCancelField

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

IrpProcessingComplete

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

LowerDriverReturn

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

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)