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。 如果设置了此标志, 则 Data 参数指向操作的原始回调数据结构的副本,而不是原始回调数据结构的副本。 此外,设置此标志时,会在 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 < DISPATCH_LEVEL 执行的任何 I/O 完成处理都不能直接在操作后回调例程中执行。 相反,必须通过调用 FltDoCompletionProcessingWhenSafeFltQueueDeferredIoWorkItem 等例程将其发布到工作队列。

请注意,如果后操作回调的 Flags 参数设置了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 操作注册操作后 回调 例程。 微筛选器驱动程序将此结构作为参数传递给其 DriverEntry 例程中的 FltRegisterFilter

微筛选器驱动程序可以为特定类型的 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