Dispositivo WinUSB

Questo articolo illustra come un dispositivo WinUSB viene riconosciuto da Windows.

Le informazioni contenute in questo articolo si applicano all'utente se si è un fornitore oem o un fornitore di hardware indipendente (IHV) che sviluppa un dispositivo per cui si vuole usare Winusb.sys come driver di funzione e si vuole caricare automaticamente il driver senza dover fornire un INF personalizzato.

Che cos'è un dispositivo WinUSB

Un dispositivo WinUSB è un dispositivo USB (Universal Serial Bus) il cui firmware definisce determinati descrittori di funzionalità del sistema operativo Microsoft che segnalano l'ID compatibile come "WINUSB".

Lo scopo di un dispositivo WinUSB è consentire a Windows di caricare Winusb.sys come driver di funzione del dispositivo senza un file INF personalizzato. Per un dispositivo WinUSB, non è necessario distribuire i file INF per il dispositivo, rendendo il processo di installazione del driver semplice per gli utenti finali. Al contrario, se è necessario fornire un INF personalizzato, non è consigliabile definire il dispositivo come dispositivo WinUSB e specificare l'ID hardware del dispositivo in INF.

Microsoft fornisce Winusb.inf che contiene informazioni necessarie per installare Winusb.sys come driver di dispositivo per un dispositivo USB.

Prima di Windows 8, per caricare Winusb.sys come driver di funzione, è necessario fornire un INF personalizzato. L'INF personalizzato specifica l'ID hardware specifico del dispositivo e include anche sezioni di Winusb.inf incluse nella casella Winusb.inf. Queste sezioni sono necessarie per creare un'istanza del servizio, copiare i file binari della posta in arrivo e registrare un GUID dell'interfaccia del dispositivo che le applicazioni devono trovare il dispositivo e comunicare con esso. Per informazioni sulla scrittura di un INF personalizzato, vedere Installazione di WinUSB (Winusb.sys).

In Windows 8 il file Winusb.inf in-box è stato aggiornato per consentire a Windows di associare automaticamente l'INF a un dispositivo WinUSB.

Installazione del dispositivo WinUSB tramite Winusb.inf

In Windows 8 il file Winusb.inf in-box è stato aggiornato. INF include una sezione di installazione che fa riferimento a un ID compatibile denominato "USB\MS_COMP_WINUSB".

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

L'INF aggiornato include anche una nuova classe di installazione denominata "USBDevice".

La classe di installazione "USBDevice" è disponibile per i dispositivi per i quali Microsoft non fornisce un driver in-box. In genere, tali dispositivi non appartengono a classi USB ben definite, ad esempio Audio, Bluetooth e così via, e richiedono un driver personalizzato. Se il dispositivo è un dispositivo WinUSB, molto probabilmente il dispositivo non appartiene a una classe USB. Di conseguenza, il dispositivo deve essere installato nella classe di installazione "USBDevice". Winusb.inf aggiornato facilita tale requisito.

Informazioni sull'uso della classe USBDevice

Non usare la classe di installazione "USB" per i dispositivi non classificati. Tale classe è riservata per l'installazione di controller, hub e dispositivi compositi. L'uso improprio della classe "USB" può causare problemi significativi di affidabilità e prestazioni. Per i dispositivi non classificati, usare "USBDevice".

In Windows 8, per usare la classe di dispositivo "USBDevice", è sufficiente aggiungerla all'INF:

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

In Gestione dispositivi verrà visualizzato un nuovo nodo dei dispositivi USB Universal Serial Bus e il dispositivo verrà visualizzato sotto tale nodo.

In Windows 7, oltre alle righe precedenti, è necessario creare queste impostazioni del Registro di sistema in 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"

In Gestione dispositivi, il dispositivo verrà visualizzato in Dispositivi bus seriale universale USB. Tuttavia, la descrizione della classe del dispositivo deriva dall'impostazione del Registro di sistema specificata in INF.

Si noti che la classe "USBDevice" non è limitata a WinUSB. Se si dispone di un driver personalizzato per il dispositivo, è possibile usare la classe di installazione "USBDevice" nell'INF personalizzato.

Durante l'enumerazione del dispositivo, lo stack di driver USB legge l'ID compatibile dal dispositivo. Se l'ID compatibile è "WINUSB", Windows lo usa come identificatore del dispositivo e trova una corrispondenza nel file Winusb.inf aggiornato e quindi carica Winusb.sys come driver di funzione del dispositivo.

Questa immagine è per un singolo dispositivo MUTT interfaccia definito come dispositivo WinUSB e di conseguenza Winusb.sys viene caricato come driver di funzione per il dispositivo.

Screenshot di Windows Gestione dispositivi che mostra un dispositivo WinUSB.

Per le versioni di Windows precedenti a Windows 8, winusb.inf aggiornato è disponibile tramite Windows Update. Se il computer è configurato per ottenere automaticamente l'aggiornamento del driver, il driver WinUSB verrà installato senza alcun intervento dell'utente usando il nuovo pacchetto INF.

Come modificare la descrizione del dispositivo per un dispositivo WinUSB

Per un dispositivo WinUSB, Gestione dispositivi mostra "Dispositivo WinUsb" come descrizione del dispositivo. Tale stringa deriva da Winusb.inf. Se sono presenti più dispositivi WinUSB, tutti i dispositivi ottengono la stessa descrizione del dispositivo.

Per identificare e distinguere in modo univoco il dispositivo in Gestione dispositivi, Windows 8 fornisce una nuova proprietà in una classe di dispositivo che indica al sistema di dare la precedenza alla descrizione del dispositivo segnalata dal dispositivo (nel descrittore di stringa iProduct) sulla descrizione nell'INF. La classe "USBDevice" definita in Windows 8 imposta questa proprietà. In altre parole, quando un dispositivo viene installato nella classe "USBDevice", il sistema esegue una query sul dispositivo per una descrizione del dispositivo e imposta la stringa Gestione dispositivi su qualsiasi elemento recuperato nella query. In tal caso, la descrizione del dispositivo fornita nell'INF viene ignorata. Si notino le stringhe di descrizione del dispositivo: "MUTT" nell'immagine precedente. La stringa viene fornita dal dispositivo USB nel descrittore di stringa del prodotto.

La nuova proprietà della classe non è supportata nelle versioni precedenti di Windows. Per avere una descrizione personalizzata del dispositivo in una versione precedente di Windows, è necessario scrivere il proprio INF personalizzato.

Come configurare un dispositivo WinUSB

Per identificare un dispositivo USB come dispositivo WinUSB, il firmware del dispositivo deve avere descrittori del sistema operativo Microsoft. Per informazioni sui descrittori, vedere le specifiche descritte qui: Descrittori del sistema operativo Microsoft.

Supporto dei descrittori delle funzionalità estese

Affinché lo stack di driver USB sappia che il dispositivo supporta descrittori di funzionalità estese, il dispositivo deve definire un descrittore di stringa del sistema operativo archiviato in corrispondenza dell'indice stringa 0xEE. Durante l'enumerazione, lo stack di driver esegue una query per il descrittore di stringa. Se il descrittore è presente, lo stack di driver presuppone che il dispositivo contenga uno o più descrittori di funzionalità del sistema operativo e i dati necessari per recuperare i descrittori di funzionalità.

Il descrittore di stringa recuperato ha un valore di campo bMS_VendorCode . Il valore indica il codice fornitore che lo stack di driver USB deve usare per recuperare il descrittore di funzionalità esteso.

Per informazioni su come definire un descrittore di stringa del sistema operativo, vedere "Il descrittore stringa del sistema operativo" nelle specifiche descritte qui: Descrittori del sistema operativo Microsoft.

Impostazione dell'ID compatibile

Descrittore di funzionalità del sistema operativo con ID compatibile esteso necessario per trovare la corrispondenza con Winusb.inf nella casella e caricare il modulo driver WinUSB.

Il descrittore di funzionalità del sistema operativo CON ID compatibile esteso include una sezione di intestazione seguita da una o più sezioni di funzione a seconda che il dispositivo sia un dispositivo composito o non composito. La sezione dell'intestazione specifica la lunghezza dell'intero descrittore, il numero di sezioni della funzione e il numero di versione. Per un dispositivo non composito, l'intestazione è seguita da una sezione della funzione associata all'unica interfaccia del dispositivo. Il campo compatibleID di tale sezione deve specificare "WINUSB" come valore del campo. Per un dispositivo composito, sono disponibili più sezioni di funzione. Il campo compatibleID di ogni sezione della funzione deve specificare "WINUSB".

Registrazione di un GUID dell'interfaccia del dispositivo

Descrittore di funzionalità del sistema operativo delle proprietà estese necessario per registrare il GUID dell'interfaccia del dispositivo. Il GUID è necessario per trovare il dispositivo da un'applicazione o un servizio, configurare il dispositivo ed eseguire operazioni di I/O.

Nelle versioni precedenti di Windows, la registrazione GUID dell'interfaccia dispositivo viene eseguita tramite l'INF personalizzato. A partire da Windows 8, il dispositivo deve segnalare il GUID dell'interfaccia usando il descrittore delle funzionalità del sistema operativo delle proprietà estese.

Il descrittore della funzionalità del sistema operativo delle proprietà estese include una sezione di intestazione seguita da una o più sezioni di proprietà personalizzate. La sezione intestazione descrive l'intero descrittore delle proprietà estese, inclusa la lunghezza totale, il numero di versione e il numero di sezioni delle proprietà personalizzate. Per registrare il GUID dell'interfaccia del dispositivo, aggiungere una sezione della proprietà personalizzata che imposta il campo bPropertyName su "DeviceInterfaceGUID" e wPropertyNameLength su 40 byte. Generare un GUID univoco dell'interfaccia del dispositivo usando un generatore GUID e impostare il campo bPropertyData su tale GUID, ad esempio "{8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}". Il GUID viene specificato come stringa Unicode e la lunghezza della stringa è di 78 byte (incluso il carattere di terminazione Null).

       
bPropertyData 78 byte 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 0 43 00 36 00 42 00 46 00 45 00 34 00 37 00 35 00 7D 00 00 00 Il valore della proprietà è {8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}.

Durante l'enumerazione del dispositivo, lo stack di driver USB recupera quindi il valore DeviceInterfaceGUID dal descrittore della funzionalità del sistema operativo delle proprietà estese e registra il dispositivo nella chiave hardware del dispositivo. Un'applicazione può recuperare il valore usando le API SetupDiXxx (vedere SetupDiOpenDevRegKey). Per altre informazioni, vedere Come accedere a un dispositivo USB tramite funzioni WinUSB.

Abilitazione o disabilitazione delle funzionalità di risparmio energia WinUSB

Prima di Windows 8, per configurare le funzionalità di risparmio energia di WinUSB, è stato necessario scrivere i valori delle voci del Registro di sistema in HW. Sezione AddReg dell'INF personalizzato.

In Windows 8 e versioni successive è possibile specificare le impostazioni di risparmio energia nel dispositivo. È possibile segnalare i valori tramite il descrittore della funzionalità del sistema operativo delle proprietà estese che abilita o disabilita le funzionalità in WinUSB per tale dispositivo. È possibile configurare due funzionalità: sospensione selettiva e riattivazione del sistema. La sospensione selettiva consente al dispositivo di entrare nello stato a basso consumo quando è inattiva. La riattivazione del sistema si riferisce alla capacità di un dispositivo di riattivare un sistema quando il sistema è in stato a basso consumo.

Per informazioni sulle funzionalità di risparmio energia di WinUSB, vedere Gestione alimentazione WinUSB.

Nome proprietà Descrizione
DeviceIdleEnabled Questo valore è impostato su 1 per indicare che il dispositivo può essere spento quando è inattivo (sospensione selettiva).
DefaultIdleState Questo valore è impostato su 1 per indicare che il dispositivo può essere sospeso quando è inattiva per impostazione predefinita.
DefaultIdleTimeout Questo valore è impostato su 5000 in millisecondi per indicare la quantità di tempo in millisecondi di attesa prima di determinare che un dispositivo è inattiva.
UserSetDeviceIdleEnabled Questo valore è impostato su 1 per consentire all'utente di controllare la capacità del dispositivo di abilitare o disabilitare la sospensione selettiva USB. Casella di controllo Consenti al computer di spegnere il dispositivo per risparmiare energia nella pagina delle proprietà Risparmio energia del dispositivo e l'utente può selezionare o deselezionare la casella per abilitare o disabilitare la sospensione selettiva USB.
SystemWakeEnabled Questo valore è impostato su 1 per consentire all'utente di controllare la capacità del dispositivo di riattivare il sistema da uno stato a basso consumo. Se abilitata, la casella di controllo Consenti al dispositivo di riattivare il computer viene visualizzata nella pagina delle proprietà risparmio energia del dispositivo. L'utente può selezionare o deselezionare la casella per abilitare o disabilitare la riattivazione del sistema USB.

Ad esempio, per abilitare la sospensione selettiva nel dispositivo, aggiungere una sezione di proprietà personalizzata che imposta il campo bPropertyName su una stringa Unicode, "DeviceIdleEnabled" e wPropertyNameLength su 36 byte. Impostare il campo bPropertyData su "0x00000001". I valori delle proprietà vengono archiviati come interi a 32 bit little-endian.

Durante l'enumerazione, lo stack di driver USB legge i descrittori delle funzionalità delle proprietà estese e crea voci del Registro di sistema in questa chiave:

HKEY_LOCAL_MACHINE\Sistema\Currentcontrolset\Enum\USB\Parametri dispositivoidentificatore istanza identificatore<>\\>dispositivo<

Questa immagine mostra le impostazioni di esempio per un dispositivo WinUSB.

Screenshot dell'editor del Registro di sistema di Windows che mostra le impostazioni per un dispositivo WinUSB.

Per altri esempi, vedere le specifiche sui descrittori del sistema operativo Microsoft.