FLT_PARAMETERS для объединения IRP_MJ_DEVICE_CONTROL и IRP_MJ_INTERNAL_DEVICE_CONTROL
Компонент объединения используется, когда поле MajorFunction структуры FLT_IO_PARAMETER_BLOCK для операции 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: длина (в байтах) буфера, на который указывают члены Noer.OutputBuffer, Direct.OutputBuffer или FastIo.OutputBuffer .
InputBufferLength: длина (в байтах) буфера, на который указывают члены Noer.InputBuffer, Buffered.SystemBuffer, Direct.InputSystemBuffer или FastIo.InputBuffer .
IoControlCode: код функции IOCTL, передаваемый драйверу устройства для целевого устройства. Подробные сведения о запросах IOCTL см. в разделах Использование кодов управления вводом-выводом и "Коды управления вводом и выводом устройства" в документации по Microsoft Windows SDK. (Этот ресурс может быть недоступен для некоторых языков и стран.)
Ни то, ни: компонент объединения используется, когда метод буферизации METHOD_NEITHER. Дополнительные сведения о методах буферизации см. в разделе Определение кодов элементов управления ввода-вывода в руководстве по архитектуре режима ядра.
Noer.InputBuffer: виртуальный адрес входного буфера в пользовательском режиме, предоставленный исходной инициатором запроса операции. Диспетчер операций ввода-вывода и диспетчер фильтров не проверяют эти адреса. Чтобы обеспечить допустимость адресов пространства пользователя, минифильтр должен использовать подпрограммы, такие как ProbeForRead, ProbeForWrite и FltLockUserBuffer, заключая все ссылки на буфер в блоки try/кроме . Дополнительные сведения см. в статье Использование не буферизованного и прямого ввода-вывода и ошибок при ссылке на адреса User-Space.
Noer.OutputBuffer: виртуальный адрес выходного буфера в пользовательском режиме, предоставленный исходной инициатором запроса операции. Диспетчер операций ввода-вывода и диспетчер фильтров не проверяют эти адреса. Чтобы обеспечить допустимость адресов пространства пользователя, минифильтр должен использовать подпрограммы, такие как ProbeForRead, ProbeForWrite и FltLockUserBuffer, заключая все ссылки на буфер в блоки try/кроме . Дополнительные сведения см. в разделе Использование не только буферизованного, но и прямого ввода-вывода и ошибок в статье Ссылки на адреса User-Space в руководстве по архитектуре режима ядра.
Noer.OutputMdlAddress: адрес списка дескрипторов памяти (MDL), описывающего буфер, на который указывает член Neither.OutputBuffer . Этот член является необязательным и может иметь значение NULL.
Buffered : компонент объединения, используемый, когда метод буферизации METHOD_BUFFERED. Дополнительные сведения о методах буферизации см. в разделе Определение кодов управления вводом-выводом.
Buffered.SystemBuffer: адрес буфера, выделенного системой для операции. В METHOD_BUFFERED ввода-вывода этот буфер используется как для входных, так и для выходных данных. Дополнительные сведения см. в разделе Методы для доступа к буферам данных.
Direct: компонент объединения, используемый, когда метод буферизации METHOD_IN_DIRECT или METHOD_OUT_DIRECT. Дополнительные сведения о методах буферизации см. в разделе Определение кодов управления вводом-выводом.
Direct.InputSystemBuffer: адрес входного буфера для операции. Этот буфер блокируется операционной системой, чтобы к нему был безопасный доступ из режима ядра. Дополнительные сведения см. в разделе Методы для доступа к буферам данных.
Direct.OutputBuffer: виртуальный адрес выходного буфера в пользовательском режиме, предоставленный исходным инициатором запроса операции. В случае прямого ввода-вывода, в отличие от METHOD_NEITHER ввода-вывода, операционная система блокирует этот буфер, чтобы обеспечить безопасный доступ из режима ядра, если минифильтр находится в том же контексте процесса, что и исходный инициатор запроса операции ввода-вывода. (В противном случае необходимо вызвать MmGetSystemAddressForMdlSafe , чтобы получить системный адрес из списка дескрипторов памяти (MDL), на который указывает элемент OutputMdlAddress .) Дополнительные сведения см. в разделе Использование прямого ввода-вывода и ошибки в прямом вводе-выводе.
Direct.OutputMdlAddress: адрес MDL, описывающий буфер, на который указывает член Direct.OutputBuffer . Этот элемент является обязательным и не может иметь значение NULL.
FastIo: компонент объединения, используемый, когда структура FLT_CALLBACK_DATA представляет быструю операцию ввода-вывода IRP_MJ_DEVICE_CONTROL.
FastIo.InputBuffer: виртуальный адрес входного буфера в пользовательском режиме, предоставленный исходным инициатором запроса операции. Диспетчер операций ввода-вывода и диспетчер фильтров не проверяют эти адреса. Чтобы обеспечить допустимость адресов пространства пользователя, минифильтр должен использовать подпрограммы, такие как ProbeForRead, ProbeForWrite и FltLockUserBuffer, заключая все ссылки на буфер в блоки try/кроме . Дополнительные сведения см. в разделе Ошибки при ссылке на адреса User-Space.
FastIo.OutputBuffer: виртуальный адрес выходного буфера в пользовательском режиме, предоставленный исходной инициатором запроса операции. Диспетчер операций ввода-вывода и диспетчер фильтров не проверяют эти адреса. Чтобы обеспечить допустимость адресов пространства пользователя, минифильтр должен использовать подпрограммы, такие как ProbeForRead, ProbeForWrite и FltLockUserBuffer, заключая все ссылки на буфер в блоки try/кроме . Дополнительные сведения см. в разделе Ошибки при ссылке на адреса User-Space.
Комментарии
Структура FLT_PARAMETERS для операций IRP_MJ_DEVICE_CONTROL и IRP_MJ_INTERNAL_DEVICE_CONTROL содержит параметры для операции управления устройством и выводом на основе IRP, представленную структурой данных обратного вызова (FLT_CALLBACK_DATA). Он содержится в структуре FLT_IO_PARAMETER_BLOCK .
IRP_MJ_DEVICE_CONTROL может быть операцией на основе IRP или быстрой операцией ввода-вывода.
IRP_MJ_INTERNAL_DEVICE_CONTROL — это операция ввода-вывода на основе IRP.
Требования
Тип требования | Требование |
---|---|
Заголовок | Fltkernel.h (включая Fltkernel.h) |