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 值,例如以下值之一:
返回代码 | 说明 |
---|---|
|
微筛选器驱动程序的实例正在被拆毁。 这是错误代码。 |
|
FltRequestOperationStatusCallback 遇到池分配失败。 这是错误代码。 |
|
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 |