共用方式為


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

I/O 作業的回呼資料 (FLT_CALLBACK_DATA) 結構的指標。

[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作的 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

另請參閱

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