共用方式為


FltCheckOplockEx 函式 (fltkernel.h)

小型篩選驅動程式會呼叫 FltCheckOplockEx 例程,以同步處理 IRP 型檔案 I/O 作業的回呼數據結構,該作業具有檔案目前的機會鎖定 (oplock) 狀態。

語法

FLT_PREOP_CALLBACK_STATUS FLTAPI FltCheckOplockEx(
  [in]           POPLOCK                                 Oplock,
  [in]           PFLT_CALLBACK_DATA                      CallbackData,
  [in]           ULONG                                   Flags,
  [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] Flags

相關聯檔案 I/O 作業的位掩碼。 迷你篩選驅動程式會設定位,以指定 FltCheckOplockEx的行為。 Flags 參數具有下列選項:

OPLOCK_FLAG_COMPLETE_IF_OPLOCKED(0x00000001)

允許機會鎖定中斷繼續,而不會封鎖或擱置造成 oplock 中斷的作業。

OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY (0x00000002)

指定 FltCheckOplockEx 應該只檢查與 I/O 作業相關聯之FILE_OBJECT上的機會鎖定密鑰。 此 I/O 作業是由 CallbackData 參數指向的回呼數據表示。 FltCheckOplockEx 必須在 I/O 作業中提供金鑰時新增金鑰。 不會發生其他 oplock 處理;也就是說,不會發生機會性鎖定中斷。

OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK (0x00000004)

指定 FsRtlCheckOplockEx 應該還原先前透過呼叫 FltOplockFsctrl 例程設定的任何狀態。 處理IRP_MJ_CREATE要求時,會呼叫 FltOplockFsctrl。 此IRP_MJ_CREATE要求會指定 create options 參數中的FILE_OPEN_REQUIRING_OPLOCK旗標。 OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK旗標通常會在先前失敗時,用於這類建立要求的最終處理中。

OPLOCK_FLAG_IGNORE_OPLOCK_KEYS (0x00000008)

允許所有機會鎖定中斷繼續進行,而不論機會鎖定密鑰為何。

[in, optional] Context

要傳遞至 waitCompletionRoutine WaitCompletionRoutinePrePostCallbackDataRoutine 指向之回呼例程的呼叫端定義內容資訊的指標。 篩選管理員會將這項信息視為不透明。

[in, optional] WaitCompletionRoutine

呼叫端提供的回呼例程指標。 如果作業鎖定中斷正在進行中,篩選管理員會在 oplock 中斷完成時呼叫此例程。 這個參數是選擇性的,而且可以 NULL。 如果它 NULL,則呼叫端會進入等候狀態,直到 oplock 中斷完成為止。

此例程宣告如下:

typedef VOID
(*PFLTOPLOCK_WAIT_COMPLETE_ROUTINE) (
      IN PFLT_CALLBACK_DATA CallbackData,
      IN PVOID Context
      );

此例程具有下列參數:

CallbackData

I/O 作業之回呼數據結構的指標。

附註,當呼叫 WaitCompleteRoutine 時,IoStatus 子結構可能會填入失敗狀態(例如STATUS_CANCELLED)。 您應該檢查此狀態並適當地做出反應。

上下文

傳遞至 Context 參數的內容資訊指標,FltCheckOplockEx

[in, optional] PrePostCallbackDataRoutine

如果 I/O 作業張貼至工作佇列,則會呼叫呼叫端提供的回呼例程指標。 這個參數是選擇性的,而且可以 NULL

此例程宣告如下:

typedef VOID
(*PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE) (
      IN PFLT_CALLBACK_DATA CallbackData,
      IN PVOID Context
      );

CallbackData

I/O 作業之回呼數據結構的指標。

上下文

傳遞至 Context 參數的內容資訊指標,FltCheckOplockEx

傳回值

FltCheckOplockEx 會傳回下列其中一個FLT_PREOP_CALLBACK_STATUS碼:

傳回碼 描述
FLT_PREOP_COMPLETE
FltCheckOplockEx 發生集區配置失敗,或呼叫 FsRtlCheckOplockEx 函式傳回錯誤。 FltCheckOplockEx 會在 FLT_CALLBACK_DATA 回呼數據結構之 IoStatusIO_STATUS_BLOCK 成員的 Status 成員中設定錯誤碼。 CallbackData 參數指向這個FLT_CALLBACK_DATA結構。
FLT_PREOP_PENDING
已起始 oplock 中斷,導致篩選管理員將 I/O 作業張貼至工作佇列。 I/O 作業是由 CallbackData 參數所指向的回呼數據表示。
FLT_PREOP_SUCCESS_WITH_CALLBACK
CallbackData 參數所指向的回呼數據未寫入,而且會立即執行 I/O 作業。 請注意,如果在 Flags 參數中指定OPLOCK_FLAG_COMPLETE_IF_OPLOCKED呼叫端,即使 I/O 作業未加上筆跡,oplock 中斷可能仍進行中。 若要判斷情況是否為這種情況,呼叫端應該檢查 狀態 IO_STATUS_BLOCK FLT_CALLBACK_DATA 回呼數據結構之 IoStatus 成員 成員中的STATUS_OPLOCK_BREAK_IN_PROGRESS。

言論

小型篩選驅動程式會呼叫 FltCheckOplockEx,以根據下列條件同步處理以 IRP 為基礎的 I/O 作業與檔案目前的 oplock 狀態:

  • 如果 I/O 作業會導致 oplock 中斷,則會起始 oplock 中斷。

  • 如果 I/O 作業在 oplock 中斷完成之前無法繼續,FltCheckOplockEx 會傳回FLT_PREOP_PENDING,並呼叫 PrePostCallbackDataRoutine 參數指向的回呼例程。

  • 如果迷你篩選驅動程式使用 oplocks,它必須針對可能導致 oplock 中斷的 I/O 作業,從任何預先操作回呼 (PFLT_PRE_OPERATION_CALLBACK) 例程 呼叫 fltCheckOplockEx。 此規則適用於下列類型的 I/O 作業,因為這些作業可能會導致 oplock 中斷:

    • IRP_MJ_CLEANUP

    • IRP_MJ_CREATE

    • IRP_MJ_FILE_SYSTEM_CONTROL

    • IRP_MJ_FLUSH_BUFFERS

    • IRP_MJ_LOCK_CONTROL

    • IRP_MJ_READ

    • IRP_MJ_SET_INFORMATION

    • IRP_MJ_WRITE

I/O 作業必須是 IRP 型 I/O 作業。 若要判斷指定的回呼數據結構是否代表 IRP 型 I/O 作業,請使用 FLT_IS_IRP_OPERATION 巨集。

Minifilters 不得在 WaitCompletionRoutine中指定的回呼 內再次呼叫 FltCheckOplockEx。 如果 oplock 套件在 FltCheckOplockEx 傳回之前呼叫完成回呼,則這樣做可能會導致死結狀況。

如需機會鎖定的詳細資訊,請參閱 Microsoft Windows SDK 檔。

要求

要求 價值
最低支援的用戶端 從 Windows 7 開始,即可使用 FltCheckOplockEx 例程。
目標平臺 普遍
標頭 fltkernel.h (包括 Fltkernel.h)
連結庫 FltMgr.lib
IRQL <= APC_LEVEL

另請參閱

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltInitializeOplock

FltOplockFsctrl

FsRtlCheckOplockEx

IO_STATUS_BLOCK

PFLT_PRE_OPERATION_CALLBACK