Condividi tramite


Installazione di WinUSB (Winusb.sys) per gli sviluppatori

Per alcuni dispositivi USB (Universal Serial Bus), ad esempio i dispositivi a cui si accede da una singola applicazione, è possibile installare WinUSB (Winusb.sys) nello stack in modalità kernel del dispositivo come driver funzione del dispositivo USB anziché implementare un driver.

Importante

Questo argomento è destinato ai programmatori. Se si verificano problemi USB da parte di un cliente, vedere Risolvere i problemi comuni relativi a USB

Installazione automatica di WinUSB senza un file INF

IHV (OEM o fornitore di hardware indipendente), è possibile compilare il dispositivo in modo che il Winusb.sys venga installato automaticamente in Windows 8 e versioni successive del sistema operativo. Un dispositivo di questo tipo è denominato dispositivo WinUSB e non richiede la scrittura di un file INF personalizzato che fa riferimento a Winusb.inf.

Quando si connette un dispositivo WinUSB, il sistema legge le informazioni sul dispositivo e carica automaticamente Winusb.sys .

Per altre informazioni, vedere Dispositivo WinUSB.

Installazione di WinUSB specificando la classe di dispositivo fornita dal sistema

Quando si connette il dispositivo, è possibile notare che Windows carica automaticamente Winusb.sys (se il dispositivo IHV ha definito il dispositivo come dispositivo WinUSB). In caso contrario, seguire queste istruzioni per caricare il driver:

  1. Collegare il dispositivo al sistema host.
  2. Aprire Gestione dispositivi e individuare il dispositivo.
  3. Selezionare e tenere premuto (o fare clic con il pulsante destro del mouse) sul dispositivo e scegliere Aggiorna software driver dal menu di scelta rapida.
  4. Nella procedura guidata selezionare Sfoglia il computer per il software driver.
  5. Selezionare Let me pick from a list of device drivers on my computer (Consenti selezione da un elenco di driver di dispositivo nel computer).
  6. Nell'elenco delle classi di dispositivi selezionare Dispositivi bus seriali universali.
  7. La procedura guidata visualizza il dispositivo WinUsb. Selezionarlo per caricare il driver.

Se i dispositivi del bus seriale universale non vengono visualizzati nell'elenco delle classi di dispositivi, è necessario installare il driver usando un INF personalizzato. La procedura precedente non aggiunge un GUID dell'interfaccia dispositivo per un'app (app UWP o app desktop di Windows) per accedere al dispositivo. È necessario aggiungere manualmente il GUID seguendo questa procedura.

  1. Caricare il driver come descritto nella procedura precedente.

  2. Generare un GUID dell'interfaccia dispositivo per il dispositivo usando uno strumento come guidgen.exe.

  3. Trovare la chiave del Registro di sistema per il dispositivo in questa chiave:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\<VID_vvvv&PID_pppp>

  4. Nella chiave Device Parameters aggiungere una voce del Registro di sistema String denominata DeviceInterfaceGUID o una voce a più stringhe denominata DeviceInterfaceGUIDs. Impostare il valore sul GUID generato nel passaggio 2.

  5. Disconnettere il dispositivo dal sistema e riconnetterlo alla stessa porta fisica. Nota: se si modifica la porta fisica, è necessario ripetere i passaggi da 1 a 4.

Scrittura di un INF personalizzato per l'installazione di WinUSB

Come parte del pacchetto driver, fornisci un file inf che installa Winusb.sys come driver di funzione per il dispositivo USB.

Il file inf di esempio seguente mostra l'installazione winUSB per la maggior parte dei dispositivi USB con alcune modifiche, ad esempio la modifica di USB_Install nei nomi di sezione in un valore DDInstall appropriato. È anche necessario modificare le sezioni della versione, del produttore e del modello in base alle esigenze. Ad esempio, specificare il nome di un produttore appropriato, il nome del file di catalogo firmato, la classe di dispositivo corretta e l'identificatore del fornitore (VID) e l'identificatore del prodotto (PID) per il dispositivo. Per informazioni sulla creazione di un file di catalogo, vedi Creazione di un file di catalogo per la firma di test di un pacchetto driver.

Si noti anche che la classe setup è impostata su "USBDevice". I fornitori possono usare la classe di installazione "USBDevice" per i dispositivi che non appartengono a un'altra classe e non sono controller host USB o hub.

Se si installa WinUSB come driver di funzione per una delle funzioni in un dispositivo composito USB, è necessario specificare l'ID hardware associato alla funzione, in INF. È possibile ottenere l'ID hardware per la funzione dalle proprietà del nodo devnode in Gestione dispositivi. Il formato della stringa ID hardware è "USB\VID_vvvv&PID_pppp".

L'INF seguente installa WinUSB come driver di funzione della scheda USB FX2 di OSR in un sistema basato su x64.

A partire da Windows 10 versione 1709, Windows Driver Kit fornisce InfVerif.exe che è possibile usare per testare un file INF driver per assicurarsi che non ci siano problemi di sintassi e che il file INF sia universale. È consigliabile fornire un INF universale. Per altre informazioni, vedere Uso di un file INF universale.

;
;
; 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

Includere solo una sezione ClassInstall32 in un file INF del dispositivo per installare una nuova classe di installazione del dispositivo personalizzata. I file INF per i dispositivi in una classe installata, indipendentemente dal fatto che una classe di installazione del dispositivo fornita dal sistema o una classe personalizzata, non includano una sezione ClassInstall32.

Ad eccezione dei valori specifici del dispositivo e di diversi problemi indicati nell'elenco seguente, è possibile usare queste sezioni e direttive per installare WinUSB per qualsiasi dispositivo USB. Queste voci di elenco descrivono le direttive Includes e nel file con estensione inf precedente.

  • USB_Install: le direttive Include e Needs nella sezione USB_Install sono necessarie per l'installazione di WinUSB. Non è consigliabile modificare queste direttive.

  • USB_Install.Services: la direttiva Include nella sezione USB_Install.Services include il file inf fornito dal sistema per WinUSB (Winusb.inf). Questo file con estensione inf viene installato dal co-programma di installazione WinUSB, se non è già presente nel sistema di destinazione. La direttiva Needs specifica la sezione all'interno di Winusb.inf che contiene informazioni necessarie per installare Winusb.sys come driver di funzione del dispositivo. Non è consigliabile modificare queste direttive.

  • USB_Install.HW: questa sezione è la chiave nel file inf. Specifica l'identificatore univoco globale dell'interfaccia del dispositivo (GUID) per il dispositivo. La direttiva AddReg imposta il GUID dell'interfaccia specificato in un valore del Registro di sistema standard. Quando Winusb.sys viene caricato come driver di funzione del dispositivo, legge il valore del Registro di sistema DeviceInterfaceGUIDs e usa il GUID specificato per rappresentare l'interfaccia del dispositivo. È consigliabile sostituire il GUID in questo esempio con quello creato in modo specifico per il dispositivo. Se i protocolli per il dispositivo cambiano, creare un nuovo GUID dell'interfaccia del dispositivo.

    Nota Il software in modalità utente deve chiamare SetupDiGetClassDevs per enumerare le interfacce del dispositivo registrate associate a una delle classi di interfaccia dispositivo specificate nella chiave DeviceInterfaceGUIDs. SetupDiGetClassDevs restituisce l'handle del dispositivo per il dispositivo che il software in modalità utente deve quindi passare alla routine WinUsb_Initialize per ottenere un handle WinUSB per l'interfaccia del dispositivo. Per altre info su queste routine, vedi How to Access a USB Device by Using WinUSB Functions.For more info about these routines, see How to Access a USB Device by Using WinUSB Functions.

L'INF seguente installa WinUSB come driver di funzione della scheda USB FX2 di OSR in un sistema basato su x64. L'esempio mostra INF con co-installer WDF.

;
;
; 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: questa sezione, che include le sezioni AddReg e CopyFiles di riferimento, contiene dati e istruzioni per installare i co-installer WinUSB e KMDF e associarli al dispositivo. La maggior parte dei dispositivi USB può usare queste sezioni e direttive senza modifiche.

  • Le versioni basate su x86 e x64 di Windows hanno co-installer separati.

    Ogni co-programma di installazione ha versioni gratuite e controllate. Usare la versione gratuita per installare WinUSB in build gratuite di Windows, incluse tutte le versioni definitive. Usare la versione selezionata (con il suffisso "_chk") per installare WinUSB nelle build controllate di Windows.

Ogni volta che Winusb.sys viene caricata, registra un'interfaccia del dispositivo con le classi di interfaccia del dispositivo specificate nel Registro di sistema nella chiave DeviceInterfaceGUIDs .

HKR,,DeviceInterfaceGUIDs, 0x10000,"{D696BFEB-1734-417d-8A04-86D01071C512}"

Se usi il pacchetto WinUSB ridistribuibile per Windows XP o Windows Server 2003, assicurati di non disinstallare WinUSB nei pacchetti di disinstallazione. Altri dispositivi USB potrebbero usare WinUSB, quindi i relativi file binari devono rimanere nella cartella condivisa.

Come creare un pacchetto driver che installa Winusb.sys

Per usare WinUSB come driver di funzione del dispositivo, si crea un pacchetto driver. Il pacchetto driver deve contenere questi file:

  • Co-programma di installazione WinUSB (Winusbcoinstaller.dll)
  • Co-programma di installazione kmDF (WdfcoinstallerXXX.dll)
  • File inf che installa Winusb.sys come driver di funzione del dispositivo. Per altre informazioni, vedere Scrittura di un INF personalizzato per l'installazione di WinUSB.
  • File di catalogo firmato per il pacchetto. Questo file è necessario per installare WinUSB nelle versioni x64 di Windows a partire da Vista.

Pacchetto di installazione WinUSB.

Assicurarsi che il contenuto del pacchetto driver soddisfi questi requisiti:

  • I file co-installer kmDF e WinUSB devono essere ottenuti dalla stessa versione di Windows Driver Kit (WDK).
  • I file di co-installazione devono essere ottenuti dalla versione più recente di WDK, in modo che il driver supporti tutte le versioni più recenti di Windows.
  • Il contenuto del pacchetto driver deve essere firmato digitalmente con una firma di versione winqual. Per altre info su come creare e testare i file di catalogo firmati, vedi Procedura dettagliata per la firma del codice in modalità kernel nel sito Windows Dev Center - Hardware.
  1. Scaricare Windows Driver Kit (WDK) e installarlo.

  2. Creare una cartella del pacchetto driver nel computer a cui è connesso il dispositivo USB. Ad esempio, c:\UsbDevice.

  3. Copiare il co-programma di installazione WinUSB (WinusbcoinstallerX.dll) dalla cartella WinDDK\<BuildNumber>\redist\winusb alla cartella del pacchetto driver.

    Il co-programma di installazione WinUSB (Winusbcoinstaller.dll) installa WinUSB nel sistema di destinazione, se necessario. WdK include tre versioni del co-programma di installazione a seconda dell'architettura di sistema: sistemi basati su x86, basati su x64 e basati su Itanium. Sono tutti denominati WinusbcoinstallerX.dll e si trovano nella sottodirectory appropriata nella cartella WinDDK\<BuildNumber>\redist\winusb .

  4. Copiare il co-programma di installazione kmdf (WdfcoinstallerXXX.dll) dalla cartella WinDDK\<BuildNumber>\redist\wdf alla cartella del pacchetto driver.

    Il co-programma di installazione kmdf (WdfcoinstallerXXX.dll) installa la versione corretta di KMDF nel sistema di destinazione, se necessario. La versione del co-programma di installazione winUSB deve corrispondere al co-programma di installazione kmDF perché i driver client basati su KMDF, ad esempio Winusb.sys, richiedono l'installazione corretta della versione corrispondente del framework KMDF nel sistema. Ad esempio, Winusbcoinstaller2.dll richiede KMDF versione 1.9, installata da Wdfcoinstaller01009.dll. Le versioni x86 e x64 di WdfcoinstallerXXX.dll sono incluse in WDK nella cartella WinDDK\<BuildNumber>\redist\wdf . La tabella seguente illustra il co-programma di installazione WinUSB e il co-programma di installazione kmDF associato da usare nel sistema di destinazione.

    Usare questa tabella per determinare il co-programma di installazione di WinUSB e il co-programma di installazione kmDF associato.

    Co-programma di installazione winUSB Versione della libreria KMDF Co-programma di installazione kmDF
    Winusbcoinstaller.dll Richiede KMDF versione 1.5 o successiva Wdfcoinstaller01005.dll
    Wdfcoinstaller01007.dll
    Wdfcoinstaller01009.dll
    Winusbcoinstaller2.dll Richiede KMDF versione 1.9 o successiva Wdfcoinstaller01009.dll
    Winusbcoinstaller2.dll Richiede KMDF versione 1.11 o successiva WdfCoInstaller01011.dll
  5. Scrivere un file inf che installa Winusb.sys come driver di funzione per il dispositivo USB.

  6. Creare un file di catalogo firmato per il pacchetto. Questo file è necessario per installare WinUSB nelle versioni x64 di Windows.

  7. Collegare il dispositivo USB al computer.

  8. Aprire Gestione dispositivi per installare il driver. Seguire le istruzioni della procedura guidata Aggiornamento software driver e scegliere installazione manuale. Per completare l'installazione, è necessario specificare il percorso della cartella del pacchetto driver.