共用方式為


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 中,將此定義新增至您的 INF 檔案,以使用 USBDevice 裝置類別:

  [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 驅動程式堆疊會從裝置讀取相容 ID。 如果 「WINUSB」 是相容 ID,Windows 會使用它作為裝置識別碼,並在更新版的內建 Winusb.inf 中尋找相符項目,然後將 Winusb.sys 載入作為裝置的功能驅動程式。

此圖像是針對被定義為 WinUSB 裝置的單介面 MUTT 裝置,因此 Winusb.sys 被載入為該裝置的功能驅動程式。

顯示 WinUSB 裝置的 Windows 設備管理器螢幕快照。

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

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

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

為了在裝置管理員中唯一地識別和區分裝置,Windows 8 在裝置類別中提供了一個新的屬性,指示系統優先採用裝置所報告的裝置描述(即其 iProduct 字元串描述元中提供的描述),而非 INF 中的描述。 Windows 8 中定義的 USBDevice 類別會設定此屬性。 當裝置安裝在 USBDevice 類別下時,Windows 會查詢裝置以取得裝置描述,並將 Device Manager 字串設定為所擷取的描述。 在此情況下,會忽略 INF 中提供的裝置描述。 請注意上圖中的裝置描述字串:“MUTT”。 字串是由 USB 裝置在其產品字串描述元中提供。

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

如何設定 WinUSB 裝置

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

支援擴充功能描述元

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

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

如需如何定義 OS 字串描述元的詳細資訊,請參閱此處所述的規格中的Microsoft OS 描述元

設定相容的標識碼

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

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

註冊裝置介面 GUID

需要擴充屬性 OS 功能描述元,才能註冊其裝置介面 GUID。 需要 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 00 00 00 屬性值為 {8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}。

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

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

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

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

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

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

例如,若要在裝置上啟用選擇性暫停,請新增一個自訂屬性區段,將 bPropertyName 欄位設定為 Unicode 字元串 "DeviceIdleEnabled",並將 wPropertyNameLength 設定為 36 個字節。 將 [bPropertyData] 字段設定為 “0x00000001”。 屬性值會儲存為小端 32 位整數。

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

HKEY_LOCAL_MACHINE\System\CurrentControlSet\列舉\USB\<裝置標識符>\<實例標識碼>\裝置參數

下圖顯示 WinUSB 裝置的範例設定。

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

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