一般音訊配接器的驅動程式應該能夠輕鬆地支援系統中相同音訊配接卡的數個實例。 驅動程式維護的幾乎所有數據結構都會儲存在裝置延伸模組緩衝區中 (請參閱 DEVICE_OBJECT 結構的 DeviceExtension 欄位) 描述。 不過,如果驅動程式的數個實例共用任何全域數據,這些實例應該同步處理其對此數據的存取。
另一個需求是配接卡特定實例上的每個子裝置都應該有 裝置識別碼字串 ,以唯一識別系統中相同配接卡所有實例的子裝置。
若要完成此動作的最直接方式,就是將介面卡上的每個子裝置公開為邏輯上獨立的裝置,以供隨插即用管理員識別。 這在 多功能音訊裝置中顯示為選項 (1)。
第二種方法是使用系統提供的多功能匯流排驅動程式來管理配接卡上的子裝置。 MF 匯流排驅動程式會將裝置識別碼指派給每個子裝置,保證在整個系統中是唯一的,即使系統包含相同配接卡的數個實例也一樣。 MF 匯流排驅動程式可容納子裝置共用一組通用組態暫存器的設計,但每個子裝置都有自己的一組 PCI 基底位址暫存器。 子裝置之間不應有隱藏的相依性,而且應該能夠同時運作,而不會彼此干擾,或與系統中的其他裝置干擾。 這是 多功能音訊裝置中的選項 (2)。
第三種方法是使用專屬匯流排驅動程式來管理配接卡上的子裝置。 如果子裝置具有必須集中管理的相互相依性,則經常需要這樣做。 這類相依性可以透過以下幾種方式發生:
子裝置可能會共用一些卡上資源。 例如,如果子裝置共用數位訊號處理器 (DSP) ,匯流排驅動程式可能需要先下載在 DSP 上執行的專屬作業系統,才能啟動第一個子裝置。
設計缺陷可能會導致子裝置之間的相依性。 例如,設計缺陷可能需要子裝置以特定順序開啟或關閉電源。
當任一類型的相依性存在時,專屬匯流排驅動程式幾乎一律是比直接將子裝置呈現給隨插即用管理員並嘗試隱藏相依性更好的解決方案。
如果您為配接卡提供自己的匯流排驅動程式,您應該確保匯流排驅動程式指派的裝置識別碼在整個系統中是唯一的。
匯流排驅動程式會為其中一個子系提供裝置識別碼,以回應來自隨插即用管理員的 IRP_MN_QUERY_ID 查詢。 識別碼可以透過兩種方式之一來指定,匯流排驅動程式在回應IRP_MN_QUERY_CAPABILITIES查詢時,透過將DEVICE_CAPABILITIES結構的UniqueID欄位設定為TRUE或FALSE來指出:
唯一標識碼 = True
這意味著保證孩子的名字在整個系統中是唯一的。 裝置 ID 字串包含裝置 ID 加上實例 ID,這是唯一識別硬體實例的序號。
唯一標識碼 = 偽
這表示子項的名稱僅相對於父項是唯一的。 大多數設備都使用這種識別方式。 在此情況下,隨插即用管理員會擴充它收到的裝置識別碼字串,使其在系統中是唯一的。 擴充字串取決於父裝置的唯一識別碼。
所有音訊匯流排驅動程式都應該為其子系設定 UniqueID = FALSE 。 這會導致隨插即用管理員藉由新增裝置父系的相關資訊來擴充子系的裝置識別碼字串,讓識別碼在計算機上是唯一的。