다음을 통해 공유


HID 보고서 가져오기

이 문서에서는 사용자 모드 애플리케이션 및 커널 모드 드라이버가 HID 컬렉션에서 HID 보고서를 가져오는 방법을 설명합니다.

사용자 모드 애플리케이션으로 HID 보고서 가져오기

이 섹션에서는 ReadFile 또는 HidD_GetXxx 루틴을 사용하는 사용자 모드 애플리케이션에서 HID 입력 보고서 또는 HID 기능 보고서를 가져오는 방법에 대해 설명합니다.

그러나 애플리케이션은 HidD_GetXxx 루틴만 사용하여 디바이스의 현재 상태를 가져와야 합니다. 애플리케이션이 HidD_GetInputReport 사용하여 입력 보고서를 지속적으로 가져오려고 하면 보고서가 손실될 수 있습니다. 또한 일부 디바이스는 HidD_GetInputReport 지원하지 않으며 이 루틴을 사용하는 경우 응답하지 않습니다.

ReadFile 사용

애플리케이션은 CreateFile을 사용하여 가져온 열린 파일 핸들을 사용하여 컬렉션에서 파일을 엽니다. 애플리케이션이 ReadFile을 호출하는 경우 HID 클라이언트 드라이버가 링 버퍼에서 보고서를 버퍼하기 때문에 겹치는 I/O를 지정할 필요가 없습니다. 그러나 애플리케이션은 겹치는 I/O를 사용하여 둘 이상의 미해결 읽기 요청을 가질 수 있습니다.

HidD_GetXxx 루틴 사용

애플리케이션은 다음 HIDClass 지원 루틴을 사용하여 HID 컬렉션에서 최신 입력 보고서 및 기능 보고서를 가져올 수 있습니다.

  • HidD_GetInputReport: HID 컬렉션(Windows XP 이상 버전)에서 입력 보고서를 반환합니다.
  • HidD_GetFeature: HID 컬렉션에서 기능 보고서를 반환합니다.

애플리케이션은 특정 보고서의 반환을 요청할 수 있습니다. HidD_GetXxx 루틴을 사용하여 특정 보고서를 검색하기 위해 애플리케이션은 보고서 출력 버퍼를 할당하고, 버퍼를 0으로 초기화하고, 버퍼의 첫 번째 바이트를 특정 보고서 ID로 설정합니다. 자세한 내용은 HID 보고서 초기화를 참조 하세요.

커널 모드 드라이버로 HID 보고서 가져오기

이 섹션에서는 커널 모드 드라이버가 HID 입력 보고서를 지속적으로 가져오기 위한 주요 방법으로 IRP_MJ_READ 요청을 사용하는 방법을 설명합니다.

연속 읽기 요청은 컬렉션에서 받은 순서대로 입력 보고서를 반환합니다. 드라이버는 IOCTL_HID_GET_Xxx 요청을 사용하여 입력 및 기능 보고서를 가져올 수도 있습니다. 그러나 드라이버는 IOCTL_HID_GET_Xxx 요청만 사용하여 디바이스의 현재 상태를 가져와야 합니다. 드라이버가 IOCTL_HID_GET_INPUT_REPORT 사용하여 입력 보고서를 지속적으로 가져오려고 하면 보고서가 손실될 수 있습니다. 또한 일부 디바이스는 IOCTL_HID_GET_INPUT_REPORT 지원하지 않으며 이 요청을 사용하는 경우 응답하지 않습니다.

IRP_MJ_READ 요청 사용

I/O 요청 패킷(IRP)을 사용하고 다시 사용하는 방법에 대한 일반적인 내용은 IRP 처리 및 IRP 재사용을 참조하세요.

드라이버가 IRP를 다시 사용하는 경우 IRP의 IoCompletion 루틴은 STATUS_MORE_PROCESSING_REQUIRED 상태로 요청을 완료해야 하며 IRP를 해제하지 않아야 합니다. 드라이버에 IRP가 더 이상 필요하지 않은 경우 IoCompleteRequest 및 IoFreeIrp를 호출하여 IRP를 완료하고 해제해야 합니다. 예를 들어 드라이버는 일반적으로 언로드 루틴에서 또는 디바이스를 제거한 후 IRP를 완료하고 해제할 수 있습니다.

드라이버가 하나의 읽기 요청에만 IRP를 사용하는 경우 IRP의 IoCompletion 루틴은 IRP를 완료 및 해제하고 STATUS_SUCCESS 반환해야 합니다.

드라이버가 입력 보고서를 요청하려면 먼저 페이지가 없는 메모리 풀에서 초기화되지 않은 입력 보고서 버퍼를 할당해야 합니다. 버퍼의 크기(바이트)는 HID 컬렉션의 HIDP_CAPS 구조체의 InputReportByteLength 멤버에 의해 지정됩니다. 그런 다음 드라이버는 MDL을 사용하여 읽기 요청에 대한 입력 보고서 버퍼를 매핑해야 합니다. 드라이버는 IoAllocateMdl을 호출하여 입력 보고서 버퍼에 대한 MDL을 할당하고 읽기 IRP의 Irp-MdlAddress> 멤버를 입력 보고서 버퍼의 MDL 주소로 설정합니다. 드라이버가 더 이상 필요하지 않은 경우 보고서 버퍼와 MDL을 해제해야 합니다.

읽기 IRP의 MDL 주소를 설정하는 것 외에도 드라이버는 다음 하위 수준 드라이버의 I/O 스택 위치도 설정해야 합니다. 드라이버는 IoGetNextIrpStackLocation을 호출하여 다음 하위 수준 드라이버의 I/O 스택 위치에 액세스할 수 있습니다. 드라이버는 I/O 스택 위치의 다음 멤버를 설정합니다.

  • Parameters.Read.Length: 읽기 버퍼의 크기(바이트)로 설정합니다. 크기는 HID 컬렉션 의 HIDP_CAPS 구조체의 InputReportByteLength 멤버가 지정한 값보다 크거나 같아야 합니다.
  • Parameters.Read.Key: 0으로 설정합니다.
  • Parameters.Read.ByteOffset.QuadPart: 0으로 설정합니다.
  • MajorFunction: IRP_MJ_READ.
  • FileObject: HID 컬렉션에서 열린 파일을 나타내는 파일 개체 포인터로 설정합니다.

드라이버가 입력 보고서를 가져온 후 HID 보고서 해석에 설명된 대로 제어 데이터에 액세스할 수 있습니다.

IOCTL_HID_GET_Xxx 요청 사용

드라이버는 다음 I/O 요청을 사용하여 HID 컬렉션에서 최신 입력 및 기능 보고서를 가져올 수 있습니다.

  • IOCTL_HID_GET_INPUT_REPORT: HID 컬렉션(Windows XP 이상 버전)에서 입력 보고서를 반환합니다.
  • IOCTL_HID_GET_FEATURE: HID 컬렉션에서 기능 보고서를 반환합니다.

드라이버는 특정 보고서의 반환을 요청할 수 있습니다. 이러한 I/O 요청을 사용하여 특정 보고서를 검색하기 위해 드라이버는 먼저 출력 보고서 버퍼를 할당한 다음 버퍼를 0으로 초기화하고 버퍼의 첫 번째 바이트를 특정 보고서 ID로 설정합니다.

자세한 내용은 HID 보고서 해석을 참조 하세요.