次の方法で共有


FltCheckOplock 関数 (fltkernel.h)

ミニフィルター ドライバーは FltCheckOplock を呼び出して、IRP ベースのファイル I/O 操作のコールバック データ構造をファイルの現在の日和見ロック (oplock) 状態と同期します。

構文

FLT_PREOP_CALLBACK_STATUS FLTAPI FltCheckOplock(
  [in]           POPLOCK                                 Oplock,
  [in]           PFLT_CALLBACK_DATA                      CallbackData,
  [in, optional] PVOID                                   Context,
  [in, optional] PFLTOPLOCK_WAIT_COMPLETE_ROUTINE        WaitCompletionRoutine,
  [in, optional] PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE PrePostCallbackDataRoutine
);

パラメーター

[in] Oplock

ファイルの不透明な oplock ポインター。 このポインターは、FltInitializeOplockを する前の呼び出しによって初期化されている必要があります。

[in] CallbackData

I/O 操作のコールバック データ (FLT_CALLBACK_DATA) 構造体へのポインター。

[in, optional] Context

WaitCompletionRoutine を し、PrePostCallbackDataRoutine ポイント コールバック ルーチンに渡される呼び出し元定義のコンテキスト情報へのポインター。 フィルター マネージャーは、この情報を不透明として扱います。

[in, optional] WaitCompletionRoutine

呼び出し元が指定したコールバック ルーチンへのポインター。 oplock の中断が進行中の場合、フィルター マネージャーは、oplock の中断が完了したときに、このルーチンを呼び出します。 このパラメーターは省略可能であり、NULL にすることができます。 NULL の場合、呼び出し元は oplock ブレークが完了するまで待機状態になります。

このルーチンは、次のように宣言されます。

typedef VOID
(*PFLTOPLOCK_WAIT_COMPLETE_ROUTINE) (
      IN PFLT_CALLBACK_DATA CallbackData,
      IN PVOID Context
      );

どこで:

  • CallbackData は、I/O 操作の FLT_CALLBACK_DATA 構造体へのポインターです。

  • Context は、 Context パラメーターで FltCheckOplock に渡されたコンテキスト情報ポインターです。

[in, optional] PrePostCallbackDataRoutine

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

このルーチンは、次のように宣言されます。

typedef VOID
(*PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE) (
      IN PFLT_CALLBACK_DATA CallbackData,
      IN PVOID Context
      );

どこで:

  • CallbackData は、I/O 操作の FLT_CALLBACK_DATA 構造体へのポインターです。

  • Context は、 Context パラメーターで FltCheckOplock に渡されたコンテキスト情報ポインターです。

戻り値

FltCheckOplock は、次のいずれかのFLT_PREOP_CALLBACK_STATUS コードを返します。

リターン コード 説明
FLT_PREOP_COMPLETE FltCheckOplock でプールの割り当てエラーが発生したか、 FsRtlCheckOplock 関数の呼び出しでエラーが返されました。 FltCheckOplock は、FLT_CALLBACK_DATA コールバック データ構造体の IoStatus メンバーの IO_STATUS_BLOCK 構造体の Status メンバーにエラー コードを設定します。 CallbackData パラメーターは、このFLT_CALLBACK_DATAを指します。
FLT_PREOP_PENDING oplock の中断が開始され、フィルター マネージャーが I/O 操作を作業キューにポストしました。 I/O 操作は、CallbackData パラメーターが指すコールバック データによって表されます。
FLT_PREOP_SUCCESS_NO_CALLBACK I/O操作はすぐに実行されました。 この操作が create-options パラメーターで FILE_COMPLETE_IF_OPLOCKED を指定した作成操作であった場合、操作がすぐに実行された場合でも、実際には oplock の中断が進行中である可能性があることに注意してください。 これが状況であるかどうかを判断するには、呼び出し元は、FLT_CALLBACK_DATA コールバック データ構造体の IoStatus メンバーの IO_STATUS_BLOCK 構造体の Status メンバーの状態を確認する必要があります。

注釈

ミニフィルター ドライバーは FltCheckOplock を呼び出して、次の条件に従って IRP ベースの I/O 操作をファイルの現在の oplock 状態と同期します。

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

  • oplock の中断が完了するまで I/O 操作を続行できない場合、 FltCheckOplock は FLT_PREOP_PENDING を返し、 PrePostCallbackDataRoutine パラメーターが指すコールバック ルーチンを呼び出します。

ミニフィルター ドライバーで oplock を使用する場合は、oplock の中断を引き起こす可能性のある I/O 操作の任意の操作前コールバック (PFLT_PRE_OPERATION_CALLBACK) ルーチンから FltCheckOplock を呼び出す必要があります。 この規則は、次の種類の 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
  • IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION

I/O 操作は、IRP ベースの I/O 操作である必要があります。 特定のコールバック データ構造が IRP ベースの I/O 操作を表すかどうかを判断するには、FLT_IS_IRP_OPERATION マクロを使用します。

ミニフィルターは、 WaitCompletionRoutine で指定されたコールバック内で FltCheckOplock を再度呼び出すことはできません。 これを行うと、 FltCheckOplock が戻る前に oplock パッケージが完了コールバックを呼び出すと、デッドロック状態が発生する可能性があります。

日和見ロックの詳細については、Microsoft Windows SDK のドキュメントを参照してください。

要求事項

要件 価値
ターゲット プラットフォーム 普遍
ヘッダー fltkernel.h (Fltkernel.h を含む)
IRQL <= APC_LEVEL

こちらも参照ください

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

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 の

FltCurrentBatchOplock の

FltInitializeOplock の

FltOplockFsctrl の

FltOplockIsFastIoPossible の

FltUninitializeOplock の

FsRtlCheckOplock (英語)

PFLT_PRE_OPERATION_CALLBACK