Share via


Configurazione dei driver di classe della tastiera e del mouse

Nota

Questo argomento è destinato agli sviluppatori che configurano i driver di classe della tastiera e del mouse. Se stai cercando di correggere un mouse o una tastiera, vedi:

Le tastiere e i mouse non HID possono connettersi su più bus legacy, ma usano comunque lo stesso driver di classe. Questa sezione contiene informazioni dettagliate sui driver di classe stessi. Le sezioni seguenti illustrano in dettaglio i controller.

In questo argomento viene descritta la configurazione fisica tipica dei dispositivi da tastiera e mouse in Microsoft Windows 2000 e versioni successive.

Le figure seguenti illustrano due configurazioni comuni che usano una singola tastiera e un singolo mouse.

Diagramma che illustra due configurazioni che usano una singola tastiera e un singolo mouse.

La figura a sinistra mostra una tastiera e un mouse connessi a un bus di sistema tramite controller indipendenti. Una configurazione tipica è costituita da una tastiera di tipo PS/2 gestita tramite un controller i8042 e da un mouse in stile seriale gestito tramite un controller di porta seriale.

Le informazioni aggiuntive seguenti sono importanti per i produttori di tastiera e mouse:

  • Le tastiere vengono aperte in modalità esclusiva dallo stack del sistema operativo per motivi di sicurezza
  • Windows supporta la connessione simultanea di più di una tastiera e di un dispositivo mouse.
  • Windows non supporta l'accesso indipendente da un client a ogni dispositivo.

Funzionalità del driver di classe

In questo argomento vengono descritte le funzionalità dei seguenti driver di classe di sistema di Microsoft Windows 2000 e versioni successive:

  • Kbdclass, il driver di classe per i dispositivi di GUID_CLASS_KEYBOARD classe dispositivo

  • Mouclass, il driver di classe per i dispositivi di GUID_CLASS_MOUSE classe di dispositivo

Kbdclass implementa il servizio Kbdclass e l'immagine eseguibile è kbdclass.sys.

Mouclass implementa il servizio Mouclass e la relativa immagine eseguibile è mouclass.sys.

Kbdclass e Mouclass ogni funzionalità:

  • Operazione generica e indipendente dall'hardware della classe del dispositivo.

  • Plug and Play, risparmio energia e Strumentazione gestione Windows (WMI).

  • Funzionamento dei dispositivi legacy.

  • Funzionamento simultaneo di più dispositivi.

  • Connessione di una routine di callback del servizio di classe usata da un driver di funzione per trasferire i dati dal buffer dei dati di input del dispositivo al buffer dei dati del driver di classe.

Configurazione degli oggetti dispositivo

La figura seguente illustra la configurazione degli oggetti dispositivo per una tastiera e un dispositivo mouse di Plug and Play PS/2. Ogni driver di classe crea un oggetto dispositivo di filtro di classe superiore (FILTRO DO) collegato a un oggetto dispositivo funzione tramite un filtro di dispositivo facoltativo di livello superiore. Un driver di filtro di dispositivo di livello superiore crea l'operazione di filtro del dispositivo di livello superiore. I8042prt crea la funzione DO e la collega a un oggetto dispositivo fisico (PDO) creato dal driver del bus radice.

Diagramma che illustra la configurazione degli oggetti dispositivo per una tastiera di tipo plug and play ps/2 e un dispositivo mouse.

Tastiera PS/2

Lo stack di driver della tastiera è costituito dai seguenti elementi.

  • Kbdclass, driver di filtro della classe della tastiera di livello superiore
  • Uno o più driver di filtro della tastiera di livello superiore facoltativo
  • I8042prt, il driver di funzione

PS/2 Mouse

Lo stack di driver del mouse è costituito dai seguenti elementi.

  • Mouclass, driver di filtro di classe mouse di livello superiore
  • Uno o più driver di filtro del mouse di livello superiore facoltativo
  • I8042prt, il driver di funzione

Kbdclass e Mouclass possono supportare più di un dispositivo in due modalità diverse. Nella modalità uno-a-uno, ogni dispositivo ha uno stack di dispositivi indipendente. Il driver di classe crea e collega una classe indipendente DO a ogni stack di dispositivi. Ogni stack di dispositivi ha lo stato di controllo e il buffer di input. Il sottosistema Microsoft Win32 accede all'input da ogni dispositivo tramite un oggetto file univoco.

Nella modalità grandmaster, il driver di classe opera tutti i dispositivi nel modo seguente:

  • Il driver di classe crea sia una classe grandmaster DO che rappresenta tutti i dispositivi che una classe subordinata DO per ogni dispositivo.

    Il driver di classe associa una classe subordinata DO a ogni stack di dispositivi. Sotto la classe subordinata DO, lo stack di dispositivi è uguale a quello creato nella modalità uno-a-uno.

  • La classe grandmaster DO controlla l'operazione di tutti gli oggetti DO subordinati.

  • Il sottosistema Win32 accede a tutti gli input del dispositivo tramite l'oggetto file che rappresenta il dispositivo della classe grandmaster.

  • Tutti gli input del dispositivo vengono memorizzati nel buffer nella coda dei dati del grandmaster.

  • Il grandmaster mantiene un singolo stato globale del dispositivo.

Kbdclass e Mouclass operano in modalità uno-a-uno se il valore della voce del Registro di sistema ConnectMultiplePorts è impostato su 0x00 (sotto la chiave HKLM\Services\CurrentControlSet\<class service>\Parameters, dove il servizio di classe è Kbdclass o Mouclass). In caso contrario, Kbdclass e Mouclass funzionano in modalità grandmaster.

Aprire e chiudere tramite il driver di classe

Il sottosistema Microsoft Win32 apre tutti i dispositivi di tastiera e mouse per l'uso esclusivo. Per ogni classe di dispositivo, il sottosistema Win32 considera l'input da tutti i dispositivi come se l'input provenisse da un singolo dispositivo di input. Un'applicazione non può richiedere di ricevere l'input da un solo dispositivo specifico.

Il sottosistema Win32 apre dinamicamente Plug and Play dispositivi di input dopo che riceve una notifica dal gestore Plug and Play che è abilitata un'interfaccia del dispositivo GUID_CLASS_KEYBOARD o GUID_CLASS_MOUSE. Il sottosistema Win32 chiude Plug and Play dispositivi dopo che riceve una notifica che un'interfaccia aperta è disabilitata. Il sottosistema Win32 apre anche i dispositivi legacy in base al nome,ad esempio "\Device\KeyboardLegacyClass0". Si noti che quando il sottosistema Win32 apre correttamente un dispositivo legacy, non può determinare se il dispositivo viene successivamente rimosso fisicamente.

Dopo che Kbdclass e Mouclass ricevono una richiesta di creazione, eseguono le operazioni seguenti per Plug and Play e legacy:

  • operazione Plug and Play

    Se il dispositivo si trova nello stato Plug and Play avviato, il driver di classe invia la richiesta di IRP_MJ_CREATE nello stack di driver. In caso contrario, il driver di classe completa la richiesta senza inviare la richiesta allo stack di driver. Il driver di classe imposta il file attendibile con accesso in lettura al dispositivo. Se è presente un dispositivo grandmaster, il driver di classe invia una richiesta di creazione a tutte le porte associate ai dispositivi di classe subordinati.

  • Operazione legacy

    Il driver di classe invia una richiesta di controllo del dispositivo interno al driver della porta per abilitare il dispositivo.

Connettere un callback del servizio a un dispositivo

I driver di classe devono connettere il servizio di classe a un dispositivo prima che il dispositivo possa essere aperto. I driver di classe connettono il servizio di classe dopo aver collegato una classe DO a uno stack di dispositivi. Il driver di funzione usa il callback del servizio di classe per trasferire i dati di input da un dispositivo alla coda dei dati della classe per il dispositivo. La routine di completamento dell'invio ISR del driver di funzione per un dispositivo chiama il callback del servizio di classe. Kbdclass fornisce il callback del servizio classe KeyboardClassServiceCallback e Mouclass fornisce il callback del servizio classe MouseClassServiceCallback.

Un fornitore può modificare il funzionamento di un callback del servizio di classe installando un driver di filtro di livello superiore per un dispositivo. Il driver di filtro della tastiera di esempio Kbfiltr definisce il callback KbFilter_ServiceCallback e il driver di filtro del mouse di esempio Moufiltr definisce il callback MouFilter_ServiceCallback . I callback del servizio di filtro di esempio possono essere configurati per modificare i dati di input trasferiti dal buffer di input della porta per un dispositivo alla coda dei dati della classe. Ad esempio, il callback del servizio di filtro può eliminare, trasformare o inserire dati.

I callback della classe e del servizio di filtro sono connessi nel modo seguente:

  • Il driver di classe invia una richiesta di connessione interna del dispositivo nello stack di dispositivi (IOCTL_INTERNAL_KEYBOARD_CONNECT o IOCTL_INTERNAL_MOUSE_CONNECT). I dati di connessione della classe vengono specificati da una struttura CONNECT_DATA che include un puntatore all'oggetto dispositivo della classe e un puntatore al callback del servizio di classe.

  • Dopo che il driver di filtro riceve la richiesta di connessione, salva una copia dei dati di connessione della classe e sostituisce i dati di connessione della richiesta con i dati di connessione del filtro. I dati di connessione del filtro specificano un puntatore all'oggetto dispositivo di filtro e un puntatore al callback del servizio driver di filtro. Il driver di filtro invia quindi la richiesta di connessione filtrata al driver di funzione.

I callback della classe e del servizio di filtro vengono chiamati nel modo seguente:

  • Il driver di funzione usa i dati di connessione del filtro per eseguire il callback iniziale al callback del servizio di filtro.

  • Dopo aver filtrato i dati di input, il callback del servizio di filtro usa i dati di connessione della classe salvati per eseguire un callback al callback del servizio di classe.

Eseguire query e impostare un dispositivo da tastiera

I8042prt supporta le richieste di controllo del dispositivo interno seguenti per eseguire query sulle informazioni su un dispositivo da tastiera e per impostare i parametri in un dispositivo da tastiera:

IOCTL_KEYBOARD_QUERY_ATTRIBUTES

IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION

IOCTL_KEYBOARD_QUERY_INDICATORS

IOCTL_KEYBOARD_QUERY_TYPEMATIC

IOCTL_KEYBOARD_SET_INDICATORS

IOCTL_KEYBOARD_SET_TYPEMATIC

Per altre informazioni su tutte le richieste di controllo dei dispositivi da tastiera, vedere Informazioni di riferimento sui dispositivi dell'interfaccia umana.

Analizza il mapper di codice per le tastiere

Nei sistemi operativi Microsoft Windows, i codici di analisi compatibili con PS/2 forniti da un dispositivo di input vengono convertiti in chiavi virtuali, propagate attraverso il sistema sotto forma di messaggi di Windows. Se un dispositivo genera un codice di analisi non corretto per una determinata chiave, verrà inviato il messaggio di chiave virtuale errato. Questo problema può essere risolto scrivendo un driver di filtro che analizza i codici di analisi generati dal firmware e modifica il codice di analisi non corretto in un driver riconosciuto dal sistema. Tuttavia, si tratta di un processo noioso e talvolta può causare gravi problemi, se esistono errori nel driver di filtro a livello di kernel.

Windows 2000 e Windows XP includono un nuovo mapper del codice di analisi, che fornisce un metodo che consente il mapping dei codici di analisi. I mapping del codice di analisi per Windows vengono archiviati nella seguente chiave del Registro di sistema:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout

Nota C'è anche un tasto Layout tastiera (si noti il formato plurale) sotto il tasto Di controllo, ma tale tasto non deve essere modificato.

Nel tasto Layout tastiera è necessario aggiungere il valore di Scancode Map . Questo valore è di tipo REG_BINARY (formato little Endian) e ha il formato dati specificato nella tabella seguente.

Offset iniziale (in byte) Dimensioni (in byte) Dati
0 4 Intestazione: informazioni sulla versione
4 4 Intestazione: flag
8 4 Intestazione: numero di mapping
12 4 Mapping individuale
... ... ...
Ultimi 4 byte 4 Terminator Null (0x00000000)

Il primo e il secondo DWORDS archivia le informazioni sull'intestazione e devono essere impostati su tutti gli zere per la versione corrente del mapper del codice di analisi. La terza voce DWORD contiene un conteggio del numero totale di mapping che seguono, incluso il mapping di terminazione Null. Il conteggio minimo sarà quindi 1 (nessun mapping specificato). I singoli mapping seguono l'intestazione. Ogni mapping è una DWORD in lunghezza ed è divisa in due campi di lunghezza di WORD. Ogni campo DI WORD archivia il codice di analisi di una chiave di cui eseguire il mapping.

Dopo aver archiviato la mappa nel Registro di sistema, è necessario riavviare il sistema per rendere effettive le mappe. Si noti che se il mapping di un codice di analisi è necessario in un tasto di scelta rapida, il passaggio viene eseguito in modalità utente appena prima che il codice di analisi venga convertito in una chiave virtuale. Questa conversione in modalità utente può presentare determinate limitazioni, ad esempio il mapping non funziona correttamente durante l'esecuzione in Servizi terminal.

Per rimuovere questi mapping, rimuovere il valore del Registro di sistema di Scancode Map e riavviare.

Esempio 1

Di seguito è riportato un esempio. Per scambiare il tasto CTRL a sinistra con il tasto BLOC MAIUSC, usare un editor del Registro di sistema (preferibilmente Regedt32.exe) per modificare il tasto Mappa scancode con il valore seguente:

00000000 00000000 03000000 3A001D00 1D003A00 00000000

La tabella seguente contiene queste voci suddivise in campi DWORD e i byte scambiati.

Valore: Interpretazione

0x00000000: Intestazione: Versione. Impostare su tutti gli zere.

0x00000000: intestazione: flag. Impostare su tutti gli zere.

0x00000003: tre voci nella mappa (inclusa la voce Null).

0x001D003A: tasto CTRL sinistro --> BLOC MAIUSC (0x1D --> 0x3A).

0x003A001D: BLOC MAIUSC --> Tasto CTRL sinistro (0x3A --> 0x1D).

0x00000000: terminatore Null.

Esempio 2

È anche possibile aggiungere un tasto non disponibile a livello generale su una tastiera o rimuovere un tasto che non viene mai utilizzato. L'esempio seguente mostra il valore archiviato in Scancode Map per rimuovere il tasto CTRL destro e modificare la funzionalità del tasto ALT destro per funzionare come tasto disattivato:

00000000 00000000 03000000 00001DE0 20E038E0 00000000

La tabella seguente contiene queste voci suddivise in campi DWORD e i byte scambiati.

Valore: Interpretazione

0x00000000: Intestazione: Versione. Impostare su tutti gli zere.

0x00000000: intestazione: flag. Impostare su tutti gli zere.

0x00000003: tre voci nella mappa (inclusa la voce Null).

0xE01D0000: rimuovere il tasto CTRL destro (0xE01D -> 0x00).

0xE038E020: tasto ALT destro --> Disattiva tasto (0xE038 --> 0xE020).

0x00000000: terminatore Null.

Dopo aver generato i dati necessari, è possibile inserirli nel Registro di sistema in diversi modi.

  • È possibile generare un file reg che può essere facilmente incorporato nel Registro di sistema usando un editor del Registro di sistema.
  • È anche possibile creare un file inf con una sezione [AddReg] che contiene le informazioni del Registro di sistema da aggiungere.
  • Regedt32.exe possibile usare per aggiungere manualmente le informazioni al Registro di sistema.

Scan Code Mapper presenta diversi vantaggi e svantaggi.

I vantaggi includono:

  • Il mapper può essere usato come correzione semplice per correggere gli errori del firmware.
  • I tasti usati di frequente possono essere aggiunti alla tastiera modificando la mappa nel Registro di sistema. I tasti che non vengono spesso usati (ad esempio, il tasto CTRL destro) possono essere mappati a null (rimossi) o scambiati per altri tasti.
  • Le posizioni chiave possono essere modificate facilmente. Gli utenti possono personalizzare facilmente la posizione delle chiavi usate di frequente per il loro vantaggio.

Vengono riconosciuti gli svantaggi seguenti:

  • Una volta archiviata la mappa nel Registro di sistema, per attivarla è necessario riavviare il sistema.
  • I mapping archiviati nel Registro di sistema funzionano a livello di sistema e si applicano a tutti gli utenti. Questi mapping non possono essere impostati per funzionare in modo diverso a seconda dell'utente corrente.
  • L'implementazione corrente limita la funzionalità della mappa in modo che i mapping si applichino sempre a tutte le tastiere connesse al sistema. Non è attualmente possibile creare una mappa in base alla tastiera.

Eseguire query su un dispositivo mouse

I8042prt supporta la richiesta di controllo del dispositivo interna seguente per eseguire query sulle informazioni su un dispositivo mouse:

IOCTL_MOUSE_QUERY_ATTRIBUTES

Per altre informazioni su tutte le richieste di controllo del dispositivo mouse, vedere Informazioni di riferimento sui dispositivi dell'interfaccia umana.

Impostazioni del Registro di sistema associate al driver di classe mouse

Di seguito è riportato un elenco di chiavi del Registro di sistema associate al driver di classe del mouse.

[Chiave: HKLM\SYSTEM\CurrentControlSet\Services\Mouclass\Parameters]

  • MaximumPortsServiced : non usato in Windows XP e versioni successive. Solo per Windows NT4.
  • PointerDeviceBaseName : specifica il nome di base per gli oggetti dispositivo creati dal driver di dispositivo della classe mouse
  • ConnectMultiplePorts : determina se è presente uno o più oggetti dispositivo porta per ogni oggetto dispositivo di classe. Questa voce viene usata principalmente dai driver di dispositivo.
  • MouseDataQueueSize : specifica il numero di eventi del mouse memorizzati nel buffer dal driver del mouse. Viene usato anche per calcolare le dimensioni del buffer interno del driver del mouse nel pool di memoria non di paging.

Dispositivi di puntamento assoluti

Per i dispositivi di tipo GUID_CLASS_MOUSE, il driver di funzione di un dispositivo:

  • Gestisce l'input specifico del dispositivo.

  • Crea le strutture MOUSE_INPUT_DATA richieste da MouseClassServiceCallback.

  • Trasferisce MOUSE_INPUT_DATA strutture alla coda di dati Mouclass chiamando MouseClassServiceCallback nella routine di completamento dell'invio ISR.

Per un dispositivo di puntamento assoluto, il driver di funzione del dispositivo deve impostare i membri LastX, LastY e Flags delle strutture MOUSE_INPUT_DATA nel modo seguente:

  • Oltre a dividere il valore di input del dispositivo in base alla funzionalità massima del dispositivo, il driver ridimensiona il valore di input del dispositivo in base 0xFFFF:

    LastX = ((device input x value) * 0xFFFF ) / (Maximum x capability of the device)
    LastY = ((device input y value) * 0xFFFF ) / (Maximum y capability of the device)
    
  • Il driver imposta il flag MOUSE_MOVE_ABSOLUTE in Flags.

  • Se l'input deve essere mappato da Window Manager a un intero desktop virtuale, il driver imposta il flag MOUSE_VIRTUAL_DESKTOP in Flags. Se il flag MOUSE_VIRTUAL_DESKTOP non è impostato, Window Manager esegue il mapping dell'input solo al monitoraggio primario.

Di seguito viene specificato, per tipo di dispositivo, come vengono implementati questi requisiti speciali per un dispositivo di puntamento assoluto:

  • Dispositivi HID:

    Mouhid, il driver di funzione Windows per i dispositivi mouse HID, implementa automaticamente questi requisiti speciali.

  • Dispositivi di tipo PS/2:

    È necessario un driver di filtro di livello superiore. Il driver di filtro fornisce un callback IsrHook e un callback del servizio di classe. I8042prt chiama IsrHook per gestire l'input del dispositivo non elaborato e chiama il callback del servizio classe di filtro per filtrare l'input. Il callback del servizio classe di filtro chiama a sua volta MouseClassServiceCallback. La combinazione del callback IsrHook e del callback del servizio di classe gestisce l'input specifico del dispositivo, crea le strutture di MOUSE_INPUT_DATA necessarie, ridimensiona i dati di input del dispositivo e imposta il flag di MOUSE_MOVE_ABSOLUTE.

  • Plug and Play dispositivi di porta COM enumerati da Serenum:

    È necessario un driver di funzione Plug and Play. Il driver di funzione crea le strutture di MOUSE_INPUT_DATA necessarie, ridimensiona i dati di input del dispositivo e imposta il flag MOUSE_MOVE_ABSOLUTE prima di chiamare MouseClassServiceCallback.

  • Dispositivi porta COM non Plug and Play:

    È necessario un driver di funzione specifico del dispositivo. Il driver di funzione crea le strutture di MOUSE_INPUT_DATA necessarie, ridimensiona i dati di input del dispositivo e imposta il flag MOUSE_MOVE_ABSOLUTE prima di chiamare MouseClassServiceCallback.

  • Dispositivo su un bus non supportato:

    È necessario un driver di funzione specifico del dispositivo. Il driver di funzione crea le strutture di MOUSE_INPUT_DATA necessarie, ridimensiona i dati di input del dispositivo e imposta il flag MOUSE_MOVE_ABSOLUTE prima di chiamare MouseClassServiceCallback.