Senden von HID-Berichten

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

Senden von HID-Berichten durch User-Mode-Anwendungen

Eine Anwendung im Benutzermodus sollte WriteFile als Standard Ansatz verwenden, um fortlaufend Ausgabeberichte an eine HID-Sammlung zu senden. Eine Anwendung kann auch HidD_SetXxx Routinen verwenden, um Ausgabeberichte und Featureberichte an eine Sammlung zu senden. Eine Anwendung sollte diese Routinen jedoch nur verwenden, um den aktuellen Zustand einer Sammlung festzulegen. Einige Geräte unterstützen HidD_SetOutputReport möglicherweise nicht und reagieren nicht mehr, wenn diese Routine verwendet wird.

Verwenden von WriteFile

Eine Anwendung sollte Schreibanforderungen verwenden, um Ausgabeberichte an eine HID-Sammlung zu senden. Nachdem eine Anwendung im Benutzermodus einen Ausgabebericht erstellt hat, kann sie mithilfe von WriteFile einen Ausgabebericht an eine Sammlung senden.

Verwenden von HidD_SetXxx Routinen

Eine Anwendung kann die folgenden HIDClass-Supportroutinen verwenden, 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 durch Kernel-Mode-Treiber

Ein Kernelmodustreiber sollte IRP_MJ_WRITE Anforderungen als Standard Ansatz verwenden, um den Ausgabebericht kontinuierlich an eine HID-Sammlung zu senden. Treiber können auch IOCTL_HID_SET_Xxx Anforderungen verwenden, um Ausgabeberichte und Featureberichte an eine Sammlung zu senden. Ein Treiber sollte jedoch nur diese E/A-Anforderungen verwenden, um den aktuellen Zustand einer Sammlung festzulegen. Einige Geräte unterstützen IOCTL_HID_SET_OUTPUT_REPORT möglicherweise nicht und reagieren nicht mehr, wenn diese Anforderung verwendet wird.

Verwenden von IRP_MJ_WRITE Anforderungen

Nicht-WDM Windows 2000-Treiber und Treiber für Windows XP und höhere Versionen können ein einzelnes IRP für alle Schreibanforderungen verwenden, die an eine Sammlung gesendet werden. Windows 2000 WDM-Treiber müssen jedoch für jede Schreibanforderung ein neues IRP zuweisen. Weitere Informationen zur Verwendung und Wiederverwendung von IRPs finden Sie unter Behandeln von IRPs und Wiederverwendung von IRPs.

Wenn der Treiber eine Schreib-IRP wiederverwendet, sollte die IoCompletion-Routine des IRP die Anforderung mit einem status von STATUS_MORE_PROCESSING_REQUIRED abschließen (und das IRP nicht freigeben). Wenn der Treiber das IRP nicht mehr benötigt, sollte er das IRP abschließen und durch Aufrufen von IoCompleteRequest und IoFreeIrp freigeben. Beispielsweise kann ein Treiber in der Regel den IRP in seiner Entladeroutine oder nach dem Entfernen eines Geräts abschließen und freigeben.

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

Vor dem Senden eines Ausgabeberichts muss ein Treiber zunächst einen Ausgabeberichtpuffer initialisieren und festlegen, wie unter Initialisieren von HID-Berichten beschrieben. Der Treiber muss dann eine MDL verwenden, um den Ausgabeberichtspuffer für eine Schreibanforderung zuzuordnen. Ein Treiber ruft IoAllocateMdl auf, um die MDL für einen Ausgabebericht zuzuordnen, und legt den Irp-MdlAddress-Member eines Schreib-IRP auf die MDL-Adresse> des Ausgabeberichtspuffers 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 nächsten Treibers auf niedrigerer Ebene festlegen. Ein Treiber erhält Zugriff auf den E/A-Stapelspeicherort des nächsten Treibers auf niedrigerer Ebene, indem er IoGetNextIrpStackLocation aufruft. Der Treiber legt die folgenden Elemente des E/A-Stapelspeicherorts fest:

Parameters.Write.Length
Legen Sie auf die Länge eines Ausgabeberichts in Bytes fest. Dies sollte auf die Länge der Ausgabeberichte einer HID-Auflistung festgelegt werden, wie im OutputReportByteLength-Element der HIDP_CAPS-Struktur einer Auflistung angegeben.

Parameters.Write.Key
Auf NULL festlegen.

Parameters.Write.ByteOffset.QuadPart
Auf NULL festlegen.

MajorFunction
Auf IRP_MJ_WRITE festgelegt.

FileObject
Legen Sie auf den Dateiobjektzeiger fest, der die geöffnete Datei in der HID-Auflistung darstellt.

Verwenden von IOCTL_HID_SET_Xxx-Anforderungen

Ein Treiber kann auch die folgenden E/A-Anforderungen verwenden, um Ausgabe- und Featureberichte an eine HID-Sammlung zu senden:

IOCTL_HID_SET_OUTPUT_REPORT
Sendet einen Ausgabebericht an eine Sammlung (Windows XP und höhere Versionen).

IOCTL_HID_SET_FEATURE
Sendet einen Featurebericht an eine Sammlung.