System-Wide唯一裝置識別碼

一般音訊配接器的驅動程式應該可以輕鬆地支援系統中相同音訊配接卡的數個實例。 驅動程式維護的幾乎所有資料結構都會儲存在裝置擴充緩衝區中, (請參閱 DEVICE_OBJECT 結構的 DeviceExtension 欄位描述) 。 不過,如果驅動程式的數個實例共用任何全域資料,這些實例應該同步處理對此資料的存取。

另一個需求是,特定介面卡實例上的每個子裝置都應該有一個裝置識別碼 字串 ,可唯一識別系統中相同介面卡之所有實例的子裝置。

若要達成此目的,最簡單的方式是將介面卡上的每個子裝置公開為隨插即用管理員的邏輯上不同的裝置。 這會在 多功能音訊裝置中顯示為選項 (1) 。

第二種方法是使用系統提供的多功能匯流排驅動程式來管理介面卡上的子裝置。 MF 匯流排驅動程式會指派給每個子裝置,保證在整個系統中是唯一的裝置識別碼,即使系統包含相同介面卡的數個實例也一樣。 MF 匯流排驅動程式會容納子裝置共用一組萬用群組態暫存器的設計,但每個子裝置都有自己的 PCI 基底位址暫存器集合。 子裝置應該彼此沒有隱藏的相依性,而且應該能夠同時運作,而不會干擾系統中的其他裝置。 此選項 (2) 多功能音訊裝置

第三種方法是使用專屬匯流排驅動程式來管理介面卡上的子裝置。 如果子裝置具有必須集中管理的相互相依性,這通常是必要的。 這類相依性可以透過幾種方式發生:

  • 子裝置可能會共用一些卡片上的資源。 例如,如果子裝置 (DSP) 共用數位訊號處理器,則匯流排驅動程式可能需要先下載在 DSP 上執行的專屬作業系統,再啟動第一個子裝置。

  • 設計缺陷可能會導致子裝置之間的相依性。 例如,設計缺陷可能需要以特定順序向上或向下啟動子裝置。

當任一類型的相依性存在時,專屬匯流排驅動程式幾乎一律是比直接向隨插即用管理員呈現子裝置更好的解決方案,並嘗試隱藏相依性。

如果您為介面卡提供自己的匯流排驅動程式,您應該確保匯流排驅動程式指派的裝置識別碼在整個系統中都是唯一的。

匯流排驅動程式會為其其中一個子系提供裝置識別碼,以回應隨插即用管理員的IRP_MN_QUERY_ID查詢。 識別碼可以透過下列兩種方式之一指定,其中匯流排驅動程式會藉由將DEVICE_CAPABILITIES結構的UniqueID欄位設定為TRUEFALSE,在回應IRP_MN_QUERY_CAPABILITIES查詢時指出:

  • UniqueID =

    這表示子系的名稱保證在整個系統中都是唯一的。 裝置識別碼字串包含裝置識別碼加上實例識別碼,這是可唯一識別硬體實例的序號。

  • UniqueID =

    這表示子系的名稱只有在父系時才是唯一的。 大部分的裝置都會使用這種識別方式。 在此情況下,隨插即用管理員會擴充它收到的裝置識別碼字串,使其透過系統是唯一的。 擴充字串是父裝置唯一識別碼的函式。

所有音訊匯流排驅動程式都應該為其子系設定UniqueID = FALSE。 這會導致隨插即用管理員藉由新增裝置父系的相關資訊,使機器上的識別碼是唯一的,藉此擴充子系的裝置識別碼字串。