Функция 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
Указатель на подпрограмму обратного вызова, которую диспетчер фильтров вызывает после возврата IoCallDrive r. Этот параметр является обязательным и не может быть null.
[in, optional] RequesterContext
Указатель контекста, передаваемый в CallbackRoutine. Этот параметр является необязательным и может быть null.
Возвращаемое значение
FltRequestOperationStatusCallback возвращает STATUS_SUCCESS или соответствующее значение NTSTATUS, например одно из следующих:
Возвращаемый код | Описание |
---|---|
|
Экземпляр драйвера минифильтра отключается. Это код ошибки. |
|
FltRequestOperationStatusCallback возникла ошибка выделения пула. Это код ошибки. |
|
FltRequestOperationStatusCallback был вызван из подпрограммы, которая не была подпрограммой обратного вызова (PFLT_PRE_OPERATION_CALLBACK), или операция ввода-вывода была IRP_MJ_CLOSE запроса. Это код ошибки. |
Замечания
Драйвер мини-фильтра может вызывать FltRequestOperationStatusCall back для операции ввода-вывода на основе IRP, чтобы получить значение состояния, которое IoCallDriver возвращено для операции.
Большинство драйверов минифильтра никогда не должны вызывать FltRequestOperationStatusCallback. Как правило, драйвер минифильтра вызывает эту процедуру, чтобы определить, был ли предоставлен запрошенный оплок.
fltRequestOperationStatusCallback можно вызывать только из подпрограммы предварительного вызова драйвера минифильтратора (PFLT_PRE_OPERATION_CALLBACK) .
FltRequestOperationStatusCallback можно вызывать только для операций, отличных от IRP_MJ_CLOSE IRP. Чтобы определить, является ли операция операцией на основе IRP, используйте макрос FLT_IS_IRP_OPERATION.
Если операция на основе IRP является запросом IRP_MJ_CLOSE, возвращается STATUS_INVALID_PARAMETER.
FltRequestOperationStatusCallback копирует содержимое блока параметров ввода-вывода (FLT_IO_PARAMETER_BLOCK) в элемент Iopb элемента данных обратного вызова (FLT_CALLBACK_DATA), и это данные обратного вызова, которые диспетчер фильтров передает в подпрограмму, указанную в параметре CallbackRoutine. Скопированные данные представляют моментальный снимок блока параметров ввода-вывода во время вызова предварительного вызова (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 (include Fltkernel.h) |
библиотеки | Fltmgr.lib |
DLL | Fltmgr.sys |
IRQL | <= APC_LEVEL |