IrpProcessing 规则集 (WDM)
使用这些规则验证驱动程序是否正确处理 I/O 请求数据包 (IRP) 。
在本节中
主题 | 说明 |
---|---|
CompleteRequest 规则验证在完成例程运行后未调用 IoCompleteRequest 例程,并且它不会返回STATUS_MORE_PROCESSING_REQUIRED。 |
|
CompleteRequestStatusCheck 规则验证 IRP 中的 I/O 状态值是否与较低驱动程序返回的状态值匹配。 |
|
CompletionRoutineRegistered 规则指定,如果调度例程使用 IoSetCompletionRoutineEx 注册 IoCompletion 例程,则调度例程之后必须调用 IoCallDriver 或 PoCallDriver。 |
|
DoubleCompletion (WDM) 规则指定驱动程序不得为同一 IRP 调用 IoCompleteRequest 例程两次。 |
|
IoReuseIrp 规则指定驱动程序应仅在之前使用 IoAllocateIrp 分配的 IRP 上使用 IoReuseIrp。 |
|
IoReuseIrp2 规则指定驱动程序应仅在以前在驱动程序中分配的 IRP 上使用 IoReuseIrp。 |
|
IoSetCompletionExCompleteIrp 规则指定 IoSetCompletionRoutineEx 例程返回 NTSTATUS 值。 驱动程序必须检查此值,以确定 IoCompletion 例程在调用 IoCallDriver 或 PoCallDriver 之前是否已成功注册,如果 IoSetCompletionRoutineEx 失败,则 IRP 应完成并且调度例程应返回。 |
|
IoSetCompletionRoutineExCheck 规则指定 IoSetCompletionRoutineEx 例程返回 NTSTATUS 值。 驱动程序必须检查此值,以确定在调用 IoCallDriver 或 PoCallDriver 之前是否已成功注册 IoCompletion 例程。 |
|
IoSetCompletionRoutineExCheckDeviceObject 规则指定,如果当前设备对象未传递到 IoSetCompletionRoutineEx,而较低的设备对象为 ,则可能导致争用条件,即即使尚未运行完成例程,也可以卸载当前设备对象。 |
|
IoSetCompletionRoutineNonPnpDriver 规则指定不是 PnP 驱动程序的驱动程序应使用 IoSetCompletionRoutineEx 而不是 IoSetCompletionRoutine。 |
|
IrpCancelField 规则指定驱动程序在设置已插入的 IRP 上的取消例程时检查 Irp-Cancel> 成员的值。 |
|
IrpProcessingComplete 规则指定,如果调度例程返回STATUS_SUCCESS,则 IRP 必须由驱动程序本身或较低级别的驱动程序完成。 |
|
LowerDriverReturn 规则指定在使用 PoCallDriver 或 IoCallDriver 调用较低驱动程序后,驱动程序保存调用的返回状态,并将收到的返回状态传递给调度例程。 |
|
SignalEventInCompletion 规则指定在处理异步 IRP 时,驱动程序需要在设置 Irp-PendingReturned> 标志时在完成例程中调用 KeSetEvent。 |
|
SignalEventInCompletion2 规则指定在处理异步 IRP 时,驱动程序需要在设置 Irp-PendingReturned> 标志时在完成例程中调用 KeSetEvent。 |
|
SignalEventInCompletion3 规则指定在处理异步 IRP 时,驱动程序需要在设置 Irp-PendingReturned> 标志时在完成例程中调用 KeSetEvent。 |
|
StartIoCancel 规则指定,在使用非 NULLCancel 例程调用 IoSetCancelRoutine 之前,驱动程序不得调用 NonCanable 参数设置为 FALSE 的 IoSetStartIoAttries。 |
|
StartIoRecursion 规则指定,如果驱动程序的 StartIo 例程包含对 IoStartNextPacket 的调用,驱动程序必须先调用 IoSetStartIoAttributes,并将 DeferredStartIo 属性设置为 TRUE。 否则,可能会导致无限递归。 |
|
PnpRemove 规则指定驱动程序无法完成IRP_MN_SURPRISE_REMOVAL、IRP_MN_CANCEL_REMOVE_DEVICE、IRP_MN_CANCEL_STOP_DEVICE或IRP_MN_REMOVE_DEVICE失败的请求。 |
|
PnpSurpriseRemove 规则指定驱动程序在处理IRP_MN_SURPRISE_REMOVAL请求时不调用 IoDeleteDevice 或 IoDetachDevice。 |
|
PowerDownAllocate 规则指定 FDO 和 FIDO 驱动程序在 IRP_MN_SET_POWER处理从 s0 到 [S1...S5]。 |
|
PowerDownFail 规则指定在设备关闭电源时,FDO 或 FIDO 驱动程序不应使IRP_MN_SET_POWER请求失败。 此规则仅适用于 FDO 和 FIDO 驱动程序。 |
|
PowerIrpDDI 规则指定,当驱动程序使用IRP_MN_SET_POWER处理系统或设备IRP_MJ_POWER时,它不应调用只能在PASSIVE_LEVEL调用的 DDI。 |
|
PowerUpFail 规则指定在设备通电时,FDO 或 FIDO 驱动程序不应使IRP_MN_SET_POWER请求失败。 |
|
PnpIrpCompletion 规则验证 FDO 驱动程序是否将 PnP IRP 传递给较低的驱动程序。 |
|
WmiComplete 规则指定在处理 WMI 次要 IRP 时,驱动程序在从 DispatchSystemControl 例程返回之前调用 IoCompleteRequest。 |
|
WmiForward 规则指定驱动程序在需要转发时必须转发 WMI 次要 IRP。 |
选择 IrpProcessing 规则集
在 Microsoft Visual Studio 中选择驱动程序项目 (.vcxProj) 。 在“ 驱动程序 ”菜单中,单击“ 启动静态驱动程序验证程序...”。
单击“ 规则 ”选项卡。在“ 规则集”下,选择“ IrpProcessing”。
若要从 Visual Studio 开发人员命令提示符窗口中选择默认规则集,请使用 /检查 选项指定 IrpProcessing.sdv。 例如:
msbuild /t:sdv /p:Inputs="/check:IrpProcessing.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
有关详细信息,请参阅 使用静态驱动程序验证程序查找驱动程序中的缺陷 和 静态驱动程序验证程序命令 (MSBuild) 。