ドライバー スタック

デバイス ドライバーに送信されるほとんどの要求は、I/O 要求パケット (IRP) にパッケージ化されます。 各デバイスはデバイス ノードで表され、各デバイス ノードにはデバイス スタックがあります。 詳細については、「デバイス ノードとデバイス スタック」を参照してください。 デバイスに読み取り、書き込み、または制御の要求を送信するために、I/O マネージャーは、デバイスのデバイス ノードを検索し、そのノードのデバイス スタックに IRP を送信します。 I/O 要求の処理には、複数のデバイス スタックが関係する場合があります。 含まれているデバイス スタックの数に関係なく、I/O 要求に参加するドライバーの全体的なシーケンスは、要求のドライバー スタックと呼ばれます。 また、ドライバー スタックという用語は、特定のテクノロジーに対するドライバーの階層化されたセットのことも意味します。

複数のデバイス スタックで処理される I/O 要求

場合によっては、IRP の処理に複数のデバイス スタックが関係します。 次の図は、4 つのデバイス スタックが 1 つの IRP の処理に関係するケースを示しています。

それぞれのノードにデバイス スタックを 1 つ含む 4 つのデバイス ノードの図。

以下に、図の各番号のステージで IRP がどのように処理されるかを示します。

  1. IRP は、Disk.sys によって作成されます。これは、マイ USB ストレージ デバイス ノードのデバイス スタック内のファンクション ドライバーです。 Disk.sys は、IRP をデバイス スタックから Usbstor.sys に渡します。

  2. Usbstor.sys が、マイ USB ストレージ デバイス ノードの PDO ドライバーであり、USB 大容量ストレージ デバイス ノードの FDO ドライバーであることに注意してください。 この時点で、IRP が (PDO、Usbstor.sys) ペアと (FDO、Usbstor.sys) ペアのいずれによって所有されているかを判断することは重要ではありません。 IRP はドライバーである Usbstor.sys によって所有され、このドライバーは PDO と FDO の両方にアクセスできます。

  3. Usbstor.sys が IRP の処理を完了すると、IRP が Usbhub.sys に渡されます。 Usbhub.sys は、USB 大容量ストレージ デバイス ノードの PDO ドライバーであり、USB ルート ハブ ノードの FDO ドライバーです。 IRP が (PDO、Usbhub.sys) ペアと (FDO、Usbhub.sys) ペアのいずれによって所有されているかを判断することは重要ではありません。 IRP はドライバーである Usbhub.sys によって所有され、このドライバーは PDO と FDO の両方にアクセスできます。

  4. Usbhub.sys が IRP の処理を完了すると、IRP が (Usbuhci.sys、Usbport.sys) ペアに渡されます。

    Usbuhci.sys はミニポート ドライバーであり、Usbport.sys はポート ドライバーです。 (ミニポート、ポート) ペアは、1 つのドライバーの役割を果たします。 この場合、ミニポート ドライバーとポート ドライバーの両方が Microsoft によって作成されます。 (Usbuhci.sys、Usbport.sys) ペアは USB ルート ハブ ノードの PDO ドライバーであり、(Usbuhci.sys、Usbport.sys) ペアは USB ホスト コントローラー ノードの FDO ドライバーでもあります。 (Usbuhci.sys、Usbport.sys) ペアは、ホスト コントローラー ハードウェアとの実際の通信を行います。これが、次に物理 USB ストレージ デバイスと通信します。

I/O 要求のドライバー スタック

前の図で示した、I/O 要求に参加した 4 つのドライバーのシーケンスについて考えてみましょう。 デバイス ノードとその個々のデバイス スタックではなく、ドライバーに焦点を当てると、シーケンスに対して別の見方をすることができます。 次の図は、シーケンス内のドライバーを上から下に示しています。 Disk.sys は 1 つのデバイス オブジェクトに関連付けられていますが、他の 3 つのドライバーはそれぞれ 2 つのデバイス オブジェクトに関連付けられています。

ドライバー スタックの図 (最上段のドライバーが FDO だけに関連付けられ、他の 3 つはそれぞれ PDO と FDO に関連付けられている状態)。

I/O 要求に参加するドライバーのシーケンスは、I/O 要求のドライバー スタックと呼ばれます。 I/O 要求のドライバー スタックを図示するには、ドライバーを要求に参加する順序で上から下に描画していきます。

I/O 要求のドライバー スタックが、デバイス ノードのデバイス スタックとは大きく異なっていることに注意してください。 また、I/O 要求のドライバー スタックが、必ずしもデバイス ツリーの 1 つのブランチ内に留まるとは限らないことにも注意してください。

テクノロジ ドライバー スタック

前の図に示した I/O 要求のドライバー スタックについて考えてみましょう。 各ドライバーにフレンドリ名を付け、図を少し変更すると、Windows Driver Kit (WDK) のドキュメントに出てくる多くの図に似たブロック図になります。

フレンドリ名を付けたドライバーのドライバー スタックの図 (最上段に Disk クラス ドライバーがあり、以下 USB Storage ポート ドライバー、USB Hub ドライバーと (USB 2 ミニポート、USB ポート) ドライバーが続く状態)。

その図では、ドライバー スタックは 3 つのセクションに分かれています。 各セクションは、特定のテクノロジ、またはオペレーティング システムの特定のコンポーネントあるいは部分に属していると考えることができます。 たとえば、ドライバー スタックの上部にある最初のセクションはボリューム マネージャーに属し、2 番目のセクションはオペレーティング システムのストレージ コンポーネントに属し、3 番目のセクションはオペレーティング システムのコア USB 部分に属しているかもしれません。

3 番目のセクションのドライバーについて考えてみましょう。 これらのドライバーは、さまざまな種類の USB 要求と USB ハードウェアを処理するために Microsoft によって提供される、コア USB ドライバーの大きなセットのサブセットです。 次の図は、USB コア ブロック図全体がどのようなものになるかを示しています。

考えられる USB コア ブロックのテクノロジ ドライバー スタックの図。

特定のテクノロジ、またはオペレーティング システムの特定のコンポーネントまたは部分のすべてのドライバーを示すブロック図は、テクノロジ ドライバー スタックと呼ばれます。 通常、テクノロジ ドライバー スタックには、USB コア ドライバー スタック、ストレージ スタック、1394 ドライバー スタック、オーディオ ドライバー スタックなどの名前が付けられます。

: この記事の USB コア ブロック図は、USB 1.0 および 2.0 のテクノロジ ドライバー スタックを示すいくつかの方法の 1 つを示しています。 USB 1.0、2.0、および 3.0 ドライバー スタックの公式図については、「USB ドライバー スタック アーキテクチャ」を参照してください。

デバイス ノードとデバイス スタック

ミニドライバーとドライバーのペア

すべてのドライバー開発者のための概念