Minidriver e driver di classe HID
Questo articolo descrive i minidriver e il driver di classe HID.
Per altre informazioni, vedere Creazione di minidriver HID WDF.
Funzionalità operative del driver di classe HID
Il driver di classe HID esegue le operazioni seguenti:
Fornisce e gestisce l'interfaccia superiore usata dai driver in modalità kernel e dalle applicazioni in modalità utente per accedere alle raccolte HID supportate da un dispositivo di input.
Il driver di classe HID gestisce in modo trasparente e instrada tutte le comunicazioni tra driver e applicazioni di livello superiore e i dispositivi di input sottostanti che supportano le raccolte HID. Gestisce i diversi protocolli di dati usati da diversi dispositivi di input e code di input che supportano più file aperti nella stessa raccolta HID.
L'interfaccia di livello superiore per le raccolte HID è costituita da IOCTLs del driver di classe HID, dalle routine di supporto HIDClass e dalle strutture HIDClass.
Comunica con un minidriver HID chiamando le routine standard del driver del minidriver.
Crea un oggetto dispositivo funzionale (FDO) per i dispositivi di input HIDClass enumerati da un bus o un driver di porta di livello inferiore.
Ad esempio, il driver di classe HID crea e gestisce le operazioni di un oggetto FDO che rappresenta un dispositivo USB HID enumerato dallo stack di driver USB fornito dal sistema.
Fornisce la funzionalità di un driver del bus per i dispositivi figlio (raccolte HID) supportati da un dispositivo di input sottostante.
Il driver di classe HID crea un oggetto dispositivo fisico (PDO) per ogni raccolta HID supportata da un dispositivo di input e gestisce l'operazione della raccolta.
Associazione di un minidriver a HIDClass
Un minidriver HID associa l'operazione al driver di classe HID chiamando HidRegisterMinidriver per registrarsi con il driver di classe HID. Operazione di registrazione:
Salva una copia dei punti di ingresso (puntatori) nelle routine di driver standard di HID nell'estensione del dispositivo del driver di classe HID.
Un minidriver HID imposta i punti di ingresso nell'oggetto driver che il minidriver riceve come input alla relativa routine di DRIVER_INITIALIZE . Il minidriver HID imposta questi punti di ingresso prima di registrarli con il driver di classe HID.
Reimposta i punti di ingresso nell'oggetto driver del minidriver nei punti di ingresso per le routine di driver standard fornite dal driver HID.
Il driver di classe HID fornisce le routine di driver standard seguenti:
routine DRIVER_ADD_DEVICE e DRIVER_UNLOAD
Routine di invio per le richieste di I/O seguenti:
Il processo di registrazione alloca anche la memoria per l'estensione del dispositivo HID mind river. Anche se la memoria viene allocata dal driver di classe HID, solo il minidriver HID usa questa estensione del dispositivo.
Comunicazione con un minidriver HID
Il driver di classe HID comunica con un minidriver HID chiamando la DRIVER_ADD_DEVICE del minidriver HID, DRIVER_UNLOAD e le routine di invio come indicato di seguito:
Chiamata alla routine AddDevice
Quando viene chiamata la routine AddDevice del driver di classe HID per creare un oggetto dispositivo funzionale (FDO), il driver di classe HID crea l'oggetto FDO, lo inizializza e chiama la routine HID minidriver AddDevice . La routine ADDDevice del minidriver HID esegue l'inizializzazione interna specifica del dispositivo e, se ha esito positivo, restituisce STATUS_SUCCESS. Se la routine HID minidriver AddDevice non ha esito positivo, il driver di classe HID elimina l'oggetto FDO e restituisce lo stato restituito dalla routine AddDevice del minidriver HID.
Chiamata alla routine di scaricamento
Quando viene chiamata la routine di caricamento del driver di classe HID, il driver di classe HID completa il rilascio di tutte le risorse associate all'oggetto FDO e chiama la routine di scaricamento del minidriver HID.
Chiamata alle routine dispatch
Per operare un dispositivo, il driver di classe HID chiama principalmente la routine di invio del minidriver HID per le richieste di controllo del dispositivo interno.
Quando il gestore I/O invia richieste al driver di classe HID, il driver di classe HID elabora la richiesta e chiama la routine di invio corrispondente del minidriver HID.
Il driver di classe HID non invia le richieste seguenti al minidriver HID: creare, chiudere o controllare il dispositivo.
Operazione di un minidriver HID
Un minidriver di trasporto HID astrae l'operazione di un bus hardware o una porta a cui è collegato il dispositivo di input.
I minidriver HID possono essere compilati usando uno dei framework seguenti:
- UMDF - Framework del driver in modalità utente
- KDMF - Framework del driver in modalità kernel
- WDF - Windows Driver Framework
- WDM - Modello di driver Windows (legacy)
Microsoft consiglia di usare una soluzione basata su Framework (KMDF o UMDF). Per altre informazioni su ognuno dei modelli di driver, visitare le sezioni seguenti:
- Minidriver basato su KMDF, vedere Creazione di minidriver basati su Framework
- Minidriver basato su UMDF, vedere Creazione di minidriver HID WDF
La sezione seguente illustra la registrazione di un minidriver basato su WDM, ma gran parte di esso è pertinente anche a un driver basato su Framework basati su KMDF. Tutti i minidriver HID devono registrarsi con il driver di classe HID e il driver di classe HID comunica con il minidriver chiamando le routine standard del driver del minidriver.
Per altre informazioni sulla funzionalità che un minidriver HID deve supportare nelle routine di driver standard, vedere le sezioni seguenti:
- Registrazione di un minidriver HID
- Estensione minidriver HID
- Uso della struttura HID_DEVICE_EXTENSION
- Routine di minidriver standard
Per altre informazioni sul driver di classe HID, vedere Operazione del minidriver HID.
Registrazione di un minidriver HID
Dopo che un minidriver HID completa tutte le altre inizializzazioni driver nella sua routine di DRIVER_INITIALIZE , il minidriver HID associa l'operazione al driver di classe HID chiamando HidRegisterMinidriver.
Quando il minidriver HID registra con il driver di classe HID, usa una struttura HID_MINIDRIVER_REGISTRATION . La struttura specifica:
- Revisione HID
- Oggetto driver HID minidriver
- Dimensioni di un'estensione del dispositivo HID minidriver
- Indica se i dispositivi vengono eseguito il polling
Estensione minidriver HID
Un'estensione del dispositivo HID minidriver è specifica del dispositivo e viene usata solo da un minidriver HID. Il driver di classe HID alloca la memoria per l'estensione del dispositivo minidriver quando il driver di classe crea l'estensione del dispositivo per un oggetto dispositivo funzionale (FDO). Il minidriver HID specifica le dimensioni dell'estensione del dispositivo quando registra il minidriver con il driver di classe HID. Le dimensioni sono specificate dal membro DeviceExtensionSize di una struttura HID_MINIDRIVER_REGISTRATION .
Uso della struttura HID_DEVICE_EXTENSION
Un minidriver HID deve usare una struttura HID_DEVICE_EXTENSION come layout per l'estensione del dispositivo creata dal driver di classe HID per un oggetto dispositivo funzionale (FDO). Il driver di classe HID imposta i membri di questa struttura quando inizializza l'oggetto FDO. Un minidriver HID non deve modificare le informazioni in questa struttura.
Una struttura HID_DEVICE_EXTENSION contiene i membri seguenti:
PhysicalDeviceObject è un puntatore all'oggetto dispositivo fisico (PDO) che rappresenta il dispositivo di input sottostante.
NextDeviceObject è un puntatore alla parte superiore dello stack di dispositivi sotto l'oggetto FDO.
MiniDeviceExtension è un puntatore all'estensione del dispositivo HID minidriver.
Dato un puntatore all'oggetto FDO di un dispositivo di input, la macro seguente GET_MINIDRIVER_DEVICE_EXTENSION restituisce un puntatore a un'estensione minidriver HID:
#define GET_MINIDRIVER_DEVICE_EXTENSION(DO) ((PDEVICE_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension))
PDEVICE_EXTENSION è un puntatore a un'estensione del dispositivo specifica del dispositivo dichiarata da un minidriver HID.
Analogamente, un minidriver HID può ottenere un puntatore al PDO del dispositivo di input e la parte superiore dello stack di dispositivi sotto l'oggetto FDO del dispositivo di input.
Quando un minidriver HID invia un'IRP nello stack di dispositivi, deve usare NextDeviceObject come oggetto dispositivo di destinazione.
Routine di minidriver standard
Un minidriver HID deve fornire le routine di supporto standard seguenti:
- Routine HID minidriver DriverEntry
- Routine hiD minidriver AddDevice
- Routine di scaricamento minidriver HID
Un minidriver HID deve supportare anche le routine di invio descritte in Routine dispatch fornite da un minidriver HID.
Routine DriverEntry
La routine DRIVER_INITIALIZE in un minidriver HID esegue le operazioni seguenti:
Crea un oggetto driver per la coppia di driver collegata (driver di classe HID e un minidriver HID).
Imposta i punti di ingresso del driver necessari nell'oggetto driver HID minidriver.
Chiama HidRegisterMinidriver per registrare il minidriver HID con il driver di classe HID.
Esegue configurazioni specifiche del dispositivo usate solo dal minidriver HID.
Routine AddDevice
Il driver di classe HID gestisce la creazione e l'inizializzazione dell'oggetto dispositivo funzionale per un dispositivo di input sottostante. Il driver di classe HID gestisce anche il fdO dal punto di vista dell'interfaccia superiore al dispositivo sottostante e ai relativi dispositivi figlio (raccolte HID).
Il driver di classe HID DRIVER_ADD_DEVICE routine chiama la routine HID minidriver AddDevice in modo che il minidriver possa eseguire l'inizializzazione specifica del dispositivo interna.
I parametri passati alla routine di minidriver HID DRIVER_ADD_DEVICE sono l'oggetto driver minidriver e l'oggetto FDO. Il driver di classe HID passa l'oggetto FDO alla routine addDevice del minidriver, non all'oggetto dispositivo fisico per il dispositivo di input sottostante.
La routine di minidriver HID DRIVER_ADD_DEVICE ottiene un puntatore all'estensione del dispositivo minidriver dall'oggetto FDO.
In genere, la routine di minidriver HID DRIVER_ADD_DEVICE esegue le operazioni seguenti:
Inizializza l'estensione del dispositivo minidriver. L'estensione del dispositivo viene usata solo dal minidriver.
Restituisce STATUS_SUCCESS. Se il minidriver restituisce uno stato di errore, il driver di classe HID elimina l'oggetto FDO e restituisce lo stato di errore al gestore di Plug and Play.
Scarica routine
La routine Di scaricamento del driver di classe HID chiama la routine di minidriver HID DRIVER_UNLOAD . Un minidriver HID rilascia qualsiasi risorsa interna allocata dal minidriver.
Routine di invio
Un minidriver HID deve fornire le routine di invio seguenti: creazione, chiusura, controllo del dispositivo interno, controllo del sistema, Plug and Play e risparmio energia. Ad eccezione delle richieste di controllo del dispositivo interno, la maggior parte di queste routine di invio fornisce una funzione minima. Quando il driver di classe HID chiama queste routine di invio, passa l'oggetto driver minidriver e l'oggetto dispositivo funzionale (FDO).
IRP_MJ_CREATE
In conformità ai requisiti WDM, il driver di classe HID e un minidriver HID forniscono una routine di invio per creare richieste. Tuttavia, l'oggetto FDO non può essere aperto. Il driver di classe HID restituisce STATUS_UNSUCCESSFUL.
Un minidriver HID deve fornire solo uno stub. La routine di creazione dell'invio non viene mai chiamata.
IRP_MJ_CLOSE
In conformità ai requisiti WDM, il driver di classe HID e un minidriver HID devono fornire una routine di invio per le richieste di chiusura. Tuttavia, l'oggetto FDO non può essere aperto. Il driver di classe HID restituisce STATUS_INVALID_PARAMETER_1.
Un minidriver HID deve fornire solo uno stub. La routine di invio di chiusura non viene mai chiamata.
IRP_MJ_DEVICE_CONTROL
Un minidriver HID non necessita di una routine di invio per le richieste di controllo del dispositivo. Il driver di classe HID non passa le richieste di controllo del dispositivo a un minidriver.
IRP_MJ_INTERNAL_DEVICE_CONTROL
Un minidriver HID deve fornire una routine di invio per le richieste di controllo dei dispositivi interni che supportano le richieste descritte in IOCTr HID.
Il driver di classe HID usa principalmente richieste di controllo del dispositivo interno per accedere al dispositivo di input sottostante.
Il minidriver HID gestisce queste richieste in modo specifico del dispositivo.
IRP_MJ_SYSTEM_CONTROL
Un minidriver HID deve fornire una routine di invio per le richieste di controllo del sistema. Tuttavia, un minidriver HID è necessario solo per passare le richieste di controllo del sistema verso il basso lo stack di dispositivi come indicato di seguito:
Ignorare il percorso dello stack IRP corrente
Inviare la richiesta verso il basso dello stack di dispositivi di FDO
IRP_MJ_PNP
Un minidriver HID deve fornire una routine di invio per le richieste di Plug and Play.
Il driver di classe HID esegue tutte le Plug and Play elaborazione associate all'oggetto FDO. Quando il driver di classe HID elabora una richiesta di Plug and Play, chiama la routine di invio Plug and Play del minidriver HID.
Una routine di invio di minidriver HID Plug and Play:
Gestisce l'invio della richiesta nello stack di dispositivi dell'oggetto FDO e il completamento della richiesta nel modo in cui eseguire il backup dello stack di dispositivi, come appropriato per ogni tipo di richiesta.
Esegue l'elaborazione specifica del dispositivo associata a determinate richieste per aggiornare le informazioni sullo stato dell'oggetto FDO.
Ad esempio, il minidriver potrebbe aggiornare lo stato di Plug and Play dell'oggetto FDO (in particolare, se l'oggetto FDO viene avviato, arrestato o nel processo di rimozione).
IRP_MJ_POWER
Il minidriver HID deve fornire una routine di invio per le richieste di alimentazione. Tuttavia, il driver di classe HID gestisce l'elaborazione dell'alimentazione per l'oggetto FDO.
In conformità con i requisiti WDM, un minidriver HID invia richieste di alimentazione verso il basso dello stack di dispositivi del servizio gestito in questo modo:
Ignora il percorso dello stack IRP corrente
Avvia l'IRP di alimentazione successiva
Invia l'IRP di alimentazione verso il basso dello stack di dispositivi del gruppo di distribuzione
In genere, il minidriver HID passa le richieste di alimentazione verso il basso lo stack di dispositivi senza elaborazione aggiuntiva.