Problembehandlung bei HID-Berichten
In diesem Artikel werden die häufigsten Probleme beschrieben, die bei Benutzermodusanwendungen und Kernelmodustreibern auftreten können, wenn versucht wird , HID-Verwendungen zu extrahieren oder festzulegen.
HID-Berichts-ID-Fehler
Wenn eine Anwendung oder ein Treiber einen HID-Bericht aus einer HID-Auflistung empfängt, kann es sich um einen beliebigen Bericht, den die Sammlung enthält, sein (da eine Sammlung Berichte in beliebiger Reihenfolge zurückgeben kann). Die HidP_GetXxx-Routinen geben die folgenden status-Werte zurück, die auf Fehler der Berichts-ID hinweisen:
HIDP_STATUS_INCOMPATIBLE_REPORT_ID
Eine angeforderte Verwendung befindet sich in einem Bericht, der von der HID-Auflistung unterstützt wird, aber nicht in dem Bericht, den die Anwendung oder der Treiber angegeben hat.
HIDP_STATUS_USAGE_NOT_FOUND
Eine angeforderte Verwendung ist in keinem Bericht enthalten, der von der Sammlung der obersten Ebene unterstützt wird.
Die folgende Abbildung zeigt beispielsweise eine HID-Auflistung, die zwei Berichte enthält.
Basierend auf diesem Beispiel wird davon ausgegangen, dass eine Anwendung oder ein Treiber einen Bericht aus einer Sammlung erhalten hat und HidP_GetUsageValue aufruft, um den aktuellen Wert von "Wert X" zu extrahieren. Wenn die ID des Berichts sieben ist, gibt die Routine HIDP_STATUS_INCOMPATIBLE_REPORT_ID zurück, was angibt, dass das Gerät Wert X unterstützt, aber wert X nicht im Bericht vorhanden ist. Wenn die Anwendung oder der Treiber dagegen den Wert von "Wert Z" anfordert, gibt die Routine HIDP_STATUS_USAGE_NOT_FOUND zurück, was angibt, dass Wert Z in keinem Bericht enthalten ist, der von der Auflistung unterstützt wird.
Wenn eine Anwendung oder ein Treiber HidP_SetXxx-Routinen verwendet, um Die Verwendungen in einem Bericht festzulegen, können die Routinen auch die gleichen zwei status Werte zurückgeben. Die Bedeutung von HIDP_STATUS_USAGE_NOT_FOUND ist die gleiche wie bei den HidP_GetXxx-Routinen . Die Bedeutung von HIDP_STATUS_INCOMPATIBLE_REPORT_ID ist jedoch anders. Dieser status Wert gibt an, dass der Bericht zuvor mit einer Berichts-ID konfiguriert wurde und die vom Aufrufer angegebene Verwendung nicht zu dieser Berichts-ID gehört. Beispiel: Nachdem eine Anwendung oder ein Treiber HidP_SetUsages verwendet, um "Schaltfläche 2" in einem null initialisierten Bericht festzulegen, wird der Bericht mit einer Berichts-ID von sieben konfiguriert. Wenn die Anwendung oder der Treiber anschließend versucht, HidP_SetUsageValue zu verwenden, um "Wert X" im gleichen Bericht festzulegen, gibt die Routine HIDP_STATUS_INCOMPATIBLE_REPORT_ID zurück.
Wenn eine **HidP_**Xxx-Routine HIDP_STATUS_INCOMPATIBLE_REPORT_ID zurückgibt, sollte der Aufrufer eine der folgenden Aktionen ausführen:
Wenn der Aufrufer Nutzungen festlegt, sollte er einen neuen Bericht der richtigen Länge zuordnen, ihn null initialisieren und dann die Routine erneut aufrufen. Der Aufrufer kann den Bericht an die Sammlung senden, nachdem alle Verwendungen im Bericht erfolgreich festgelegt wurden.
Wenn der Aufrufer Nutzungen extrahiert, sollte er die Routine mit einem anderen Bericht aufrufen, der aus der Sammlung abgerufen wurde.
Gelöschte HID-Berichte
Wenn die HID-Clienttreiber Eingabeberichte aus einer HID-Sammlung abrufen, werden die Berichte in einem Ringpuffer gespeichert, der vom HID-Klassentreiber verwaltet wird. Dieser Mechanismus verringert die Wahrscheinlichkeit, dass eine Anwendung oder ein Treiber eingabeberichte, die sie benötigt, verpasst.
Standardmäßig verwaltet der HID-Klassentreiber einen Ringpuffer für Eingabeberichte, der 32 Berichte enthält. Wenn eine Sammlung Daten schneller an den HID-Klassentreiber übermittelt, als eine Benutzermodusanwendung oder ein Kernelmodustreiber sie aus dem Puffer abruft, gehen Eingabeberichte aufgrund von Pufferüberlauf verloren. Um die Möglichkeit eines Pufferüberlaufs zu verringern, kann eine Anwendung oder ein Treiber die Größe des Puffers in Der Anzahl der Berichte neu konfigurieren. Treiber rufen die Größe des Puffers mithilfe einer IOCTL_GET_NUM_DEVICE_INPUT_BUFFERS-Anforderung und einer IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS-Anforderung ab und ändern diesen. Anwendungen führen den gleichen Vorgang aus, indem sie HidD_GetNumInputBuffers und HidD_SetNumInputBuffers aufrufen.