撰寫後置回呼常式
檔案系統迷你篩選驅動程式會使用一或多個 後置回呼常式 來篩選 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 呼叫的核心模式常式,例如 FltLockUserBuffer 或 RtlCompareUnicodeString。 基於相同的理由,在後置回呼常式中使用的任何資料結構都必須從非分頁集區配置。
下列情況是上述規則的數個例外狀況:
如果迷你篩選驅動程式的預先操作回呼常式針對 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 作業。
本節包括: