Invio di report HID
Questo articolo descrive come le applicazioni in modalità utente e i driver in modalità kernel inviano report HID a una raccolta HID.
Inviare report HID da applicazioni in modalità utente
Le applicazioni in modalità utente usano WriteFile per inviare continuamente report di output a una raccolta HID. È anche possibile usare HidD_SetXxx routine per inviare report di output e report delle funzionalità a una raccolta. Tuttavia, utilizzare solo HidD_SetXxx routine per impostare lo stato corrente di una raccolta. Alcuni dispositivi potrebbero non supportare HidD_SetOutputReport e non rispondere se viene usata questa routine.
Routine WriteFile
Usare le richieste di scrittura per inviare report di output a una raccolta HID. Dopo che un'applicazione in modalità utente crea un report di output, può inviare un report di output a una raccolta usando WriteFile.
routine HidD_SetXxx
Usare queste routine di supporto HIDClass per inviare report HID a una raccolta HID:
- HidD_SetOutputReport: invia un report di output a una raccolta HID (Windows XP e versioni successive).
- HidD_SetFeature: invia un report delle funzionalità a una raccolta HID.
Inviare report HID per driver in modalità kernel
I driver in modalità kernel usano IRP_MJ_WRITE richieste per inviare continuamente report di output a una raccolta HID. È anche possibile usare IOCTL_HID_SET_Xxx richieste per inviare report di output e report delle funzionalità a una raccolta. Tuttavia, usare solo IOCTL_HID_SET_Xxx richieste per impostare lo stato corrente di una raccolta. Alcuni dispositivi potrebbero non supportare IOCTL_HID_SET_OUTPUT_REPORT e non rispondere se viene usata questa richiesta.
richieste di IRP_MJ_WRITE
I driver e i driver di Windows 2000 non WDM per Windows XP e versioni successive possono usare un singolo IRP per tutte le richieste di scrittura inviate a una raccolta. Tuttavia, i driver WDM di Windows 2000 devono allocare un nuovo IRP per ogni richiesta di scrittura. Per altre informazioni su come usare e riutilizzare i runtime di integrazione, vedere Gestione dei runtime di integrazione e riutilizzo dei runtime di integrazione.
Se il driver riutilizza un IRP di scrittura, la routine IoCompletion di IRP deve completare la richiesta con lo stato STATUS_MORE_PROCESSING_REQUIRED (e non liberare l'IRP). Quando il driver non richiede più l'IRP, deve completare e liberare l'IRP chiamando IoCompleteRequest e IoFreeIrp. Ad esempio, un driver potrebbe in genere completare e liberare l'IRP nella routine Di scaricamento o dopo la rimozione di un dispositivo.
Se un driver usa un IRP per una sola richiesta di scrittura, la routine IoCompletion di IRP deve essere completata e liberare l'IRP e restituire STATUS_SUCCESS.
Quando un driver invia un report di output, deve prima inizializzare e impostare un buffer di report di output, come descritto in Inizializzazione di report HID. Il driver deve quindi usare un file MDL per eseguire il mapping del buffer del report di output per una richiesta di scrittura. Un driver chiama IoAllocateMdl per allocare il file MDL per un report di output e imposta un membro Irp-MdlAddress> di scrittura sull'indirizzo MDL del buffer del report di output. Il driver deve liberare il buffer del report e il file MDL quando non sono più necessari.
Oltre a impostare l'indirizzo MDL di IRP di scrittura, il driver deve anche impostare la posizione dello stack di I/O del driver di livello inferiore successivo. Un driver ottiene l'accesso alla posizione dello stack di I/O del driver di livello inferiore successivo chiamando IoGetNextIrpStackLocation. Il driver imposta i membri seguenti della posizione dello stack di I/O:
- Parameters.Write.Length: impostato sulla lunghezza, espressa in byte, di un report di output. Impostare questo membro sulla lunghezza dei report di output di un insieme HID, come specificato dal membro OutputReportByteLength della struttura HIDP_CAPS di una raccolta.
- Parameters.Write.Key: impostato su zero.
- Parameters.Write.ByteOffset.QuadPart: impostato su zero.
- MajorFunction: impostare su
IRP_MJ_WRITE
. - FileObject: impostare sul puntatore all'oggetto file che rappresenta il file aperto nell'insieme HID.
richieste di IOCTL_HID_SET_Xxx
È anche possibile usare le richieste di I/O seguenti per inviare report di output e funzionalità a una raccolta HID: