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 作業。 篩選管理員不會將 I/O 作業傳送至驅動程式堆疊或檔案系統中呼叫端下方的任何迷你篩選驅動程式。 在此情況下,篩選管理員只會呼叫驅動程式堆疊中呼叫端上方迷你篩選驅動程式的後續作業回呼常式。
FLT_PREOP_DISALLOW_FASTIO 此作業是快速的 I/O 作業,而迷你篩選驅動程式不允許用於此作業的快速 I/O 路徑。 篩選管理員不會將快速 I/O 作業傳送至驅動程式堆疊或檔案系統中呼叫端下方的任何迷你篩選驅動程式。 在此情況下,篩選管理員只會呼叫驅動程式堆疊中呼叫端上方迷你篩選驅動程式的後續作業回呼常式。
FLT_PREOP_PENDING 迷你篩選驅動程式已畫筆輸入 I/O 作業,且作業仍然擱置中。 篩選管理員不會進一步處理 I/O 作業,直到迷你篩選驅動程式呼叫 FltCompletePendedPreOperation為止。
FLT_PREOP_SUCCESS_NO_CALLBACK 迷你篩選驅動程式會將 I/O 作業傳回給篩選管理員,以便進一步處理。 在此情況下,篩選管理員不會在 I/O 完成期間呼叫迷你篩選驅動程式的後續作業回呼。
FLT_PREOP_SUCCESS_WITH_CALLBACK 迷你篩選驅動程式會將 I/O 作業傳回給篩選管理員,以便進一步處理。 在此情況下,篩選管理員會在 I/O 完成期間呼叫迷你篩選驅動程式的後續作業回呼。
FLT_PREOP_SYNCHRONIZE 迷你篩選驅動程式會將 I/O 作業傳回給篩選管理員以進行進一步處理,但未完成作業。 在此情況下,篩選管理員會在 IRQL < = APC_LEVEL目前線程的內容中呼叫迷你篩選程式的後續作業回呼。
FLT_PREOP_DISALLOW_FSFILTER_IO 迷你篩選驅動程式不允許快速的 QueryOpen 作業,並強制作業降低速度緩慢的路徑。 這樣做會導致 I/O 管理員藉由執行檔案的開啟/查詢/關閉來服務要求。 Minifilter 驅動程式應該只會傳回 QueryOpen 的這個狀態。

備註

迷你篩選驅動程式的前置作業回呼常式會處理一或多種 I/O 作業類型。 這個回呼常式類似于舊版篩選模型中的分派常式。

迷你篩選驅動程式會藉由將回呼常式儲存在FLT_REGISTRATION結構的OperationRegistration陣列中,為特定類型的 I/O 作業註冊預先作業回呼常式。 迷你篩選驅動程式會將這個結構當做參數傳遞至其DriverEntry常式中的FltRegisterFilter。 迷你篩選驅動程式可以註冊指定類型的 I/O 作業前置作業回呼常式,而不需註冊作業後回 呼 (PFLT_POST_OPERATION_CALLBACK) 常式,反之亦然。

如果此常式傳回FLT_PREOP_COMPLETE,它必須將回呼資料結構的 IoStatus.Status 欄位設定為 I/O 作業的最終 NTSTATUS 值。 無法STATUS_PENDING這個 NTSTATUS 值。 針對清除或關閉作業,它必須是非STATUS_PENDING的成功 NTSTATUS 值,因為清除和關閉作業無法失敗。

如果此常式傳回FLT_PREOP_DISALLOW_FASTIO,它不應該設定回呼資料結構的 IoStatus.Status 欄位,因為篩選管理員會自動將此欄位設定為STATUS_FLT_DISALLOW_FAST_IO。

FLT_PREOP_DISALLOW_FASTIO只能針對快速 I/O 作業傳回。 若要判斷指定的回呼資料結構是否代表快速的 I/O 作業,請使用 FLT_IS_FASTIO_OPERATION 宏。

FLT_PREOP_PENDING只能針對 IRP 型 I/O 作業傳回,因為只有 IRP 型 I/O 作業可以畫筆。 若要判斷指定的回呼資料結構是否代表以 IRP 為基礎的 I/O 作業,請使用 FLT_IS_IRP_OPERATION 宏。

如果迷你篩選驅動程式的前置作業回呼常式傳回FLT_PREOP_SYNCHRONIZE,迷你篩選驅動程式必須已註冊作業的對應後續作業回呼。

FLT_PREOP_SYNCHRONIZE應該只針對 IRP 型 I/O 作業傳回。 如果傳回的 I/O 作業不是以 IRP 為基礎的作業,篩選管理員會將這個傳回值視為FLT_PREOP_SUCCESS_WITH_CALLBACK。

迷你篩選驅動程式不應該傳回建立作業的FLT_PREOP_SYNCHRONIZE,因為這些作業已經由篩選管理員同步處理。

迷你篩選驅動程式絕對不能傳回非同步讀取和寫入作業FLT_PREOP_SYNCHRONIZE。 這樣做可能會嚴重降低迷你篩選驅動程式和系統效能。

迷你篩選驅動程式的前置作業或後續作業回呼常式可以修改作業之回呼資料結構的內容。 如果這樣做,它必須接著呼叫 FltSetCallbackDataDirty,除非它已變更回呼資料結構 IoStatus 欄位的內容。

這個泛型回呼常式的 IRQL 取決於其特定的 IO 路徑。

檔案系統會將檔案結尾的寫入和讀取作業四捨五入到基礎檔案儲存裝置的多個磁區大小。 處理預先讀取或預先寫入作業時,配置和交換緩衝區的篩選需要將配置緩衝區的大小四捨五入到相關聯裝置的多個磁區大小。 如果沒有,從基礎檔案系統傳輸的資料長度將會超過緩衝區的配置長度。 如需交換緩衝區的詳細資訊,請參閱 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
    );


規格需求

   
最低支援的用戶端 適用于 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

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltQueueDeferredIoWorkItem

FltRegisterFilter

FltSetCallbackDataDirty

PFLT_POST_OPERATION_CALLBACK

Flt_CompletionCoNtext_Outptr