Функция 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, например одно из следующих значений:

Код возврата Описание
STATUS_FLT_DELETING_OBJECT
Экземпляр драйвера минифильтра сносится. Это код ошибки.
STATUS_INSUFFICIENT_RESOURCES
FltRequestOperationStatusCallback обнаружил сбой выделения пула. Это код ошибки.
STATUS_INVALID_PARAMETER
Метод 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

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

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_IRP_OPERATION

FLT_RELATED_OBJECTS

IoCallDriver

PFLT_GET_OPERATION_STATUS_CALLBACK

PFLT_PRE_OPERATION_CALLBACK