Freigeben über


Senden von HID-Berichten

In diesem Artikel wird beschrieben, wie Benutzermodusanwendungen und Kernelmodustreiber HID-Berichte an eine HID-Sammlung senden.

Senden von HID-Berichten nach Benutzermodusanwendungen

Benutzermodusanwendungen verwenden WriteFile, um Ausgabeberichte kontinuierlich an eine HID-Sammlung zu senden. Sie können auch HidD_SetXxx-Routinen verwenden, um Ausgabeberichte und Funktionsberichts an eine Sammlung zu senden. Verwenden Sie jedoch nur HidD_SetXxx-Routinen, um den aktuellen Status einer Sammlung festzulegen. Einige Geräte unterstützen möglicherweise HidD_SetOutputReport nicht und reagieren nicht mehr, wenn diese Routine verwendet wird.

WriteFile-Routine

Verwenden Sie Schreibanforderungen, um Ausgabeberichte an eine HID-Sammlung zu senden. Nachdem eine Benutzermodusanwendung einen Ausgabebericht erstellt hat, kann sie einen Ausgabebericht mithilfe von WriteFile an eine Sammlung senden.

HidD_SetXxx-Routinen

Verwenden Sie diese HIDClass-Supportroutinen, um HID-Berichte an eine HID-Sammlung zu senden:

  • HidD_SetOutputReport: Sendet einen Ausgabebericht an eine HID-Sammlung (Windows XP und höhere Versionen).
  • HidD_SetFeature: Sendet einen Featurebericht an eine HID-Sammlung.

Senden von HID-Berichten nach Kernelmodustreibern

Kernelmodustreiber verwenden IRP_MJ_WRITE-Anforderungen, um den Ausgabebericht kontinuierlich an eine HID-Sammlung zu senden. Sie können auch IOCTL_HID_SET_Xxx-Anforderungen senden, um Ausgabeberichte und Featureberichte an eine Sammlung zu senden. Verwenden Sie jedoch nur IOCTL_HID_SET_Xxx-Anforderungen, um den aktuellen Status einer Sammlung festzulegen. Einige Geräte unterstützen möglicherweise IOCTL_HID_SET_OUTPUT_REPORT nicht und reagieren nicht mehr, wenn diese Anforderung verwendet wird.

IRP_MJ_WRITE-Anforderungen

Nicht-WDM-Treiber für Windows 2000 sowie Treiber für Windows XP und spätere Versionen können ein einzelnes IRP für alle an eine Sammlung gesendeten Schreibanforderungen verwenden. Windows 2000 WDM-Treiber müssen jedoch für jede Schreibanforderung eine neue IRP zuweisen. Weitere Informationen zur Verwendung und Wiederverwendung von IRPs finden Sie unter Behandeln von IRPs und Wiederverwenden von IRPs.

Wenn der Treiber ein Schreib-IRP wiederverwendet, sollte die IoCompletion-Routine die Anforderung mit dem Status STATUS_MORE_PROCESSING_REQUIRED abschließen (und das IRP nicht freigeben). Wenn der Treiber das IRP nicht mehr benötigt, sollte er das IRP durch Aufrufen von IoCompleteRequest und IoFreeIrp freigeben. Beispielsweise kann ein Treiber das IRP in der Regel in seiner Unload-Routine abschließen und freigeben oder nachdem ein Gerät entfernt wurde.

Wenn ein Treiber nur für eine Schreibanforderung ein IRP verwendet, sollte die IoCompletion-Routine das IRP abschließen und freigeben und STATUS_SUCCESS zurückgeben.

Wenn ein Treiber einen Ausgabebericht sendet, muss er zunächst einen Ausgabeberichtspuffer initialisieren und einrichten, wie in Initialisieren von HID-Berichten beschrieben. Der Treiber muss dann eine MDL verwenden, um den Ausgabeberichtpuffer für eine Schreibanforderung zuzuordnen. Ein Treiber ruft IoAllocateMdl auf, um die MDL für einen Ausgabebericht zuzuweisen und legt ein Irp->MdlAddress-Mitglied eines IRP-Schreibbefehls auf die MDL-Adresse des Ausgabeberichtpuffers fest. Der Treiber muss den Berichtspuffer und die MDL freigeben, wenn sie nicht mehr benötigt werden.

Zusätzlich zum Festlegen der MDL-Adresse des Schreib-IRP muss der Treiber auch den E/A-Stapelspeicherort des Treibers auf der nächsten niedrigeren Ebene festlegen. Ein Treiber erhält Zugriff auf den E/A-Stapelspeicherort des nächsten Treibers auf niedrigerer Ebene durch Aufrufen von IoGetNextIrpStackLocation. Der Treiber legt die folgenden Elemente des E/A-Stapelspeicherorts fest:

  • Parameters.Write.Length: Die Länge eines Ausgabeberichts in Bytes festlegen. Stellen Sie dieses Mitglied auf die Länge der Ausgabeberichte einer HID-Sammlung ein, wie durch das OutputReportByteLength-Mitglied der HIDP_CAPS-Struktur einer Sammlung angegeben.
  • Parameters.Write.Key: Auf Null festlegen.
  • Parameters.Write.ByteOffset.QuadPart: Auf Null festlegen.
  • MajorFunction: Auf IRP_MJ_WRITE festlegen.
  • FileObject: Auf den Dateiobjektzeiger festgelegt, der die geöffnete Datei in der HID-Sammlung darstellt.

IOCTL_HID_SET_Xxx-Anforderungen

Sie können auch die folgenden E/A-Anforderungen verwenden, um Ausgabe- und Featureberichte an eine HID-Sammlung zu senden: