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 结构的指针。 此结构必须已由 IoCsqInitialize 或 IoCsqInitializeEx 初始化。
[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 例程:
- 调用队列的 CsqAcquireLock 例程以锁定队列。
- 如果队列的 IO_CSQ 结构由 IoCsqInitialize 初始化, IoCsqInsertIrpEx 将调用队列的 CsqInsertIrp 例程来插入 IRP。 如果队列的IO_CSQ结构由 IoCsqInitializeEx 初始化,IoCsqInsertIrpEx 将调用队列的 CsqInsertIrpEx 例程来插入 IRP,并将 InsertContext 参数作为 CsqInsertIrpEx 的 InsertContext 参数传递。
- 调用队列的 CsqReleaseLock 例程来解锁队列。
有关详细信息,请参阅 取消安全 IRP 队列。
请注意, IoCsqXxx 例程使用 IRP 的 DriverContext[3] 成员来保存 IRP 上下文信息。 使用这些例程对 IRP 进行排队的驱动程序必须使该成员处于未使用状态。
IoCsqInsertIrpEx 的调用方必须在 IRQL <= DISPATCH_LEVEL上运行。 驱动程序的回调例程必须在此 IRQL 中正常工作。