IoCsqInsertIrpEx 函数 (wdm.h)

IoCsqInsertIrpEx 例程将 IRP 插入驱动程序的取消安全的 IRP 队列中。

语法

NTSTATUS IoCsqInsertIrpEx(
  [in, out]       PIO_CSQ             Csq,
  [in, out]       PIRP                Irp,
  [out, optional] PIO_CSQ_IRP_CONTEXT Context,
  [in, optional]  PVOID               InsertContext
);

参数

[in, out] Csq

指向驱动程序取消安全 IRP 队列的 IO_CSQ 结构的指针。 此结构必须由 IoCsqInitializeIoCsqInitializeEx初始化。

[in, out] Irp

指向要排队的 IRP 的指针。

[out, optional] Context

指向 IO_CSQ_IRP_CONTEXT 结构的指针。 IoCsqInsertIrpEx 使用插入的 IRP 的上下文信息初始化此结构。 驱动程序将此值传递给 IoCsqRemoveIrp 以从队列中删除 IRP。 如果驱动程序 不使用 ioCsqRemoveIrp 从队列中删除此 IRP,则可以 上下文NULL

[in, optional] InsertContext

指向驱动程序定义的上下文值的指针。 此参数传递给驱动程序的 CsqInsertIrpEx 例程(如果有)。 否则,将忽略此参数。

返回值

如果使用 ioCsqInitialize 初始化 Csq 参数,则 IoCsqInsertIrpEx 始终返回STATUS_SUCCESS。 如果使用 IoCsqInitializeEx初始化 CsqIoCsqInsertIrpEx 将返回驱动程序 CsqInsertIrpEx 例程返回的值。

言论

IoCsqInsertIrpEx 使用队列的调度例程插入 IRP。 IoCsqInsertIrpEx 例程:

  1. 调用队列的 CsqAcquireLock 例程来锁定队列。
  2. 如果队列的 IO_CSQ 结构是通过 IoCsqInitialize初始化的,IoCsqInsertIrpEx 调用队列的 CsqInsertIrp 例程来插入 IRP。 如果队列的 IO_CSQ 结构是通过 IoCsqInitializeEx初始化的,IoCsqInsertIrpEx 调用队列的 CsqInsertIrpEx 例程来插入 IRP, 并将 InsertContext 参数作为 CsqInsertIrpExInsertContext 参数传递。
  3. 调用队列的 CsqReleaseLock 例程来解锁队列。
如果已取消要插入的 IRP,IoCsqInsertIrpEx 不会尝试将 IRP 插入队列。

有关详细信息,请参阅 Cancel-Safe IRP 队列

请注意,IoCsqXxx 例程使用 IRP 的 DriverContext[3] 成员来保存 IRP 上下文信息。 使用这些例程对 IRP 进行排队的驱动程序必须将该成员保留为未使用状态。

IoCsqInsertIrpEx 的调用方必须在 IRQL <= DISPATCH_LEVEL上运行。 驱动程序的回调例程必须在此 IRQL 中正常工作。

要求

要求 价值
最低支持的客户端 在 Windows Server 2003 及更高版本的 Windows作系统中可用。 该例程在适用于 Windows Server 2003 的 Windows 驱动程序工具包(WDK)和驱动程序开发工具包(DDK)随附的 Csq.lib 库中也提供。 还必须适用于 Windows XP、Windows 2000 和 Windows 98/Me 的驱动程序可以改为链接到 Csq.lib 以使用例程。
目标平台 普遍
标头 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (请参阅“备注”部分)
DDI 符合性规则 IoAllocateFree(wdm)IoReuseIrp(wdm)IrpCancelField(wdm)RemoveLockCheck (wdm)RemoveLockForward(wdm)RemoveLockForward2(wdm)RemoveLockForwardDeviceControl(wdm) )RemoveLockForwardDeviceControl2(wdm)RemoveLockForwardDeviceControlInternal(wdm)RemoveLockForwardDeviceControlInternal2(wdm)RemoveLockForwardRead(wdm)RemoveLockForwardRead2(wdm)RemoveLockForwardWrite(wdm)RemoveLockForwardWrite2(wdm)RemoveLockReleaseCleanup(wdm)RemoveLockReleaseClose(wdm)RemoveLockReleaseCreate(wdm)RemoveLockReleaseDeviceControl(wdm)RemoveLockReleaseInternalDeviceControl(wdm)RemoveLockReleasePower(wdm)RemoveLockReleaseRead(wdm)RemoveLockReleaseShutdown(wdm)RemoveLockReleaseSystemControl(wdm)RemoveLockReleaseWrite(wdm)

另请参阅

CsqAcquireLock

CsqCompleteCanceledIrp

CsqInsertIrp

CsqInsertIrpEx

CsqPeekNextIrp

CsqReleaseLock

CsqRemoveIrp

IO_CSQ

IO_CSQ_IRP_CONTEXT

IoCsqInitialize

IoCsqInitializeEx

IoCsqInsertIrp

IoCsqRemoveIrp

IoCsqRemoveNextIrp