Partager via


Envoi de rapports HID

Cet article décrit comment les applications en mode utilisateur et les pilotes en mode noyau envoient des rapports HID à une collection HID.

Envoi de rapports HID par les applications en mode utilisateur

Les applications en mode utilisateur utilisent WriteFile pour envoyer en continu des rapports de sortie à une collection HID. Vous pouvez également utiliser les routines HidD_SetXxx pour envoyer des rapports de sortie et des rapports de fonctionnalité à une collection. Cependant, n'utilisez les routines HidD_SetXxx que pour définir l'état actuel d'une collection. Certains appareils peuvent ne pas prendre en charge la routine HidD_SetOutputReport et ne plus répondre si cette routine est utilisée.

Routine WriteFile

Utilisez les requêtes d'écriture pour envoyer des rapports de sortie à une collection HID. Une fois qu'une application en mode utilisateur a créé un rapport de sortie, elle peut l'envoyer à une collection à l'aide de la routine WriteFile.

Routines HidD_SetXxx

Utilisez ces routines de support HIDClass pour envoyer des rapports HID à une collection HID :

  • HidD_SetOutputReport : Envoie un rapport de sortie à une collection HID (Windows XP et versions ultérieures).
  • HidD_SetFeature : Envoie un rapport de fonctionnalité à une collection HID.

Envoi de rapports HID par les pilotes en mode noyau

Les pilotes en mode noyau utilisent les requêtes IRP_MJ_WRITE pour envoyer en continu un rapport de sortie à une collection HID. Vous pouvez également utiliser les requêtes IOCTL_HID_SET_Xxx pour envoyer des rapports de sortie et des rapports de fonctionnalité à une collection. Cependant, n'utilisez les requêtes IOCTL_HID_SET_Xxx que pour définir l'état actuel d'une collection. Certains appareils peuvent ne pas prendre en charge IOCTL_HID_SET_OUTPUT_REPORT et ne plus répondre si cette requête est utilisée.

Requêtes IRP_MJ_WRITE

Les pilotes Windows 2000 non WDM et les pilotes Windows XP et versions ultérieures peuvent utiliser une IRP unique pour toutes les requêtes d'écriture envoyées à une collection. Cependant, les pilotes WDM Windows 2000 doivent allouer une nouvelle IRP pour chaque requête d'écriture. Pour plus d'informations sur l'utilisation et la réutilisation des IRP, voir Manipulation des IRP et Réutilisation des IRP.

Si le pilote réutilise une IRP d'écriture, la routine IoCompletion de l'IRP doit terminer la requête avec un statut STATUS_MORE_PROCESSING_REQUIRED (et ne pas libérer l'IRP). Lorsque le pilote n'a plus besoin de l'IRP, il doit la compléter et la libérer en appelant IoCompleteRequest et IoFreeIrp. Par exemple, un pilote peut généralement compléter et libérer l'IRP dans sa routine Unload, ou après le retrait d'un appareil.

Si un pilote utilise une IRP pour une seule requête d'écriture, la routine IoCompletion de l'IRP doit terminer et libérer l'IRP, et renvoyer STATUS_SUCCESS.

Lorsqu'un pilote envoie un rapport de sortie, il doit d'abord initialiser et définir un tampon de rapport de sortie, comme décrit dans Initialisation des rapports HID. Le pilote doit ensuite utiliser une MDL pour mapper le tampon de rapport de sortie pour une requête d'écriture. Un pilote appelle IoAllocateMdl pour allouer la MDL pour un rapport de sortie, et définit le membre Irp->MdlAddress d'une IRP d'écriture à l'adresse MDL de la mémoire tampon du rapport de sortie. Le pilote doit libérer le tampon d'état et la MDL lorsqu'ils ne sont plus nécessaires.

En plus de définir l'adresse MDL de l'IRP d'écriture, le pilote doit également définir l'emplacement de la pile d'E/S du pilote de niveau inférieur suivant. Un pilote accède à l'emplacement de la pile d'E/S du pilote de niveau inférieur suivant en appelant IoGetNextIrpStackLocation. Le pilote définit les membres suivants de l'emplacement de la pile d'E/S :

  • Parameters.Write.Length : Définit la longueur, en octets, d'un rapport de sortie. Définissez ce membre sur la longueur des rapports de sortie d'une collection HID, comme spécifié par le membre OutputReportByteLength de la structure HIDP_CAPS d'une collection.
  • Parameters.Write.Key : Défini à zéro.
  • Parameters.Write.ByteOffset.QuadPart : Mis à zéro.
  • MajorFunction : Réglé sur IRP_MJ_WRITE.
  • FileObject : Défini sur le pointeur de l'objet fichier qui représente le fichier ouvert sur la collection HID.

Requêtes IOCTL_HID_SET_Xxx

Vous pouvez également utiliser les requêtes d'E/S suivantes pour envoyer des rapports de sortie et de fonctionnalité à une collection HID :