共用方式為


撰寫後置回呼常式

檔案系統迷你篩選驅動程式會使用一或多個 後置回呼常式 來篩選 I/O 作業。

後置回呼常式可以採取下列其中一個動作:

  • 直接在後置作業常式中完成工作。 所有完成工作都可以在 IRQL < = DISPATCH_LEVEL完成。
  • 在安全的 IRQL 完成工作。 傳回FLT_STATUS_MORE_PROCESSING_REQUIRED並將背景工作執行緒排入佇列,以允許在安全的 IRQL 進行處理。 處理完成時,背景工作執行緒會呼叫 FltCompletePendedPostOperation 以繼續後續處理。
  • 取消成功的 CREATE 作業。

後置回呼常式 類似于舊版檔案系統篩選驅動程式中使用的 完成常式

迷你篩選驅動程式會以註冊預先操作回呼常式的方式,為特定類型的 I/O 作業註冊後置回呼常式,亦即,將回呼常式的進入點儲存在其DriverEntry常式中,以將回呼常式的OperationRegistrationFLT_REGISTRATION成員儲存在其 DriverEntry 常式中作為參數傳遞至FltRegisterFilter

迷你篩選驅動程式只會接收已註冊預先操作或後置操作回呼常式的 I/O 作業類型。 迷你篩選驅動程式可以註冊指定類型 I/O 作業的預先操作回呼常式,而不註冊後置回呼,反之亦然。

每個後置回呼常式的定義如下:

typedef FLT_POSTOP_CALLBACK_STATUS 
(*PFLT_POST_OPERATION_CALLBACK) ( 
    IN OUT PFLT_CALLBACK_DATA Data, 
    IN PCFLT_RELATED_OBJECTS FltObjects, 
    IN PVOID CompletionContext, 
    IN FLT_POST_OPERATION_FLAGS Flags 
    ); 

如同完成常式,在任意執行緒內容中,IRQL < = DISPATCH_LEVEL呼叫後置回呼常式。

因為它可以在 IRQL = DISPATCH_LEVEL呼叫,所以後置回呼常式無法呼叫必須在較低 IRQL 呼叫的核心模式常式,例如 FltLockUserBufferRtlCompareUnicodeString。 基於相同的理由,在後置回呼常式中使用的任何資料結構都必須從非分頁集區配置。

下列情況是上述規則的數個例外狀況:

  • 如果迷你篩選驅動程式的預先操作回呼常式針對 IRP 型 I/O 作業傳回FLT_PREOP_SYNCHRONIZE,則會在 IRQL < = APC_LEVEL呼叫對應的後置回呼常式,與預先操作回呼常式位於相同的執行緒內容中。

  • 在與預先操作回呼常式相同的執行緒內容中,會在 IRQL = PASSIVE_LEVEL 呼叫快速 I/O 作業的後置回呼常式。

  • 在產生IRP_MJ_CREATE作業的執行緒內容中,會在 IRQL = PASSIVE_LEVEL 呼叫建立後回呼常式。

當篩選管理員針對指定的 I/O 作業呼叫迷你篩選驅動程式的後置回呼常式時,迷你篩選驅動程式會暫時控制 I/O 作業。 迷你篩選驅動程式會保留此控制項,直到執行下列其中一項:

  • 從後置回呼常式傳回FLT_POSTOP_FINISHED_PROCESSING。

  • 從工作常式呼叫 FltCompletePendedPostOperation ,該常式已處理在後置回呼常式中寫入的 IRP 型 I/O 作業。

本節包括:

執行 I/O 作業的完成處理

擱置後置回呼常式中的 I/O 作業

在 Postoperation 回呼常式中失敗 I/O 作業