WinUSB 裝置

在本文中,您將瞭解 Windows 如何辨識 WinUSB 裝置。

如果您是 OEM 或獨立硬體廠商, (IHV) 開發您想要使用 Winusb.sys 作為函式驅動程式的裝置,而且想要自動載入驅動程式,而不需要提供自定義 INF,本文中的資訊將適用於您。

什麼是 WinUSB 裝置

WinUSB 裝置是通用序列總線 (USB) 裝置,其韌體會定義特定 Microsoft 操作系統 (OS) 功能描述元,將相容標識碼回報為 “WINUSB”。

WinUSB 裝置的目的是讓 Windows 在沒有自定義 INF 檔案的情況下,將 Winusb.sys 載入為裝置的函式驅動程式。 針對 WinUSB 裝置,您不需要散發裝置的 INF 檔案,讓驅動程式安裝程式可供終端使用者使用。 相反地,如果您需要提供自定義 INF,則不應該將裝置定義為 WinUSB 裝置,並在 INF 中指定裝置的硬體識別碼。

Microsoft 提供 Winusb.inf,其中包含安裝 Winusb.sys 作為 USB 裝置裝置裝置裝置驅動器所需的資訊。

在 Windows 8 之前,若要將 Winusb.sys 載入為函式驅動程式,您需要提供自定義 INF。 自定義 INF 會指定裝置特定的硬體識別碼,也包含來自內建 Winusb.inf 的區段。 需要這些區段才能具現化服務、複製收件匣二進位檔,以及註冊應用程式尋找裝置並與其通訊所需的裝置介面 GUID。 如需撰寫自定義 INF 的相關信息,請參閱 WinUSB (Winusb.sys) 安裝

在 Windows 8 中,已更新內建的 Winusb.inf 檔案,讓 Windows 自動比對 INF 與 WinUSB 裝置。

使用內建的 Winusb.inf 安裝 WinUSB 裝置

在 Windows 8 中,已更新內建的 Winusb.inf 檔案。 INF 包含一個安裝區段,參考名為 「USB\MS_COMP_WINUSB」 的相容識別碼。

[Generic.Section.NTamd64]
%USB\MS_COMP_WINUSB.DeviceDesc%=WINUSB,USB\MS_COMP_WINUSB

更新的 INF 也包含名為 「USBDevice」 的新安裝類別。

“USBDevice” 安裝類別適用於 Microsoft 未提供現用驅動程序的裝置。 這類裝置通常不屬於定義完善的 USB 類別,例如音訊、藍牙等,而且需要自定義驅動程式。 如果您的裝置是 WinUSB 裝置,最有可能是裝置不屬於 USB 類別。 因此,您的裝置必須安裝在 「USBDevice」 安裝類別下。 更新後的 Winusb.inf 有助於該需求。

關於使用USBDevice類別

請勿針對未分類的裝置使用 「USB」 安裝類別。 該類別會保留用於安裝控制器、中樞和複合裝置。 誤用 「USB」 類別可能會導致顯著的可靠性和效能問題。 針對未分類的裝置,請使用 “USBDevice”。

在 Windows 8 中,若要使用 「USBDevice」 裝置類別,只要將此專案新增至您的 INF:

  [Version]
  ...
  Class=USBDevice
  ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF138216D6}
  ...

在 裝置管理員 您會看到新的節點 USB 通用序列總線裝置,且您的裝置會出現在該節點底下。

除了上述幾行之外,在 Windows 7 中,您需要在 INF 中建立這些登錄設定:

  ;---------- Add Registry Section ----------
  [USBDeviceClassReg]
  HKR,,,,"Universal Serial Bus devices"
  HKR,,NoInstallClass,,1
  HKR,,SilentInstall,,1
  HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"

在 裝置管理員 中,您會看到您的裝置出現在 USB 通用序列總線裝置底下。 不過,裝置類別描述衍生自 INF 中指定的登錄設定。

請注意,“USBDevice” 類別不限於 WinUSB。 如果您有裝置的自定義驅動程式,您可以在自定義 INF 中使用 “USBDevice” 安裝類別。

在裝置列舉期間,USB 驅動程式堆疊會從裝置讀取相容的標識符。 如果相容的標識碼是 「WINUSB」,Windows 會使用它作為裝置識別碼,並在更新的內建 Winusb.inf 中尋找相符專案,然後將 Winusb.sys 載入為裝置的函式驅動程式。

此映像適用於定義為 WinUSB 裝置的單一介面 MUTT 裝置,因此 Winusb.sys 載入為裝置的函式驅動程式。

顯示WinUSB裝置的 Windows 裝置管理員 螢幕快照。

對於早於 Windows 8 的 Windows 版本,可透過 Windows Update 取得更新的 Winusb.inf。 如果您的電腦設定為自動取得驅動程式更新,WinUSB 驅動程式將會安裝,而不需要任何使用者介入,方法是使用新的 INF 套件。

如何變更 WinUSB 裝置的裝置描述

針對 WinUSB 裝置,裝置管理員 會顯示 「WinUsb Device」 作為裝置描述。 該字串衍生自 Winusb.inf。 如果有多個 WinUSB 裝置,所有裝置都會取得相同的裝置描述。

若要在 裝置管理員 中唯一識別及區分裝置,Windows 8 在裝置類別上提供新的屬性,指示系統在其iProduct 字串描述元中 (裝置所報告的裝置描述) 高於 INF 中的描述。 Windows 8 中定義的 「USBDevice」 類別會設定此屬性。 換句話說,當裝置安裝在 「USBDevice」 類別下時,系統會查詢裝置是否有裝置描述,並將 裝置管理員 字串設定為查詢中擷取的任何專案。 在此情況下,會忽略 INF 中提供的裝置描述。 請注意上圖中的裝置描述字串:“MUTT”。 字串是由 USB 裝置在其產品字串描述元中提供。

舊版 Windows 不支援新的類別屬性。 若要在舊版 Windows 上自定義裝置描述,您必須撰寫自己的自定義 INF。

如何設定 WinUSB 裝置

若要將 USB 裝置識別為 WinUSB 裝置,裝置韌體必須具有 Microsoft OS 描述元。 如需描述項的相關信息,請參閱這裡所述的規格: Microsoft OS 描述元

支援擴充功能描述元

為了讓 USB 驅動程式堆疊知道裝置支援擴充功能描述元,裝置必須定義儲存在字串索引0xEE的 OS 字串描述元。 列舉期間,驅動程式堆疊會查詢字串描述元。 如果描述項存在,驅動程式堆疊會假設裝置包含一或多個OS功能描述元,以及擷取這些功能描述元所需的數據。

擷取的字串描述元具有 bMS_VendorCode 域值。 值表示 USB 驅動程式堆疊必須用來擷取擴充功能描述元的廠商程式代碼。

For information about how to define an OS string descriptor, see "The OS String Descriptor" in the specifications described here: Microsoft OS Descriptors.

設定相容的標識碼

符合內建 Winusb.inf 並載入 WinUSB 驅動程式模組所需的擴充相容識別碼 OS 功能描述元。

擴充相容標識碼 OS 功能描述元包含標頭區段,後面接著一或多個函式區段,視裝置是複合或非複合裝置而定。 標頭區段會指定整個描述項、函式區段數目和版本號碼的長度。 對於非複合裝置,標頭後面接著一個與裝置唯一介面相關聯的函式區段。 該區段的 compatibleID 字段必須指定 「WINUSB」 做為域值。 針對複合裝置,有多個函式區段。 每個函式區段的 compatibleID 欄位必須指定 「WINUSB」。。

註冊裝置介面 GUID

註冊其裝置介面 GUID 所需的擴充屬性 OS 功能描述元。 需要 GUID 才能從應用程式或服務尋找裝置、設定裝置,以及執行 I/O 作業。

在舊版 Windows 中,裝置介面 GUID 註冊是透過自定義 INF 完成。 從 Windows 8 開始,您的裝置應該使用擴充屬性OS功能描述元來報告介面 GUID。

擴充屬性OS功能描述元包含標頭區段,後面接著一或多個自定義屬性區段。 標頭區段描述整個擴充屬性描述項,包括其總長度、版本號碼和自定義屬性區段數目。 若要註冊裝置介面 GUID,請新增自定義屬性區段,將 bPropertyName 字段設定為 “DeviceInterfaceGUID”, 並將 wPropertyNameLength 設定為 40 個字節。 使用 GUID 產生器產生唯一的裝置介面 GUID,並將 bPropertyData 字段設定為該 GUID,例如 “{8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}”。 GUID 會指定為 Unicode 字串,而字串的長度為 78 個字節, (包括 null 終止符) 。

       
bPropertyData 78 個字節 7B 00 38 00 46 00 45 00 36 00 44 00 34 00 44 00 37 00 2D 00 34 00 39 00 00 44 00 2D 00 34 00 31 00 45 00 37 00 2D 00 39 00 34 00 38 00 36 00 2D 00 34 00 39 00 41 00 46 00 43 00 36 00 42 00 46 00 45 00 34 00 37 00 35 00 7D 0000 00 屬性值為 {8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}。

在裝置列舉期間,USB 驅動程式堆棧接著會從擴充屬性 OS 功能描述元擷取 DeviceInterfaceGUID 值,並在裝置的硬體密鑰中註冊裝置。 應用程式可以使用 SetupDiXxx API 來擷取值, (請參閱 SetupDiOpenDevRegKey) 。 如需詳細資訊,請參閱 如何使用 WinUSB 函式存取 USB 裝置

啟用或停用 WinUSB 電源管理功能

在 Windows 8 之前,若要設定 WinUSB 的電源管理功能,您必須在 HW 中撰寫登錄專案值自訂 INF 的 AddReg 區段。

在 Windows 8 和更新版本中,您可以在裝置中指定電源設定。 您可以透過擴充屬性操作系統功能描述元來報告值,以啟用或停用該裝置的 WinUSB 功能。 我們可以設定兩個功能:選擇性暫停和系統喚醒。 選擇性暫停可讓裝置在閑置時進入低電源狀態。 系統喚醒是指當系統處於低電源狀態時,裝置喚醒系統的能力。

如需 WinUSB 電源管理功能的相關信息,請參閱 WinUSB 電源管理

屬性名稱 描述
DeviceIdleEnabled 此值設定為 1,表示當閒置 (選擇性暫停) 時,裝置可以關閉電源。
DefaultIdleState 此值設定為 1,表示裝置預設可在閑置時暫停。
DefaultIdleTimeout 此值會設定為5000毫秒,以指出判斷裝置閒置之前等待的時間量,以毫秒為單位。
UserSetDeviceIdleEnabled 此值設定為 1,可讓使用者控制裝置啟用或停用 USB 選擇性暫停的能力。 複選框 [允許計算機關閉此裝置以節省裝置電源管理] 屬性頁的電源,使用者可以核取或取消核取方塊以啟用或停用 USB 選擇性暫停。
SystemWakeEnabled 此值設定為 1,可讓使用者控制裝置從低電源狀態喚醒系統的能力。 啟用時, [允許此裝置喚醒計算機 ] 複選框會出現在裝置電源管理屬性頁中。 用戶可以核取或取消核取方塊,以啟用或停用USB系統喚醒。

例如,若要在裝置上啟用選擇性暫停,請新增自定義屬性區段,將 bPropertyName 字段設定為 Unicode 字元串 “DeviceIdleEnabled” 和 wPropertyNameLength 為 36 個字節。 將 bPropertyData 字段設定為 「0x00000001」。 屬性值會儲存為位元組由小到小的32位整數。

在列舉期間,USB 驅動程式堆疊會讀取擴充屬性功能描述項,並在此機碼下建立登錄專案:

\ HKEY_LOCAL_MACHINE系統\CurrentControlSet\枚舉\Usb\<裝置標識碼>\<實例標識碼>\裝置參數

此影像顯示 WinUSB 裝置的範例設定。

Windows 登錄編輯器的螢幕快照,其中顯示 WinUSB 裝置的設定。

如需其他範例,請參閱 Microsoft OS 描述元上的規格。