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 时,它将传入指向旧缓冲区而不是新缓冲区的指针。

筛选器管理器在 IRQL <= APC_LEVEL 发起线程的上下文中调用给定的 CallbackRoutine

要求

   
目标平台 通用
标头 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