FltCbdqInsertIo 函数 (fltkernel.h)
FltCbdqInsertIo 将 I/O作的回调数据结构插入到筛选器驱动程序的回调数据队列中。
语法
NTSTATUS FLTAPI FltCbdqInsertIo(
[in, out] PFLT_CALLBACK_DATA_QUEUE Cbdq,
[in] PFLT_CALLBACK_DATA Cbd,
[in, optional] PFLT_CALLBACK_DATA_QUEUE_IO_CONTEXT Context,
[in, optional] PVOID InsertContext
);
参数
[in, out] Cbdq
指向调用方的取消安全回调数据队列的指针。 必须通过调用 FltCbdqInitialize来初始化此队列。
[in] Cbd
指向要排队的 I/O作的回调数据(FLT_CALLBACK_DATA)结构的指针。 该作必须是基于 IRP 的 I/O作。
[in, optional] Context
调用方提供的变量,用于接收 I/O 请求的不透明上下文指针。 筛选器驱动程序可以使用此指针来标识队列中的特定项,以便可以通过调用 FltCbdqRemoveIo将其删除。 如果筛选器驱动程序不需要从队列中删除特定的 I/O 请求,则可以 NULL。
[in, optional] InsertContext
要传递给筛选器驱动程序的 CbdqInsertIo 回调例程的上下文指针。
返回值
FltCbdqInsertIo 在回调数据队列中插入回调数据结构或相应的 NTSTATUS 值时返回STATUS_SUCCESS,如下所示:
返回代码 | 描述 |
---|---|
STATUS_FLT_CBDQ_DISABLED | 回调数据结构未插入回调数据队列,因为队列当前已禁用。 若要重新启用队列,请调用 FltCbdqEnable。 这是一个错误代码。 |
注意
如果成功,FltCbdqInsertIo 返回筛选器 InsertIo 回调返回的内容;例如,筛选器可能会返回STATUS_SUCCESS或STATUS_PENDING来指示成功。 必须根据筛选器用来指示成功的值进行自我一致性。
言论
FltCbdqInsertIo 将指定的回调数据(FLT_CALLBACK_DATA)结构插入筛选器驱动程序的回调数据队列中。
- 请注意,在插入回调数据的筛选器驱动程序与取消关联的 IRP 之间可能存在争用条件。 如果 IRP 已取消,则可以立即调用队列的取消例程来避免此问题。
筛选器驱动程序可以使用 FltCbdqXxx 例程来实现基于 IRP 的 I/O作的回调数据队列。 通过使用这些例程,筛选器驱动程序可以使队列取消安全;系统以透明方式处理筛选器驱动程序的 I/O 取消。
FltCbdqXxx 例程只能用于基于 IRP 的 I/O作。 若要确定给定的回调数据结构是否表示基于 IRP 的 I/O作,请使用 FLT_IS_IRP_OPERATION 宏。
通过调用 FltCbdqInitialize初始化回调数据队列。 FltCbdqInsertIo 使用队列调度表中提供的函数锁定队列并将回调数据结构插入队列。 插入作本身由队列的 CbdqInsertIo 例程执行。
有关如何创建回调数据队列的详细信息,请参阅 FltCbdqInitialize。 使用 FltCbdqRemoveIo 从队列中删除特定 I/O 请求,或 FltCbdqRemoveNextIo 删除下一个可用的 I/O 请求。
如果队列受 旋转锁 保护,而不是 互斥对象 或 资源变量,则可以在 IRQL <= DISPATCH_LEVEL上运行 FltCbdqInsertIo 的调用方。 如果使用互斥体或资源,则调用方必须在 IRQL <= APC_LEVEL运行。
要求
要求 | 价值 |
---|---|
目标平台 | 普遍 |
标头 | fltkernel.h (包括 Fltkernel.h) |
IRQL | 请参阅“备注”部分。 |