В качестве учебного упражнения я пытаюсь написать драйвер фильтра для проводного контроллера XBox 360 в 64-разрядной версии Windows 7. Этот контроллер отображается как HID-джойстик, поэтому кажется, что он должен быть простым.
Я сделал пример драйвера фильтра для моей мыши, который меняет местами левую и правую кнопки мыши. Это было основано на образцах moufiltr и firefly, которые поставляются с WDK. Однако у меня возникают проблемы при преобразовании этого примера в работу для контроллера XBox 360.
Когда я подключаю контроллер, в диспетчере устройств появляются 3 разных устройства:
- Human Interface Devices / HID-совместимый игровой контроллер
- Интерфейсные устройства / USB Human Interface Device
- Общий контроллер для Windows Class / Xbox 360 Контроллер для Windows
К какому из них я должен прикрепить мой драйвер?
Используя драйвер фильтра мыши, я смог выполнить указания по установке из примера светлячка: щелкните правой кнопкой мыши в диспетчере устройств, выберите «обновить драйвер». С контроллером XBox 360 я не уверен, для какого устройства мне следует устанавливать драйвер. Или они все разговаривают с оборудованием независимо, и мне нужно установить фильтр для каждого из них?
Следует отметить, что я пытался подключить драйвер фильтра к каждому из 3 устройств, чтобы распечатать списки IOCTL, доступные для моего драйвера фильтра. Для «USB Human Interface Device» мой фильтр не получил IOCTL.
Для HID-совместимого игрового контроллера получено:
- IOCTL_HID_GET_COLLECTION_INFORMATION (несколько раз)
- IOCTL_HID_GET_COLLECTION_DESCRIPTOR (несколько раз)
- IOCTL_GET_SYS_BUTTON_CAPS
Для контроллера Xbox 360 для Windows он получает набор IOCTL, для которых я не могу отследить символическое имя:
- 0x80006000 (несколько раз)
- 0x8000e00c (несколько раз)
- 0x8000e008
- 0x8000a010
- 0x8000e018
- 0x8000e014
К сожалению, я до сих пор не знаю, какое устройство я должен пытаться фильтровать. (Я надеялся, что один из них получит эквивалент IOCTL_INTERNAL_MOUSE_CONNECT, эквивалентный джойстику, но это не так.)