適用於開發人員的 WinUSB (Winusb.sys) 安裝
針對特定的通用序列總線 (USB) 裝置,您可以安裝 WinUSB (Winusb.sys),而不是實作驅動程式。
重要
本主題適用於程式設計人員。 如果您是客戶遇到 USB 問題,請參閱 修正 Windows 中的 USB-C 問題
不使用 INF 檔案自動安裝 WinUSB
身為 OEM 或獨立硬體廠商 (IHV),您可以建置裝置, 讓Winusb.sys 自動安裝在 Windows 8 和更新版本的作業系統上。 這類裝置稱為 WinUSB 裝置,不需要您撰寫參考內建 Winusb.inf 的自定義 INF 檔案。
當您連線 WinUSB 裝置時,系統會讀取裝置資訊,並自動載入 Winusb.sys 。
如需詳細資訊,請參閱 WinUSB 裝置。
藉由指定系統提供的裝置類別來安裝 WinUSB
當您連線裝置時,您可能會注意到 Windows 會自動載入 Winusb.sys 。 否則,請遵循下列指示來載入驅動程式:
- 將裝置插入主機系統。
- 開啟 [裝置管理員],然後找出裝置。
- 選取並按住裝置(或以滑鼠右鍵按兩下),然後從操作功能表中選取 [ 更新驅動程序軟體... ]。
- 在精靈中,選取 [ 流覽我的計算機以取得驅動程序軟體]。
- 從 電腦上的設備驅動器清單中選取 [讓我挑選]。
- 從裝置類別清單中,選取 [通用序列總線裝置]。
- 精靈會顯示 WinUsb 裝置。 選取它以載入驅動程式。
如果 通用序列總線裝置 未出現在裝置類別清單中,則必須使用自定義 INF 安裝驅動程式。 上述程式不會新增應用程式 (UWP 應用程式或 Windows 傳統型應用程式) 的裝置介面 GUID 來存取裝置。 您必須遵循此程式手動新增 GUID。
如上述程式所述載入驅動程式。
使用 guidgen.exe 之類的工具,為您的裝置產生裝置介面 GUID。
在此機碼下尋找裝置的登入機碼:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\<VID_vvvv&PID_pppp>
在 [裝置參數] 機碼下,新增名為 DeviceInterfaceGUID 的 String 登錄專案,或名為 DeviceInterfaceGUIDs 的多字元串專案。 將值設定為您在步驟 2 中產生的 GUID。
中斷裝置與系統的連線,並將它重新連線到相同的實體埠。
注意
如果您變更實體埠,則必須重複步驟 1 到 4。
撰寫用於 WinUSB 安裝的自訂 INF
在驅動程式套件中,您會提供 .inf 檔案,以安裝 Winusb.sys 做為 USB 裝置的功能驅動程式。
下列範例 .inf 檔案會顯示大部分 USB 裝置的 WinUSB 安裝,但有一些修改,例如將區段名稱中的USB_Install變更為適當的 DDInstall 值。 您也應該視需要變更版本、製造商和型號區段。 例如,提供適當的製造者名稱、已簽署目錄檔案的名稱、正確的裝置類別,以及裝置的廠商標識元 (VID) 和產品識別碼 (PID)。 如需建立類別目錄檔案的資訊,請參閱 建立目錄檔案以進行測試簽署驅動程式套件。
另請注意,安裝程式類別會設定為 USBDevice。 廠商可以將 USBDevice 設定類別用於不屬於另一個類別且不是 USB 主機控制器或中樞的裝置。
如果您要將 WinUSB 安裝為 USB 複合裝置中其中一個函式的函式驅動程式,您必須在 INF 中提供與函式相關聯的硬體識別碼。 您可以從 裝置管理員 中 devnode 的屬性取得函式的硬體識別碼。 硬體識別元字串格式為 USB\VID_vvvv&PID_pppp
。
下列 INF 會在以 x64 為基礎的系統上,將 WinUSB 安裝為 OSR USB FX2 面板的功能驅動程式。
從 Windows 10 版本 1709 開始,Windows 驅動程式套件提供 InfVerif.exe ,可讓您用來測試驅動程式 INF 檔案,以確保沒有語法問題,而且 INF 檔案是通用的。 我們建議您提供通用 INF。 如需詳細資訊,請參閱 使用通用 INF 檔案。
;
;
; 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
PnpLockdown = 1
; ========== Manufacturer/Models sections ===========
[Manufacturer]
%ManufacturerName% = Standard,NTamd64
[Standard.NTamd64]
%DeviceName% =USB_Install, USB\VID_0547&PID_1002
; ========== Class definition (for Windows 8 and earlier versions)===========
[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
[USB_Install.Wdf]
KmdfService=WINUSB, WinUsb_Install
[WinUsb_Install]
KmdfLibraryVersion=1.11
[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 檔案中包含 ClassInstall32 區段。 已安裝類別中裝置的 INF 檔案,無論是系統提供的裝置安裝類別還是自定義類別,都不得包含 ClassInstall32 區段。
除了下列清單中所指出的裝置特定值和數個問題之外,您可以使用這些區段和指示詞來安裝任何 USB 裝置的 WinUSB。 這些清單專案描述 上述 .inf 檔案中的 Includes 和 指示詞 。
USB_Install:安裝 WinUSB 需要 [USB_Install] 區段中的 Include 和 Needs 指示詞。 您不應該修改這些指示詞。
USB_Install.Services:USB_Install.Services 區段中的 Include 指示詞包含 WinUSB 的系統提供的 .inf (Winusb.inf)。 如果 WinUSB cointaller 尚未安裝在目標系統上,則會安裝這個 .inf 檔案。 Needs 指示詞會指定 Winusb.inf 內的 區段,其中包含安裝Winusb.sys作為裝置函式驅動程式所需的資訊。 您不應該修改這些指示詞。
USB_Install.HW:本節是 .inf 檔案中的索引鍵。 它會指定裝置的裝置介面全域唯一標識碼 (GUID)。 AddReg 指示詞會在標準登錄值中設定指定的介面 GUID。 當Winusb.sys載入為裝置的功能驅動程式時,它會讀取登錄值 DeviceInterfaceGUIDs 機碼,並使用指定的 GUID 來表示裝置介面。 您應該將此範例中的 GUID 取代為您特別為裝置建立的 GUID。 如果裝置的通訊協議變更,請建立新的裝置介面 GUID。
注意
使用者模式軟體必須呼叫 SetupDiGetClassDevs ,以列舉與 DeviceInterfaceGUIDs 索引鍵下指定之其中一個裝置介面類別相關聯的已註冊裝置介面。 SetupDiGetClassDevs 會傳回使用者模式軟體接著必須傳遞至WinUsb_Initialize例程的裝置句柄,以取得裝置介面的 WinUSB 句柄。 如需這些例程的詳細資訊,請參閱 如何使用 WinUSB Functions 存取 USB 裝置。
下列 INF 會在以 x64 為基礎的系統上,將 WinUSB 安裝為 OSR USB FX2 面板的功能驅動程式。 此範例顯示具有 WDF 硬幣的 INF。
;
;
; 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
PnpLockdown = 1
; ========== Manufacturer/Models sections ===========
[Manufacturer]
%ManufacturerName% = Standard,NTamd64
[Standard.NTamd64]
%DeviceName% =USB_Install, USB\VID_0547&PID_1002
; ========== Class definition (for Windows 8 and earlier versions) ===========
[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}"
[USB_Install.CoInstallers]
AddReg=CoInstallers_AddReg
CopyFiles=CoInstallers_CopyFiles
[CoInstallers_AddReg]
HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01011.dll,WdfCoInstaller","WinUsbCoInstaller2.dll"
[CoInstallers_CopyFiles]
WinUsbCoInstaller2.dll
WdfCoInstaller01011.dll
[DestinationDirs]
; If your INF needs to copy files, you must not use the DefaultDestDir directive here.
CoInstallers_CopyFiles=11
; ================= Source Media Section =====================
[SourceDisksNames]
1 = %DiskName%
[SourceDisksFiles]
WinUsbCoInstaller2.dll=1
WdfCoInstaller01011.dll=1
; =================== Strings ===================
[Strings]
ManufacturerName=""
ClassName="Universal Serial Bus devices"
DeviceName="Fx2 Learning Kit Device"
DiskName="MyDisk"
REG_MULTI_SZ = 0x00010000
USB_Install.CoInstallers:本節包含參考的 AddReg 和 CopyFiles 區段,包含安裝 WinUSB 和 KMDF 硬幣套件的數據和指示,並將其與裝置產生關聯。 大部分的USB裝置都可以使用這些區段和指示詞,而不需要修改。
x86 型和 x64 型 Windows 版本有個別的硬幣集。
每個硬幣器都有免費和檢查的版本。 使用免費版本在免費的 Windows 組建上安裝 WinUSB,包括所有零售版本。 若要在已檢查的 Windows 組建上安裝 WinUSB,請使用核取的版本(搭配 “_chk” 後綴)。
每次載入Winusb.sys時,它會註冊裝置介面,該介面具有DeviceInterfaceGUIDs機碼下登錄中指定的裝置介面類別。
HKR,,DeviceInterfaceGUIDs, 0x10000,"{D696BFEB-1734-417d-8A04-86D01071C512}"
如果您使用適用於 Windows XP 或 Windows Server 2003 的可轉散發 WinUSB 套件,請確定您不會在卸載套件中卸載 WinUSB。 其他USB裝置可能會使用WinUSB,因此其二進位檔必須保留在共享資料夾中。
如何建立安裝Winusb.sys的驅動程式套件
若要使用 WinUSB 作為裝置的功能驅動程式,您可以建立驅動程式套件。 驅動程式套件必須包含下列檔案:
- WinUSB 硬幣塔勒 (Winusbcoinstaller.dll)
- KMDF 硬幣器 (WdfcoinstallerXXX.dll)
- 安裝Winusb.sys為裝置函式驅動程式的 .inf 檔案。 如需詳細資訊,請參閱 撰寫自定義 INF for WinUSB 安裝。
- 封裝的已簽署目錄檔案。 從 Vista 開始,需要此檔案才能在 x64 版本的 Windows 上安裝 WinUSB。
請確定驅動程式套件內容符合下列需求:
- KMDF 和 WinUSB cointaller 檔案必須從相同版本的 Windows 驅動程式套件 (WDK) 取得。
- cointaller 檔案必須從最新版本的 WDK 取得,讓驅動程序支援所有最新的 Windows 版本。
- 驅動程式套件的內容必須使用 Winqual 發行簽章進行數字簽署。 如需如何建立及測試已簽署類別目錄檔案的詳細資訊,請參閱 Windows 開發人員中心 - 硬體網站上的內核模式程式代碼簽署逐步解說。
下載 Windows 驅動程式套件 (WDK) 並加以安裝。
在 USB 裝置所連線的電腦上建立驅動程式套件資料夾。 例如,c:\UsbDevice。
將 WinUSB cointaller (WinusbcoinstallerX.dll) 從 WinDDK\BuildNumber>\<redist\winusb 資料夾複製到驅動程式套件資料夾。
必要時,WinUSB 硬幣器 (Winusbcoinstaller.dll) 會在目標系統上安裝 WinUSB。 WDK 包含三個版本,視系統架構而定:x86 型、x64 型和 Itanium 型系統。 每個 cointaller 都會命名為 WinusbcoinstallerX.dll,並位於 WinDDK\BuildNumber>\redist\winusb 資料夾的適當子目錄中。<
將 KMDF cointaller (WdfcoinstallerXXX.dll) 從 WinDDK\BuildNumber>\<redist\wdf 資料夾複製到驅動程式套件資料夾。
如有必要,KMDF 硬幣機 (WdfcoinstallerXXX.dll) 會在目標系統上安裝正確的 KMDF 版本。 WinUSB cointaller 的版本必須符合 KMDF cointaller,因為 KMDF 型用戶端驅動程式,例如 Winusb.sys,需要系統上正確安裝對應的 KMDF 架構版本。 例如,Winusbcoinstaller2.dll需要 KMDF 1.9 版,Wdfcoinstaller01009.dll安裝。 x86 和 x64 版本的WdfcoinstallerXXX.dll隨附於 WinDDK\<BuildNumber>\redist\wdf 資料夾下的 WDK。 下表顯示用於目標系統上的 WinUSB cointaller 和相關聯的 KMDF cointaller。
使用此表格來判斷 WinUSB 硬幣塔勒和相關聯的 KMDF 硬幣器。
WinUSB cointaller KMDF 連結庫版本 KMDF 硬幣器 Winusbcoinstaller.dll 需要 KMDF 1.5 版或更新版本 Wdfcoinstaller01005.dll
Wdfcoinstaller01007.dll
Wdfcoinstaller01009.dllWinusbcoinstaller2.dll 需要 KMDF 1.9 版或更新版本 Wdfcoinstaller01009.dll Winusbcoinstaller2.dll 需要 KMDF 1.11 版或更新版本 WdfCoInstaller01011.dll 撰寫 .inf 檔案,以安裝 Winusb.sys 做為USB裝置的函式驅動程式。
建立封裝的已簽署目錄檔案。 需要此檔案才能在 x64 版本的 Windows 上安裝 WinUSB。
將 USB 裝置連結至您的電腦。
若要安裝驅動程式,請開啟 裝置管理員。 遵循更新驅動程式軟體精靈上的指示,然後選擇手動安裝。 若要完成安裝,請提供驅動程式套件資料夾的位置。