PFLT_PRE_OPERATION_CALLBACK回呼函式 (fltkernel.h)
迷你篩選驅動程式 的PFLT_PRE_OPERATION_CALLBACK 例程會針對I/O作業執行前置作業處理。
語法
PFLT_PRE_OPERATION_CALLBACK PfltPreOperationCallback;
FLT_PREOP_CALLBACK_STATUS PfltPreOperationCallback(
[in, out] PFLT_CALLBACK_DATA Data,
[in] PCFLT_RELATED_OBJECTS FltObjects,
[out] PVOID *CompletionContext
)
{...}
參數
[in, out] Data
I/O 作業的回呼數據 指標 (FLT_CALLBACK_DATA) 結構。
[in] FltObjects
FLT_RELATED_OBJECTS 結構的指標,其中包含與目前 I/O 要求相關的物件不透明指標。
[out] CompletionContext
如果這個回呼例程傳回FLT_PREOP_SUCCESS_WITH_CALLBACK或FLT_PREOP_SYNCHRONIZE,這個參數是選擇性的內容指標,要傳遞至對應的作業後回呼例程。 否則,它必須是 NULL。
傳回值
這個回呼例程會傳回下列其中一個FLT_PREOP_CALLBACK_STATUS值。
傳回碼 | Description |
---|---|
FLT_PREOP_COMPLETE | 迷你篩選器正在完成 I/O 作業。 如需詳細資訊,請參閱。 |
FLT_PREOP_DISALLOW_FASTIO | 此作業是快速的 I/O 作業,而迷你篩選器不允許用於此作業的快速 I/O 路徑。 如需詳細資訊,請參閱。 |
FLT_PREOP_PENDING | 迷你篩選器已畫筆輸入 I/O 作業,且作業仍然擱置中。 如需詳細資訊,請參閱。 |
FLT_PREOP_SUCCESS_NO_CALLBACK | 迷你篩選程式會將 I/O 作業傳回 給 FltMgr 以進一步處理。 在此情況下, FltMgr 不會在 I/O 完成期間呼叫迷你篩選驅動程式的後續作業回呼。 |
FLT_PREOP_SUCCESS_WITH_CALLBACK | 迷你篩選程式會將 I/O 作業傳回 給 FltMgr 以進一步處理。 在此情況下, FltMgr 會在 I/O 完成期間呼叫迷你篩選器的後續作業回呼。 |
FLT_PREOP_SYNCHRONIZE | 迷你篩選器會將 I/O 作業傳回 給 FltMgr 以進行進一步處理,但未完成作業。 如需詳細資訊,請參閱。 |
FLT_PREOP_DISALLOW_FSFILTER_IO | 迷你篩選器不允許快速的 QueryOpen 作業,並強制作業降低速度緩慢的路徑。 這樣做會導致 I/O 管理員藉由執行檔案的開啟/查詢/關閉來服務要求。 Minifilter 驅動程式應該只會傳回 QueryOpen 的這個狀態。 |
備註
如需詳細資訊 ,請參閱撰寫作業前回呼例程 。
迷你篩選的前置作業回呼例程會處理一或多種 I/O 作業類型。 (此回呼 例程類似於舊版篩選模型中的分派例程。)
迷你篩選會藉由將回呼例程儲存在 FLT_REGISTRATION 結構的 OperationRegistration 陣列中,為特定類型的 I/O 作業註冊前置作業回呼例程。 minifilter 會將此結構當做參數傳遞至 DriverEntry 例程中的 FltRegisterFilter。 迷你篩選器可以註冊指定類型的 I/O 作業前置作業回呼例程,而不需註冊作業後回呼 (PFLT_POST_OPERATION_CALLBACK) 例程,反之亦然。
迷你篩選驅動程式的前置作業或後續作業回呼例程可以修改作業之回呼數據結構的內容。 如果這樣做,它必須接著呼叫 FltSetCallbackDataDirty,除非它已變更回呼數據結構 IoStatus 字段的內容。
這個泛型回呼例程的 IRQL 取決於其特定的 IO 路徑。 如果您需要知道目前的 IRQL,您可以快速且便宜地呼叫 KeGetCurrentIRQL 。 如需 IRQL 的其他資訊,請參閱 撰寫作業前回呼例程 。
檔系統會將檔案結尾的寫入和讀取作業進位到基礎檔案儲存裝置的多個扇區大小。 處理預先讀取或預先寫入作業時,配置和交換緩衝區的篩選需要將配置緩衝區的大小四捨五入到相關聯裝置的多個扇區大小。 如果沒有,從基礎文件系統傳輸的數據長度將會超過緩衝區的配置長度。 如需交換緩衝區的詳細資訊,請參閱 SwapBuffers Minifilter 範例。
從 Windows 8 開始,CompletionContext 會使用Flt_CompletionContext_Outptr註釋,根據作業結果定義有效的內容值。 以下是 具有 CompletionContext 註釋之回呼的使用範例。
FLT_PREOP_CALLBACK_STATUS
SwapPreReadBuffers(
_Inout_ PFLT_CALLBACK_DATA Data,
_In_ PCFLT_RELATED_OBJECTS FltObjects,
_Flt_CompletionContext_Outptr_ PVOID *CompletionContext
);
傳回FLT_PREOP_COMPLETE
如果此例程傳回FLT_PREOP_COMPLETE,它必須將回呼數據結構的 IoStatus.Status 字段設定為I/O作業的最終NTSTATUS值。 無法STATUS_PENDING這個NTSTATUS值。 針對清除或關閉作業,它必須是非STATUS_PENDING的成功NTSTATUS值,因為清除和關閉作業無法失敗。
當此例程傳回FLT_PREOP_COMPLETE時, FltMgr 不會將 I/O 作業傳送至驅動程式堆疊或文件系統中呼叫端下方的任何迷你篩選驅動程式。 在此情況下, FltMgr 只會呼叫驅動程式堆疊中呼叫端上方迷你篩選驅動程式的後續作業回呼例程。
傳回FLT_PREOP_DISALLOW_FASTIO
如果此例程傳回FLT_PREOP_DISALLOW_FASTIO,它不應該設定回呼數據結構的 IoStatus.Status 字段,因為 FltMgr 會自動將此字段設定為STATUS_FLT_DISALLOW_FAST_IO。
FLT_PREOP_DISALLOW_FASTIO只能針對快速 I/O 作業傳回。 若要判斷指定的回呼數據結構是否代表快速的 I/O 作業,請使用 FLT_IS_FASTIO_OPERATION 宏。
當此例程傳回FLT_PREOP_DISALLOW_FASTIO時, FltMgr 不會將快速 I/O 作業傳送至驅動程式堆疊或檔案系統中呼叫端下方的任何迷你篩選驅動程式。 在此情況下, FltMgr 只會呼叫驅動程式堆疊中呼叫端上方迷你篩選驅動程式的後續作業回呼例程。
傳回FLT_PREOP_PENDING
FLT_PREOP_PENDING只能針對 IRP 型 I/O 作業傳回,因為只有 IRP 型 I/O 作業可以畫筆。 若要判斷指定的回呼數據結構是否代表以 IRP 為基礎的 I/O 作業,請使用 FLT_IS_IRP_OPERATION 宏。
當此例程傳回FLT_PREOP_PENDING時, FltMgr 將不會進一步處理 I/O 作業,直到迷你篩選驅動程式呼叫 FltCompletePendedPreOperation 為止。
傳回FLT_PREOP_SYNCHRONIZE
如果迷你篩選器的前置作業回呼例程傳回FLT_PREOP_SYNCHRONIZE,迷你篩選程序必須註冊作業的對應後作業回呼。 當這個例程傳回FLT_PREOP_SYNCHRONIZE時, FltMgr 會在 IRQL <= APC_LEVEL的目前線程內容中呼叫迷你篩選器的後續作業回呼。
FLT_PREOP_SYNCHRONIZE應該只針對 IRP 型 I/O 作業傳回。 如果傳回的 I/O 作業不是以 IRP 為基礎的作業, FltMgr 會將這個傳回值視為FLT_PREOP_SUCCESS_WITH_CALLBACK。
Minifilter 驅動程式不應該傳回建立作業的FLT_PREOP_SYNCHRONIZE,因為這些作業已經由 FltMgr 同步處理。
迷你篩選絕對不能針對異步讀取和寫入作業傳回FLT_PREOP_SYNCHRONIZE。 這樣做可能會嚴重降低迷你篩選驅動程式和系統效能。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | 適用於 SP4、Windows XP SP2、Windows Server 2003 SP1 和更新版本的 Windows 操作系統的 Microsoft Windows 2000 Update 匯總 1。 |
目標平台 | 桌面 |
標頭 | fltkernel.h (包括 FltKernel.h) |
IRQL | 請參閱一節 |