HID 보고서 보내기
이 문서에서는 사용자 모드 애플리케이션 및 커널 모드 드라이버가 HID 보고서를 HID 컬렉션에 보내는 방법을 설명합니다.
사용자 모드 애플리케이션으로 HID 보고서 보내기
사용자 모드 애플리케이션은 WriteFile을 사용하여 HID 컬렉션에 출력 보고서를 지속적으로 보냅니다. HidD_SetXxx 루틴을 사용하여 출력 보고서 및 기능 보고서를 컬렉션에 보낼 수도 있습니다. 그러나 HidD_SetXxx 루틴만 사용하여 컬렉션의 현재 상태를 설정합니다. 일부 디바이스는 HidD_SetOutputReport 지원하지 않을 수 있으며 이 루틴을 사용하는 경우 응답하지 않을 수 있습니다.
WriteFile 루틴
쓰기 요청을 사용하여 HID 컬렉션에 출력 보고서를 보냅니다. 사용자 모드 애플리케이션이 출력 보고서를 만든 후 WriteFile을 사용하여 컬렉션에 출력 보고서를 보낼 수 있습니다.
HidD_SetXxx 루틴
HID 컬렉션에 HID 보고서를 보내려면 다음 HIDClass 지원 루틴 을 사용합니다.
- HidD_SetOutputReport: HID 컬렉션(Windows XP 이상 버전)에 출력 보고서를 보냅니다.
- HidD_SetFeature: HID 컬렉션에 기능 보고서를 보냅니다.
커널 모드 드라이버로 HID 보고서 보내기
커널 모드 드라이버는 IRP_MJ_WRITE 요청을 사용하여 HID 컬렉션에 출력 보고서를 지속적으로 보냅니다. IOCTL_HID_SET_Xxx 요청을 사용하여 출력 보고서 및 기능 보고서를 컬렉션에 보낼 수도 있습니다. 그러나 IOCTL_HID_SET_Xxx 요청만 사용하여 컬렉션의 현재 상태를 설정합니다. 일부 디바이스는 IOCTL_HID_SET_OUTPUT_REPORT 지원하지 않을 수 있으며 이 요청을 사용하는 경우 응답하지 않을 수 있습니다.
IRP_MJ_WRITE 요청
WDM이 아닌 Windows 2000 드라이버 및 Windows XP 이상 버전의 드라이버는 컬렉션에 전송된 모든 쓰기 요청에 단일 IRP를 사용할 수 있습니다. 그러나 Windows 2000 WDM 드라이버는 각 쓰기 요청에 대해 새 IRP를 할당해야 합니다. IRP를 사용하고 다시 사용하는 방법에 대한 자세한 내용은 IRP 처리 및 IRP 재사용을 참조하세요.
드라이버에서 쓰기 IRP를 다시 사용하는 경우 IRP의 IoCompletion 루틴은 STATUS_MORE_PROCESSING_REQUIRED 상태로 요청을 완료해야 하며 IRP를 해제하지 않아야 합니다. 드라이버에 IRP가 더 이상 필요하지 않은 경우 IoCompleteRequest 및 IoFreeIrp를 호출하여 IRP를 완료하고 해제해야 합니다. 예를 들어 드라이버는 일반적으로 언로드 루틴에서 또는 디바이스를 제거한 후 IRP를 완료하고 해제할 수 있습니다.
드라이버가 하나의 쓰기 요청에만 IRP를 사용하는 경우 IRP의 IoCompletion 루틴은 IRP를 완료 및 해제하고 STATUS_SUCCESS 반환해야 합니다.
드라이버는 출력 보고서를 보낼 때 HID 보고서 초기화에 설명된 대로 먼저 출력 보고서 버퍼를 초기화하고 설정해야 합니다. 그런 다음 드라이버는 MDL을 사용하여 쓰기 요청에 대한 출력 보고서 버퍼를 매핑해야 합니다. 드라이버는 IoAllocateMdl을 호출하여 출력 보고서에 MDL을 할당하고 쓰기 IRP의 Irp-MdlAddress> 멤버를 출력 보고서 버퍼의 MDL 주소로 설정합니다. 드라이버가 더 이상 필요하지 않은 경우 보고서 버퍼와 MDL을 해제해야 합니다.
쓰기 IRP의 MDL 주소를 설정하는 것 외에도 드라이버는 다음 하위 수준 드라이버의 I/O 스택 위치도 설정해야 합니다. 드라이버는 IoGetNextIrpStackLocation을 호출하여 다음 하위 수준 드라이버의 I/O 스택 위치에 액세스할 수 있습니다. 드라이버는 I/O 스택 위치의 다음 멤버를 설정합니다.
- Parameters.Write.Length: 출력 보고서의 길이(바이트)로 설정합니다. 컬렉션의 HIDP_CAPS 구조체의 OutputReportByteLength 멤버가 지정한 대로 이 멤버를 HID 컬렉션의 출력 보고서 길이로 설정합니다.
- Parameters.Write.Key: 0으로 설정합니다.
- Parameters.Write.ByteOffset.QuadPart: 0으로 설정합니다.
- MajorFunction: 로 설정
IRP_MJ_WRITE
- FileObject: HID 컬렉션에서 열린 파일을 나타내는 파일 개체 포인터로 설정합니다.
IOCTL_HID_SET_Xxx 요청
다음 I/O 요청을 사용하여 HID 컬렉션에 출력 및 기능 보고서를 보낼 수도 있습니다.