システム全体にわたる一意のデバイス ID
一般的なオーディオ アダプタのドライバは、システム内の同じオーディオ アダプタ カードの複数のインスタンスを簡単にサポートできる必要があります。 ドライバーが保持するほぼすべてのデータ構造は、デバイス拡張バッファーに格納されます (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 = FALSE
これは、子の名前は親に関してのみ一意であることを意味します。 ほとんどのデバイスはこの識別手段を使用します。 この場合、プラグ アンド プレイ マネージャーは、受け取ったデバイス ID 文字列を拡張して、システム全体で一意になるようにします。 拡張文字列は、親デバイスの一意の ID の関数です。
すべてのオーディオ バス ドライバーは、その子に対して UniqueID = FALSE を設定する必要があります。 これにより、プラグ アンド プレイ マネージャーは、デバイスの親に関する情報を追加して子のデバイス ID 文字列を拡張し、マシン上で ID を一意にします。