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

指向回调数据的指针 (FLT_CALLBACK_DATA 要排队的 I/O 操作的) 结构。 该操作必须是基于 IRP 的 I/O 操作。

[in, optional] Context

调用方提供的变量,用于接收 I/O 请求的不透明上下文指针。 筛选器驱动程序可以使用此指针来标识队列中的特定项,以便可以通过调用 FltCbdqRemoveIo 将其删除。 如果不需要筛选器驱动程序即可从队列中删除特定的 I/O 请求,则此参数可以为 NULL

[in, optional] InsertContext

要传递给筛选器驱动程序的 CbdqInsertIo 回调例程的上下文指针。

返回值

将回调数据结构插入回调数据队列时,FltCbdqInsertIo 返回STATUS_SUCCESS,或者返回相应的 NTSTATUS 值,如下所示:

返回代码 说明
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 请求。

如果队列受 旋转锁 而不是 互斥体对象资源变量的保护, 则 FltCbdqInsertIo 的调用方可以在 IRQL <= DISPATCH_LEVEL运行。 如果使用互斥体或资源,则调用方必须在 IRQL <= APC_LEVEL 运行。

要求

要求
目标平台 通用
标头 fltkernel.h (包括 Fltkernel.h)
IRQL 请参见“备注”部分。

另请参阅

FLT_CALLBACK_DATA

FLT_CALLBACK_DATA_QUEUE

FLT_IS_IRP_OPERATION

FltCbdqDisable

FltCbdqEnable

FltCbdqInitialize

FltCbdqRemoveIo

FltCbdqRemoveNextIo