Condividi tramite


Risoluzione dei problemi relativi ai report HID

Questo articolo descrive i problemi più comuni che le applicazioni in modalità utente e i driver in modalità kernel potrebbero riscontrare quando si tenta di estrarre o impostare utilizzi HID.

Errori relativi all'ID del report HID

Quando un'applicazione o un driver riceve un report HID da una raccolta HID, può essere qualsiasi report contenuto nella raccolta ,perché una raccolta può restituire report in qualsiasi ordine. Le routine HidP_GetXxx restituiscono i valori di stato seguenti, che indicano errori di ID report:

HIDP_STATUS_INCOMPATIBLE_REPORT_ID
Un utilizzo richiesto si trova in un report supportato dalla raccolta HID, ma non nel report specificato dall'applicazione o dal driver.

HIDP_STATUS_USAGE_NOT_FOUND
Un utilizzo richiesto non è incluso in alcun report supportato dalla raccolta di livello superiore.

Ad esempio, la figura seguente mostra una raccolta HID che contiene due report.

Diagramma che illustra una raccolta nascosta contenente due report.

In base a questo esempio, si supponga che un'applicazione o un driver abbia ricevuto un report da una raccolta e chiami HidP_GetUsageValue per estrarre il valore corrente di "Value X". Se l'ID del report è sette, la routine restituisce HIDP_STATUS_INCOMPATIBLE_REPORT_ID, che indica che il dispositivo supporta Value X, ma tale valore X non è presente nel report. D'altra parte, se l'applicazione o il driver richiede il valore di "Value Z", la routine restituisce HIDP_STATUS_USAGE_NOT_FOUND, che indica che Value Z non è in alcun report supportato dalla raccolta.

Quando un'applicazione o un driver usa HidP_Set routine Xxx per impostare gli utilizzi in un report, le routine possono restituire gli stessi due valori di stato. Il significato di HIDP_STATUS_USAGE_NOT_FOUND è uguale a quello delle routine HidP_GetXxx . Tuttavia, il significato di HIDP_STATUS_INCOMPATIBLE_REPORT_ID è diverso. Questo valore di stato indica che il report è stato configurato in precedenza con un ID report e l'utilizzo specificato dal chiamante non appartiene a tale ID report. Usando la figura precedente come esempio, dopo che un'applicazione o un driver usa HidP_SetUsages per impostare "Pulsante 2" in un report inizializzato zero, il report viene configurato con un ID report di sette. Se l'applicazione o il driver tenta successivamente di usare HidP_SetUsageValue per impostare "Value X" nello stesso report, la routine restituirà HIDP_STATUS_INCOMPATIBLE_REPORT_ID.

Se una routine **HidP_**Xxx restituisce HIDP_STATUS_INCOMPATIBLE_REPORT_ID, il chiamante deve eseguire una delle azioni seguenti:

  • Se il chiamante sta impostando gli utilizzi, deve allocare un nuovo report della lunghezza corretta, inizializzarlo zero e quindi chiamare di nuovo la routine. Il chiamante può inviare il report alla raccolta dopo aver impostato correttamente tutti gli utilizzi nel report.

  • Se il chiamante estrae gli utilizzi, deve chiamare la routine con un report diverso ottenuto dalla raccolta.

Report HID eliminati

Quando i driver client HID ottengono report di input da una raccolta HID, i report vengono archiviati in un buffer circolare gestito dal driver di classe HID. Questo meccanismo riduce la possibilità che un'applicazione o un driver non visualizzi i report di input necessari.

Per impostazione predefinita, il driver di classe HID gestisce un buffer circolare del report di input che contiene 32 report. Se una raccolta trasmette i dati al driver di classe HID più velocemente di un'applicazione in modalità utente o un driver in modalità kernel lo recupera dal buffer, i report di input vengono persi a causa dell'overflow del buffer. Per ridurre la possibilità di overflow del buffer, un'applicazione o un driver può riconfigurare le dimensioni, in numero di report, del buffer. I driver recuperano e modificano le dimensioni del buffer usando una richiesta di IOCTL_GET_NUM_DEVICE_INPUT_BUFFERS e una richiesta di IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS . Le applicazioni eseguono la stessa operazione chiamando HidD_GetNumInputBuffers e HidD_SetNumInputBuffers.