一般的なオーディオ アダプターのドライバーは、システム内の同じオーディオ アダプター カードの複数のインスタンスを簡単にサポートできる必要があります。 ドライバーが保持するほぼすべてのデータ構造は、デバイス拡張バッファーに格納されます ( DEVICE_OBJECT 構造体の DeviceExtension フィールドの説明を参照してください)。 ただし、ドライバーの複数のインスタンスがグローバル データを共有する場合、それらのインスタンスはこのデータへのアクセスを同期する必要があります。
追加の要件の 1 つは、アダプター カードの特定のインスタンス上の各サブデバイスに、システム内の同じアダプター カードのすべてのインスタンスでサブデバイスを一意に識別するデバイス ID 文字列 を持つ必要があるということです。
これを実現する最も簡単な方法は、プラグ アンド プレイ マネージャーに論理的に異なるデバイスとしてアダプター カード上の各サブデバイスを公開することです。 これは 、多機能オーディオ デバイスのオプション (1) として表示されます。
2 つ目の方法は、システム提供の多機能バス ドライバーを使用して、アダプター カード上のサブデバイスを管理することです。 MF バス ドライバーは、システムに同じアダプター カードの複数のインスタンスが含まれている場合でも、システム全体で一意であることが保証されているデバイス ID を各サブデバイスに割り当てます。 MF バス ドライバーは、サブデバイスが共通の構成レジスタのセットを共有するが、各サブデバイスが PCI ベース アドレス レジスタの独自のセットを持つ設計に対応します。 サブデバイスは互いに隠れた依存関係を持たず、相互に干渉したり、システム内の他のデバイスと干渉することなく同時に動作できるようにする必要があります。 これは 、多機能オーディオ デバイスのオプション (2) です。
3 つ目の方法は、専用のバス ドライバーを使用して、アダプター カード上のサブデバイスを管理することです。 これは、サブデバイスに一元的に管理する必要がある相互依存関係がある場合に、頻繁に必要になります。 このような依存関係は、次のいくつかの方法で発生する可能性があります。
サブデバイスは、一部のオンカード リソースを共有する場合があります。 たとえば、サブデバイスがデジタル信号プロセッサ (DSP) を共有している場合、バス ドライバーは、最初のサブデバイスを起動する前に、DSP で実行される独自のオペレーティング システムをダウンロードする必要があります。
設計上の欠陥により、サブデバイス間の依存関係が発生する可能性があります。 たとえば、設計上の欠陥では、特定のシーケンスでサブデバイスの電源をオンまたはオフにする必要がある場合があります。
いずれかの種類の依存関係が存在する場合、サブデバイスをプラグ アンド プレイ マネージャーに直接表示し、依存関係を非表示にしようとするよりも、ほとんどの場合、専用のバス ドライバーが優れたソリューションです。
アダプター カードに独自のバス ドライバーを提供する場合は、バス ドライバーが割り当てるデバイス ID がシステム全体で一意であることを確認する必要があります。
バス ドライバーは、プラグ アンド プレイ マネージャーからの IRP_MN_QUERY_ID クエリに応答して、その子のいずれかのデバイス ID を提供します。 ID は、次の 2 つの方法のいずれかで指定できます。バス ドライバーは、DEVICE_CAPABILITIES構造体の UniqueID フィールドを TRUE または FALSE に設定することで、IRP_MN_QUERY_CAPABILITIES クエリへの応答で示します。
UniqueID = TRUE
つまり、子の名前はシステム全体で一意であることが保証されます。 デバイス ID 文字列には、デバイス ID とインスタンス ID が含まれています。これは、ハードウェア インスタンスを一意に識別するシリアル番号です。
UniqueID = 偽
これは、子の名前が親に関してのみ一意であることを意味します。 ほとんどのデバイスでは、この識別手段が使用されます。 この場合、プラグ アンド プレイ マネージャーは、受信したデバイス ID 文字列を拡張して、システムを通じて一意にします。 拡張文字列は、親デバイスの一意の ID の関数です。
すべてのオーディオ バス ドライバーは、子に UniqueID = FALSE を設定する必要があります。 これにより、プラグ アンド プレイ マネージャーは、デバイスの親に関する情報を追加して、デバイス上で ID を一意にすることで、子のデバイス ID 文字列を拡張します。