次の方法で共有


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

ファイルの不透明な 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 キーのみをチェックするように指定します。 FsRtlCheckOplockEx2 は、IRP でキーが指定されている場合は、キーを追加する必要があります。 他の 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) Oplock が、Irp パラメーターの 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

引っ込み思案;0 に設定する必要があります。

[in, optional] CompletionRoutineContext

CompletionRoutine パラメーターが指すコールバック ルーチンに渡される呼び出し元定義コンテキスト情報へのポインター。 このパラメーターは省略可能であり、NULLできます。

[in, optional] CompletionRoutine

呼び出し元が指定したコールバック ルーチンへのポインター。 oplock の中断が進行中の場合、このルーチンは、中断が完了したときに呼び出されます。 このパラメーターは省略可能であり、NULLできます。 NULL場合、FsRtlCheckOpLockEx2 同期的に動作し、呼び出し元は oplock の中断が完了するまで待機状態になります。

CompletionRoutine は次のように宣言されています。

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

CompletionRoutine には、次のパラメーターがあります。

  • コンテキスト: fsRtlCheckOplockEx2を するために Context パラメーターで渡されたコンテキスト情報ポインター。
  • Irp: I/O 操作の IRP へのポインター。

[in, optional] PostIrpRoutine

I/O 操作が作業キューにポストされた場合に呼び出される呼び出し元が指定したコールバック ルーチンへのポインター。 このパラメーターは省略可能であり、NULLできます。

PostIrpRoutine は次のように宣言されています。

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

PostIrpRoutine には、次のパラメーターがあります。

  • コンテキスト。これは、fsRtlCheckOplockEx2を するために Context パラメーターで渡されたコンテキスト情報ポインターです。
  • Irp: I/O 操作の IRP へのポインター。

[in] Timeout

0 以外の場合は、呼び出し元のスレッドをブロックして 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。これは、FsRtlCheckOplockEx2に渡される NotifyContext パラメーターに設定されます。

戻り値

FsRtlCheckOplockEx2 は、STATUS_SUCCESSまたは次のいずれかの適切な NTSTATUS コードを返します。

リターン コード 形容
STATUS_CANCELLED IRP が取り消されました。 STATUS_CANCELLEDはエラー コードです。
STATUS_CANNOT_BREAK_OPLOCK oplock の中断を実行できません。 IRP はIRP_MJ_CREATE要求です。 FILE_OPEN_REQUIRING_OPLOCK操作の作成オプション パラメーターで指定され、許可された oplock があります。
STATUS_OPLOCK_BREAK_IN_PROGRESS oplock の中断が進行中です。 IRP はIRP_MJ_CREATE要求であり、操作の作成オプション パラメーターにFILE_COMPLETE_IF_OPLOCKEDが指定されています。 STATUS_OPLOCK_BREAK_IN_PROGRESSは、OPLOCK_FLAG_COMPLETE_IF_OPLOCKEDが設定され、oplock が壊れている場合に返される成功コードです。
STATUS_PENDING oplock の中断が進行中であり、IRP の制御が oplock パッケージに渡されました。 CompletionRoutine が NULL場合、STATUS_PENDINGを返す代わりに、oplock ブレークの処理中に FsRtlCheckOplockEx2 ブロック 。 STATUS_PENDINGは成功コードです。

備考

ミニフィルターは、FsRtlCheckOplockEx2 ではなく、FltCheckOplockEx 呼び出す必要があります。

FsRtlCheckOplockEx2 は、次の条件に従って、I/O 操作の IRP をファイルの現在の oplock 状態と同期します。

  • I/O 操作によって oplock が中断される場合、oplock の中断が開始されます。

  • oplock の中断が完了し、CompletionRoutine の完了ルーチンが指定されるまで I/O 操作を続行できない場合、FsRtlCheckOplockEx2 はSTATUS_PENDINGを返し、PostIrpRoutineで指定されたコールバック ルーチン 呼び出します。 oplock の中断が確認されると、CompletionRoutine のコールバック ルーチン 呼び出されます。

  • oplock の中断が完了し、CompletionRoutine が指定されていない まで I/O 操作を続行できない場合、呼び出し元のスレッドはブロックされ、FsRtlCheckOplockEx2 は、oplock の中断が完了したときにのみ返されます。

呼び出し元のスレッドがブロックされ、NotifyRoutine が NULLされていない場合、NotifyRoutine は、NotifyParamsで設定された次の理由のいずれかまたはすべてのために呼び出されます。

  • OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT
  • OPLOCK_NOTIFY_BREAK_WAIT_TERMINATED

上記のいずれかの理由で NotifyRoutine を する呼び出しは、CompletionRoutine が NULL であり、呼び出し元のスレッドが中断の完了を待機するのをブロックする必要がある場合にのみ発生します。

理由OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT NotifyRoutine が呼び出された場合、待機が何らかの理由で終了/完了した場合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

oplock の詳細については、「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