IoMarkIrpPending 函数 (wdm.h)

IoMarkIrpPending 例程标记指定的 IRP,指示驱动程序的调度例程随后返回STATUS_PENDING,因为其他驱动程序例程需要进一步处理。

语法

void IoMarkIrpPending(
  [in, out] PIRP Irp
);

参数

[in, out] Irp

指向要标记为挂起的 IRP 的指针。

返回值

没有

言论

除非驱动程序的调度例程完成 IRP(通过调用 IoCompleteRequest)或将 IRP 传递到较低驱动程序,否则它必须使用 IRP 调用 IoMarkIrpPending。 否则,一旦调度例程返回控制,I/O 管理器就会尝试完成 IRP。

调用 IoMarkIrpPending后,调度例程必须返回STATUS_PENDING,即使某些例程在调用 IoMarkIrpPending 返回的调度例程之前完成 IRP(通过调用 IoCompleteRequest)。

如果驱动程序将传入 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 结构的 参数 联合,并且不应调用 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