Функция FltRequestOperationStatusCallback (fltkernel.h)
FltRequestOperationStatusCallback возвращает сведения о состоянии для заданной операции ввода-вывода.
Синтаксис
NTSTATUS FLTAPI FltRequestOperationStatusCallback(
[in] PFLT_CALLBACK_DATA Data,
[in] PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine,
[in, optional] PVOID RequesterContext
);
Параметры
[in] Data
Указатель на структуру данных обратного вызова (FLT_CALLBACK_DATA) для операции ввода-вывода. Этот параметр является обязательным и не может иметь значение NULL.
[in] CallbackRoutine
Указатель на подпрограмму обратного вызова, которую диспетчер фильтров вызывает после возврата IoCallDriver . Этот параметр является обязательным и не может иметь значение NULL.
[in, optional] RequesterContext
Указатель контекста, передаваемый в CallbackRoutine. Этот параметр является необязательным и может иметь значение NULL.
Возвращаемое значение
FltRequestOperationStatusCallback возвращает STATUS_SUCCESS или соответствующее значение NTSTATUS, например одно из следующих значений:
Код возврата | Описание |
---|---|
|
Экземпляр драйвера минифильтра сносится. Это код ошибки. |
|
FltRequestOperationStatusCallback обнаружил сбой выделения пула. Это код ошибки. |
|
Метод FltRequestOperationStatusCallback был вызван из подпрограммы, которая не была подпрограммой обратного вызова перед операцией (PFLT_PRE_OPERATION_CALLBACK), или операция ввода-вывода была IRP_MJ_CLOSE запросом. Это код ошибки. |
Комментарии
Драйвер мини-фильтра может вызывать FltRequestOperationStatusCallback для операции ввода-вывода на основе IRP, чтобы получить значение состояния, возвращенное IoCallDriver для операции.
Большинству драйверов мини-фильтра никогда не требуется вызывать FltRequestOperationStatusCallback. Как правило, драйвер минифильтра вызывает эту процедуру только для определения того, была ли предоставлена запрошенная блокировка.
Метод FltRequestOperationStatusCallback можно вызвать только из процедуры обратного вызова драйвера мини-фильтра (PFLT_PRE_OPERATION_CALLBACK).
FltRequestOperationStatusCallback можно вызывать только для операций на основе IRP, не являющихся IRP_MJ_CLOSE. Чтобы определить, является ли операция операцией на основе IRP, используйте макрос FLT_IS_IRP_OPERATION .
Если операция на основе IRP является запросом IRP_MJ_CLOSE, возвращается STATUS_INVALID_PARAMETER.
FltRequestOperationStatusCallback копирует содержимое блока параметров ввода-вывода (FLT_IO_PARAMETER_BLOCK) в элемент Iopb данных обратного вызова (FLT_CALLBACK_DATA), и это данные обратного вызова, которые диспетчер фильтров передает подпрограмме, указанной в параметре CallbackRoutine . Скопированные данные представляют собой snapshot блока параметров ввода-вывода в то время, когда подпрограмма обратного вызова перед операцией (PFLT_PRE_OPERATION_CALLBACK) вызывает FltRequestOperationStatusCallback. Если подпрограмма обратного вызова перед операцией изменяет блок параметров ввода-вывода после вызова FltRequestOperationStatusCallback, блок параметров ввода-вывода, который диспетчер фильтров передает в CallbackRoutine , будет отличаться от блока параметров ввода-вывода, который драйвер фильтра передает в стек драйверов при вызове IoCallDriver.
В следующем примере кода из подпрограммы обратного вызова перед операции показано, как это может произойти:
PFLT_CALLBACK_DATA Data;
PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine;
PVOID RequesterContext;
...
if (iopb->MajorFunction == IRP_MJ_READ) {
FltRequestOperationStatusCallback (Data, CallbackRoutine, RequesterContext);
Data->Iopb->Parameters.Read.ReadBuffer = newBuffer;
...
}
В этом примере буфер чтения изменяется после вызова FltRequestOperationStatusCallback, поэтому, когда диспетчер фильтров вызывает CallbackRoutine, он передает указатель на старый буфер, а не на новый.
Диспетчер фильтров вызывает заданную callbackRoutine в контексте исходного потока в IRQL <= APC_LEVEL.
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Верхняя часть | fltkernel.h (включая Fltkernel.h) |
Библиотека | Fltmgr.lib |
DLL | Fltmgr.sys |
IRQL | <= APC_LEVEL |