Compartilhar via


Enviando relatórios de HID

Este artigo descreve como os aplicativos de modo de usuário e drivers de modo kernel enviam relatórios de HID para uma coleção de HID.

Enviar relatórios de HID por aplicativos de modo de usuário

Os aplicativos no modo de usuário usam WriteFile para enviar continuamente relatórios de saída para uma coleção de HID. Você também pode usar rotinas HidD_SetXxx para enviar relatórios de saída e relatórios de recursos para uma coleção. No entanto, use apenas rotinas HidD_SetXxx para definir o estado atual de uma coleção. Alguns dispositivos podem não dar suporte a HidD_SetOutputReport e parar de responder, caso essa rotina seja usada.

Rotina WriteFile

Use solicitações de gravação para enviar relatórios de saída para uma coleção de HID. Depois que um aplicativo no modo de usuário cria um relatório de saída, ele pode enviar um relatório de saída para uma coleção usando WriteFile.

rotinas HidD_SetXxx

Use estas rotinas de suporte HIDClass para enviar relatórios de HID para uma coleção de HID:

  • HidD_SetOutputReport: envia um relatório de saída para uma coleção de HID (Windows XP e versões posteriores).
  • HidD_SetFeature: envia um relatório de recursos para uma coleção de HID.

Enviar relatórios de HID por drivers no modo kernel

Os drivers do modo kernel usam solicitações IRP_MJ_WRITE para enviar continuamente o relatório de saída para uma coleção de HID. Você também pode usar solicitações IOCTL_HID_SET_Xxx para enviar relatórios de saída e relatórios de recursos para uma coleção. No entanto, use apenas solicitações IOCTL_HID_SET_Xxx para definir o estado atual de uma coleção. Alguns dispositivos talvez não ofereçam suporte a IOCTL_HID_SET_OUTPUT_REPORT e parem de responder, caso esta solicitação não seja usada.

Solicitações IRP_MJ_WRITE

Drivers Windows 2000 não WDM e drivers para Windows XP e versões posteriores podem usar um único IRP para todas as solicitações de gravação enviadas para uma coleção. No entanto, os drivers WDM do Windows 2000 devem alocar um novo IRP para cada solicitação de gravação. Para obter mais informações sobre como usar e reutilizar IRPs, consulte Manipular IRPs e Reutilizar IRPs.

Se o driver reutilizar um IRP de gravação, a rotina IoCompletion IoCompletion deverá concluir a solicitação com um status de STATUS_MORE_PROCESSING_REQUIRED (e não liberar o IRP). Quando o driver não precisar mais do IRP, ele deverá concluir e liberar o IRP chamando IoCompleteRequest e IoFreeIrp. Por exemplo, um driver normalmente pode concluir e liberar o IRP em sua rotina de Descarregamento ou depois que um dispositivo for removido.

Se um driver usar um IRP para apenas uma solicitação de gravação, a rotina IoCompletion do IRP deverá concluir e liberar o IRP e retornar STATUS_SUCCESS.

Quando um driver envia um relatório de saída, ele deve primeiro inicializar e definir um buffer de relatório de saída, conforme descrito em Inicializando relatórios de HID. Em seguida, o driver deve usar um MDL para mapear o buffer de relatório de saída para uma solicitação de gravação. Um driver chama IoAllocateMdl para alocar o MDL para um relatório de saída e define um membro>MdlAddress do IPR de gravação como o endereço MDL do buffer de relatório de saída. O driver deve liberar o buffer de relatório e o MDL quando eles não forem mais necessários.

Além de definir o endereço MDL do IRP de gravação, o driver também deve definir o local da pilha de E/S do próximo driver de nível inferior. Um driver obtém acesso ao local da pilha de E/S do próximo driver de nível inferior chamando IoGetNextIrpStackLocation. O driver define os seguintes membros do local da pilha de E/S:

  • Parameters.Write.Length: definido como o comprimento, em bytes, de um relatório de saída. Defina esse membro como o comprimento dos relatórios de saída de uma coleção HID, conforme especificado pelo membro OutputReportByteLength da estrutura HIDP_CAPS de uma coleção.
  • Parameters.Write.Key: definido como zero.
  • Parameters.Write.ByteOffset.QuadPart: definido como zero.
  • MajorFunction: defina como IRP_MJ_WRITE.
  • FileObject: definido como o ponteiro do objeto de arquivo que representa o arquivo aberto na coleção de HID.

Solicitações IOCTL_HID_SET_Xxx

Você também pode usar as seguintes solicitações de E/S para enviar relatórios de saída e recursos para uma coleção de HID: