FLT_CALLBACK_DATA 结构 (fltkernel.h)

FLT_CALLBACK_DATA 结构表示 I/O 操作。 筛选器管理器和微筛选器使用此结构来启动和处理 I/O 操作。

语法

typedef struct _FLT_CALLBACK_DATA {
  FLT_CALLBACK_DATA_FLAGS     Flags;
  PETHREAD                    Thread;
  PFLT_IO_PARAMETER_BLOCK     Iopb;
  IO_STATUS_BLOCK             IoStatus;
  struct _FLT_TAG_DATA_BUFFER *TagData;
  union {
    struct {
      LIST_ENTRY QueueLinks;
      PVOID      QueueContext[2];
    };
    PVOID FilterContext[4];
  };
  KPROCESSOR_MODE             RequestorMode;
} FLT_CALLBACK_DATA, *PFLT_CALLBACK_DATA;

成员

Flags

描述 I/O 操作的标志的位掩码。

微筛选器可以设置以下标志。

标志 含义
FLTFL_CALLBACK_DATA_DIRTY 微筛选器通过调用 FltSetCallbackDataDirty) 来设置此标志 (,以指示它已修改回调数据结构的内容。 (有关详细信息,请参阅以下“备注”部分。)

注意

只有筛选器管理器可以设置以下标志。

当筛选器管理器初始化回调数据结构时,它会设置以下标志之一,以指定回调数据结构所表示的 I/O 操作类型。

标志 含义
FLTFL_CALLBACK_DATA_FAST_IO_OPERATION 回调数据结构表示快速 I/O 操作。
FLTFL_CALLBACK_DATA_FS_FILTER_OPERATION 回调数据结构表示文件系统微筛选器回调操作。
FLTFL_CALLBACK_DATA_IRP_OPERATION 回调数据结构表示 I/O 请求数据包 (基于 IRP) 的操作。

注意

只有筛选器管理器可以设置以下标志。

筛选器管理器初始化回调数据结构时,还可以设置以下标志。

标志 含义
FLTFL_CALLBACK_DATA_GENERATED_IO 回调数据结构表示由微筛选器生成的 I/O 操作。 此标志仅对基于 IRP 的操作有效。
FLTFL_CALLBACK_DATA_REISSUED_IO 回调数据结构表示由微筛选器重新发布的 I/O 操作。 (若要重新发出 I/O 操作,微筛选器调用 FltReissueSynchronousIo.) 此标志仅对基于 IRP 的操作有效。
FLTFL_CALLBACK_DATA_SYSTEM_BUFFER I/O 操作的缓冲区是从非分页池分配的。 可以为任何类型的 I/O 操作设置此标志。 微筛选器绝不能设置此标志。

注意

只有筛选器管理器可以设置以下标志。

当筛选器管理器对回调数据结构所表示的 I/O 操作执行完成处理时,它会设置以下一个或两个标志。

标志 含义
FLTFL_CALLBACK_DATA_DRAINING_IO 筛选器管理器设置此标志以指示它当前正在排空 I/O 操作的完成节点。 此标志仅在 I/O 完成期间有效。
FLTFL_CALLBACK_DATA_POST_OPERATION 筛选器管理器设置此标志以指示它当前正在调用注册的操作后回调 (PFLT_POST_OPERATION_CALLBACK) 操作例程。 此标志仅在 I/O 完成期间有效。

Thread

指向启动 I/O 操作的线程的指针。 此字段可以为 NULL。

Iopb

指向包含 I/O 操作参数 的FLT_IO_PARAMETER_BLOCK 结构的指针。

IoStatus

包含 I/O 操作的状态和信息的 IO_STATUS_BLOCK 结构。 微筛选器只能在操作前回调 (PFLT_PRE_OPERATION_CALLBACK) 即将返回FLT_PREOP_COMPLETE的例程或操作后回调 (PFLT_POST_OPERATION_CALLBACK) 例程中修改此结构的内容FLT_POSTOP_FINISHED_PROCESSING。 否则,此结构的内容通常由筛选器管理器设置。

TagData

指向包含 I/O 操作的重新分析点数据的 FLT_TAG_DATA_BUFFER 结构的指针。 此指针仅在创建后路径中有效。 因此,只有微筛选器的操作后回调例程可以更改此成员的值。 微筛选器的创建后回调例程可以将此成员更改为指向不同的 FLT_TAG_DATA_BUFFER 结构。 但是,如果它更改成员以指向不同的结构,它必须首先调用 ExFreePool 以释放现有结构,以防止池内存泄漏。

QueueLinks

当筛选器管理器的回调数据队列用于写入 I/O 操作时,微筛选器可以使用的队列链接。

QueueContext[2]

当筛选器管理器的队列用于写入 I/O 操作时,微筛选器可以使用的上下文信息指针数组。

FilterContext[4]

当筛选器管理器的队列以外的队列用于写入 I/O 操作时,微筛选器可以使用的上下文信息指针数组。

RequestorMode

指示启动 I/O 操作的进程( KernelMode 或 UserMode )的执行 模式

注解

微筛选器 (PFLT_PRE_OPERATION_CALLBACK ) 和操作后 (PFLT_POST_OPERATION_CALLBACK 一个或多个 I/O 操作类型的回调例程) PFLT_POST_OPERATION_CALLBACK操作前 (。 当筛选器管理器调用其中一个回调例程时,它会将回调数据 (FLT_CALLBACK_DATA) 结构作为第一个参数传递。 此结构表示 I/O 操作。

微筛选器的操作前或操作后回调例程可以修改回调数据结构的内容, 线程RequestorMode 成员除外。 如果存在,则必须调用 FltSetCallbackDataDirty,除非它还修改了 IoStatus 成员的内容。 否则,将忽略修改的值。

微筛选器可以通过调用支持例程(如 FltReadFile )或通过调用 FltAllocateCallbackData 来分配回调数据结构来启动 I/O 操作;初始化结构的 I/O 参数,并将结构传递给 FltPerformSynchronousIoFltPerformAsynchronousIo

微筛选器启动的 I/O 操作仅发送到附加到调用实例下方的微筛选器实例和文件系统。 附加到指定实例上方的微筛选器不会接收 I/O 操作。

微筛选器只能启动基于 IRP 的 I/O 操作。 它们无法启动快速 I/O 或文件系统筛选器 (FSFilter) 回调操作。

要求

要求
Header fltkernel.h (包括 Fltkernel.h)

另请参阅

FLT_IO_PARAMETER_BLOCK

FLT_IS_FASTIO_OPERATION

FLT_IS_FS_FILTER_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_REISSUED_IO

FLT_IS_SYSTEM_BUFFER

FLT_REGISTRATION

FLT_RELATED_OBJECTS

FLT_TAG_DATA_BUFFER

FltAllocateCallbackData

FltFreeCallbackData

FltPerformAsynchronousIo

FltPerformSynchronousIo

FltReadFile

FltReissueSynchronousIo

FltReuseCallbackData

FltSetCallbackDataDirty

IO_STACK_LOCATION

IO_STATUS_BLOCK

IRP

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK