FltRequestOperationStatusCallback 函数 (fltkernel.h)

FltRequestOperationStatusCallback 返回给定 I/O 操作的状态信息。

语法

NTSTATUS FLTAPI FltRequestOperationStatusCallback(
  [in]           PFLT_CALLBACK_DATA                 Data,
  [in]           PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine,
  [in, optional] PVOID                              RequesterContext
);

参数

[in] Data

指向回调数据的指针 (I/O 操作 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) 例 程调用的,或者 I/O 操作是IRP_MJ_CLOSE请求。 这是错误代码。

注解

微筛选器驱动程序可以为基于 IRP 的 I/O 操作调用 FltRequestOperationStatusCallback ,以获取 IoCallDriver 为操作返回的状态值。

大多数微筛选器驱动程序永远不需要调用 FltRequestOperationStatusCallback。 通常,微筛选器驱动程序仅调用此例程来确定是否授予了请求的 oplock。

FltRequestOperationStatusCallback 只能从微筛选器驱动程序的预操作回调 (PFLT_PRE_OPERATION_CALLBACK) 例程调用。

只能对基于 IRP 的非IRP_MJ_CLOSE操作调用 FltRequestOperationStatusCallback。 若要确定操作是否是基于 IRP 的操作,请使用 FLT_IS_IRP_OPERATION 宏。

如果基于 IRP 的操作是IRP_MJ_CLOSE请求,则返回STATUS_INVALID_PARAMETER。

FltRequestOperationStatusCallback 将 I/O 参数块的内容 (FLT_IO_PARAMETER_BLOCK) 复制到回调数据的 Iopb 成员 (FLT_CALLBACK_DATA) ,这是筛选器管理器将传递给 CallbackRoutine 参数中指定的例程的回调数据。 复制的数据表示在预操作回调 (PFLT_PRE_OPERATION_CALLBACK) 例程调用 FltRequestOperationStatusCallback 时 I/O 参数块快照。 如果预操作回调例程在调用 FltRequestOperationStatusCallback 后更改 I/O 参数块,则筛选器管理器传递给 CallbackRoutine 的 I/O 参数块将不同于筛选器驱动程序在调用 IoCallDriver 时向下传递驱动程序堆栈的 I/O 参数块。

来自预操作回调例程的以下示例代码演示了这种情况的发生方式:

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)
Library 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