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值。
傳回碼 | 描述 |
---|---|
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 管理員藉由執行檔案的開啟/查詢/關閉來服務要求。 迷你篩選驅動程式應該只針對 QueryOpen 傳回此狀態。 |
言論
如需詳細資訊,請參閱 撰寫作業前回呼例程。
迷你篩選的前置作業回呼例程會處理一或多種 I/O 作業類型。 (此回呼例程類似於舊版篩選模型 中的分派例程。
小型篩選程式會藉由將回呼例程的進入點儲存在 FLT_REGISTRATION 結構的 OperationRegistration 陣列中,以註冊特定類型的 I/O 作業預先作業回呼例程。 迷你篩選程式會將這個結構當做參數傳遞至 FltRegisterFilterDriverEntry 例程。 小型篩選程式可以在不註冊後續作業回呼 (PFLT_POST_OPERATION_CALLBACK) 例程的情況下,為指定類型的 I/O 作業註冊前置作業回呼例程,反之亦然。
小型篩選驅動程式的作業前或作業後回呼例程可以修改作業回呼數據結構的內容。 如果這樣做,則必須呼叫 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 值。 這個 NTSTATUS 值不能STATUS_PENDING。 針對清除或關閉作業,它必須是非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 在小型篩選驅動程式呼叫 FltCompletePendedPreOperation之前,不會進一步處理 I/O 作業。
傳回FLT_PREOP_SYNCHRONIZE
如果小型篩選程式的作業前回呼例程傳回FLT_PREOP_SYNCHRONIZE,迷你篩選程式必須註冊作業的對應後續作業回呼。 當這個例程傳回FLT_PREOP_SYNCHRONIZE時,FltMgr 在 IRQL <= APC_LEVEL 目前線程的內容中呼叫迷你篩選器的後續作業回呼。
FLT_PREOP_SYNCHRONIZE應該只針對 IRP 型 I/O 作業傳回。 如果針對不是 IRP 型作業的 I/O 作業傳回,FltMgr 會將這個傳回值視為FLT_PREOP_SUCCESS_WITH_CALLBACK。
小型篩選驅動程式不應該針對建立作業傳回FLT_PREOP_SYNCHRONIZE,因為這些作業已由 FltMgr同步處理。
小型篩選永遠不會傳回異步讀取和寫入作業FLT_PREOP_SYNCHRONIZE。 這樣做可能會嚴重降低迷你篩選驅動程式和系統效能。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Microsoft SP4、Windows XP SP2、Windows Server 2003 SP1 及更新版本的 Windows作系統的 Windows 2000 更新匯總 1。 |
目標平臺 | 桌面 |
標頭 | fltkernel.h (包括 FltKernel.h) |
IRQL | 請參閱一節 |