структура 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 | Операция связана с главным 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 структуры данных обратного вызова для операции. В противном случае измененные значения игнорируются.
Когда диспетчер фильтров выполняет обратный вызов мини-фильтра перед операцией или после операции, fltObject-FileObject> и TargetFileObject (CallbackData-Iopb-TargetFileObject>>) изначально совпадают. Если минифильтр изменяет TargetFileObject или TargetInstance, его последующий вызов FltSetCallbackDataDirty из обратного вызова перед операцией приведет к тому, что диспетчер фильтров заменит FltObjects-FileObject> и 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_PARAMETERS для IRP_MJ_ACQUIRE_FOR_MOD_WRITE
- FLT_PARAMETERS для IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION
- FLT_PARAMETERS для IRP_MJ_CREATE
- FLT_PARAMETERS для IRP_MJ_CREATE_MAILSLOT
- FLT_PARAMETERS для IRP_MJ_CREATE_NAMED_PIPE
- FLT_PARAMETERS для IRP_MJ_DEVICE_CONTROL
- FLT_PARAMETERS для IRP_MJ_DIRECTORY_CONTROL
- FLT_PARAMETERS для IRP_MJ_FAST_IO_CHECK_IF_POSSIBLE
- FLT_PARAMETERS для IRP_MJ_FILE_SYSTEM_CONTROL
- FLT_PARAMETERS для IRP_MJ_INTERNAL_DEVICE_CONTROL
- FLT_PARAMETERS для IRP_MJ_LOCK_CONTROL
- FLT_PARAMETERS для IRP_MJ_MDL_READ
- FLT_PARAMETERS для IRP_MJ_MDL_READ_COMPLETE
- FLT_PARAMETERS для IRP_MJ_MDL_WRITE_COMPLETE
- FLT_PARAMETERS для IRP_MJ_NETWORK_QUERY_OPEN
- FLT_PARAMETERS для IRP_MJ_PNP
- FLT_PARAMETERS для IRP_MJ_PREPARE_MDL_WRITE
- FLT_PARAMETERS для IRP_MJ_QUERY_EA
- FLT_PARAMETERS для IRP_MJ_QUERY_INFORMATION
- FLT_PARAMETERS для IRP_MJ_QUERY_OPEN
- FLT_PARAMETERS для IRP_MJ_QUERY_QUOTA
- FLT_PARAMETERS для IRP_MJ_QUERY_SECURITY
- FLT_PARAMETERS для IRP_MJ_QUERY_VOLUME_INFORMATION
- FLT_PARAMETERS для IRP_MJ_READ
- FLT_PARAMETERS для IRP_MJ_RELEASE_FOR_MOD_WRITE
- FLT_PARAMETERS для IRP_MJ_RELEASE_FOR_SECTION_SYNCHRONIZATION
- FLT_PARAMETERS для IRP_MJ_SET_EA
- FLT_PARAMETERS для IRP_MJ_SET_INFORMATION
- FLT_PARAMETERS для IRP_MJ_SET_QUOTA
- FLT_PARAMETERS для IRP_MJ_SET_SECURITY
- FLT_PARAMETERS для IRP_MJ_SET_VOLUME_INFORMATION
- FLT_PARAMETERS для IRP_MJ_SYSTEM_CONTROL
- FLT_PARAMETERS для IRP_MJ_VOLUME_MOUNT
- FLT_PARAMETERS для IRP_MJ_WRITE