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 |
OPLOCK_FLAG_CLOSING_DELETE_ON_CLOSE (0x00000020) |
Irp で指定された I/O 操作が、作成オプションでFILE_DELETE_ON_CLOSE フラグが設定された状態で最初に開かれたハンドルのIRP_MJ_CLEANUPであることを指定します。 Irp |
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
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 の中断が完了するのを待機するために使用されるイベントを待機するタイムアウト (ミリ秒) を指定します。
[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_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 |
備考
ミニフィルターは、FsRtlCheckOplockEx2
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 の中断が完了したときにのみ返されます。
呼び出し元のスレッドがブロックされ、
- OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT
- OPLOCK_NOTIFY_BREAK_WAIT_TERMINATED
上記のいずれかの理由で NotifyRoutine を
理由OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT NotifyRoutine が呼び出された場合、待機が何らかの理由で終了/完了した場合OPLOCK_NOTIFY_BREAK_WAIT_TERMINATED理由で常に呼び出されます (これは決して発生しない可能性があります)。
CompletionRoutine が指定されている場合にのみ、PostIrpRoutine を指定する必要があります。 PostIrpRoutine
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
FltCheckOplockEx を