【问题标题】:Which device to attach filter driver to for Xbox 360 controller?将筛选器驱动程序附加到 Xbox 360 控制器的哪个设备?
【发布时间】:2011-05-11 04:08:24
【问题描述】:

作为学习练习,我正在尝试为 Windows 7 64 位上的有线 XBox 360 控制器编写过滤器驱动程序。此控制器显示为 HID 操纵杆,因此看起来应该很简单。

我已经为我的鼠标制作了一个示例过滤器驱动程序,它可以交换鼠标左右键。这是基于 WDK 附带的 moufiltr 和 firefly 样本。但是,我无法将此示例转换为适用于 Xbox 360 控制器。

当我插入控制器时,设备管理器中出现了 3 个不同的设备:

  • 人机接口设备/符合 HID 标准的游戏控制器
  • 人机接口设备/USB 人机接口设备
  • Windows 类的通用控制器/Windows 的 Xbox 360 控制器

我应该将驱动程序附加到其中哪一个?

使用鼠标过滤器驱动程序,我能够按照萤火虫示例中的installation directions:在设备管理器中右键单击鼠标,选择“更新驱动程序”。使用 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 等效的操纵杆,但事实并非如此。)

【问题讨论】:

    标签: filter driver wdk joystick


    【解决方案1】:

    我认为您想过滤内部 IOCTL(特别是 IOCTL_HID_GET_INPUT_REPORT/IOCTL_HID_READ_REPORT)

    您可能一直在过滤 EvtIoDeviceControl 尝试 EvtIoInternalDeviceControl 并查找读取/获取输入报告 ioctl,这将源自任何系统服务想要读取操纵杆事件。

    一旦您设法过滤了正确的 ioctl,您将需要查看该操纵杆的报告描述符,以了解如何解释(然后修改)数据。

    【讨论】:

      【解决方案2】:

      来自 xusb22.sys XInputRequestDispatcher::Dispatch():

      0x80006000 DispatchGetInformation((XInputRequestServicers *)this, (WDFREQUEST)request, (RequestBuffers*)buffer, (ULONG)ioctlCode);
      0x8000A010 DispatchSetState((XInputRequestServicers *)this, (WDFREQUEST)request, (RequestBuffers*)buffer);
      0x8000A01C DispatchPowerDownDevice((XInputRequestServicers *)this, (WDFREQUEST)request, (RequestBuffers*)buffer);
      0x8000E004 DispatchGetCapabilities((XInputRequestServicers *)this, (WDFREQUEST)request, (RequestBuffers*)buffer);
      0x8000E008 DispatchGetLedState((XInputRequestServicers *)this, (WDFREQUEST)request, (RequestBuffers*)buffer)
      0x8000E00C DispatchGetState((XInputRequestServicers *)this, (WDFREQUEST)request, (RequestBuffers*)buffer);
      0x8000E014 DispatchWaitForGuideButton((XInputRequestServicers *)this, (WDFREQUEST)request, (RequestBuffers*)buffer)
      0x8000E018 DispatchGetBatteryInformation((XInputRequestServicers *)this, (WDFREQUEST)request, (RequestBuffers*)buffer);
      0x8000E020 DispatchGetAudioDeviceInformation((XInputRequestServicers *)this, (WDFREQUEST)request, (RequestBuffers*)buffer);
      0x8000E3AC DispatchWaitForInput((XInputRequestServicers *)this, (struct XenonBusInformation *)&v6, (RequestBuffers*)buffer);
      0x8000E3FC DispatchGetInformationEx((XInputRequestServicers *)this, (WDFREQUEST)request, (RequestBuffers*)buffer);
      

      所以据此,我们可以对代码进行逆向工程:

      #include <windows.h>
      
      // https://docs.microsoft.com/windows-hardware/drivers/kernel/defining-i-o-control-codes
      // {EC87F1E3-C13B-4100-B5F7-8B84D54260CB}
      DEFINE_GUID(XUSB_INTERFACE_CLASS_GUID, 0xEC87F1E3, 0xC13B, 0x4100, 0xB5, 0xF7, 0x8B, 0x84, 0xD5, 0x42, 0x60, 0xCB);
      
      // xusb22.sys IOCTLs
      #define FILE_DEVICE_XUSB    0x8000
      #define IOCTL_INDEX_XUSB    0x0800
      
      #define IOCTL_XUSB_GET_INFORMATION              /*0x80006000*/ CTL_CODE(FILE_DEVICE_XUSB, IOCTL_INDEX_XUSB + 0, METHOD_BUFFERED, FILE_READ_ACCESS)
      #define IOCTL_XUSB_GET_CAPABILITIES             /*0x8000E004*/ CTL_CODE(FILE_DEVICE_XUSB, IOCTL_INDEX_XUSB + 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
      #define IOCTL_XUSB_GET_LED_STATE                /*0x8000E008*/ CTL_CODE(FILE_DEVICE_XUSB, IOCTL_INDEX_XUSB + 2, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
      #define IOCTL_XUSB_GET_STATE                    /*0x8000E00C*/ CTL_CODE(FILE_DEVICE_XUSB, IOCTL_INDEX_XUSB + 3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
      #define IOCTL_XUSB_SET_STATE                    /*0x8000A010*/ CTL_CODE(FILE_DEVICE_XUSB, IOCTL_INDEX_XUSB + 4, METHOD_BUFFERED, FILE_WRITE_ACCESS)
      #define IOCTL_XUSB_WAIT_GUIDE_BUTTON            /*0x8000E014*/ CTL_CODE(FILE_DEVICE_XUSB, IOCTL_INDEX_XUSB + 5, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
      #define IOCTL_XUSB_GET_BATTERY_INFORMATION      /*0x8000E018*/ CTL_CODE(FILE_DEVICE_XUSB, IOCTL_INDEX_XUSB + 6, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
      #define IOCTL_XUSB_POWER_DOWN                   /*0x8000A01C*/ CTL_CODE(FILE_DEVICE_XUSB, IOCTL_INDEX_XUSB + 7, METHOD_BUFFERED, FILE_WRITE_ACCESS)
      #define IOCTL_XUSB_GET_AUDIO_DEVICE_INFORMATION /*0x8000E020*/ CTL_CODE(FILE_DEVICE_XUSB, IOCTL_INDEX_XUSB + 8, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
      #define IOCTL_XUSB_WAIT_FOR_INPUT               /*0x8000E3AC*/ CTL_CODE(FILE_DEVICE_XUSB, IOCTL_INDEX_XUSB + 235, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
      #define IOCTL_XUSB_GET_INFORMATION_EX           /*0x8000E3FC*/ CTL_CODE(FILE_DEVICE_XUSB, IOCTL_INDEX_XUSB + 255, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        • 1970-01-01
        • 2017-07-29
        相关资源
        最近更新 更多