Функция FltDecodeParameters (fltkernel.h)
FltDecodeParameters возвращает указатели на адрес списка дескрипторов памяти (MDL), указатель буфера, длину буфера и требуемые параметры доступа для операции ввода-вывода. Это избавляет драйверы минифильтра от использования инструкции switch для поиска позиции этих параметров во вспомогательных подпрограммах, которые обращаются к MDL-адресу, указателю буфера, длине буфера и требуемому доступу для нескольких типов операций.
Синтаксис
NTSTATUS FLTAPI FltDecodeParameters(
[in] PFLT_CALLBACK_DATA CallbackData,
[out] PMDL **MdlAddressPointer,
[out] PVOID **Buffer,
[out] PULONG *Length,
[out, optional] LOCK_OPERATION *DesiredAccess
);
Параметры
[in] CallbackData
Указатель на структуру данных обратного вызова (FLT_CALLBACK_DATA) для операции ввода-вывода.
[out] MdlAddressPointer
Указатель на переменную, предоставленную вызывающей стороны, которая получает указатель на элемент MdlAddress (или OutputMdlAddress) структуры параметра данных обратного вызова (FLT_PARAMETERS) (обратите внимание, что этот элемент сам является указателем). Этот параметр является необязательным и может иметь значение NULL. Если операция ввода-вывода не имеет поля MDL, этот параметр получает значение NULL.
[out] Buffer
Указатель на переменную, предоставляемую вызывающим объектом, которая получает указатель на соответствующий член буфера (в зависимости от основного кода функции) в структуре параметров данных обратного вызова (обратите внимание, что этот элемент сам по себе является указателем).
[out] Length
Указатель на переменную, предоставляемую вызывающим объектом, которая получает указатель на элемент длины буфера в структуре параметров данных обратного вызова. Если операция не имеет поля длины, этот параметр получает значение NULL.
[out, optional] DesiredAccess
Указатель на переменную, предоставляемую вызывающей стороны, которая получает тип доступа, соответствующий этому типу операций ввода-вывода, например IoReadAccess, IoWriteAccess или IoModifyAccess. IoReadAccess означает, что драйвер минифильтра может проверять содержимое буфера, но не может изменять содержимое на месте. IoWriteAccess и IoModifyAccess, которые эквивалентны, означают, что драйвер минифильтра имеет доступ на чтение и запись к буферу.
Возвращаемое значение
FltDecodeParameters возвращает STATUS_SUCCESS или соответствующее значение NTSTATUS, например следующее:
Код возврата | Описание |
---|---|
STATUS_INVALID_PARAMETER | Структура данных обратного вызова (FLT_CALLBACK_DATA) представляет операцию ввода-вывода без параметров буфера. Это код ошибки. |
Комментарии
FltDecodeParameters возвращает указатели на параметры для операции ввода-вывода, а не значения параметров, чтобы вызывающий объект при необходимости смог изменить значения параметров.
FltDecodeParameters можно использовать для быстрых операций ввода-вывода, а также для операций на основе IRP. Он не имеет смысла для операций обратного вызова фильтра файловой системы (FSFilter), так как эти операции не имеют параметров буфера.
Операции IOCTL и FSCTL могут иметь один или два буфера в зависимости от используемого метода буферизации. В случаях, когда операция содержит два буфера (и два поля длины), FltDecodeParameters возвращает поля OutputBuffer, OutputBufferLength и (или ) OutputMdlAddress соответствующим образом.
Не все четыре параметра возвращаются для каждой операции ввода-вывода. Например, для запроса IRP_MJ_READ FltDecodeParameters задает выходные параметры следующим образом.
Параметр | Значение |
---|---|
MdlAddressPointer | &(CallbackData-Iopb-Parameters.Read.MdlAddress>>) |
Буфер | &(CallbackData-Iopb-Parameters.Read.ReadBuffer>>) |
Длина | &(CallbackData-Iopb-Parameters.Read.Length>>) |
DesiredAccess | IoWriteAccess |
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Верхняя часть | fltkernel.h (включая Fltkernel.h) |
Библиотека | FltMgr.lib |
IRQL | Любой уровень |