标记QueuedIrps 规则 (wdm)
MarkQueuedIrps 规则指定驱动程序为 IRP 调用 IoMarkIrpPending,该 IRP 仅在持有旋转锁时需要进一步处理。 仅当驱动程序将 IRP 添加到驱动程序管理的队列时,此规则才适用。
具体而言,仅当发生以下 所有 事件时,驱动程序才会违反此规则。
驱动程序调用 KeAcquireSpinLock 或 KeAcquireInStackQueuedSpinLock 以获取旋转锁。
驱动程序调用以下例程之一,将 IRP 添加到驱动程序管理的队列:
驱动程序调用 KeReleaseSpinLock 或 KeReleaseInStackQueuedSpinLock 以释放旋转锁,然后再调用 IoMarkIrpPending。
驱动程序返回 IRP 的STATUS_PENDING状态。
驱动程序应仅在持有旋转锁时为排队的 IRP 调用 IoMarkIrpPending 。 否则,IRP 可能会取消排队,由另一个驱动程序例程完成,并在调用 IoMarkIrpPending 之前由系统释放,从而导致崩溃。
有关详细信息,请参阅 同步 IRP 取消。
驱动程序模型:WDM
如何测试
编译时 |
---|
运行 静态驱动程序验证程序 并指定 MarkingQueuedIrps 规则。 使用以下步骤运行代码分析:有关详细信息,请参阅 使用静态驱动程序验证程序查找驱动程序中的缺陷。 |
适用于
InsertHeadListIoCallDriverIoMarkIrpPendingKeAcquireInStackQueuedSpinLockKeAcquireSpinLockKeInsertByKeyDeviceQueueKeInsertDeviceQueueKeInsertQueueDpcKeReleaseInStackQueuedSpinLockKeReleaseSpinLockPoCallDriverRemoveHeadList