Весь прикол в том что вы связались с USB - это самоописываемый интерфейс, в этом был смысл. Ведь те кто пишет виндус не читают даташиты на все клавиатуры

...
Принцип работы HID устройств такой: Они обмениваются репортами, формат репорта описан в дескрипторах. Когда происходит подключение устройства к хосту, хост инициализирует серию запросов по которым определяет что за устройство, подбирает к нему драйверы если надо, получает формат данных что оно выдает.
Для HID есть целая таблица с тем какие данные бывают, абсолютные, относительные, в репортах задаются диапазоны и так далее. Так что работая с USB клавиатурой, которая по сути HID (не берем супер навороченные), вам все равно как она устроена, у вас будет для всех все одинаково.
USB устройство надо отметить имеет несколько сущностей, то есть когда вы включаете его, в дескрипторах вам сообщается сколько ваще вариантов есть. Среди них будет обязательно один стандартный, если клава навороченная и нужен ей свой драйвер, то будет и такой вариант, и хост сможет выбрать по какому варианту работать.
Так вот возвращаясь к HID
в нем определены
IN репорт, OUT репорт, Feature репорт.
В USB все всегда со стороны хоста мериют, так что OUT репорт - это передача данных в HID, в клавиатуре его может не быть
IN репорт - это данные от устройства, через них вам будут из клавиатуры слать код нажатой кнопки.
Feature - это свойства, это штука двунаправленная, ее можно как задать, так и считать, состояние feature может менять как хост так и устройство, обычно через него на клавах зажигают диодики что нажат капс лок и так далее, или же там стоит флаг что он нажат.
Чтобы это точно узнать, надо опросить клавиатуру и считать дискрипторы ее репортов.
Отчеты могут поступать в 3 режимах, по изменению состояния или по таймеру с заданным интервалом или по запросу от хоста, но это только для фичей.. In репорт запросить вроде как нельзя, если я не ошибаюсь... Также как фича отчет не придет по инициативе устройства... но тут 100% гарантии не дам, давно я с этим ковырялся...
----------
обманул маленько
InReport идет через входную интерапт точку, или через контрольную
OutReport
FeatureReport
идут через контрольную точку, или через опциональную выходную интерапт точку, если ее нет, то только через контрольную по инициации хоста.
OutReport можно только послать
InReport можно только запросить
FeatureReport можно и послать и запросить
запрашивать OutReport или посылать InReport через контрольную точку по идее не запрещено, но устройство должно их отнакать, и в стандартном драйвере винды такой опции не дали...