структура 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 для следующих типов подпрограмм обратного вызова:
- PFLT_POST_OPERATION_CALLBACK
- PFLT_PRE_OPERATION_CALLBACK
- PFLT_COMPLETED_ASYNC_IO_CALLBACK
- PFLT_GENERATE_FILE_NAME
Подпрограммы обратного вызова минифильтра перед операцией и после операции могут изменять содержимое структуры 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) |
См. также раздел
IRP_MJ_INTERNAL_DEVICE_CONTROL
IRP_MJ_QUERY_VOLUME_INFORMATION
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по