App desktop di Windows per un dispositivo USB
In questo articolo si apprenderà come un'applicazione può chiamare funzioni WinUSB per comunicare con un dispositivo USB. Per un'applicazione di questo tipo, WinUSB (Winusb.sys) deve essere installato come driver di funzione del dispositivo. WinUSB nello stack in modalità kernel del dispositivo. Questo driver è incluso in Windows nella cartella \Windows\System32\drivers.
Se usi Winusb.sys come driver di funzione di un dispositivo USB, puoi chiamare funzioni WinUSB da un'applicazione per comunicare con il dispositivo. Queste funzioni, esposte dalla DLL in modalità utente Winusb.dll, semplificano il processo di comunicazione. Anziché costruire richieste di controllo di I/O del dispositivo per eseguire operazioni USB standard ,ad esempio la configurazione del dispositivo, l'invio di richieste di controllo e il trasferimento di dati da o verso il dispositivo, le applicazioni chiamano la funzione WinUSB equivalente.
Winusb.dll usa i dati forniti dall'applicazione per costruire la richiesta di controllo di I/O del dispositivo appropriata e quindi invia la richiesta a Winusb.sys per l'elaborazione. Per comunicare con lo stack USB, la funzione WinUSB chiama la funzione DeviceIoControl con l'IOCTL appropriato correlato alla richiesta dell'applicazione. Al termine della richiesta, la funzione WinUSB passa tutte le informazioni restituite da Winusb.sys (ad esempio i dati di una richiesta di lettura) al processo chiamante. Se la chiamata a DeviceIoControl ha esito positivo, restituisce un valore diverso da zero. Se la chiamata ha esito negativo o è in sospeso (non elaborata immediatamente), DeviceIoControl restituisce un valore zero. Se si verifica un errore, l'applicazione può chiamare GetLastError per un messaggio di errore più dettagliato.
È più semplice usare le funzioni WinUSB per comunicare con un dispositivo piuttosto che implementare un driver. Si notino tuttavia le limitazioni seguenti:
Le funzioni WinUSB consentono a un'applicazione alla volta di comunicare con il dispositivo. Se è necessario che più applicazioni comunichino contemporaneamente a un dispositivo, è necessario implementare un driver di funzione.
Prima di Windows 8.1, le funzioni WinUSB non supportano lo streaming di dati da o verso endpoint isocroni.
Le funzioni WinUSB non supportano i dispositivi che dispongono già del supporto in modalità kernel. Esempi di tali dispositivi includono modem e schede di rete, supportate rispettivamente dall'API di telefonia (TAPI) e NDIS.
Per i dispositivi multifunzione, è possibile usare il file INF del dispositivo per specificare separatamente un driver in modalità kernel o Winusb.sys per ogni funzione USB. Tuttavia, è possibile specificare solo una di queste opzioni per una determinata funzione, non entrambe.
Nota
Le funzioni WinUSB richiedono Windows XP o versioni successive. È possibile usare queste funzioni nell'applicazione C/C++ per comunicare con il dispositivo USB. Per scrivere un'app UWP che usa LE API WinUSB, vedi App UWP per un dispositivo USB.
Introduzione
Ottenere gli strumenti necessari per scrivere un'app desktop di Windows per i dispositivi
- Seguire le istruzioni riportate in Download di Windows Driver Kit.
Ottenere un dispositivo USB di test e la relativa specifica hardware.
Usare la specifica per determinare la funzionalità dell'app e le decisioni di progettazione correlate.
I dispositivi Microsoft USB Test Tool (MUTT) sono disponibili da JJG Technologies. Questo dispositivo richiede il firmware di Microsoft disponibile in Download MUTT Software Package (Scarica pacchetto software MUTT).
Scrivere una bozza di app che ottiene un handle per il dispositivo.
Esistono due approcci per la scrittura della prima applicazione:
Scrivere in base al modello WinUSB incluso in Visual Studio. Per altre informazioni, vedere Scrivere un'app desktop di Windows basata sul modello WinUSB.
Chiamare routine SetupAPI per ottenere un handle per il dispositivo e aprirlo chiamando WinUsb_Initialize. Per altre informazioni, vedere How to Access a USB Device by Using WinUSB Functions.For more information, see How to Access a USB Device by Using WinUSB Functions.
Installare Winusb.sys per il dispositivo.
Se si usa Visual Studio, installare il pacchetto driver nel computer di destinazione usando la distribuzione di Visual Studio. Per istruzioni, vedi Scrivere un'app desktop di Windows basata sul modello WinUSB. In caso contrario, installare manualmente il driver in Gestione dispositivi scrivendo un INF personalizzato. Per altre informazioni, vedere Installazione di WinUSB (Winusb.sys).
Ottenere informazioni sul dispositivo e visualizzarne i descrittori.
Per informazioni concettuali, vedere Concetti per tutti gli sviluppatori USB. Per ottenere informazioni sulle funzionalità del dispositivo, leggere il descrittore di configurazione, i descrittori di interfaccia per ogni impostazione alternativa supportata e i descrittori degli endpoint. Per altre informazioni, vedere Eseguire query sul dispositivo per i descrittori USB.
Inviare un trasferimento di controllo USB.
Inviare richieste di controllo standard e comandi fornitore al dispositivo. Per altre informazioni, vedere Send Control Transfer to the Default Endpoint.For more information, see Send Control Transfer to the Default Endpoint.
Inviare trasferimenti bulk o interrupt.
Eseguire operazioni di lettura e scrittura da e verso gli endpoint bulk, interrupt e isocroni supportati dal dispositivo. Per altre informazioni, vedere Inviare richieste di I/O.
Inviare trasferimenti isocroni.
Inviare richieste di lettura e scrittura isocrone, usate principalmente per i dati di streaming. Questa funzionalità è disponibile solo in Windows 8.1 e versioni successive. Per altre informazioni, vedere Invio di trasferimenti isocroni USB da un'app desktop WinUSB.