FLT_IO_PARAMETER_BLOCK 结构 (fltkernel.h)

FLT_IO_PARAMETER_BLOCK 结构包含由FLT_CALLBACK_DATA回调数据结构表示的 I/O 操作的参数。

语法

typedef struct _FLT_IO_PARAMETER_BLOCK {
  ULONG          IrpFlags;
  UCHAR          MajorFunction;
  UCHAR          MinorFunction;
  UCHAR          OperationFlags;
  UCHAR          Reserved;
  PFILE_OBJECT   TargetFileObject;
  PFLT_INSTANCE  TargetInstance;
  FLT_PARAMETERS Parameters;
} FLT_IO_PARAMETER_BLOCK, *PFLT_IO_PARAMETER_BLOCK;

成员

IrpFlags

标志的位掩码,用于指定 I/O 操作的各个方面。 这些标志仅用于基于 IRP 的操作。 下表显示了标志值。

含义
IRP_BUFFERED_IO 该操作是缓冲 I/O 操作。
IRP_CLOSE_OPERATION 该操作是清理或关闭操作。
IRP_DEALLOCATE_BUFFER I/O 管理器将在 IRP 的完成阶段释放缓冲区。
IRP_INPUT_OPERATION 操作是输入操作。
IRP_NOCACHE 该操作是未缓存的 I/O 操作。
IRP_PAGING_IO 该操作是分页 I/O 操作。
IRP_SYNCHRONOUS_API I/O 操作是同步的。
IRP_SYNCHRONOUS_PAGING_IO 该操作是同步分页 I/O 操作。
IRP_MOUNT_COMPLETION 已完成操作的卷装载。
IRP_CREATE_OPERATION 操作是创建或打开操作。
IRP_READ_OPERATION I/O 操作用于读取。
IRP_WRITE_OPERATION I/O 操作用于写入。
IRP_DEFER_IO_COMPLETION 操作的 I/O 完成延迟。
IRP_ASSOCIATED_IRP 该操作与主 IRP 相关联。
IRP_OB_QUERY_NAME 该操作是一个异步名称查询。
IRP_HOLD_DEVICE_QUEUE 保留。
IRP_UM_DRIVER_INITIATED_IO 操作源自用户模式驱动程序。

MajorFunction

I/O 操作的主要函数代码。 主要函数代码用于基于 IRP 的操作、快速 I/O 操作和文件系统 (FSFilter) 回调操作。 有关其他操作的详细信息,请参阅 FLT_PARAMETERS

MinorFunction

I/O 操作的次要函数代码。 此成员是可选的,可以为 NULLMajorFunction 成员的值确定可能的值。 有关次要函数代码的详细信息,请参阅 FLT_PARAMETERS

OperationFlags

标志的位掩码,用于指定 I/O 操作的各个方面。 这些标志仅用于基于 IRP 的操作。 筛选器管理器从与 IRP 关联的IO_STACK_LOCATION结构的 Flags 成员复制这些标志。 下表显示了最常用的标志值。

含义
SL_CASE_SENSITIVE 用于 IRP_MJ_CREATE。 如果设置了此标志,文件名比较应区分大小写。
SL_EXCLUSIVE_LOCK 用于 IRP_MJ_LOCK_CONTROL。 如果设置了此标志,则会请求独占字节范围锁。 否则,将请求共享锁。
SL_FAIL_IMMEDIATELY 用于 IRP_MJ_LOCK_CONTROL。 如果设置了此标志,如果无法立即授予锁定请求,则锁定请求应会失败。
SL_FORCE_ACCESS_CHECK 用于 IRP_MJ_CREATE。 如果设置了此标志,则即使 IRP 的 RequestorMode 成员的值为 KernelMode,也必须执行访问检查。
SL_FORCE_DIRECT_WRITE 用于IRP_MJ_WRITE和IOCTL_DISK_COPY_DATA。 如果设置了此标志,内核模式驱动程序可以写入通常由于安全原因而阻止其写入的卷区域。 此标志在文件系统层和存储堆栈层进行检查。 SL_FORCE_DIRECT_WRITE标志在 Windows Vista 和更高版本的 Windows 中可用。
SL_INDEX_SPECIFIED 用于 IRP_MJ_DIRECTORY_CONTROLIRP_MJ_QUERY_EAIRP_MJ_SET_QUOTA。 如果设置了此标志,则目录、配额或扩展属性信息的扫描应从指定了索引的列表中的条目开始。
SL_OPEN_PAGING_FILE 用于 IRP_MJ_CREATE。 如果设置了此标志,则该文件是分页文件。
SL_OPEN_TARGET_DIRECTORY 用于 IRP_MJ_CREATE。 如果设置了此标志,则应打开文件的父目录。
SL_OVERRIDE_VERIFY_VOLUME 用于 IRP_MJ_DIRECTORY_CONTROLIRP_MJ_READIRP_MJ_WRITE。 如果设置了此标志,则即使对卷的设备对象设置了DO_VERIFY_VOLUME标志,也应执行 I/O 操作。
SL_RESTART_SCAN 用于 IRP_MJ_DIRECTORY_CONTROLIRP_MJ_QUERY_EAIRP_MJ_SET_QUOTA。 如果设置了此标志,则目录、配额或扩展属性信息的扫描应从目录或列表中的第一个条目开始。 否则,应从上一次扫描恢复扫描。
SL_RETURN_SINGLE_ENTRY 用于 IRP_MJ_DIRECTORY_CONTROLIRP_MJ_QUERY_EAIRP_MJ_SET_QUOTA。 如果设置了此标志,则目录、配额或扩展属性信息的扫描应仅返回找到的第一个条目。
SL_WATCH_TREE 用于 IRP_MJ_DIRECTORY_CONTROL。 如果设置了此标志,则还应监视此目录的所有子目录。 否则,仅监视目录本身。
SL_WRITE_THROUGH 用于 IRP_MJ_WRITE。 如果设置了此标志,则必须将文件数据写入永久性存储,而不仅仅是写入缓存。

Reserved

预留给系统使用。 请勿使用。

TargetFileObject

作为此 I/O 操作目标的文件或目录的文件对象指针。

TargetInstance

作为此 I/O 操作目标的微筛选器的不透明实例指针。

Parameters

一个FLT_PARAMETERS结构,其中包含由 MajorFunction 和 MinorFunction 成员指定的 I/O 操作的参数。

注解

FLT_IO_PARAMETER_BLOCK 结构包含 I/O 操作的参数,该操作由回调数据 (FLT_CALLBACK_DATA) 结构表示。 回调数据结构包含指向其 Iopb 成员中的 FLT_IO_PARAMETER_BLOCK 结构的指针。

微筛选器接收指向回调数据结构的指针,作为指向以下回调例程类型的 DataCallbackData 输入参数:

微筛选器的预操作和后操作回调例程可以修改 I/O 操作的FLT_IO_PARAMETER_BLOCK结构的内容, 但 MajorFunctionReserved 成员除外。 如果是,则必须调用 FltSetCallbackDataDirty,除非它还修改了操作的回调数据结构的 IoStatus 成员。 否则,将忽略修改的值。

当筛选器管理器向微筛选器发出操作前或操作后回调时,FltObjects-FileObject>TargetFileObject (CallbackData-Iopb-TargetFileObject>>) 最初是相同的。 如果微筛选器修改 TargetFileObjectTargetInstance,则后续从预操作回调调用 FltSetCallbackDataDirty 将导致筛选器管理器在将操作发送到较低筛选器之前替换 FltObjects-FileObject>FltObjects-Instance>

如果微筛选器的预操作回调例程修改 I/O 操作的参数,则微筛选器实例堆栈中它下面的所有微筛选器都将在其预操作和操作后回调例程中接收修改的参数。

微筛选器自己的操作后回调例程或微筛选器实例堆栈中该微筛选器上方的任何微筛选器不会接收修改的参数。 在所有情况下,微筛选器的预操作和操作后回调例程接收相同的输入参数值。

如果微筛选器更改 了 TargetInstance 成员的值,则新值必须是指向不同卷上同一高度处同一微筛选器实例的指针。 此外,新卷的设备对象的堆栈大小必须大于或等于原始卷的设备对象的堆栈大小。

若要获取卷设备对象的堆栈大小,给定附加到卷的实例的不透明实例指针,请执行以下操作:

  • 调用 FltGetVolumeFromInstance 以获取卷指针。
  • 调用 FltGetDeviceObject 以获取指向卷设备对象的指针。 此指针在 DeviceObject 参数中返回。 可在 DeviceObject-StackSize> 中找到设备对象的堆栈大小。
  • 当不再需要卷指针时,调用 FltObjectDereference 以递减其引用计数。
  • 当不再需要卷设备对象指针时,调用 ObDereferenceObject 以递减其引用计数。

微筛选器可以更改 TargetFileObject 成员的值。 但是,新值必须是指向文件对象的指针,该文件与 TargetInstance 成员指定的实例位于同一卷上。

微筛选器无法安全地更改 MajorFunction 成员的值。 相反,它必须启动新的 I/O 操作。

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

注意

在启动 I/O 操作时,尽可能使用支持例程。 仅当没有对特定 I/O 操作的支持函数时,微筛选器才应分配自己的回调数据。

要求

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

另请参阅

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltAllocateCallbackData

FltClearCallbackDataDirty

FltDecodeParameters

FltIsCallbackDataDirty

FltReadFile

FltSetCallbackDataDirty

IO_STACK_LOCATION

IRP

FLT_PARAMETERS

IRP_MJ_CLEANUP

IRP_MJ_CLOSE

IRP_MJ_FLUSH_BUFFERS

IRP_MJ_SHUTDOWN

PFLT_COMPLETED_ASYNC_IO_CALLBACK

PFLT_GENERATE_FILE_NAME

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK