PFLT_POST_OPERATION_CALLBACK回调函数 (fltkernel.h)

微型筛选器驱动程序可以注册一个或多个类型PFLT_POST_OPERATION_CALLBACK例程,以执行 I/O作的完成处理。

语法

PFLT_POST_OPERATION_CALLBACK PfltPostOperationCallback;

FLT_POSTOP_CALLBACK_STATUS PfltPostOperationCallback(
  [in, out]      PFLT_CALLBACK_DATA Data,
  [in]           PCFLT_RELATED_OBJECTS FltObjects,
  [in, optional] PVOID CompletionContext,
  [in]           FLT_POST_OPERATION_FLAGS Flags
)
{...}

参数

[in, out] Data

指向 I/O作 FLT_CALLBACK_DATA 结构的回调数据的指针。

[in] FltObjects

指向筛选器管理器的指针维护 FLT_RELATED_OBJECTS 结构,该结构包含与当前 I/O 请求相关的对象的不透明指针。

[in, optional] CompletionContext

由微型筛选器驱动程序的预作回调 PFLT_PRE_OPERATION_CALLBACK 例程返回的上下文指针。 CompletionContext 指针提供了一种方法,用于将作前回调例程中的信息传达给作后回调例程。

[in] Flags

标志的位掩码,指定如何执行作后回调。

意义
FLTFL_POST_OPERATION_DRAINING 筛选器管理器设置此标志以指示正在分离微型筛选器驱动程序实例,并且正在调用此作后回调例程来清理微型筛选器驱动程序的完成上下文。 作后回调应返回FLT_POSTOP_FINISHED_PROCESSING。 如果设置了此标志,则 数据 参数指向作的原始回调数据结构的副本,而不是原始回调数据结构。 此外,设置此标志时,在 IRQL 调用后回调例程 <= APC_LEVEL。

返回值

此回调例程返回以下状态值之一:

返回代码 描述
FLT_POSTOP_FINISHED_PROCESSING
微型筛选器驱动程序已完成 I/O作的完成处理,并将作的控制返回到筛选器管理器。

作后回调返回此状态值后,筛选器管理器将继续完成 I/O作的处理。

FLT_POSTOP_MORE_PROCESSING_REQUIRED
微型筛选器驱动程序已停止 I/O作的完成处理,但它不会将作的控制返回到筛选器管理器。

仅当微型筛选器驱动程序的作后回调将 I/O作发布到工作队列时,微型筛选器驱动程序的后作回调才能返回此状态值。 微型筛选器驱动程序最终必须恢复 I/O作的完成处理。

在作后回调返回FLT_POSTOP_MORE_PROCESSING_REQUIRED后,筛选器管理器不会对 I/O作执行进一步的完成处理,除非满足以下两个条件:

  • 作后回调已将 I/O作发布到工作队列。
  • 在工作例程对作执行完成处理后,它会调用 FltCompletePendedPostOperation 将作的控制返回到筛选器管理器。
只能为基于 IRP 的 I/O作返回此状态值。 若要确定给定的回调数据结构是否表示基于 IRP 的 I/O作,请使用 FLT_IS_IRP_OPERATION 宏。
FLT_POSTOP_DISALLOW_FSFILTER_IO
微型筛选器驱动程序禁止快速 QueryOpen作,并强制作沿着慢速路径执行作。 这样做会导致 I/O 管理器通过执行文件的打开/查询/关闭来为请求提供服务。 微型筛选器驱动程序应仅返回 QueryOpen 的此状态。

言论

微型筛选器驱动程序的作后回调例程对一个或多个 I/O作执行完成处理。

作后回调例程类似于旧文件系统筛选器驱动程序使用的完成例程。

在 IRQL <= DISPATCH_LEVEL 的任意线程上下文中调用作后回调例程。 由于可以在 IRQL DISPATCH_LEVEL调用此回调例程,因此会受到以下约束:

  • 它无法安全地调用必须在较低 IRQL 上运行的任何内核模式例程。
  • 此例程中使用的任何数据结构都必须从非分页池分配。
  • 无法将其设为可分页。
  • 它无法获取资源、互斥体或快速互斥体。 但是,它可以获取旋转锁。
  • 它无法获取、设置或删除上下文,但可以释放上下文。

需要在 IRQL 中执行的任何 I/O 完成处理 < DISPATCH_LEVEL 都不能直接在作后回调例程中执行。 相反,它必须通过调用例程(如 FltDoCompletionProcessingWhenSafeFltQueueDeferredIoWorkItem)将其发布到工作队列。

请注意,如果作后回调的 标志 参数具有FLTFL_POST_OPERATION_DRAINING位集,则不应调用 FltDoCompletionProcessingWhenSafe。 下面是此规则的例外情况:

  • 如果微型筛选器驱动程序的预作回调例程返回基于 IRP 的 I/O作FLT_PREOP_SYNCHRONIZE,则保证在 IRQL <= APC_LEVEL(与作前回调相同的线程上下文中)调用相应的后作回调例程。
  • 在发起IRP_MJ_CREATE作的线程的上下文中,保证在 IRQL PASSIVE_LEVEL调用创建后回调例程。

微型筛选器驱动程序通过在 FLT_REGISTRATION 结构的 OperationRegistration 数组中存储回调例程,为特定类型的 I/O作注册作后回调例程。 微型筛选器驱动程序将此结构作为参数传递给 FltRegisterFilterDriverEntry 例程。

微型筛选器驱动程序可以为特定类型的 I/O作注册作后回调例程,而无需注册作前回调(PFLT_PRE_OPERATION_CALLBACK)例程,反之亦然。

要求

要求 价值
最低支持的客户端 适用于 SP4、Windows XP SP2、Windows Server 2003 SP1 及更高版本的 Windows作系统Microsoft Windows 2000 更新汇总 1。
目标平台 桌面
标头 fltkernel.h (包括 FltKernel.h)
IRQL 请参阅“备注”部分

另请参阅

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_FASTIO_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_REISSUED_IO

FLT_IS_SYSTEM_BUFFER

FLT_REGISTRATION

FLT_RELATED_OBJECTS

FltCancelFileOpen

FltCompletePendedPostOperation

FltDoCompletionProcessingWhenSafe

FltQueueDeferredIoWorkItem

FltRegisterFilter

FltSetCallbackDataDirty

PFLT_PRE_OPERATION_CALLBACK