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 初始化 Csq,IoCsqInsertIrpEx 将返回驱动程序的 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 插入队列。

有关详细信息,请参阅 取消安全 IRP 队列

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

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

要求

要求
最低受支持的客户端 在 Windows Server 2003 及更高版本的 Windows 操作系统中可用。 该例程也可在随 Windows 驱动程序工具包 (WDK) 和适用于 Windows Server 2003 的驱动程序开发工具包 (DDK) 随附的 Csq.lib 库中提供。 还必须适用于 Windows XP、Windows 2000 和 Windows 98/Me 的驱动程序可以改为链接到 Csq.lib 以使用例程。
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library 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