Поделиться через


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)

См. также раздел

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_FASTIO_OPERATION

FLT_IS_FS_FILTER_OPERATION

FLT_IS_IRP_OPERATION

FLT_PARAMETERS

FltDeviceIoControlFile

FltLockUserBuffer

IoBuildDeviceIoControlRequest

IRP_MJ_DEVICE_CONTROL

IRP_MJ_INTERNAL_DEVICE_CONTROL

MmGetSystemAddressForMdlSafe

MmProbeAndLockPages

ProbeForRead

ProbeForWrite

ZwDeviceIoControlFile