作FLT_IO_PARAMETER_BLOCK结构的MajorFunction 字段IRP_MJ_FILE_SYSTEM_CONTROL时使用的联合组件。
语法
typedef union _FLT_PARAMETERS {
... ;
union {
struct {
PVPB Vpb;
PDEVICE_OBJECT DeviceObject;
} VerifyVolume;
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT FsControlCode;
} Common;
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT FsControlCode;
PVOID InputBuffer;
PVOID OutputBuffer;
PMDL OutputMdlAddress;
} Neither;
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT FsControlCode;
PVOID SystemBuffer;
} Buffered;
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT FsControlCode;
PVOID InputSystemBuffer;
PVOID OutputBuffer;
PMDL OutputMdlAddress;
} Direct;
} FileSystemControl;
... ;
} FLT_PARAMETERS, *PFLT_PARAMETERS;
成员
FileSystemControl:包含以下成员的结构。
VerifyVolume:用于IRP_MN_VERIFY_VOLUME作的联合组件。
Vpb:指向要验证的卷的卷参数块(VPB)的指针。
DeviceObject:指向要验证卷的设备对象的指针。
常见:用于IRP_MN_KERNEL_CALL和IRP_MN_USER_FS_REQUEST作的所有缓冲方法的联合组件。
Common.OutputBufferLength:既不指向.OutputBuffer 或 Direct.OutputBuffer 成员指向的缓冲区的长度(以字节为单位)。
Common.InputBufferLength:既不.InputBuffer、Buffered.SystemBuffer 或 Direct.InputSystemBuffer 成员指向的缓冲区的长度(以字节为单位)。
Common.FsControlCode:要传递给目标设备的文件系统、文件系统筛选器或微型筛选器驱动程序的 FSCTL 函数代码。
有关 IOCTL 和 FSCTL 请求的详细信息,请参阅 Microsoft Windows SDK 文档中的内核模式体系结构指南中的“使用 I/O 控制代码”和“设备输入和输出控制代码”。 (此资源或许不提供某些语言版本,或在某些国家或地区可能不可用。)
这两者都没有:缓冲方法METHOD_NEITHER缓冲方法时用于IRP_MN_KERNEL_CALL和IRP_MN_USER_FS_REQUEST作的联合组件。 有关缓冲方法的详细信息,请参阅 定义 I/O 控制代码。
无论是.InputBuffer:作的原始请求者提供的输入缓冲区的用户模式虚拟地址。 I/O 管理器和筛选器管理器不会验证这些地址。 为了确保用户空间地址有效,微型筛选器必须使用 ProbeForRead、 ProbeForWrite 和 MmProbeAndLockPages 等例程,并将所有缓冲区引用括在 try/except 块中。 有关详细信息,请参阅引用 User-Space 地址中的“未缓冲”和“直接 I/O”和“错误”。
Neither.OutputBuffer:作的原始请求者提供的输出缓冲区的用户模式虚拟地址。 I/O 管理器和筛选器管理器不会验证这些地址。 为了确保用户空间地址有效,微型筛选器必须使用 ProbeForRead、 ProbeForWrite 和 MmProbeAndLockPages 等例程,并将所有缓冲区引用括在 try/except 块中。 有关详细信息,请参阅引用 User-Space 地址中的“未缓冲”和“直接 I/O”和“错误”。 Noneer.OutputBuffer 是可选的,如果在 Noneer.OutputMdlAddress 中提供了 MDL,则可以为 NULL。 请参阅 “备注”。
Neither.OutputMdlAddress:内存描述符列表(MDL)的地址,该列表描述符描述符列表(MDL)描述了 Noneer.OutputBuffer 成员指向的缓冲区。 此成员是可选的,如果在 Neither.OutputBuffer 中提供了缓冲区,则可以为 NULL。
缓冲:缓冲方法METHOD_BUFFERED时用于IRP_MN_KERNEL_CALL和IRP_MN_USER_FS_REQUEST作的联合组件。 有关缓冲方法的详细信息,请参阅 定义 I/O 控制代码。
Buffered.SystemBuffer:作的系统分配缓冲区的地址。 在METHOD_BUFFERED I/O 中,此缓冲区用于输入和输出。 有关详细信息,请参阅 访问数据缓冲区的方法。
直接:缓冲方法METHOD_IN_DIRECT或METHOD_OUT_DIRECT时用于IRP_MN_KERNEL_CALL和IRP_MN_USER_FS_REQUEST作的联合组件。 有关缓冲方法的详细信息,请参阅内核模式体系结构指南中的定义 I/O 控制代码。
Direct.InputSystemBuffer:作的输入缓冲区的地址。 此缓冲区由作系统锁定,以便从内核模式进行安全访问。 有关详细信息,请参阅 访问数据缓冲区的方法。
Direct.OutputBuffer:作的原始请求者提供的输出缓冲区的用户模式虚拟地址。 在直接 I/O 中,与METHOD_NEITHER I/O 不同,作系统会锁定此缓冲区,以便只要微型筛选器与 I/O作的原始请求者位于同一进程上下文中,就能够安全地从内核模式访问。 (否则,它必须调用 MmGetSystemAddressForMdlSafe 从 OutputMdlAddress 成员指向的 MDL 获取系统地址。有关详细信息,请参阅 在直接 I/O 中使用直接 I/O 和 错误。
Direct.OutputMdlAddress:用于描述 Direct.OutputBuffer 成员指向的缓冲区的内存描述符列表(MDL)的地址。 此成员是必需的,不能 NULL。
注解
IRP_MJ_FILE_SYSTEM_CONTROL作的FLT_PARAMETERS结构包含由回调数据(FLT_CALLBACK_DATA)结构表示的文件系统控制信息作的参数。 它包含在 FLT_IO_PARAMETER_BLOCK 结构中。
如果同时提供 None.OutputBuffer 和 None.MdlAddress 缓冲区,则建议使用 MDL。
如果微型筛选器更改 了 None.MdlAddress 的值,则在其后作回调后,筛选器管理器将释放当前存储在 Noneer.MdlAddress 中的 MDL ,并还原 Neither.MdlAddress 以前的值。
IRP_MJ_FILE_SYSTEM_CONTROL是基于 IRP 的作。
要求
要求类型 | 要求 |
---|---|
标题 | Fltkernel.h (包括 Fltkernel.h) |