IrpProcessing 规则集 (WDM)

使用这些规则验证驱动程序是否正确处理 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 例程在调用 IoCallDriverPoCallDriver 之前是否已成功注册,如果 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 规则指定在使用 PoCallDriverIoCallDriver 调用较低驱动程序后,驱动程序保存调用的返回状态,并将收到的返回状态传递给调度例程。

SignalEventInCompletion

SignalEventInCompletion 规则指定在处理异步 IRP 时,驱动程序需要在设置 Irp-PendingReturned> 标志时在完成例程中调用 KeSetEvent

SignalEventInCompletion2

SignalEventInCompletion2 规则指定在处理异步 IRP 时,驱动程序需要在设置 Irp-PendingReturned> 标志时在完成例程中调用 KeSetEvent

SignalEventInCompletion3

SignalEventInCompletion3 规则指定在处理异步 IRP 时,驱动程序需要在设置 Irp-PendingReturned> 标志时在完成例程中调用 KeSetEvent

StartIoCancel

StartIoCancel 规则指定,在使用非 NULLCancel 例程调用 IoSetCancelRoutine 之前,驱动程序不得调用 NonCanable 参数设置为 FALSEIoSetStartIoAttries

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 规则指定 FDO 和 FIDO 驱动程序在 IRP_MN_SET_POWER处理从 s0 到 [S1...S5]。

PowerDownFail

PowerDownFail 规则指定在设备关闭电源时,FDO 或 FIDO 驱动程序不应使IRP_MN_SET_POWER请求失败。 此规则仅适用于 FDO 和 FIDO 驱动程序。

PowerIrpDDIs

PowerIrpDDI 规则指定,当驱动程序使用IRP_MN_SET_POWER处理系统或设备IRP_MJ_POWER时,它不应调用只能在PASSIVE_LEVEL调用的 DDI。

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 开发人员命令提示符窗口中选择默认规则集,请使用 /检查 选项指定 IrpProcessing.sdv。 例如:

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

    有关详细信息,请参阅 使用静态驱动程序验证程序查找驱动程序中的缺陷静态驱动程序验证程序命令 (MSBuild)