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 调用 IoMarkIrpPendingIoCompletion 例程不返回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)

另请参阅

IO_STACK_LOCATION

IRP

IoCompleteRequest

IoSkipCurrentIrpStackLocation

IoStartPacket