次の方法で共有


IRP_MJ_CREATE オペレーションの Oplock 状態の確認

以下は、ファイルの既存のストリームが開かれている場合にのみ適用されます (つまり、新しく作成されたストリームに既存の oplock を設定することはできません)。

注記 oplock の IRP_MJ_CREATE を処理するときに、目的のアクセスに FILE_READ_ATTRIBUTES、FILE_WRITE_ATTRIBUTES、または SYNCHRONIZE 以外のものが含まれていない場合、FILE_RESERVE_OPFILTER が指定されない限り、oplock は解除されません。 FILE_RESERVE_OPFILTER を指定すると、作成が成功すると常に oplock ブレークが発生します。 以下の表はすべての oplock に適用されるため、簡潔にするために上記の内容を省略しています。

要求の種類 条件

レベル 1

次の場合、IRP_MJ_CREATE で中断されます。

  • オープンが行われている FILE_OBJECT に関連付けられた oplock キーは、oplock を所有する FILE_OBJECT に関連付けられた oplock キーとは異なります。

oplock が壊れている場合:

  • 次を「なし」 IF にブレークする

    • FILE_RESERVE_OPFILTER フラグが設定されます。

      OR

    • 次のいずれかの作成後処理値が指定されます。
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    ELSE:

    • レベル 2 にブレイクします。
  • 操作を続行するには、確認応答を受信する必要があります。

レベル 2

次の場合、IRP_MJ_CREATE で中断されます。

  • オープンが行われている FILE_OBJECT に関連付けられた oplock キーは、oplock を所有する FILE_OBJECT に関連付けられた oplock キーとは異なります。
  • AND:
    • FILE_RESERVE_OPFILTER フラグが設定されます。

      OR

    • 次のいずれかの作成後処理値が指定されます。
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

oplock が壊れている場合:

  • 「なし」へブレークする。

  • 確認は必要なく、操作はすぐに続行されます。

Batch

次の場合、IRP_MJ_CREATE で中断されます。

  • オープンが行われている FILE_OBJECT に関連付けられた oplock キーは、oplock を所有する FILE_OBJECT に関連付けられた oplock キーとは異なります。

oplock が壊れている場合:

  • 次を「なし」 IF にブレークする

    • FILE_RESERVE_OPFILTER フラグが設定されます。

      OR

    • 次のいずれかの作成後処理値が指定されます。
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    ELSE:

    • レベル 2 にブレイクします。
  • 操作を続行するには、確認応答を受信する必要があります。

Assert

次の場合、IRP_MJ_CREATE で中断されます。

  • オープンが行われている FILE_OBJECT に関連付けられた oplock キーは、oplock を所有する FILE_OBJECT に関連付けられた oplock キーとは異なります。

  • AND:
    • FILE_SHARE_READ アクセス用にオープンされていないストリーム上で、必要な「書き込み可能な」アクセスが要求されました。 「書き込み可能」アクセスは、次の属性以外の属性として定義されることに注意してください。

      • FILE_READ_ATTRIBUTES
      • FILE_WRITE_ATTRIBUTES
      • FILE_READ_DATA
      • FILE_READ_EA
      • FILE_EXECUTE
      • SYNCHRONIZE
      • READ_CONTROL

oplock が壊れている場合:

  • 「なし」へブレークする。

  • 操作を続行するには、確認応答を受信する必要があります。

読み込み

次の場合、IRP_MJ_CREATE で中断されます。

  • オープンが行われている FILE_OBJECT に関連付けられた oplock キーは、oplock を所有する FILE_OBJECT に関連付けられた oplock キーとは異なります。

  • AND:
    • FILE_RESERVE_OPFILTER フラグが設定されます。

      OR

    • 次のいずれかの作成後処理値が指定されます。
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

oplock が壊れている場合:

  • 「なし」へブレークする。

  • 確認は必要なく、操作はすぐに続行されます。

読み取りハンドル

次の場合、IRP_MJ_CREATE で中断されます。

  • 現在のオープンは既存のオープンと競合するため、共有違反が発生します。

    OR

  • FILE_RESERVE_OPFILTER フラグが設定されます。

    OR

  • 次のいずれかの作成後処理値が指定されます。

    • FILE_SUPERSEDE
    • FILE_OVERWRITE
    • FILE_OVERWRITE_IF

    AND (上記3つの条件のいずれかの場合)

  • オープンが行われている FILE_OBJECT に関連付けられた oplock キーは、oplock を所有する FILE_OBJECT に関連付けられた oplock キーとは異なります。

oplock が壊れている場合:

  • 次を「なし」 IF にブレークする

    • FILE_RESERVE_OPFILTER フラグが設定されます。

      OR

    • 次のいずれかの作成後処理値が指定されます。
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    ELSE:

    • 「リード」にブレイクする
  • 現在のオープンが既存のオープンと競合し、共有違反が発生するために oplock が壊れた場合、操作を続行する前に確認応答を受信する必要があります。
  • 他の理由で oplock が破損した場合は、破損の確認が必要ですが、操作はすぐに (たとえば、確認を待たずに) 続行されます。

読み取り/書き込み

次の場合、IRP_MJ_CREATE で中断されます。

  • オープンが行われている FILE_OBJECT に関連付けられた oplock キーは、oplock を所有する FILE_OBJECT に関連付けられた oplock キーとは異なります。

oplock が壊れている場合:

  • 次を「なし」 IF にブレークする

    • FILE_RESERVE_OPFILTER フラグが設定されます。

      OR

    • 次のいずれかの作成後処理値が指定されます。
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    ELSE:

    • 「リード」にブレイクする
  • 操作を続行するには、確認応答を受信する必要があります。

読み取り/書き込みハンドル

次の場合、IRP_MJ_CREATE で中断されます。

  • オープンが行われている FILE_OBJECT に関連付けられた oplock キーは、oplock を所有する FILE_OBJECT に関連付けられた oplock キーとは異なります。

oplock が壊れている場合:

  • 次を「なし」 IF にブレークする

    • FILE_RESERVE_OPFILTER フラグが設定されます。

      OR

    • 次のいずれかの作成後処理値が指定されます。
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    ELSE:

    • 現在のオープンが既存のオープンと競合し、共有違反が発生する場合は、読み取り/書き込みに中断します。 それ以外の場合は、読み取りハンドルに進みます。

  • 操作を続行するには、確認応答を受信する必要があります。

ファイル システムは、IRP_MJ_CREATE 操作の処理時に (oplock パッケージ自体ではなく) バッチおよびフィルター oplock の追加チェックを実行します。これは、ファイル システムが oplock パッケージに oplock ブレーク処理の実行を要求するかどうかに影響します。 これは、1 つのデータ ストリームに対する操作が、同じファイルの他のデータ ストリーム (つまり、次の条件リストの最後の 2 つのリスト項目) の oplock に影響を与える可能性があるケースです。 次の条件の 1 つ以上が満たされる場合、ファイル システムは oplock パッケージにリクエストを送信して、oplock ブレーク処理を実行します。

  • これがオープンなネットワーク クエリで、KTM トランザクションが存在する場合は、ブレークを要求します。 それ以外の場合は、ネットワーク クエリを開いたときにブレークを要求しないでください。

  • SUPERSEDE、OVERWRITE、または OVERWRITE_IF 操作が代替データ ストリームで実行され、FILE_SHARE_DELETE が指定されておらず、プライマリ データ ストリームにバッチまたはフィルター oplock がある場合は、プライマリ データ ストリームでバッチまたはフィルター oplock の解除を要求します。

  • SUPERSEDE、OVERWRITE、または OVERWRITE_IF 操作がプライマリ データ ストリームで実行され、DELETE アクセスが要求されており、代替データ ストリームに Batch または Filter oplock がある場合。

ファイル システムが oplock パッケージに oplock ブレーク処理の実行を要求することを決定すると、前の表に示されているルールが適用されます。

Batch および Filter oplock を解除するためのチェックは、共有アクセス チェックが行われる前に行われます。 これは、共有違反により最終的にオープン リクエストが失敗した場合でも、バッチまたはフィルターの oplock が解除されることを意味します。