Condividi tramite


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 di livello 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 diversi protocolli dati usati da diversi dispositivi di input e code di input che supportano più file aperti della 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 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 FDO che rappresenta un dispositivo HID USB enumerato dallo stack di driver USB fornito dal sistema.

  • Fornisce la funzionalità di un driver del bus per i dispositivi figli (collezioni 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 del driver standard del minidriver 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 per la routine DRIVER_INITIALIZE . Il minidriver HID imposta questi punti di ingresso prima di registrarsi con il driver di classe HID.

  • Reimposta i punti di ingresso nell'oggetto driver del minidriver ai punti di ingresso associati alle routine del driver standard fornite dal driver di classe HID.

Il driver di classe HID fornisce le routine del driver standard 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 le routine di DRIVER_ADD_DEVICE, DRIVER_UNLOAD e dispatch del minidriver HID 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'FDO, lo inizializza e chiama la routine AddDevice del minidriver HID. La routine AddDevice del minidriver HID esegue l'inizializzazione interna specifica del dispositivo e, se ha esito positivo, restituisce STATUS_SUCCESS. Se la routine AddDevice del minidriver HID non riesce, il driver di classe HID elimina l'FDO e restituisce lo stato restituito dalla routine AddDevice del minidriver HID.

Chiamata alla routine di scarico

Quando viene chiamata la routine di scaricamento del driver di classe HID, il driver di classe HID completa il rilascio di tutte le risorse associate a FDO e chiama la routine di scaricamento del minidriver HID.

Chiamata delle routine Dispatch

Per gestire un dispositivo, il driver di classe HID chiama principalmente la routine dispatch del minidriver HID per le richieste di controllo dei dispositivi interne.

Quando il gestore di I/O invia richieste al driver di classe HID, il driver di classe HID elabora la richiesta e chiama la routine dispatch corrispondente del minidriver HID.

Il driver di classe HID non invia le seguenti richieste al minidriver HID: creazione, chiusura o controllo dispositivo.

Operazione di un minidriver HID

Un minidriver di trasporto HID astrae il funzionamento di un bus hardware o di una porta a cui è collegato il dispositivo di input.

I minidriver HID possono essere compilati usando uno dei framework seguenti:

  • UMDF - Framework per driver in modalità utente
  • Driver Framework in modalità kernel
  • WDF - Windows Driver Framework
  • WDM - Modello di driver Windows (obsoleto)

Microsoft consiglia di usare una soluzione basata su Framework (KMDF o UMDF). Per altre informazioni su ognuno dei modelli di driver, vedere le sezioni seguenti:

Nella sezione seguente viene illustrata la registrazione di un minidriver basato su WDM HID, ma gran parte di quanto descritto è pertinente anche per un driver basato su framework 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 del driver standard del minidriver.

Per altre informazioni sulle funzionalità che un minidriver HID deve supportare nelle routine del driver standard, vedere le sezioni seguenti:

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 del driver nella routine DRIVER_INITIALIZE , il minidriver HID associa l'operazione al driver di classe HID chiamando HidRegisterMinidriver.

Quando il minidriver HID viene registrato con il driver di classe HID, usa una struttura HID_MINIDRIVER_REGISTRATION . La struttura specifica:

  • La revisione HID
  • Oggetto driver del minidriver HID
  • Dimensioni di un'estensione del dispositivo HID minidriver
  • Indica se viene eseguito il polling dei dispositivi

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 .

Utilizzo 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 il dispositivo 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 in cima allo stack di dispositivi sotto il FDO.

  • MiniDeviceExtension è un puntatore all'estensione del dispositivo HID minidriver.

Dato un puntatore all'FDO di un dispositivo di input, la seguente macro GET_MINIDRIVER_DEVICE_EXTENSION restituisce un puntatore a un'estensione del minidriver HID.

#define GET_MINIDRIVER_DEVICE_EXTENSION(DO) ((PDEVICE_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension))

PDEVICE_EXTENSION è un puntatore a un'estensione specifica del dispositivo dichiarata da un minidriver HID.

Analogamente, un minidriver HID può ottenere un puntatore al PDO del dispositivo di input e alla parte superiore dello stack di dispositivi sotto l'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 standard di minidriver

Un minidriver HID deve fornire le routine di supporto del driver standard seguenti:

  • Routine HID minidriver DriverEntry
  • Routine AddDevice del minidriver HID
  • Routine di scaricamento minidriver HID

Un minidriver HID deve supportare anche le routine dispatch 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 collegata di driver (driver di classe HID e minidriver HID).

  • Imposta i punti di ingresso del driver necessari nell'oggetto driver del minidriver HID.

  • 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 (FDO) per un dispositivo di input sottostante. Il driver di classe HID gestisce anche l'FDO dal punto di vista dell'interfaccia di alto livello rispetto al dispositivo sottostante e ai relativi dispositivi figlio (raccolte HID).

Il driver di classe HID DRIVER_ADD_DEVICE routine chiama la routine AddDevice del minidriver HID in modo che il minidriver possa eseguire l'inizializzazione interna specifica del dispositivo.

I parametri passati alla routine DRIVER_ADD_DEVICE del minidriver HID sono l'oggetto driver del minidriver e il FDO. Il driver di classe HID passa l'FDO alla routine AddDevice del minidriver, non all'oggetto dispositivo fisico per il dispositivo di input sottostante.

Il minidriver HID DRIVER_ADD_DEVICE ottiene un puntatore all'estensione del dispositivo minidriver dall'FDO.

  • In genere, il minidriver HID DRIVER_ADD_DEVICE routine 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'FDO e restituisce lo stato di errore al Gestore Plug and Play.

Routine di scarico

La routine Unload del driver di classe HID chiama la routine DRIVER_UNLOAD del minidriver HID. Un minidriver HID rilascia tutte le risorse interne allocate dal minidriver.

Routine di dispatch

Un minidriver HID deve fornire le seguenti routine di gestione: creazione, chiusura, controllo interno del dispositivo, controllo del sistema, Plug and Play e gestione dell'energia. Ad eccezione delle richieste di controllo dei dispositivi interne, la maggior parte di queste routine dispatch fornisce una funzione minima. Quando il driver di classe HID chiama queste routine di invio, passa l'oggetto driver del minidriver e l'oggetto dispositivo funzionale (FDO).

IRP_MJ_CREATE (creazione di un IRP)

In conformità ai requisiti WDM, il driver di classe HID e un minidriver HID forniscono una routine dispatch per la creazione delle richieste. Tuttavia, l'FDO è impossibile da aprire. Il driver di classe HID restituisce STATUS_UNSUCCESSFUL.

Un minidriver HID deve fornire solo uno stub. La routine create dispatch 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 dispatch" per le richieste di chiusura. Tuttavia, l'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 dispatch di chiusura non viene mai chiamata.

IRP_MJ_DEVICE_CONTROL

Un minidriver HID non richiede una routine dispatch 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 dispatch per le richieste di controllo dei dispositivi interne che supportano le richieste descritte in IOCTL del minidriver HID.

Il driver di classe HID usa principalmente richieste di controllo dei dispositivi interne 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 dispatch per le richieste di controllo di sistema. Tuttavia, un minidriver HID è necessario solo per passare le richieste di controllo di sistema verso il basso lo stack di dispositivi come indicato di seguito:

  • Ignorare la posizione corrente dello stack IRP

  • Invia la richiesta nello stack di dispositivi del FDO

IRP_MJ_PNP

Un minidriver HID deve fornire una routine di dispatch per le richieste di Plug and Play.

Il driver di classe HID esegue tutta l'elaborazione Plug and Play relativa all'FDO. Quando il driver di classe HID elabora una richiesta Plug and Play, chiama la routine di invio Plug and Play del minidriver HID.

Routine di gestione Plug and Play del minidriver HID:

  • Gestisce l'invio della richiesta nello stack di dispositivi di FDO e completa la richiesta risalendo lo stack di dispositivi, secondo le esigenze di ogni tipo di richiesta.

  • Esegue un'elaborazione specifica per dispositivo associata a certe richieste per aggiornare le informazioni sullo stato del FDO.

    Ad esempio, il minidriver potrebbe aggiornare lo stato Plug and Play dell'FDO (in particolare, se l'FDO viene avviato, arrestato o durante il 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'FDO.

In conformità ai requisiti di WDM, un minidriver HID invia le richieste di alimentazione lungo la pila di dispositivi del FDO in questo modo:

  • Ignora la posizione corrente dello stack IRP

  • Avvia l'IRP di alimentazione successiva

  • Invia l'IRP di alimentazione verso il basso dello stack di dispositivi di FDO

In genere, il minidriver HID passa le richieste di alimentazione verso il basso dello stack di dispositivi senza elaborazione aggiuntiva.