共用方式為


fltCheckOplock 函式 (fltkernel.h)

迷你篩選驅動程式會呼叫 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

回呼數據的指標, (FLT_CALLBACK_DATA I/O 作業的) 結構。

[in, optional] Context

要傳遞給 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 作業之回呼數據結構的指標。

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 作業之回呼數據結構的指標。

Context

在 Context 參數中傳遞至 FltCheckOplock 的內容資訊指標。

傳回值

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

傳回碼 Description
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_WITH_CALLBACK
I/O 作業會立即執行。 請注意,如果此作業是在 create-options 參數中指定FILE_COMPLETE_IF_OPLOCKED的建立作業,即使作業已立即執行,仍可能會有作業中斷進行中。 若要判斷這種情況,呼叫端應該檢查FLT_CALLBACK_DATA回呼數據結構之ioStatus成員之IO_STATUS_BLOCK結構的狀態。

備註

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

  • 如果 I/O 作業會導致 oplock 中斷,則會起始 oplock 中斷。
  • 如果 I/O 作業在 oplock 中斷完成之前無法繼續, FltCheckOplock 會傳回FLT_PREOP_PENDING並呼叫 PrePostCallbackDataRoutine 參數指向的回呼例程。
如果迷你篩選驅動程式使用 oplocks,它必須從任何預先操作回呼呼叫 FltCheckOplock , (PFLT_PRE_OPERATION_CALLBACK) 可能導致 oplock 中斷的 I/O 作業例程。 此規則適用於下列類型的 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 中指定的回呼內再次呼叫 FltCheckOplock。 如果 oplock 套件在 FltCheckOplock 傳回之前呼叫完成回呼,則這樣做可能會導致死結狀況。

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

規格需求

需求
目標平台 Universal
標頭 fltkernel.h (包含 Fltkernel.h)
IRQL <= APC_LEVEL

另請參閱

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FSCTL_OPBATCH_ACK_CLOSE_PENDING

FSCTL_OPLOCK_BREAK_ACKNOWLEDGE

FSCTL_OPLOCK_BREAK_ACK_NO_2

FSCTL_OPLOCK_BREAK_NOTIFY

FSCTL_REQUEST_BATCH_OPLOCK

FSCTL_REQUEST_FILTER_OPLOCK

FSCTL_REQUEST_OPLOCK_LEVEL_1

FSCTL_REQUEST_OPLOCK_LEVEL_2

FltCheckOplockEx

FltCurrentBatchOplock

FltInitializeOplock

FltOplockFsctrl

FltOplockIsFastIoPossible

FltUninitializeOplock

FsRtlCheckOplock

PFLT_PRE_OPERATION_CALLBACK