作为一个学习练习,我试图在Windows 7 64位上为有线XBox 360控制器编写一个过滤器驱动程序 . 该控制器显示为HID操纵杆,因此它看起来应该是直截了当的 .
我为我的鼠标做了一个示例过滤器驱动程序,它可以交换鼠标左键和右键 . 这是基于WDK附带的moufiltr和firefly样本 . 但是,我无法将此示例转换为XBox 360控制器 .
当我插入控制器时,设备管理器中会出现3个不同的设备:
-
人机接口设备/符合HID标准的游戏控制器
-
人机接口设备/ USB人机接口设备
-
适用于Windows的Windows Class / Xbox 360 Controller的通用控制器
我应该将我的驱动程序中的哪一个附加到?
使用鼠标过滤器驱动程序,我能够跟踪firefly示例中的installation directions:在设备管理器中右键单击鼠标,选择"update driver."使用XBox 360控制器,我不确定我应该为哪个设备安装驱动程序 . 或者他们是否都独立地与硬件通信,我需要为每个硬件安装一个过滤器?
我应该注意到,我已经尝试将过滤器驱动程序附加到3个设备中的每个设备,以便打印出我的过滤器驱动程序可用的IOCTL . 对于“USB人机接口设备”,我的过滤器没有收到IOCTL .
对于符合HID标准的游戏控制器,它收到:
-
IOCTL_HID_GET_COLLECTION_INFORMATION(多次)
-
IOCTL_HID_GET_COLLECTION_DESCRIPTOR(多次)
-
IOCTL_GET_SYS_BUTTON_CAPS
对于Windows的Xbox 360控制器,它收到一堆IOCTL,我无法追踪符号名称:
-
0x80006000(多次)
-
0x8000e00c(多次)
-
0x8000e008
-
0x8000a010
-
0x8000e018
-
0x8000e014
不幸的是,我仍然不知道我应该尝试过滤哪个设备 . (我希望他们中的一个会接收相当于IOCTL_INTERNAL_MOUSE_CONNECT的操纵杆,但事实并非如此 . )
1 回答
我想你想过滤内部IOCTL(特别是IOCTL_HID_GET_INPUT_REPORT / IOCTL_HID_READ_REPORT)
您可能已经过滤了EvtIoDeviceControl尝试EvtIoInternalDeviceControl并查找读取/获取输入报告ioctl,这将来自任何想要读取操纵杆事件的系统服务 .
一旦您设法过滤正确的ioctl,您将需要查看该操纵杆的报告描述符,以找出如何解释(然后修改)数据 .