HID 보고서 문제 해결

이 문서에서는 HID 사용량을 추출하거나 설정하려고 할 때 사용자 모드 애플리케이션 및 커널 모드 드라이버에서 발생할 수 있는 가장 일반적인 문제에 대해 설명합니다.

HID 보고서 ID 오류

애플리케이션 또는 드라이버가 HID 컬렉션에서 HID 보고서를 받으면 컬렉션에 포함된 모든 보고서일 수 있습니다(컬렉션이 순서에 관계없이 보고서를 반환할 수 있기 때문). HidP_GetXxx 루틴은 보고서 ID 오류를 나타내는 다음과 같은 상태 값을 반환합니다.

HIDP_STATUS_INCOMPATIBLE_REPORT_ID
요청된 사용량은 HID 컬렉션에서 지원하는 보고서에 있지만 애플리케이션 또는 드라이버가 지정한 보고서에는 없습니다.

HIDP_STATUS_USAGE_NOT_FOUND
요청된 사용량은 최상위 컬렉션에서 지원하는 보고서에 없습니다.

예를 들어 다음 그림에서는 두 개의 보고서가 포함된 HID 컬렉션을 보여 줍니다.

두 개의 보고서가 포함된 hid 컬렉션을 보여 주는 다이어그램

이 예제에 따라 애플리케이션 또는 드라이버가 컬렉션에서 보고서를 수신하고 HidP_GetUsageValue 호출하여 "Value X"의 현재 값을 추출했다고 가정합니다. 보고서의 ID가 7이면 루틴은 디바이스가 Value X를 지원하지만 Value X가 보고서에 없음을 나타내는 HIDP_STATUS_INCOMPATIBLE_REPORT_ID 반환합니다. 반면에 애플리케이션 또는 드라이버가 "Value Z" 값을 요청하는 경우 루틴은 HIDP_STATUS_USAGE_NOT_FOUND 반환합니다. 이는 Value Z가 컬렉션에서 지원하는 보고서에 없음을 나타냅니다.

애플리케이션 또는 드라이버가 HidP_SetXxx 루틴을 사용하여 보고서에서 사용량을 설정하는 경우 루틴은 동일한 두 개의 상태 값을 반환할 수도 있습니다. HIDP_STATUS_USAGE_NOT_FOUND 의미는 HidP_GetXxx 루틴과 동일합니다. 그러나 HIDP_STATUS_INCOMPATIBLE_REPORT_ID 의미는 다릅니다. 이 상태 값은 보고서가 이전에 보고서 ID로 구성되었고 호출자가 지정한 사용량이 해당 보고서 ID에 속하지 않음을 나타냅니다. 이전 그림을 예로 들어 애플리케이션 또는 드라이버가 HidP_SetUsages 사용하여 초기화되지 않은 보고서에서 "Button 2"를 설정한 후 보고서는 7의 보고서 ID로 구성됩니다. 애플리케이션 또는 드라이버가 이후에 HidP_SetUsageValue 사용하여 동일한 보고서에서 "값 X"를 설정하려고 하면 루틴은 HIDP_STATUS_INCOMPATIBLE_REPORT_ID 반환합니다.

**HidP_**Xxx 루틴이 HIDP_STATUS_INCOMPATIBLE_REPORT_ID 반환하는 경우 호출자는 다음 작업 중 하나를 수행해야 합니다.

  • 호출자가 사용량을 설정하는 경우 올바른 길이의 새 보고서를 할당하고 0으로 초기화한 다음 루틴을 다시 호출해야 합니다. 호출자는 보고서의 모든 사용량을 성공적으로 설정한 후 보고서를 컬렉션으로 보낼 수 있습니다.

  • 호출자가 사용량을 추출하는 경우 컬렉션에서 가져온 다른 보고서를 사용하여 루틴을 호출해야 합니다.

삭제된 HID 보고서

HID 클라이언트 드라이버가 HID 컬렉션에서 입력 보고서를 가져오면 보고서는 HID 클래스 드라이버에서 유지 관리하는 링 버퍼에 저장됩니다. 이 메커니즘은 애플리케이션 또는 드라이버가 필요한 입력 보고서를 놓칠 가능성을 줄입니다.

기본적으로 HID 클래스 드라이버는 32개의 보고서를 보유하는 입력 보고서 링 버퍼를 유지 관리합니다. 컬렉션이 사용자 모드 애플리케이션보다 더 빠르게 HID 클래스 드라이버로 데이터를 전송하거나 커널 모드 드라이버가 버퍼에서 데이터를 검색하는 경우 버퍼 오버플로로 인해 입력 보고서가 손실됩니다. 버퍼 오버플로의 가능성을 줄이기 위해 애플리케이션 또는 드라이버는 버퍼의 크기(보고서 수)를 다시 구성할 수 있습니다. 드라이버는 IOCTL_GET_NUM_DEVICE_INPUT_BUFFERS 요청 및 IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS 요청을 사용하여 버퍼의 크기를 검색하고 변경합니다. 애플리케이션은 HidD_GetNumInputBuffers HidD_SetNumInputBuffers 호출하여 동일한 작업을 수행합니다.