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 操作的次要函数代码。 此成员是可选的,可以为 NULL。 MajorFunction 成员的值确定可能的值。 有关次要函数代码的详细信息,请参阅 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_CONTROL、 IRP_MJ_QUERY_EA和 IRP_MJ_SET_QUOTA。 如果设置了此标志,则目录、配额或扩展属性信息的扫描应从指定了索引的列表中的条目开始。 |
SL_OPEN_PAGING_FILE | 用于 IRP_MJ_CREATE。 如果设置了此标志,则该文件是分页文件。 |
SL_OPEN_TARGET_DIRECTORY | 用于 IRP_MJ_CREATE。 如果设置了此标志,则应打开文件的父目录。 |
SL_OVERRIDE_VERIFY_VOLUME | 用于 IRP_MJ_DIRECTORY_CONTROL、 IRP_MJ_READ和 IRP_MJ_WRITE。 如果设置了此标志,则即使对卷的设备对象设置了DO_VERIFY_VOLUME标志,也应执行 I/O 操作。 |
SL_RESTART_SCAN | 用于 IRP_MJ_DIRECTORY_CONTROL、 IRP_MJ_QUERY_EA和 IRP_MJ_SET_QUOTA。 如果设置了此标志,则目录、配额或扩展属性信息的扫描应从目录或列表中的第一个条目开始。 否则,应从上一次扫描恢复扫描。 |
SL_RETURN_SINGLE_ENTRY | 用于 IRP_MJ_DIRECTORY_CONTROL、 IRP_MJ_QUERY_EA和 IRP_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 结构的指针。
微筛选器接收指向回调数据结构的指针,作为指向以下回调例程类型的 Data 或 CallbackData 输入参数:
- PFLT_POST_OPERATION_CALLBACK
- PFLT_PRE_OPERATION_CALLBACK
- PFLT_COMPLETED_ASYNC_IO_CALLBACK
- PFLT_GENERATE_FILE_NAME
微筛选器的预操作和后操作回调例程可以修改 I/O 操作的FLT_IO_PARAMETER_BLOCK结构的内容, 但 MajorFunction 和 Reserved 成员除外。 如果是,则必须调用 FltSetCallbackDataDirty,除非它还修改了操作的回调数据结构的 IoStatus 成员。 否则,将忽略修改的值。
当筛选器管理器向微筛选器发出操作前或操作后回调时,FltObjects-FileObject> 和 TargetFileObject (CallbackData-Iopb-TargetFileObject>>) 最初是相同的。 如果微筛选器修改 TargetFileObject 或 TargetInstance,则后续从预操作回调调用 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 参数,并将回调数据结构传递给 FltPerformSynchronousIo 或 FltPerformAsynchronousIo。
注意
在启动 I/O 操作时,尽可能使用支持例程。 仅当没有对特定 I/O 操作的支持函数时,微筛选器才应分配自己的回调数据。
要求
要求 | 值 |
---|---|
Header | fltkernel.h (包括 Fltkernel.h) |
另请参阅
- IRP_MJ_ACQUIRE_FOR_MOD_WRITE的FLT_PARAMETERS
- IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION 的 FLT_PARAMETERS
- IRP_MJ_CREATE 的 FLT_PARAMETERS
- IRP_MJ_CREATE_MAILSLOT的FLT_PARAMETERS
- IRP_MJ_CREATE_NAMED_PIPE的FLT_PARAMETERS
- IRP_MJ_DEVICE_CONTROL 的 FLT_PARAMETERS
- IRP_MJ_DIRECTORY_CONTROL的FLT_PARAMETERS
- IRP_MJ_FAST_IO_CHECK_IF_POSSIBLE 的 FLT_PARAMETERS
- IRP_MJ_FILE_SYSTEM_CONTROLFLT_PARAMETERS
- IRP_MJ_INTERNAL_DEVICE_CONTROLFLT_PARAMETERS
- 适用于IRP_MJ_LOCK_CONTROL的FLT_PARAMETERS
- IRP_MJ_MDL_READ 的 FLT_PARAMETERS
- IRP_MJ_MDL_READ_COMPLETE 的 FLT_PARAMETERS
- IRP_MJ_MDL_WRITE_COMPLETE 的 FLT_PARAMETERS
- IRP_MJ_NETWORK_QUERY_OPEN 的 FLT_PARAMETERS
- IRP_MJ_PNP 的 FLT_PARAMETERS
- IRP_MJ_PREPARE_MDL_WRITE 的 FLT_PARAMETERS
- IRP_MJ_QUERY_EAFLT_PARAMETERS
- IRP_MJ_QUERY_INFORMATION 的 FLT_PARAMETERS
- IRP_MJ_QUERY_OPEN 的 FLT_PARAMETERS
- IRP_MJ_QUERY_QUOTAFLT_PARAMETERS
- IRP_MJ_QUERY_SECURITY 的 FLT_PARAMETERS
- IRP_MJ_QUERY_VOLUME_INFORMATION 的 FLT_PARAMETERS
- IRP_MJ_READ 的 FLT_PARAMETERS
- IRP_MJ_RELEASE_FOR_MOD_WRITE 的 FLT_PARAMETERS
- IRP_MJ_RELEASE_FOR_SECTION_SYNCHRONIZATIONFLT_PARAMETERS
- IRP_MJ_SET_EA 的 FLT_PARAMETERS
- IRP_MJ_SET_INFORMATION 的 FLT_PARAMETERS
- IRP_MJ_SET_QUOTA 的 FLT_PARAMETERS
- IRP_MJ_SET_SECURITYFLT_PARAMETERS
- IRP_MJ_SET_VOLUME_INFORMATION 的 FLT_PARAMETERS
- IRP_MJ_SYSTEM_CONTROL 的 FLT_PARAMETERS
- IRP_MJ_VOLUME_MOUNT 的 FLT_PARAMETERS
- IRP_MJ_WRITE 的 FLT_PARAMETERS