共用方式為


FsRtlCheckOplockEx2 函式 (ntifs.h)

FsRtlCheckOplockEx2 會將檔案 I/O 作業的 IRP 與目前的商機鎖定同步處理, (oplock) 檔案的狀態。

語法

NTSTATUS FsRtlCheckOplockEx2(
  [in]           POPLOCK                       Oplock,
  [in]           PIRP                          Irp,
  [in]           ULONG                         Flags,
  [in]           ULONG                         FlagsEx2,
  [in, optional] PVOID                         CompletionRoutineContext,
  [in, optional] POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine,
  [in, optional] POPLOCK_FS_PREPOST_IRP        PostIrpRoutine,
  [in]           ULONGLONG                     Timeout,
  [in, optional] PVOID                         NotifyContext,
  [in, optional] POPLOCK_NOTIFY_ROUTINE        NotifyRoutine
);

參數

[in] Oplock

檔案不透明不透明鎖定結構的指標。 此指標必須由先前呼叫 FsRtlInitializeOplock 來初始化。

[in] Irp

宣告所要求 I/O 作業的 IRP 指標。

[in] Flags

相關聯檔案 I/O 作業的位掩碼。 文件系統或篩選驅動程式會設定位,以指定 FsRtlCheckOplockEx2 的行為。 旗標 具有下列選項:

旗標值 意義
OPLOCK_FLAG_COMPLETE_IF_OPLOCKED (0x00000001) 指定允許 oplock 中斷繼續,而不封鎖或擱置造成 oplock 中斷的作業。
OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY (0x00000002) 指定 FsRtlCheckOplockEx2 應該只檢查與 Irp 參數指向之 IRP 相關聯的FILE_OBJECT上是否有 oplock 鍵。 如果 IRP 中提供金鑰,FsRtlCheckOplockEx2 就必須新增密鑰。 不會發生其他 Oplock 處理;也就是說,不會發生任何 oplock 中斷。 從 Windows 7 開始支援。
OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK (0x00000004) 指定 FsRtlCheckOplockEx2 應該還原先前透過呼叫 FsRtlOplockFsctrl 例程所設定的任何狀態。 FsRtlOplockFsctrl 會在處理指定 create options 參數中FILE_OPEN_REQUIRING_OPLOCK旗標的IRP_MJ_CREATE要求期間呼叫。 OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK旗標通常用於先前失敗時,這類建立要求的最終處理。 從 Windows 7 開始支援。
OPLOCK_FLAG_IGNORE_OPLOCK_KEYS (0x00000008) 指定允許所有 oplock 中斷繼續,而不論 oplock 鍵為何。 從 Windows 7 開始支援。
OPLOCK_FLAG_PARENT_OBJECT (0x00000010) 指定 OplockIrp 參數中 IRP 導向的檔案或目錄) 父 (目錄相關聯。 從 Windows 8 開始支援。
OPLOCK_FLAG_CLOSING_DELETE_ON_CLOSE (0x00000020) 指定 Irp 中指定的 I /O 作業是原本在其建立選項中設定FILE_DELETE_ON_CLOSE旗標所開啟之句柄的IRP_MJ_CLEANUP。 如果 Irp 不是IRP_MJ_CLEANUP作業,則此旗標不會有任何作用。 指定此旗標可能會導致 oplock 中斷。 從 Windows 8 開始支援。
OPLOCK_FLAG_REMOVING_FILE_OR_LINK (0x00000040) 指定刪除該目錄中的檔案或連結時,處理父目錄上的 oplock 中斷。 如果指定,則必須將此旗標與OPLOCK_FLAG_PARENT_OBJECT結合。 當檔案系統正在處理會導致移除連結或檔案的作業時,必須指定此旗標。 從 Windows 8 開始支援。

[in] FlagsEx2

保留;必須設定為零。

[in, optional] CompletionRoutineContext

要傳遞給 CompletionRoutine 參數所指向之回呼例程之呼叫端定義內容資訊的指標。 這個參數是選擇性的,而且可以是 NULL

[in, optional] CompletionRoutine

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

CompletionRoutine 宣告如下:

typedef VOID
(*POPLOCK_WAIT_COMPLETE_ROUTINE) (
      IN PVOID Context,
      IN PIRP Irp
      );

CompletionRoutine 具有下列參數:

  • 內容在 Context 參數中傳遞至 FsRtlCheckOplockEx2 的內容資訊指標。
  • Irp:I/O 作業之 IRP 的指標。

[in, optional] PostIrpRoutine

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

PostIrpRoutine 宣告如下:

typedef VOID
(*POPLOCK_FS_PREPOST_IRP) (
      IN PVOID Context,
      IN PIRP Irp
      );

PostIrpRoutine 具有下列參數:

  • Context,這是 在 Context 參數中傳遞至 FsRtlCheckOplockEx2 的內容資訊指標。
  • Irp:I/O 作業之 IRP 的指標。

[in] Timeout

如果為非零,則指定以毫秒為單位的逾時 (,) 等候用來封鎖呼叫端線程的事件,以便等候 oplock 中斷完成。 除非下列兩個條件都成立,否則會忽略此值: CompletionRoutine 為 NULL, 而且 NotifyRoutine 不是 NULL。

[in, optional] NotifyContext

要傳遞給 NotifyRoutine 參數所指向回呼例程之OPLOCK_NOTIFY_PARAMS結構的指標。 這個參數是選擇性的,而且可以是 NULL

[in, optional] NotifyRoutine

呼叫端提供的回呼例程指標,要針對 oplock 狀態通知呼叫。 這個參數是選擇性的,而且可以是 NULL

NotifyRoutine 宣告如下:

typedef NTSTATUS
(*POPLOCK_NOTIFY_ROUTINE) (
      IN POPLOCK_NOTIFY_PARAMS NotifyParams
      );

NotifyRoutine 具有下列參數:

  • NotifyParams,設定為傳遞至 FsRtlCheckOplockEx2NotifyContext 參數。

傳回值

FsRtlCheckOplockEx2 會傳回STATUS_SUCCESS或適當的 NTSTATUS 程式代碼,例如下列其中一項:

傳回碼 Description
STATUS_CANCELLED 已取消 IRP。 STATUS_CANCELLED是錯誤碼。
STATUS_CANNOT_BREAK_OPLOCK 無法完成 oplock 中斷。 IRP 是IRP_MJ_CREATE要求。 FILE_OPEN_REQUIRING_OPLOCK是在作業的 create options 參數中指定,而且有授與的 oplock。
STATUS_OPLOCK_BREAK_IN_PROGRESS 作業鎖定中斷正在進行中。 IRP 是IRP_MJ_CREATE要求,而且已在作業的 create options 參數中指定FILE_COMPLETE_IF_OPLOCKED。 STATUS_OPLOCK_BREAK_IN_PROGRESS是設定OPLOCK_FLAG_COMPLETE_IF_OPLOCKED且 oplock 已中斷時傳回的成功程序代碼。
STATUS_PENDING Oplock 中斷正在進行中,且 IRP 的控制已傳遞至 oplock 套件。 如果 CompletionRoutineNULL,則會在處理 oplock 中斷時封鎖 FsRtlCheckOplockEx2 區塊,而不是傳回STATUS_PENDING。 STATUS_PENDING是成功的程序代碼。

備註

迷你篩選應該呼叫 FltCheckOplockEx ,而不是 FsRtlCheckOplockEx2

FsRtlCheckOplockEx2 會根據下列條件,同步處理 I/O 作業的 IRP 與檔案目前的 oplock 狀態:

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

  • 如果 I/O 作業在 oplock 中斷完成且指定 CompletionRoutine 中的完成例程之前無法繼續, FsRtlCheckOplockEx2 會傳回STATUS_PENDING,並呼叫 PostIrpRoutine 中指定的回呼例程。 確認 oplock 中斷時,會呼叫 CompletionRoutine 中的回呼例程。

  • 如果在作業鎖定中斷完成且未指定 CompletionRoutine 之前,I/O 作業無法繼續,則呼叫端的線程會遭到封鎖,而且 FsRtlCheckOplockEx2 只有在 oplock 中斷完成時才會傳回。

如果呼叫端的線程遭到封鎖,而且 NotifyRoutine 不是 NULL,則會針對 NotifyParams 中設定的任何或所有原因呼叫 NotifyRoutine

  • OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT
  • OPLOCK_NOTIFY_BREAK_WAIT_TERMINATED

只有在 CompletionRoutine 為 NULL 且必須封鎖呼叫端的線程以等候中斷完成時,才會發生上述任何原因的 NotifyRoutine 呼叫。

如果基於原因而叫用 NotifyRoutine OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT,則如果等候因任何原因而終止/完成,則一律會基於任何原因 OPLOCK_NOTIFY_BREAK_WAIT_TERMINATED而叫用, (可能永遠不會) 。

FsRtlCheckOplockEx2 會忽略 NotifyRoutine 傳回OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT和OPLOCK_NOTIFY_BREAK_WAIT_TERMINATED狀態代碼。

只有在已指定 CompletionRoutine 時,才應該指定 PostIrpRoutine。 當 PostIrpRoutine 不是 NULL 時,會在任何專案排入等候的 Irp 佇列之前呼叫它。

如果在 Flags 中指定OPLOCK_FLAG_PARENT_OBJECT旗標, FsRtlCheckOplockEx2 將會無條件地中斷任何現有的父 oplock;也就是說,不會考慮 Irp 中的主要程式碼。

如果文件系統使用 oplocks,它必須從任何可能導致 oplock 中斷的 I/O 作業分派例程呼叫 FsRtlCheckOplockEx2 。 此規則適用於下列 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

如需作業鎖定的詳細資訊,請參閱 Opportunistic Locks

規格需求

需求
最低支援的用戶端 Windows 10 (版本 2004)
標頭 ntifs.h

另請參閱

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

FsRtlCurrentBatchOplock

FsRtlInitializeOplock

FsRtlOplockFsctrl

FsRtlOplockIsFastIoPossible

FsRtlUninitializeOplock

OPLOCK_NOTIFY_PARAMS