FltDoCompletionProcessingWhenSafe 函数 (fltkernel.h)

如果这样做是安全的, 则 FltDoCompletionProcessingWhenSafe 函数执行微筛选器驱动程序操作后回调例程。

语法

BOOLEAN FLTAPI FltDoCompletionProcessingWhenSafe(
  [in]           PFLT_CALLBACK_DATA           Data,
  [in]           PCFLT_RELATED_OBJECTS        FltObjects,
  [in, optional] PVOID                        CompletionContext,
  [in]           FLT_POST_OPERATION_FLAGS     Flags,
  [in]           PFLT_POST_OPERATION_CALLBACK SafePostCallback,
  [out]          PFLT_POSTOP_CALLBACK_STATUS  RetPostOperationStatus
);

参数

[in] Data

指向 I/O 操作的回调数据结构的指针 (FLT_CALLBACK_DATA) 。 通常,这与传递到操作后回调例程 的数据 指针相同, (PFLT_POST_OPERATION_CALLBACK 调用 FltDoCompletionProcessingWhenSafe 的) 。

[in] FltObjects

指向 I/O 操作 (FLT_RELATED_OBJECTS) 的相关对象结构的指针。 通常,这与传递给调用 FltDoCompletionProcessingWhenSafe 的后操作回调例程的 FltObjects 指针相同。

[in, optional] CompletionContext

指向调用方提供的上下文信息的指针,该信息将传递到 SafePostCallback 参数中指定的回调函数。

[in] Flags

指定完成处理方式的标志的位掩码。 通常,这与传递给调用 FltDoCompletionProcessingWhenSafe 的后操作回调例程的 Flags 值相同。 有关更多信息,请参见下面的“备注”部分。

[in] SafePostCallback

指向调用方提供的 PFLT_POST_OPERATION_CALLBACK类型的回调例程的指针,操作系统在安全时调用该例程。

[out] RetPostOperationStatus

调用方分配的变量,用于接收 I/O 操作的最终状态值。 有关如何设置此参数的详细信息,请参阅以下“备注”部分。

返回值

如果可以立即执行 I/O 操作的完成处理或 I/O 操作已成功发布到工作线程,则 FltDoCompletionProcessingWhenSafe 返回 TRUE;否则,它将返回 FALSE

注解

如果调用方以 IRQL <= APC_LEVEL 运行,则 FltDoCompletionProcessingWhenSafe 立即执行 SafePostCallback。 否则,如果安全地将操作发布到工作线程, 则 SafePostCallback 处理会延迟,直到可以在 IRQL <= APC_LEVEL的线程上下文中调用它。

如果 IRQL < DISPATCH_LEVEL:

  • FltDoCompletionProcessingWhenSafe 立即调用 SafePostCallback 回调例程。
  • RetPostOperationStatus 参数接收 SafePostCallback 返回的FLT_POSTOP_CALLBACK_STATUS值。
  • FltDoCompletionProcessingWhenSafe 返回 TRUE

如果 IRQL >= DISPATCH_LEVEL:

  • FltDoCompletionProcessingWhenSafe 尝试将 I/O 操作发布到工作线程,然后从工作线程调用 SafePostCallback 例程。
  • 如果 I/O 操作可以安全发布:
    • 筛选器管理器将 RetPostOperationStatus 设置为 FLT_POSTOP_MORE_PROCESSING_REQUIRED。
    • FltDoCompletionProcessingWhenSafe 返回 TRUE
  • 如果无法安全发布 I/O 操作:
    • 筛选器管理器将 RetPostOperationStatus 设置为 FLT_POSTOP_FINISHED_PROCESSING。
    • FltDoCompletionProcessingWhenSafe 返回 FALSE

只能对基于 IRP 的操作调用 FltDoCompletionProcessingWhenSafe。 若要确定操作是否是基于 IRP 的操作,请使用 FLT_IS_IRP_OPERATION 宏。

FltDoCompletionProcessingWhenSafe 不能用于将分页 I/O 操作的完成发布到工作线程。

FltDoCompletionProcessingWhenSafe 只能从微筛选器驱动程序的后操作回调例程 (PFLT_POST_OPERATION_CALLBACK) 调用。 请注意,如果后操作回调的 Flags 参数设置了 FLTFL_POST_OPERATION_DRAINING 位,则永远不要调用 FltDoCompletionProcessingWhenSafe

如果微型筛选器调用 FltDoCompletionProcessingWhenSafe ,并且由于在当前线程上下文中调用 SafePostCallback 不安全,因此在工作线程中调用 SafePostCallback 时,只要该微筛选器不从 SafePostCallback 返回FLT_POSTOP_MORE_PROCESSING_REQUIRED,筛选器管理器就会恢复完成处理。

如果微筛选器确实从 SafePostCallback 返回FLT_POSTOP_MORE_PROCESSING_REQUIRED,则微筛选器必须调用 FltCompletePendedPostOperation 以恢复完成处理。

要求

要求
最低受支持的客户端 适用于 SP4、Windows XP SP2、Windows Server 2003 SP1 及更高版本的操作系统的 Microsoft Windows 2000 更新汇总 1。 在 Windows 2000 SP4 和更早版本的操作系统中不可用。
目标平台 通用
标头 fltkernel.h (包括 Fltkernel.h)
Library Fltmgr.lib
IRQL 任何。

另请参阅

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FLT_RELATED_OBJECTS

FltCancelIo

FltCompletePendedPostOperation

PFLT_POST_OPERATION_CALLBACK