次の方法で共有


FltCheckOplockEx 関数 (fltkernel.h)

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

構文

FLT_PREOP_CALLBACK_STATUS FLTAPI FltCheckOplockEx(
  [in]           POPLOCK                                 Oplock,
  [in]           PFLT_CALLBACK_DATA                      CallbackData,
  [in]           ULONG                                   Flags,
  [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] Flags

関連付けられているファイル I/O 操作のビットマスク。 ミニフィルター ドライバーは、FltCheckOplockExの動作 指定するビットを設定します。 Flags パラメーターには、次のオプションがあります。

OPLOCK_FLAG_COMPLETE_IF_OPLOCKED (0x00000001)

oplock の中断の原因となった操作をブロックまたは保留中にせずに、日和見ロックの中断を続行できるようにします。

OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY (0x00000002)

FltCheckOplockEx 、I/O 操作に関連付けられているFILE_OBJECTの日和見ロック キーのみをチェックすることを指定します。 この I/O 操作は、CallbackData パラメーターが指すコールバック データによって表されます。 FltCheckOplockEx 、I/O 操作でキーが指定されている場合は、キーを追加する必要があります。 他の oplock 処理は発生しません。つまり、日和見ロックの中断は発生しません。

OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK (0x00000004)

FsRtlCheckOplockEx が、FltOplockFsctrl ルーチンの呼び出しによって以前に設定された状態を元に戻す必要があることを指定します。 fltOplockFsctrl は、IRP_MJ_CREATE要求が処理されるときに呼び出されます。 このIRP_MJ_CREATE要求は、create options パラメーターのFILE_OPEN_REQUIRING_OPLOCK フラグを指定します。 通常、OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK フラグは、以前に失敗したときにこのような作成要求の最終処理で使用されます。

OPLOCK_FLAG_IGNORE_OPLOCK_KEYS (0x00000008)

日和見ロック キーに関係なく、すべての日和見ロックの中断を続行できるようにします。

[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 操作のコールバック データ構造へのポインター。

WaitCompleteRoutine が呼び出されると、IoStatus サブ構造体にエラー状態 (STATUS_CANCELLED など) が入力される可能性があることに注意してください。 この状態を検査し、適切に対応する必要があります。

文脈

FltCheckOplockExを するために、Context パラメーターで渡されたコンテキスト情報ポインター。

[in, optional] PrePostCallbackDataRoutine

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

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

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

CallbackData

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

文脈

FltCheckOplockExを するために、Context パラメーターで渡されたコンテキスト情報ポインター。

戻り値

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

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

備考

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

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

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

  • ミニフィルター ドライバーが oplock を使用する場合は、oplock の中断を引き起こす可能性がある I/O 操作の任意の事前操作コールバック (PFLT_PRE_OPERATION_CALLBACK) ルーチンから fltCheckOplockEx 呼び出す必要があります。 この規則は、次の種類の 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で指定されたコールバック内で FltCheckOplockEx 呼び出してはなりません。 これにより、FltCheckOplockEx が返される前に oplock パッケージが完了コールバック 呼び出すと、デッドロック状態が発生する可能性があります。

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

必要条件

要件 価値
サポートされる最小クライアント FltCheckOplockEx ルーチンは、Windows 7 以降で使用できます。
ターゲット プラットフォーム の 万国
ヘッダー fltkernel.h (Fltkernel.h を含む)
ライブラリ FltMgr.lib
IRQL <= APC_LEVEL

関連項目

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltInitializeOplock の

FltOplockFsctrl を する

FsRtlCheckOplock

IO_STATUS_BLOCK

PFLT_PRE_OPERATION_CALLBACK