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呼叫作業後回呼例程。

傳回值

此回呼例程會傳回下列其中一個狀態值:

傳回碼 Description
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 管理員藉由執行檔案的開啟/查詢/關閉來服務要求。 Minifilter 驅動程式應該只會傳回 QueryOpen 的這個狀態。

備註

迷你篩選驅動程式的作業後置回呼例程會針對一或多個 I/O 作業類型執行完成處理。

作業後回呼例程類似於舊版文件系統篩選驅動程式所使用的完成例程。

作業後回呼例程會在任意線程內容中呼叫,在 IRQL <= DISPATCH_LEVEL。 由於此回呼例程可以在 IRQL DISPATCH_LEVEL呼叫,因此受限於下列條件約束:

  • 它無法安全地呼叫必須在較低 IRQL 執行的任何核心模式例程。
  • 此例程中使用的任何數據結構都必須從非分頁集區配置。
  • 無法將它設為可分頁。
  • 它無法取得資源、mutex 或快速 Mutex。 不過,它可以取得微調鎖定。
  • 它無法取得、設定或刪除內容,但可以釋放內容。

必須在 IRQL < 執行的任何 I/O 完成處理DISPATCH_LEVEL都無法直接在後續操作回呼例程中執行。 相反地,它必須藉由呼叫 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 Update 匯總 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