WinUSB
WinUSB
本節介紹 Microsoft 為所有 USB 設備提供的常規 WinUSB 驅動程序 (Winusb.sys) 及其用戶模式組件。
在早于 Windows XP Service Pack 2 (SP2) 的 Windows 版本中,所有 USB 設備驅動程序都必須在內核模式下運行。如果所創建的 USB 設備的操作系統沒有本機類驅動程序,則需要為該設備編寫內核模式設備驅動程序。
Windows USB (WinUSB) 是一種常規的 USB 設備驅動程序,它是與用于 Windows XP SP2 的 Windows 驅動程序框架 (WDF) 同時開發的。WinUSB 架構由內核模式驅動程序 (Winusb.sys) 和公開 WinUSB 功能的用戶模式動態鏈接庫 (Winusb.dll) 組成。 使用這些功能,你可以通過用戶模式軟件管理 USB 設備。
WinUSB 架構和模塊
WinUSB 由于兩個基本組件組成:
Winusb.sys 是一種內核模式驅動程序,可在 USB 設備的內核模式設備堆棧的協議驅動程序之上作為篩選器驅動程序或功能驅動程序進行安裝。
Winusb.dll 是一種公開 WinUSB 功能的用戶模式 DLL。.當 Winusb.sys 作為設備的功能驅動程序安裝后,應用程序可以使用這些功能與其進行通信。
對于不要求自定義功能驅動程序的設備,Winusb.sys 可以在該設備的內核模式堆棧中作為功能驅動程序進行安裝。隨后,用戶模式流程通過使用一組設備 I/O 控制請求或調用 WinUSB 功能來與 Winusb.sys 進行通信。
WinUSB (Winusb.sys) 安裝
對于某些通用串行總線 (USB) 設備(如僅由單個應用程序訪問的設備),你可以在該設備的內核模式堆棧中安裝 WinUSB (Winusb.sys) 作為 USB 設備的功能驅動程序,來取代實施驅動程序。還可以安裝 WinUSB 作為功能驅動程序或為 USB 復合設備的某個特定功能安裝 WinUSB。WinUSB 通過使用 WinUSB 用戶模式動態鏈接庫 winusb.dll 公開的 WinUSB 功能 與設備進行通信。
編寫 WinUSB 安裝的自定義 INF
作為驅動程序包的一部分,你需要提供 .inf 文件,該文件將安裝 Winusb.sys 作為 USB 設備的功能驅動程序。
有關如何安裝 Winusb.sys 作為功能驅動程序的完整說明,請參閱如何安裝 Winusb.sys 作為設備的功能驅動程序。
下面的示例 .inf 文件西那是的針對大多數 USB 設備的 WinUSB 安裝,但進行了一些修改,例如將相應部分名稱中的 USB_Install 更改為相應的 DDInstall 值。你還應根據需要更改版本、制造商和型號部分。例如,提供相應的制造商名稱、已簽名目錄文件的名稱、正確的設備類以及設備的供應商標識 (VID) 和產品標識 (PID)。
還應通知安裝程序類已設置為 "USBDevice"。供應商可以對不屬于其他類以及不是 USB 主控制器或集線器的設備使用 "USBDevice" 安裝程序類。
如果要安裝 WinUSB 作為 USB 復合設備中任一功能的功能驅動程序,必須在 INF 中提供中與該功能關聯的硬件 ID。可以從“設備管理器”的 devnode 屬性中獲取該功能的硬件 ID。硬件 ID 字符串格式為 "USB\VID_vvvv&PID_pppp"。 下面的 INF 安裝 WinUSB 作為基于 x64 系統上 OSR USB FX2 主板的功能驅動程序。
;
;
; Installs WinUsb
;
[Version]
Signature = "$Windows NT$"
Class? ???= USBDevice
ClassGUID = {88BAE032-5A81-49f0-BC3D-A4FF138216D6}
Provider??= %ManufacturerName%
CatalogFile = WinUSBInstallation.cat
DriverVer=09/04/2012,13.54.20.543
; ========== Manufacturer/Models sections ===========
[Manufacturer]
%ManufacturerName% = Standard,NTamd64
[Standard.NTamd64]
%DeviceName% =USB_Install, USB\VID_0547&PID_1002
; ========== Class definition ===========
[ClassInstall32]
AddReg = ClassInstall_AddReg
[ClassInstall_AddReg]
HKR,,,,%ClassName%
HKR,,NoInstallClass,,1
HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"
HKR,,LowerLogoVersion,,5.2
; =================== Installation ===================
[USB_Install]
Include = winusb.inf
Needs? ?= WINUSB.NT
[USB_Install.Services]
Include =winusb.inf
Needs? ?= WINUSB.NT.Services
[USB_Install.HW]
AddReg=Dev_AddReg
[Dev_AddReg]
HKR,,DeviceInterfaceGUIDs,0x10000,"{9f543223-cede-4fa3-b376-a25ce9a30e74}"
; [DestinationDirs]
; If your INF needs to copy files, you must not use the DefaultDestDir directive here.??
; You must explicitly reference all file-list-section names in this section.
; =================== Strings ===================
[Strings]
ManufacturerName=""
ClassName="Universal Serial Bus devices"
DeviceName="Fx2 Learning Kit Device"
REG_MULTI_SZ = 0x00010000 復制代碼
如何在不編寫自定義 INF 的情況下自動安裝 WinUSB
作為 OEM 或獨立硬件供應商 (IHV),你可以構建自己的設備,以便在 Windows 8 以及早期版本的操作系統上自動安裝 Winusb.sys。這種設備稱作 WinUSB 設備,無需編寫引用自帶 Winusb.inf 的自定義 INF 文件。有關詳細信息,請參閱 WinUSB 設備。
什么是 WinUSB 設備
WinUSB 設備是一種通用串行總線 (USB) 設備,其固件定義了某些 Microsoft 操作系統 (OS) 特征描述符,這些描述符將兼容 ID 報告為 "WINUSB"。
WinUSB 設備的用途是讓 Windows 將 Winusb.sys 作為設備的功能驅動程序載入,而無需自定義 INF 文件。對于 WinUSB 設備,你無須為設備分發 INF 文件,對最終用戶而言,這大大簡化了驅動程序安裝過程。相反,如果你需要提供自定義 INF,則不應將設備定義為 WinUSB 設備和在 INF 中指定設備的硬件 ID。
Microsoft 提供了 Winusb.inf,其中包含將 Winusb.sys 作為 USB 設備的設備驅動程序安裝所需的信息。
在 Windows 8 之前,要將 Winusb.sys 作為功能驅動程序加載,你需要提供自定義 INF。自定義 INF 指定設備特定的硬件 ID,同時包括內置 Winusb.inf 的部分。這些部分是實例化服務、復制內置二進制文件以及注冊設備接口 GUID(應用程序查找設備和與設備通訊必須使用 GUID)所必需的。有關編寫自定義 INF 的信息,請參閱 WinUSB (Winusb.sys) 安裝。
在 Windows 8 中,內置 Winusb.inf 文件經過更新后可讓 Windows 自動將 INF 與 WinUSB 設備匹配。
使用內置 Winusb.inf 安裝 WinUSB 設備
在 Windows 8 中,內置 Winusb.inf 文件已更新。INF 包括引用稱為 "USB\MS_COMP_WINUSB" 的兼容 ID 的安裝部分。
[Generic.Section.NTamd64]
%USB\MS_COMP_WINUSB.DeviceDesc%=WINUSB,USB\MS_COMP_WINUSB
更新的 INF 還包括稱為 "USBDevice" 的新安裝程序類。
"USBDevice" 安裝程序類可供這些 Microsoft 未提供內置驅動程序的設備使用。通常,此類設備不屬于定義良好的 USB 類(如音頻、Bluetooth 等),并且需要自定義驅動程序。如果你的設備是 WinUSB 設備,則該設備很可能不屬于 USB 類。因此,你的設備必須安裝在 "USBDevice" 安裝程序類下。更新的 Winusb.inf 便于實現該要求。
關于 USBDevice 類的使用。:??
不要對未分類設備使用“USB”安裝程序類。該類預留用于安裝控制器、集線器和復合設備?!癠SB”類誤用可能造成嚴重的可靠性和性能問題。對于未分類設備,請使用“USBDevice”。
在 Windows 8 中,要使用“USBDevice”設備類,只需將其添加到你的 INF 中即可。
[版本] …
[Version]
Class=USBDevice
ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF138216D6}
… 復制代碼
在設備管理器中,你將會看到一個新節點 USB 通用串行總線設備,你的設備就顯示在該節點下。
在 Windows 7 中,除前面的行外,你還需要在 INF 中創建以下注冊表設置:
;---------- 添加注冊表部分 ---------- [USBDeviceClassReg]
HKR,,,,"Universal Serial Bus devices"
HKR,,NoInstallClass,,1
HKR,,SilentInstall,,1
HKR,,IconPath,%REG_MULTI_SZ%," %systemroot%\system32\setupapi.dll,-20" 復制代碼
在設備管理器中,你將會發現你的設備顯示在 USB 通用串行總線設備下。不過,該設備類描述由 INF 中指定的注冊表設置派生而來。
- Eliyas Yakub,Microsoft Windows USB 核心團隊
注意,"USBDevice" 類不僅限于 WinUSB。如果你有設備的自定義驅動程序,則可在自定義 INF 中使用 "USBDevice" 安裝程序類。
在設備枚舉過程中,USB 驅動程序堆棧會從設備讀取兼容 ID。如果兼容 ID 是 "WINUSB",Windows 會將其用作設備標識符,并在更新的內置 Winusb.inf 中查找匹配,然后將 Winusb.sys 作為設備的功能驅動程序加載。
對于 Windows 8 之前的 Windows 版本,更新的 Winusb.inf 可通過 Windows 更新提供。
如果你的計算機配置為自動獲取驅動程序更新,WinUSB 驅動程序將使用新的 INF 程序包進行安裝,無需任何用戶干預。
如何配置 WinUSB 設備
若要將 USB 設備標識為 WinUSB 設備,設備固件必須具有這些 Microsoft OS 描述符。
支持擴展的特征描述符
為了讓 USB 驅動程序堆棧了解設備支持擴展的特征描述符,設備必須定義存儲在字符串索引 0xEE 處的 OS 字符串描述符。在枚舉過程中,驅動程序堆棧查詢字符串描述符。如果存在描述符,驅動程序堆棧會假定設備包含一個或多個 OS 特征描述符和檢索這些特征描述符所需要的數據。
檢索的字符串描述符具有 bMS_VendorCode 字段值。該值表示 USB 驅動程序堆棧必須用來檢索擴展特征描述符的供應商代碼。
設置兼容 ID
匹配內置 Winusb.inf 和加載 WinUSB 驅動程序模塊所需要的擴展兼容 ID OS 特征描述符。
擴展兼容 ID OS 特征描述符包含緊跟一個或多個功能部分的標題部分,具體取決于是否是復合設備。標題部分指定整個描述符的長度、功能部分的數量以及版本號。對于非復合設備,標題后緊跟一個僅與設備的接口關聯的功能部分。該部分的 compatibleID 字段必須指定 "WINUSB" 作為字段值。復合設備有多個功能部分。每個功能部分的 compatibleID 字段必須指定 "WINUSB"。
注冊設備接口 GUID
注冊設備接口 GUID 所需要的擴展屬性 OS 特征描述符。需要使用 GUID 從應用程序或服務查找設備、配置設備以及執行 I/O 操作。
在以前版本的 Windows 中,設備接口 GUID 注冊通過自定義 INF 完成。從 Windows 8 開始,你的設備應使用擴展屬性 OS 特征描述符報告接口 GUID。
本節介紹 Microsoft 為所有 USB 設備提供的常規 WinUSB 驅動程序 (Winusb.sys) 及其用戶模式組件。
在早于 Windows XP Service Pack 2 (SP2) 的 Windows 版本中,所有 USB 設備驅動程序都必須在內核模式下運行。如果所創建的 USB 設備的操作系統沒有本機類驅動程序,則需要為該設備編寫內核模式設備驅動程序。
Windows USB (WinUSB) 是一種常規的 USB 設備驅動程序,它是與用于 Windows XP SP2 的 Windows 驅動程序框架 (WDF) 同時開發的。WinUSB 架構由內核模式驅動程序 (Winusb.sys) 和公開 WinUSB 功能的用戶模式動態鏈接庫 (Winusb.dll) 組成。 使用這些功能,你可以通過用戶模式軟件管理 USB 設備。
WinUSB 架構和模塊
WinUSB 由于兩個基本組件組成:
Winusb.sys 是一種內核模式驅動程序,可在 USB 設備的內核模式設備堆棧的協議驅動程序之上作為篩選器驅動程序或功能驅動程序進行安裝。
Winusb.dll 是一種公開 WinUSB 功能的用戶模式 DLL。.當 Winusb.sys 作為設備的功能驅動程序安裝后,應用程序可以使用這些功能與其進行通信。
對于不要求自定義功能驅動程序的設備,Winusb.sys 可以在該設備的內核模式堆棧中作為功能驅動程序進行安裝。隨后,用戶模式流程通過使用一組設備 I/O 控制請求或調用 WinUSB 功能來與 Winusb.sys 進行通信。
WinUSB (Winusb.sys) 安裝
對于某些通用串行總線 (USB) 設備(如僅由單個應用程序訪問的設備),你可以在該設備的內核模式堆棧中安裝 WinUSB (Winusb.sys) 作為 USB 設備的功能驅動程序,來取代實施驅動程序。還可以安裝 WinUSB 作為功能驅動程序或為 USB 復合設備的某個特定功能安裝 WinUSB。WinUSB 通過使用 WinUSB 用戶模式動態鏈接庫 winusb.dll 公開的 WinUSB 功能 與設備進行通信。
編寫 WinUSB 安裝的自定義 INF
作為驅動程序包的一部分,你需要提供 .inf 文件,該文件將安裝 Winusb.sys 作為 USB 設備的功能驅動程序。
有關如何安裝 Winusb.sys 作為功能驅動程序的完整說明,請參閱如何安裝 Winusb.sys 作為設備的功能驅動程序。
下面的示例 .inf 文件西那是的針對大多數 USB 設備的 WinUSB 安裝,但進行了一些修改,例如將相應部分名稱中的 USB_Install 更改為相應的 DDInstall 值。你還應根據需要更改版本、制造商和型號部分。例如,提供相應的制造商名稱、已簽名目錄文件的名稱、正確的設備類以及設備的供應商標識 (VID) 和產品標識 (PID)。
還應通知安裝程序類已設置為 "USBDevice"。供應商可以對不屬于其他類以及不是 USB 主控制器或集線器的設備使用 "USBDevice" 安裝程序類。
如果要安裝 WinUSB 作為 USB 復合設備中任一功能的功能驅動程序,必須在 INF 中提供中與該功能關聯的硬件 ID。可以從“設備管理器”的 devnode 屬性中獲取該功能的硬件 ID。硬件 ID 字符串格式為 "USB\VID_vvvv&PID_pppp"。
作為 OEM 或獨立硬件供應商 (IHV),你可以構建自己的設備,以便在 Windows 8 以及早期版本的操作系統上自動安裝 Winusb.sys。這種設備稱作 WinUSB 設備,無需編寫引用自帶 Winusb.inf 的自定義 INF 文件。有關詳細信息,請參閱 WinUSB 設備。
什么是 WinUSB 設備
WinUSB 設備是一種通用串行總線 (USB) 設備,其固件定義了某些 Microsoft 操作系統 (OS) 特征描述符,這些描述符將兼容 ID 報告為 "WINUSB"。
WinUSB 設備的用途是讓 Windows 將 Winusb.sys 作為設備的功能驅動程序載入,而無需自定義 INF 文件。對于 WinUSB 設備,你無須為設備分發 INF 文件,對最終用戶而言,這大大簡化了驅動程序安裝過程。相反,如果你需要提供自定義 INF,則不應將設備定義為 WinUSB 設備和在 INF 中指定設備的硬件 ID。
Microsoft 提供了 Winusb.inf,其中包含將 Winusb.sys 作為 USB 設備的設備驅動程序安裝所需的信息。
在 Windows 8 之前,要將 Winusb.sys 作為功能驅動程序加載,你需要提供自定義 INF。自定義 INF 指定設備特定的硬件 ID,同時包括內置 Winusb.inf 的部分。這些部分是實例化服務、復制內置二進制文件以及注冊設備接口 GUID(應用程序查找設備和與設備通訊必須使用 GUID)所必需的。有關編寫自定義 INF 的信息,請參閱 WinUSB (Winusb.sys) 安裝。
在 Windows 8 中,內置 Winusb.inf 文件經過更新后可讓 Windows 自動將 INF 與 WinUSB 設備匹配。
使用內置 Winusb.inf 安裝 WinUSB 設備
在 Windows 8 中,內置 Winusb.inf 文件已更新。INF 包括引用稱為 "USB\MS_COMP_WINUSB" 的兼容 ID 的安裝部分。
[Generic.Section.NTamd64]
%USB\MS_COMP_WINUSB.DeviceDesc%=WINUSB,USB\MS_COMP_WINUSB
更新的 INF 還包括稱為 "USBDevice" 的新安裝程序類。
"USBDevice" 安裝程序類可供這些 Microsoft 未提供內置驅動程序的設備使用。通常,此類設備不屬于定義良好的 USB 類(如音頻、Bluetooth 等),并且需要自定義驅動程序。如果你的設備是 WinUSB 設備,則該設備很可能不屬于 USB 類。因此,你的設備必須安裝在 "USBDevice" 安裝程序類下。更新的 Winusb.inf 便于實現該要求。
關于 USBDevice 類的使用。:??
不要對未分類設備使用“USB”安裝程序類。該類預留用于安裝控制器、集線器和復合設備?!癠SB”類誤用可能造成嚴重的可靠性和性能問題。對于未分類設備,請使用“USBDevice”。
在 Windows 8 中,要使用“USBDevice”設備類,只需將其添加到你的 INF 中即可。
[版本]
在 Windows 7 中,除前面的行外,你還需要在 INF 中創建以下注冊表設置:
;---------- 添加注冊表部分 ----------
- Eliyas Yakub,Microsoft Windows USB 核心團隊
注意,"USBDevice" 類不僅限于 WinUSB。如果你有設備的自定義驅動程序,則可在自定義 INF 中使用 "USBDevice" 安裝程序類。
在設備枚舉過程中,USB 驅動程序堆棧會從設備讀取兼容 ID。如果兼容 ID 是 "WINUSB",Windows 會將其用作設備標識符,并在更新的內置 Winusb.inf 中查找匹配,然后將 Winusb.sys 作為設備的功能驅動程序加載。
對于 Windows 8 之前的 Windows 版本,更新的 Winusb.inf 可通過 Windows 更新提供。
如果你的計算機配置為自動獲取驅動程序更新,WinUSB 驅動程序將使用新的 INF 程序包進行安裝,無需任何用戶干預。
如何配置 WinUSB 設備
若要將 USB 設備標識為 WinUSB 設備,設備固件必須具有這些 Microsoft OS 描述符。
支持擴展的特征描述符
為了讓 USB 驅動程序堆棧了解設備支持擴展的特征描述符,設備必須定義存儲在字符串索引 0xEE 處的 OS 字符串描述符。在枚舉過程中,驅動程序堆棧查詢字符串描述符。如果存在描述符,驅動程序堆棧會假定設備包含一個或多個 OS 特征描述符和檢索這些特征描述符所需要的數據。
檢索的字符串描述符具有 bMS_VendorCode 字段值。該值表示 USB 驅動程序堆棧必須用來檢索擴展特征描述符的供應商代碼。
設置兼容 ID
匹配內置 Winusb.inf 和加載 WinUSB 驅動程序模塊所需要的擴展兼容 ID OS 特征描述符。
擴展兼容 ID OS 特征描述符包含緊跟一個或多個功能部分的標題部分,具體取決于是否是復合設備。標題部分指定整個描述符的長度、功能部分的數量以及版本號。對于非復合設備,標題后緊跟一個僅與設備的接口關聯的功能部分。該部分的 compatibleID 字段必須指定 "WINUSB" 作為字段值。復合設備有多個功能部分。每個功能部分的 compatibleID 字段必須指定 "WINUSB"。
注冊設備接口 GUID
注冊設備接口 GUID 所需要的擴展屬性 OS 特征描述符。需要使用 GUID 從應用程序或服務查找設備、配置設備以及執行 I/O 操作。
在以前版本的 Windows 中,設備接口 GUID 注冊通過自定義 INF 完成。從 Windows 8 開始,你的設備應使用擴展屬性 OS 特征描述符報告接口 GUID。
總結
- 上一篇: 消息中间件核心实体(1)
- 下一篇: 民企信息化建设个人经历(四)