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)例程调用。

FltRequestOperationStatusCallback 只能为基于 IRP 的非IRP_MJ_CLOSE作调用。 若要确定作是否为基于 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)
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