次の方法で共有


再利用可能な IRP を使用したパケット駆動型 I/O

I/O マネージャー、プラグ アンド プレイ マネージャー、および電源マネージャーは、I/O 要求パケット (IRP) を使用してカーネル モード ドライバーと通信し、ドライバーどうしが相互に通信できるようにします。

I/O マネージャーは以下の手順を実行します。

  • I/O 要求を受け入れます。通常、このような要求はユーザー モード アプリケーションから送信されます。

  • I/O 要求を表す IRP を作成します。

  • 適切なドライバーに IRP をルーティングします。

  • IRP をその完了まで追跡します。

  • 各 I/O 操作の元の要求元に状態を返します。

複数のドライバーに IRP がルーティングされることがあります。 たとえば、ディスク上のファイルを開く要求は、最初にファイル システム ドライバー、つづいて中間ミラー ドライバー、最終的にディスク ドライバーや、場合によっては PnP ハードウェア バス ドライバーに送信されます。 これらのドライバー群をドライバー スタックと呼びます。

したがって、各 IRP には固定部分と、デバイスを制御するドライバーごとにドライバー固有の I/O スタックの場所が 1 つあります。

  • この固定部分 (ヘッダー) では、I/O マネージャーによって元の要求に関する情報が保持されています。この情報として、呼び出し元のスレッド ID とパラメーター、ファイルを開く場所となるデバイス オブジェクトのアドレスなどがあります。 この固定部分には I/O 状態ブロックもあります。ここには、要求された I/O 操作の状態に関する情報がドライバーによって設定されます。

  • 最上位ドライバーの I/O スタックの場所では、I/O マネージャー、プラグ アンド プレイ マネージャー、または電源マネージャーによってドライバー固有のパラメーターが設定されます。このパラメーターとして、要求された操作の関数コードや、実行すべき処理を判断するために該当のドライバーが使用するコンテキストなどがあります。 これにより、ドライバー スタックの中で次の順番にあるドライバーの I/O スタックの場所が各ドライバーによって設定されます。

IRP を処理する各ドライバーは、IRP で指定された I/O スタックの場所にアクセスできることから、ドライバーによる操作の各段階で IRP を再利用できます。 さらに、上位ドライバーはさらに低位のドライバーに要求を送信する IRP を作成または再利用できます。

IRP の詳細については「IRP の処理」を参照してください。