IoMarkIrpPending 函数 (wdm.h)
IoMarkIrpPending 例程标记指定的 IRP,指示驱动程序的调度例程随后返回STATUS_PENDING,因为其他驱动程序例程需要进一步处理。
语法
void IoMarkIrpPending(
[in, out] PIRP Irp
);
参数
[in, out] Irp
指向要标记为挂起的 IRP 的指针。
返回值
无
备注
除非驱动程序的调度例程通过调用 IoCompleteRequest) 完成 IRP (或将 IRP 传递给较低的驱动程序,否则它必须使用 IRP 调用 IoMarkIrpPending 。 否则,一旦调度例程返回控制权,I/O 管理器就会尝试完成 IRP。
调用 IoMarkIrpPending 后,调度例程必须返回STATUS_PENDING,即使某些例程通过在调用 IoMarkIrpPending 的调度例程返回之前调用 IoCompleteRequest) 完成 IRP (。
如果驱动程序对传入 IRP 进行排队,则应在将每个 IRP 排队之前调用 IoMarkIrpPending 。 否则,IRP 可能会取消排队,由另一个驱动程序例程完成,并在调用 IoMarkIrpPending 之前由系统释放,从而导致崩溃。
如果驱动程序为 IRP 设置了 IoCompletion 例程,然后将 IRP 向下传递到较低的驱动程序,则 IoCompletion 例程应检查 IRP-PendingReturned> 标志。 如果设置了标志, IoCompletion 例程必须使用 IRP 调用 IoMarkIrpPending 。 IoCompletion 例程不返回STATUS_PENDING。 有关详细信息,请参阅 实现 IoCompletion 例程。
创建 IRP 并将其发送到另一个堆栈的驱动程序不得在其完成例程中调用 IoMarkIrpPending 。 此调用将损坏下一个分配的池标头,因为这些驱动程序没有堆栈位置。
传递 IRP 然后等待事件的驱动程序不应将 IRP 标记为挂起。 相反,其 IoCompletion 例程应发出事件信号并返回STATUS_MORE_PROCESSING_REQUIRED。
如果驱动程序调用 IoSkipCurrentIrpStackLocation,请注意修改 IO_STACK_LOCATION 结构的方式不能无意中影响较低级别的驱动程序,或运行该驱动器时的系统行为。 具体而言,驱动程序不应修改 IO_STACK_LOCATION 结构的 Parameters 联合,也不应调用 IoMarkIrpPending。
要求
要求 | 值 |
---|---|
目标平台 | 桌面 |
标头 | wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h) |
IRQL | 任何级别 |
DDI 符合性规则 | CompleteRequestStatusCheck (wdm) 、 CompletionEventChecking (wdm) 、 IrpCancelField (wdm) 、 LowerDriverReturn (wdm) 、 MarkDevicePower (wdm) 、 MarkInterlockedQueuedIrps (wdm) 、 MarkQueuedIrps (wdm) 、 MarkIrpPending (wdm) 、 MarkIrpPending2 (wdm) 、 MarkPower (wdm) 、 MarkPowerDown (wdm) 、 MarkQueryRelations (wdm) 、 MarkStartDevice (wdm) 、 PendedCompletedRequest3 (wdm) |