(ntifs.h) FsRtlCheckOplock 函式

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

語法

NTSTATUS FsRtlCheckOplock(
  [in]           POPLOCK                       Oplock,
  [in]           PIRP                          Irp,
  [in, optional] PVOID                         Context,
  [in, optional] POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine,
  [in, optional] POPLOCK_FS_PREPOST_IRP        PostIrpRoutine
);

參數

[in] Oplock

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

[in] Irp

I/O 作業之 IRP 的指標。

[in, optional] Context

要傳遞給 CompletionRoutinePostIrpRoutine 參數所指向之回呼例程之呼叫端定義內容資訊的指標。

[in, optional] CompletionRoutine

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

此例程宣告如下:

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

此例程具有下列參數:

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

[in, optional] PostIrpRoutine

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

此例程宣告如下:

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

此例程具有下列參數:

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

傳回值

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

傳回碼 Description
STATUS_CANCELLED 已取消 IRP。 STATUS_CANCELLED是錯誤碼。
STATUS_CANNOT_BREAK_OPLOCK 如果 IRP 是IRP_MJ_CREATE,且FILE_OPEN_REQUIRING_OPLOCK位於 IRP 的 CreateOptions 中,則例程不會起始現有商機鎖定的中斷,但失敗並出現STATUS_CANNOT_BREAK_OPLOCK。
STATUS_OPLOCK_BREAK_IN_PROGRESS 商機鎖定中斷正在進行中。 IRP 是IRP_MJ_CREATE要求,而且已在作業的 create options 參數中指定FILE_COMPLETE_IF_OPLOCKED。 STATUS_OPLOCK_BREAK_IN_PROGRESS是成功的程序代碼。
STATUS_PENDING 已起始商機鎖定中斷,且 IRP 的控制已傳遞至 oplock 套件。 如果 CompletionRoutine 為 NULL,此例程會在處理 oplock 中斷時封鎖,而不是傳回STATUS_PENDING。 STATUS_PENDING是成功的程序代碼。

備註

FsRtlCheckOplock 會根據下列條件,同步處理 I/O 作業的 IRP 與檔案目前的商機鎖定狀態:

  • 如果 I/O 作業會導致商機鎖定中斷,則會起始商機鎖定中斷。

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

如果文件系統或篩選驅動程式使用商機鎖定,則必須從任何可能導致不透明鎖定中斷的 I/O 作業分派例程呼叫 FsRtlCheckOplock 。 此規則適用於下列 I/O 作業類型,因為這些作業可能會導致商機鎖定中斷:

  • 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

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

Minifilters 應該呼叫 FltCheckOplock ,而不是 FsRtlCheckOplock

規格需求

需求
最低支援的用戶端 Windows 2000
目標平台 Universal
標頭 ntifs.h (包含 FltKernel.h、Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL <= APC_LEVEL

另請參閱

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

FltCheckOplock

FsRtlCurrentBatchOplock

FsRtlInitializeOplock

FsRtlOplockFsctrl

FsRtlOplockIsFastIoPossible

FsRtlUninitializeOplock