このセクションでは、一連のドライバーが 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 を作成して接続します。
この例には、USB ハブのフィルター ドライバーは含まれません。
ジョイスティック デバイス用の PDO、FDO、および 2 つのフィルター DO。
USB ハブ ドライバーは、バスを列挙し、HID デバイス (ジョイスティック) を見つけ、ジョイスティックの PDO を作成します。
この例では、ジョイスティック デバイスのレジストリに下位レベルのフィルター ドライバーが設定されているため、PnP マネージャーがフィルター ドライバーを読み込みます。 フィルター ドライバーは、デバイスに関連していると判断し、フィルター DO を作成してデバイス スタックにアタッチします。
PnP マネージャーは、ジョイスティック デバイスのファンクション ドライバーが HID クラス/ミニクラス ドライバー ペアであると判断し、それらのドライバーを読み込みます。 ドライバー ペアは、クラス ドライバー DLL にリンクされたミニクラス ドライバーで構成されます。 これらはまとめて、デバイスの 1 つのファンクション ドライバーとして機能します。 クラス/ミニクラス ドライバー ペアは、1 つのデバイス オブジェクト FDO を作成し、デバイス スタックにアタッチします。
上位レベルのフィルター ドライバーは、下位レベルのフィルターと同様の方法で、フィルター DO を作成し、デバイス スタックにアタッチします。
親バス ドライバーは常に、特定のデバイスのデバイス スタックの下部に PDO を作成します。 ドライバーが PnP または電源 IRP を処理する場合、各 IRP をデバイス スタック全体を通して下に向かい、PDO およびそれに関連するバス ドライバーに渡す必要があります。
次の図は、前の図と同じデバイス スタックを示していますが、各ドライバーが作成および管理するデバイス オブジェクトを強調しています。
バス ドライバーは、複数のデバイス スタックにまたがる。 バス ドライバーは、そのバス アダプターまたはコントローラーの FDO を作成し、その子デバイスごとに PDO を作成します。