структура FLT_IO_PARAMETER_BLOCK (fltkernel.h)

Структура FLT_IO_PARAMETER_BLOCK содержит параметры для операции ввода-вывода, представленной структурой данных FLT_CALLBACK_DATA обратного вызова.

Синтаксис

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

Битовая маска флагов, задающая различные аспекты операции ввода-вывода. Эти флаги используются только для операций на основе IRP. В следующей таблице показаны значения флагов.

Значение Значение
IRP_BUFFERED_IO Операция представляет собой операцию буферизованного ввода-вывода.
IRP_CLOSE_OPERATION Операция является операцией очистки или закрытия.
IRP_DEALLOCATE_BUFFER Диспетчер ввода-вывода освободит буфер на этапе завершения IRP.
IRP_INPUT_OPERATION Операция является операцией ввода.
IRP_NOCACHE Операция является операцией ввода-вывода без кэширования.
IRP_PAGING_IO Операция представляет собой операцию разбиения операций ввода-вывода по страницам.
IRP_SYNCHRONOUS_API Операция ввода-вывода является синхронной.
IRP_SYNCHRONOUS_PAGING_IO Операция представляет собой синхронную операцию разбиения операций ввода-вывода по страницам.
IRP_MOUNT_COMPLETION Подключение тома для операции завершено.
IRP_CREATE_OPERATION Операция представляет собой операцию создания или открытия.
IRP_READ_OPERATION Операция ввода-вывода предназначена для чтения.
IRP_WRITE_OPERATION Операция ввода-вывода используется для записи.
IRP_DEFER_IO_COMPLETION Выполнение операции ввода-вывода откладывается.
IRP_ASSOCIATED_IRP Операция связана с master IRP.
IRP_OB_QUERY_NAME Операция представляет собой асинхронный запрос имени.
IRP_HOLD_DEVICE_QUEUE Зарезервировано.
IRP_UM_DRIVER_INITIATED_IO Операция была выполнена из драйвера пользовательского режима.

MajorFunction

Код основной функции для операции ввода-вывода. Основные коды функций используются для операций на основе IRP, быстрых операций ввода-вывода и операций обратного вызова файловой системы (FSFilter). Дополнительные сведения о дополнительных операциях см . в разделе FLT_PARAMETERS.

MinorFunction

Дополнительный код функции для операции ввода-вывода. Этот элемент является необязательным и может иметь значение NULL. Значение элемента MajorFunction определяет возможные значения. Дополнительные сведения о дополнительных кодах функций см. в разделе FLT_PARAMETERS.

OperationFlags

Битовая маска флагов, задающая различные аспекты операции ввода-вывода. Эти флаги используются только для операций на основе IRP. Диспетчер фильтров копирует эти флаги из элемента Flagsструктуры IO_STACK_LOCATION , связанной с IRP. В следующей таблице показаны наиболее часто используемые значения флагов.

Значение Значение
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. Если этот флаг установлен, проверка доступа должна выполняться, даже если значение элемента RequestorMode IRP равно 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 установлен для объекта устройства тома.
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

Указатель на файл или каталог, который является целевым объектом для этой операции ввода-вывода.

TargetInstance

Непрозрачный указатель экземпляра для минифильтра, который является целевым объектом для этой операции ввода-вывода.

Parameters

Структура FLT_PARAMETERS , содержащая параметры для операции ввода-вывода, указанные членами MajorFunction и MinorFunction .

Комментарии

Структура FLT_IO_PARAMETER_BLOCK содержит параметры для операции ввода-вывода, представленную структурой данных обратного вызова (FLT_CALLBACK_DATA). Структура данных обратного вызова содержит указатель на структуру FLT_IO_PARAMETER_BLOCK в члене Iopb .

Минифильтр получает указатель на структуру данных обратного вызова в качестве входного параметра Data или CallbackData для следующих типов подпрограмм обратного вызова:

Подпрограммы обратного вызова минифильтра перед операцией и после операции могут изменять содержимое структуры FLT_IO_PARAMETER_BLOCK операции ввода-вывода, за исключением элементов MajorFunction и Reserved . Если это так, он должен вызвать FltSetCallbackDataDirty, если только он не изменил элемент IoStatus структуры данных обратного вызова для операции. В противном случае измененные значения игнорируются.

Когда диспетчер фильтров выполняет обратный вызов мини-фильтра перед операцией или после операции, FltObjects-FileObject> и TargetFileObject (CallbackData-Iopb-TargetFileObject>>) изначально совпадают. Если минифильтр изменяет TargetFileObject или TargetInstance, его последующий вызов FltSetCallbackDataDirty из обратного вызова перед операцией приведет к тому, что диспетчер фильтров заменит FltObjects-FileObjects> и FltObjects-Instance> перед отправкой операции в более низкие фильтры.

Если подпрограмма обратного вызова минифильтра перед операцией ввода-вывода изменяет параметры операции ввода-вывода, все минифильтры под ним в стеке экземпляров минифильтра будут получать измененные параметры в подпрограммах обратного вызова перед операцией и после операции.

Измененные параметры не получаются собственной подпрограммой обратного вызова после операции минифильтра или любыми минифильтрами над этим минифильтром в стеке экземпляров минифильтра. Во всех случаях подпрограммы обратного вызова минифильтра до операции и после операции получают одинаковые входные значения параметров.

Если минифильтр изменяет значение элемента TargetInstance , новое значение должно быть указателем на экземпляр того же минифильтра на той же высоте на другом томе. Кроме того, объект устройства нового тома должен иметь размер стека, который больше или равен размеру объекта устройства исходного тома.

Чтобы получить размер стека для объекта устройства тома, учитывая непрозрачный указатель на экземпляр, подключенный к тому, выполните следующие действия.

  • Вызовите метод FltGetVolumeFromInstance , чтобы получить указатель тома.
  • Вызовите Метод FltGetDeviceObject , чтобы получить указатель на объект устройства тома. Этот указатель возвращается в параметре DeviceObject . Размер стека объекта устройства можно найти в разделе DeviceObject-StackSize>.
  • Если указатель тома больше не требуется, вызовите Метод FltObjectDereference , чтобы уменьшать количество ссылок.
  • Если указатель объекта устройства тома больше не требуется, вызовите ObDereferenceObject , чтобы уменьшать его количество ссылок.

Минифильтр может изменять значение элемента TargetFileObject . Однако новое значение должно быть указателем на объект файла для файла, который находится на том же томе, что и экземпляр, указанный элементом TargetInstance .

Минифильтр не может безопасно изменить значение члена MajorFunction . Вместо этого он должен инициировать новую операцию ввода-вывода.

Минифильтр может инициировать операцию ввода-вывода, вызвав подпрограмму поддержки , например FltReadFile , или метод FltAllocateCallbackData для выделения структуры данных обратного вызова; инициализация параметров ввода-вывода в структуре FLT_IO_PARAMETER_BLOCK и передача структуры данных обратного вызова в FltPerformSynchronousIo или FltPerformAsynchronousIo.

Примечание

Используйте подпрограммы поддержки везде, где это возможно, при инициации операций ввода-вывода. Минифильтр должен выделять собственные данные обратного вызова, только если не существует функции поддержки для конкретной операции ввода-вывода.

Требования

Требование Значение
Заголовок fltkernel.h (включая Fltkernel.h)

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

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FLT_PARAMETERS

FltAllocateCallbackData

FltClearCallbackDataDirty

FltDecodeParameters

FltIsCallbackDataDirty

FltReadFile

FltSetCallbackDataDirty

IO_STACK_LOCATION

IRP

IRP_MJ_CLEANUP

IRP_MJ_CLOSE

IRP_MJ_CREATE

IRP_MJ_DEVICE_CONTROL

IRP_MJ_DIRECTORY_CONTROL

IRP_MJ_FILE_SYSTEM_CONTROL

IRP_MJ_FLUSH_BUFFERS

IRP_MJ_INTERNAL_DEVICE_CONTROL

IRP_MJ_LOCK_CONTROL

IRP_MJ_PNP

IRP_MJ_QUERY_EA

IRP_MJ_QUERY_INFORMATION

IRP_MJ_QUERY_QUOTA

IRP_MJ_QUERY_SECURITY

IRP_MJ_QUERY_VOLUME_INFORMATION

IRP_MJ_READ

IRP_MJ_SET_EA

IRP_MJ_SET_INFORMATION

IRP_MJ_SET_QUOTA

IRP_MJ_SET_SECURITY

IRP_MJ_SET_VOLUME_INFORMATION

IRP_MJ_SHUTDOWN

IRP_MJ_WRITE

PFLT_COMPLETED_ASYNC_IO_CALLBACK

PFLT_GENERATE_FILE_NAME

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK