FsRtlCheckOplock 関数 (ntifs.h)
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
CompletionRoutine パラメーターと PostIrpRoutine パラメーターが指すコールバック ルーチンに渡される呼び出し元定義のコンテキスト情報へのポインター。
[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 コードを返します。
リターン コード | 説明 |
---|---|
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要求であり、操作の作成オプション パラメーターでFILE_COMPLETE_IF_OPLOCKEDが指定されました。 STATUS_OPLOCK_BREAK_IN_PROGRESSは成功コードです。 |
STATUS_PENDING | 日和見ロックの中断が開始され、IRP の制御が oplock パッケージに渡されました。 CompletionRoutine が NULL の場合、このルーチンは、STATUS_PENDINGを返すのではなく、oplock ブレークの処理中にブロックされます。 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 のドキュメントを参照してください。
ミニフィルターでは、FsRtlCheckOplock ではなく FltCheckOplock を呼び出す必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 |
対象プラットフォーム | ユニバーサル |
Header | ntifs.h (FltKernel.h、Ntifs.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | <= APC_LEVEL |
こちらもご覧ください
FSCTL_OPBATCH_ACK_CLOSE_PENDING