2011-02-16 16 views
16

Sono un principiante che impara a scrivere i driver di dispositivo WDM per dispositivi USB e ho scoperto che i materiali disponibili sono troppo difficili da comprendere (il DDK online doc è uno dei più difficili da leggere e WDM Device driver book di Oney non è niente di meglio).Creazione di un dispositivo USB virtuale

Quindi, ho una domanda semplice. Da dove iniziare se voglio creare un dispositivo USB virtuale (ad esempio, un mouse USB virtuale simile a un vero mouse USB collegato a una porta USB) per test/apprendimento.

Finora quello che ho capito è che il driver HIDClass (hidclass.sys) ha un minidriver per il bus usb (hidusb.sys) che esegue l'enumerazione dell'hardware USB collegato. Quindi, se voglio dirottare il processo di enumerazione dell'hardware e creare il mio hardware virtuale, dovrei includere un driver di filtro da qualche parte per intercettare alcuni IRP relativi al processo di enumerazione dell'hardware?

Scusate se quanto sopra non ha senso poiché sono ancora in fase di apprendimento e questo è in realtà uno degli esercizi che ritengo possa aiutarmi a capire meglio come scrivere driver di periferica USB.

+0

dispositivo USB di simulazione per la piattaforma linux http://stackoverflow.com/a/43917529/6180077 –

risposta

16

Windows utilizza un'architettura Plug and Play: si inserisce un dispositivo USB e Windows registra che un dispositivo è stato connesso. Invia una richiesta USB di basso livello al dispositivo e, in base alla risposta del dispositivo, decide quale driver caricare. Questo driver si presenta sotto forma di un file xxx.sys compilato e viene caricato nello spazio del kernel. Windows decide quale xxx.sys caricare in base al file * .inf fornito con il driver del dispositivo.

Questi file hanno sezioni come questo:

[Manufacturer] 
%Manufacturer% = DeviceInstall 

[DeviceInstall] 
"some usb dev"=OTHER_SECTION_DEV, USB\Vid_XXXX&Pid_yyyy 

# This is where windows learns to match this information 
# to your device, using the product id (Pid) and the 
# vendor id (Vid) that Windows gets back during the 
# low level USB DeviceDescriptor request 

[OTHER_SECTION_DEV] 
CopyFiles = xxx.sys, 10,system32\drivers 

(una descrizione più dettagliata su ciò che è in inf file si trovano sopra il http://www.osronline.com/ddkx/install/inf-format_2k8i.htm)


Uno sguardo dettagliato il processo di enumerazione USB :

  • Dispositivo USB inserito
  • USB Request Bus Driver (questi comandi vengono inviati tramite cavo USB, utilizzare un registratore USB per vederli):
    • GetDescriptor (Device)
    • GetDescriptor (Configuration)
    • GetDescriptor (String iSerialNumber), usato come dispositivo di ID istanza
    • GetDescriptor (String iProduct), utilizzati nel "nuovo hardware stati identificati" popup
  • il PnP (Plug and Play) direttore è informato che un dispositivo è stato aggiunto dai conducenti di autobus.
  • Il gestore PNP quindi chiede al conducente di autobus per informtion dispositivo utilizzando una richiesta PNP chiedendo:
    • stringa DeviceID, che rappresenta il Venditore USB e ID prodotto, stringa
    • HardwareIDs,
    • CompatibleIDs stringa, che rappresenta la Classe interfaccia, Sottoclasse e Protocollo del dispositivo USB e
    • InstanceID stringa, che rappresenta l'uid per questo particolare dispositivo all'interno dell'insieme di tutte le istanze con lo stesso compatibile collegato al computer.

Per qualsiasi dispositivo USB collegato è possibile vedere queste stringhe utilizzando la Gestione periferiche:

  • Aprire Gestione periferiche (menu di Windows -> "Gestione periferiche", o il pannello di controllo -> " Sistema "->" Hardware "->" Device Manager ")
  • quindi utilizzare il menu" Visualizza "per passare a" Dispositivo tramite connessione "
  • aprire" ACPI [...] "->" PCI bus "/"Complesso di root PCI Express" -> "[...] Controller host USB [...]"
  • espandere qualsiasi voce sotto il controller host, e per qualsiasi dispositivo elencato, fare clic destro per ottenere le loro proprietà, aprire la scheda "dettagli" e quindi utilizzare il menu a discesa proprietà per trovare "Id Hardware", "Compatibile ids", "Device instance ID", "abbinabili ID dispositivo", "Servizio", ecc

ad esempio, ho un dispositivo di memorizzazione USB con Device Id = usb\class_08&subclass_06&prot_50 collegato, e questa stringa può essere abbinato ad un .inf file che è stato aggiunto all'elenco delle informazioni note quando è stato installato il driver per questo dispositivo. Questo file ha una stringa Service = USBSTOR, quindi sappiamo che usbstor.sys viene utilizzato per interfacciare con questo dispositivo di archiviazione di massa USB.

Continuiamo con il processo di abbinamento.

  • Il PNP Manager tenta di determinare se dispositivo è già stato "installato":
    • Ricerca il Registro di sistema per una chiave corrispondente al "DeviceInstance ID" per vedere quale servizio gestisce l'interfacciamento con questo dispositivo. In particolare, esso cerca per questo nel HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB

Per disco sul tasto, è possibile vedere qualcosa di simile:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_0781&Pid_5406\0775555ACA54ADE3] 
"Service"="USBSTOR" 
  • Il PNP manager poi carica il driver associati sulla base di una corrispondenza tra le stringhe che vede nelle richieste PNP al dispositivo e i dati dal database inf:
    • posizione del database inf è c: \ WI Ndows \ inf \
    • driver si trovano qui C: \ WINDOWS \ system32 \ drivers
  • Se non è possibile eseguire un corrispondente in questo modo, chiederà all'utente di cercare un pilota da usare al posto.

Per la scrittura di driver Il mio consiglio è:

  1. Non iniziare con attuazione HID (Human Interface Device) i dispositivi, perché si può causare finestre per cercare di applicare il driver personalizzato come autista per il tuo mouse o la tua tastiera già installati e perderne l'accesso.
  2. Non caricare i driver nella vostra macchina reale:
    1. uso di una macchina virtuale e installare i driver lì. Impostare un debugger del kernel per la macchina virtuale: http://www.codeproject.com/KB/winsdk/KernelModeDebuggerSetup.asp
    2. Si può anche provare a utilizzare una scheda fisica come ad esempio USB-FX2 Learning Kit di OSR
1

Non avrebbe più senso fornire il proprio tipo di bus ed enumeratore?

+0

Cosa succede se, ai fini dell'apprendimento, mi piacerebbe creare un dispositivo USB virtuale? – JavaMan

+1

Il mio punto è che ai fini dell'apprendimento, è meglio iniziare con qualcosa che non implichi confusione nel sistema operativo. Se vuoi davvero presentare un dispositivo USB virtuale, allora è il modo di procurarti il ​​tuo tipo di adattatore host USB. –

+0

Si potrebbe voler vedere come è stato fatto nel progetto http://usbip.sourceforge.net/. – jpc

2

È possibile utilizzare il progetto USB/IP per emulare qualsiasi dispositivo che si desidera. Nel mio blog ho dimostrato come emulare dispositivo USB Mouse in python usando il progetto USB/IP: http://breaking-the-system.blogspot.com/2014/08/emulating-usb-devices-in-python-with-no.html

E 'abitudine aiuterà a capire come creare il dispositivo USB virtuale (il processo è fatto nel driver USB/IP , puoi leggere il codice), ma creerà il dispositivo HID USB virtuale e potrai giocare con gli argomenti HID inviati al driver USB.

Problemi correlati