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 结构 成员 标志复制这些标志。 下表显示了最常用的标志值。
价值 | 意义 |
---|---|
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 结构包含由回调数据(FLT_CALLBACK_DATA)结构表示的 I/O作的参数。 回调数据结构包含指向其 Iopb 成员中FLT_IO_PARAMETER_BLOCK结构的指针。
微型筛选器接收指向回调数据结构的指针作为 数据 或 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 和 保留 成员。 如果这样做,则必须调用 FltSetCallbackDataDirty,除非它还修改了作回调数据结构的 IoStatus 成员。 否则,将忽略修改的值。
当筛选器管理器向微型筛选器发出预作或作后回调时,FltObjects->FileObject 和 TargetFileObject(CallbackData->Iopb->TargetFileObject)最初相同。 如果微筛选器修改 TargetFileObject 或 TargetInstance,则随后从 pre 调用 FltSetCallbackDataDirty作回调将导致筛选器管理器在将作发送到较低筛选器之前替换 FltObjects->FileObject 和 FltObjects ->实例。
如果微型筛选器的预作回调例程修改 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作没有支持函数时,微型筛选器才应分配自己的回调数据。
要求
要求 | 价值 |
---|---|
标头 | 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_CONTROL的FLT_PARAMETERS
- IRP_MJ_INTERNAL_DEVICE_CONTROL的FLT_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_EA的FLT_PARAMETERS
- IRP_MJ_QUERY_INFORMATIONFLT_PARAMETERS
- IRP_MJ_QUERY_OPEN的FLT_PARAMETERS
- IRP_MJ_QUERY_QUOTA的FLT_PARAMETERS
- IRP_MJ_QUERY_SECURITY的FLT_PARAMETERS
- IRP_MJ_QUERY_VOLUME_INFORMATION的FLT_PARAMETERS
- IRP_MJ_READ的FLT_PARAMETERS
- IRP_MJ_RELEASE_FOR_MOD_WRITEFLT_PARAMETERS
- FLT_PARAMETERS for IRP_MJ_RELEASE_FOR_SECTION_SYNCHRONIZATION
- IRP_MJ_SET_EA的FLT_PARAMETERS
- IRP_MJ_SET_INFORMATION的FLT_PARAMETERS
- IRP_MJ_SET_QUOTA的FLT_PARAMETERS
- IRP_MJ_SET_SECURITY的FLT_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