WDM デバイス スタックの例
このセクションでは、USB ハードウェアのドライバー セットで構成されたデバイス オブジェクトについて説明し、WDM デバイス オブジェクトとその階層化の方法を示します。
次の図は、「WDM ドライバー レイヤー: 例」で使用した図の再掲で、サンプル ドライバーを使用したデバイス オブジェクトを示しています。
この図で、サンプル デバイス スタック内のデバイス オブジェクトは、下から順に次の要素で構成されています。
PCI バス用の PDO と FDO。
ルート バス ドライバーは、内部システム バス (ルート バス) を列挙し、検出された各デバイスの PDO を作成します。 これらの PDO の 1 つは PCI バス用です (ルート バスの PDO と FDO は図示されていません)。
PnP マネージャーは、PCI ドライバーを PCI バスのファンクション ドライバーとして識別し、ドライバーを読み込み (まだ読み込まれていない場合)、PDO を PCI ドライバーに渡します。 その AddDeviceルーチンでは、PCI ドライバーは PCI バス (IoCreateDevice) の FDO を作成し、PCI バスのデバイス スタック (IoAttachDeviceToDeviceStack) に FDO をアタッチします。 PCI ドライバーは、PCI バスのファンクション ドライバーとしての役割の一部として、この FDO を作成してアタッチします。
この例では、PCI バスのフィルター ドライバーはありません。
USB ホスト コントローラー用の PDO と FDO。
PnP マネージャーは、PCI ドライバーにデバイス (IRP_MN_START_DEVICE) を起動するように指示し、その子 (IRP_MN_QUERY_DEVICE_RELATIONS の関係の種類 が BusRelations) の PCI ドライバーに対してクエリを実行します。 応答として、PCI ドライバーはバス上のデバイスを列挙します。 この例では、PCI ドライバーは USB ホスト コントローラーを検索し、そのデバイスの PDO を作成します。 図のワイド矢印は、USB ホスト コントローラーが PCI バスの "子" であることを示しています。 PCI ドライバーは、PCI バスのバス ドライバーとしての役割の一部として、その子デバイスの PDO を作成します。
PnP マネージャーは、USB ホスト コントローラーのミニクラス/クラス ドライバー ペアを USB ホスト コントローラーの関数ドライバーとして識別し、ドライバー ペアを読み込みます。 PnP マネージャーは、USB ホスト コント ローラーの FDO を作成し、接続する適切なタイミングでドライバーのペアを呼び出します。
この例では、USB ホスト コントローラーのフィルター ドライバーはありません。
USB ハブ用の PDO と FDO。
USB ホスト コントローラーは、そのバスを列挙し、USB ハブを唯一のポートに配置し、ハブの PDO を作成します。 USB ハブ ドライバーは、ハブの FDO を作成して接続します。
この例では、PCI ハブのフィルター ドライバーはありません。
ジョイスティック デバイス用の PDO、FDO、および 2 つのフィルター DO。
USB ハブ ドライバーは、バスを列挙し、HID デバイス (ジョイスティック) を見つけ、ジョイスティックの PDO を作成します。
この例では、ジョイスティック デバイスのレジストリに下位レベルのフィルター ドライバーが設定されているため、PnP マネージャーがフィルター ドライバーを読み込みます。 フィルター ドライバーは、デバイスに関連していると判断し、デバイス スタックにフィルター DO を作成してアタッチします。
PnP マネージャーは、ジョイスティック デバイスのファンクション ドライバーが HID クラス/ミニクラス ドライバー ペアであると判断し、それらのドライバーを読み込みます。 ドライバー ペアは、クラス ドライバー DLL にリンクされたミニクラス ドライバーで構成されます。は、デバイスの 1 つのファンクション ドライバーとして機能します。 クラス/ミニクラス ドライバー ペアは、1 つのデバイス オブジェクト FDO を作成し、デバイス スタックにアタッチします。
上位レベルのフィルター ドライバーは、下位レベルのフィルターと同様の方法で、フィルター DO を作成し、デバイス スタックにアタッチします。
親バス ドライバーによって作成された PDO は、常に特定のデバイスのデバイス スタックの一番下にあります。 ドライバーが PnP または電源 IRP を処理する場合は、PDO とそれに関連付けられているバス ドライバーにデバイス スタックのすべての方法で各 IRP を渡す必要があります。
次の図は、前の図と同じデバイス スタックを示していますが、どのデバイス オブジェクトがどのドライバーによって作成および管理されているかを強調しています。
バス ドライバーは、複数のデバイス スタックにまたがります。 バス ドライバーは、そのバス アダプター/コントローラーの FDO を作成し、その子デバイスごとに PDO を作成します。