ドライバー スタック

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

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

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

diagram of four device nodes, each with a device stack.

以下に、図の各番号のステージで 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 つのデバイス オブジェクトに関連付けられています。

diagram of a driver stack, showing the top driver associated with an fdo only, and the other three drivers associated with a pdo and an fdo.

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

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

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

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

diagram of a driver stack showing friendly names for the drivers: disk class driver on top followed by usb storage port driver, and then usb hub driver and (usb 2 miniport, usb port) driver.

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

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

diagram showing the technology driver stack for possible usb core block .

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

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

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

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

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