IRP_MJ_DEVICE_CONTROL和IRP_MJ_INTERNAL_DEVICE_CONTROL联盟的FLT_PARAMETERS
当操作的FLT_IO_PARAMETER_BLOCK结构的 MajorFunction 字段IRP_MJ_DEVICE_CONTROL或IRP_MJ_INTERNAL_DEVICE_CONTROL时使用的联合组件。
语法
typedef union _FLT_PARAMETERS {
... ;
union {
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT IoControlCode;
} Common;
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT IoControlCode;
PVOID InputBuffer;
PVOID OutputBuffer;
PMDL OutputMdlAddress;
} Neither;
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT IoControlCode;
PVOID SystemBuffer;
} Buffered;
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT IoControlCode;
PVOID InputSystemBuffer;
PVOID OutputBuffer;
PMDL OutputMdlAddress;
} Direct;
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT IoControlCode;
PVOID InputBuffer;
PVOID OutputBuffer;
} FastIo;
} DeviceIoControl;
... ;
} FLT_PARAMETERS, *PFLT_PARAMETERS;
成员
常见:用于所有缓冲方法的联合组件 (“非缓冲”、“ 缓冲”和 “FastIo) ”。
OutputBufferLength:非.OutputBuffer、Direct.OutputBuffer 或 FastIo.OutputBuffer 成员指向的缓冲区的长度(以字节为单位)。
InputBufferLength:非.InputBuffer、Buffered.SystemBuffer、Direct.InputSystemBuffer 或 FastIo.InputBuffer 成员指向的缓冲区的长度(以字节为单位)。
IoControlCode:要传递给目标设备的设备驱动程序的 IOCTL 函数代码。 有关 IOCTL 请求的详细信息,请参阅Microsoft Windows SDK文档中的“使用 I/O 控制代码”和“设备输入和输出控制代码”。 (此资源可能在某些语言和国家/地区不可用。)
两者都不是:METHOD_NEITHER缓冲方法时使用的联合组件。 有关缓冲方法的详细信息,请参阅内核模式体系结构指南中的定义 I/O 控制代码。
不是。InputBuffer:操作的原始请求者提供的输入缓冲区的用户模式虚拟地址。 I/O 管理器和筛选器管理器不会验证这些地址。 若要确保用户空间地址有效,微筛选器必须使用 ProbeForRead、 ProbeForWrite 和 FltLockUserBuffer 等例程,将所有缓冲区引用包含在 try/除外 块中。 有关详细信息,请参阅在引用 User-Space 地址中使用非缓冲 I/O 和直接 I/O 和错误。
不是。OutputBuffer:操作的原始请求者提供的输出缓冲区的用户模式虚拟地址。 I/O 管理器和筛选器管理器不会验证这些地址。 若要确保用户空间地址有效,微筛选器必须使用 ProbeForRead、 ProbeForWrite 和 FltLockUserBuffer 等例程,将所有缓冲区引用包含在 try/除外 块中。 有关详细信息,请参阅内核模式体系结构指南中的引用 User-Space 地址中的“使用非缓冲 I/O 和直接 I/O 和错误”。
None.OutputMdlAddress:内存描述符列表的地址 (MDL) ,用于描述 Noneer.OutputBuffer 成员指向的缓冲区。 此成员是可选的,可以为 NULL。
缓冲:METHOD_BUFFERED缓冲方法时使用的联合组件。 有关缓冲方法的详细信息,请参阅 定义 I/O 控制代码。
Buffered.SystemBuffer:系统为操作分配的缓冲区的地址。 在METHOD_BUFFERED I/O 中,此缓冲区用于输入和输出。 有关详细信息,请参阅 访问数据缓冲区的方法。
直接:METHOD_IN_DIRECT或METHOD_OUT_DIRECT缓冲方法时使用的联合组件。 有关缓冲方法的详细信息,请参阅 定义 I/O 控制代码。
Direct.InputSystemBuffer:操作的输入缓冲区的地址。 此缓冲区由操作系统锁定,以便从内核模式进行安全访问。 有关详细信息,请参阅 访问数据缓冲区的方法。
Direct.OutputBuffer:操作的原始请求者提供的输出缓冲区的用户模式虚拟地址。 在直接 I/O 中,与 METHOD_NEITHER I/O 不同,操作系统会锁定此缓冲区,以便从内核模式进行安全访问,只要微筛选器与 I/O 操作的原始请求者位于同一进程上下文中。 (否则,它必须调用 MmGetSystemAddressForMdlSafe ,从内存描述符列表 (MDL) OutputMdlAddress 成员指向的系统地址。) 有关详细信息,请参阅 使用直接 I/O 和 直接 I/O 中的错误。
Direct.OutputMdlAddress:描述 Direct.OutputBuffer 成员指向的缓冲区的 MDL 的地址。 此成员是必需的,不能为 NULL。
FastIo: FLT_CALLBACK_DATA 结构表示快速 I/O IRP_MJ_DEVICE_CONTROL操作时使用的联合组件。
FastIo.InputBuffer:操作的原始请求者提供的输入缓冲区的用户模式虚拟地址。 I/O 管理器和筛选器管理器不会验证这些地址。 若要确保用户空间地址有效,微筛选器必须使用 ProbeForRead、 ProbeForWrite 和 FltLockUserBuffer 等例程,将所有缓冲区引用包含在 try/除外 块中。 有关详细信息,请参阅 引用 User-Space 地址中的错误。
FastIo.OutputBuffer:操作的原始请求者提供的输出缓冲区的用户模式虚拟地址。 I/O 管理器和筛选器管理器不会验证这些地址。 若要确保用户空间地址有效,微筛选器必须使用 ProbeForRead、 ProbeForWrite 和 FltLockUserBuffer 等例程,将所有缓冲区引用包含在 try/除外 块中。 有关详细信息,请参阅 引用 User-Space 地址中的错误。
注解
IRP_MJ_DEVICE_CONTROL和IRP_MJ_INTERNAL_DEVICE_CONTROL操作的FLT_PARAMETERS结构包含基于 IRP 的设备 I/O 控制信息操作的参数,该操作由回调数据 (FLT_CALLBACK_DATA) 结构表示。 它包含在 FLT_IO_PARAMETER_BLOCK 结构中。
IRP_MJ_DEVICE_CONTROL可以是基于 IRP 的操作,也可以是快速 I/O 操作。
IRP_MJ_INTERNAL_DEVICE_CONTROL是基于 IRP 的 I/O 操作。
要求
要求类型 | 要求 |
---|---|
标头 | Fltkernel.h (包括 Fltkernel.h) |