微篩選器驅動程式調用 FltCheckOplock 以將基於 IRP 的檔 I/O作的回調數據結構與檔的當前機會鎖 (oplock) 狀態同步。
語法
FLT_PREOP_CALLBACK_STATUS FLTAPI FltCheckOplock(
[in] POPLOCK Oplock,
[in] PFLT_CALLBACK_DATA CallbackData,
[in, optional] PVOID Context,
[in, optional] PFLTOPLOCK_WAIT_COMPLETE_ROUTINE WaitCompletionRoutine,
[in, optional] PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE PrePostCallbackDataRoutine
);
參數
[in] Oplock
檔案的不透明不透明指標。 此指標必須由先前呼叫 FltInitializeOplock初始化。
[in] CallbackData
I/O 作業的回呼資料 (FLT_CALLBACK_DATA) 結構的指標。
[in, optional] Context
要傳遞至 waitCompletionRoutine WaitCompletionRoutine 和 PrePostCallbackDataRoutine 指向之回呼例程的呼叫端定義內容資訊的指標。 篩選管理員會將這項信息視為不透明。
[in, optional] WaitCompletionRoutine
呼叫端提供的回呼例程指標。 如果作業鎖定中斷正在進行中,篩選管理員會在 oplock 中斷完成時呼叫此例程。 這個參數是選擇性的,而且可以是 NULL。 如果為 NULL,則調用方將進入等待狀態,直到 oplock 中斷完成。
此例程宣告如下:
typedef VOID
(*PFLTOPLOCK_WAIT_COMPLETE_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
地點:
CallbackData 是指向 I/O作的 FLT_CALLBACK_DATA 結構的指標。
Context 是在 Context 參數中傳遞給 FltCheckOplock 的上下文資訊指標。
[in, optional] PrePostCallbackDataRoutine
如果 I/O 作業張貼至工作佇列,則會呼叫呼叫端提供的回呼例程指標。 這個參數是選擇性的,而且可以是 NULL。
此例程宣告如下:
typedef VOID
(*PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
地點:
CallbackData 是指向 I/O作的 FLT_CALLBACK_DATA 結構的指標。
Context 是在 Context 參數中傳遞給 FltCheckOplock 的上下文資訊指標。
返回值
FltCheckOplock 返回以下 FLT_PREOP_CALLBACK_STATUS 代碼之一:
| 回傳碼 | 說明 |
|---|---|
| FLT_PREOP_COMPLETE | FltCheckOplock 遇到池分配失敗,或者對 FsRtlCheckOplock 函數的調用返回錯誤。 FltCheckOplock 將在 FLT_CALLBACK_DATA 回調數據結構的 IoStatus 成員的 IO_STATUS_BLOCK 結構的 Status 成員中設置錯誤代碼。 CallbackData 參數指向此FLT_CALLBACK_DATA。 |
| FLT_PREOP_PENDING | 已起始 oplock 中斷,導致篩選管理員將 I/O 作業張貼至工作佇列。 I/O 作業是由 CallbackData 參數所指向的回呼數據表示。 |
| FLT_PREOP_SUCCESS_NO_CALLBACK | 立即執行 I/O作。 請注意,如果此作是在 create-options 參數中指定了 FILE_COMPLETE_IF_OPLOCKED 的創建作,則實際上可能存在正在進行的 oplock 中斷,即使該作已立即執行。 若要確定是否是這種情況,調用方應檢查 FLT_CALLBACK_DATA 回調數據結構的IoStatus成員的IO_STATUS_BLOCK結構的 Status 成員中的狀態。 |
備註
微篩選器驅動程式調用 FltCheckOplock ,根據以下條件將基於 IRP 的 I/O作與文件的當前 oplock 狀態同步:
如果 I/O 作業會導致 oplock 中斷,則會起始 oplock 中斷。
如果 I/O作在 oplock 中斷完成之前無法繼續, 則 FltCheckOplock 將返回 FLT_PREOP_PENDING 並調用 PrePostCallbackDataRoutine 參數指向的回調例程。
如果微篩選器驅動程式使用 oplock,則必須從任何作前回調 (PFLT_PRE_OPERATION_CALLBACK) 例程調用 FltCheckOplock,以便執行可能導致 oplock 中斷的 I/O作。 此規則適用於下列類型的 I/O 作業,因為這些作業可能會導致 oplock 中斷:
- IRP_MJ_CLEANUP
- IRP_MJ_CREATE
- IRP_MJ_文件系統控制
- IRP_MJ_FLUSH_BUFFERS
- IRP_MJ_LOCK_CONTROL
- IRP_MJ_READ
- IRP_MJ_SET_INFORMATION (設定資訊)
- IRP_MJ_WRITE(寫入操作)
- IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION
I/O 作業必須是 IRP 型 I/O 作業。 若要判斷指定的回呼數據結構是否代表 IRP 型 I/O 作業,請使用 FLT_IS_IRP_OPERATION 巨集。
微篩選器不得在 WaitCompletionRoutine 中指定的回調中再次調用 FltCheckOplock。 如果 oplock 包在 FltCheckOplock 返回之前調用完成回調,則這樣做可能會導致死鎖情況。
如需機會鎖定的詳細資訊,請參閱Microsoft Windows SDK 檔。
需求
| 要求 | 價值觀 |
|---|---|
| 目標平臺 | 普遍 |
| 頁首 | fltkernel.h (包括 Fltkernel.h) |
| IRQL | <= APC_LEVEL |
另請參閱
FSCTL_OPBATCH_ACK_CLOSE_PENDING