首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为Xbox 360控制器附加过滤器驱动程序的设备是什么?

为Xbox 360控制器附加过滤器驱动程序的设备是什么?
EN

Stack Overflow用户
提问于 2011-05-11 04:08:24
回答 2查看 1.3K关注 0票数 0

作为一个学习练习,我正在为Windows764位上的有线XBox 360控制器编写一个过滤器驱动程序。这个控制器显示为一个隐藏的操纵杆,所以它看起来应该很简单。

我已经为我的鼠标做了一个示例过滤器驱动程序,它交换鼠标左右按钮。这是基于与WDK一起的moufiltr和萤火虫样本。但是,我很难将这个示例转换为XBox 360控制器。

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

  • 人机界面设备/HID兼容游戏控制器
  • 人机界面设备/USB人机界面设备
  • Windows类通用控制器/ Windows Xbox 360控制器

我应该把我的司机绑在哪一个上?

使用鼠标过滤驱动程序,我能够跟踪萤火虫示例中的安装指示:右键单击设备管理器中的鼠标,选择“更新驱动程序”。对于XBox 360控制器,我不确定我应该为哪个设备安装驱动程序。或者他们都是独立地与硬件对话,而我需要为他们每一个安装一个过滤器?

我应该注意,我已经尝试将一个过滤器驱动程序附加到这三个设备中的每个设备上,以便打印出我的筛选器驱动程序可用的IOCTL。对于"USB人机界面设备“,我的过滤器没有收到IOCTL。

对于符合HID的游戏控制器,它收到:

  • IOCTL_HID_GET_COLLECTION_INFORMATION (多次)
  • IOCTL_HID_GET_COLLECTION_DESCRIPTOR (多次)
  • IOCTL_GET_SYS_BUTTON_CAPS

对于Xbox 360 Controller For Windows,它接收到一组IOCTL,我无法跟踪这些IOCTL的符号名称:

  • 0x80006000 (多次)
  • 0x8000e00c (多次)
  • 0x8000e008
  • 0x8000a010
  • 0x8000e018
  • 0x8000e014

不幸的是,我仍然不知道我应该尝试过滤哪个设备。(我希望他们中的一个能收到相当于IOCTL_INTERNAL_MOUSE_CONNECT的操纵杆,但情况似乎并非如此。)

EN

回答 2

Stack Overflow用户

发布于 2011-06-01 02:57:53

我想你想要过滤内部IOCTL(特别是IOCTL_HID_GET_INPUT_REPORT/IOCTL_HID_READ_REPORT) )

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

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

票数 0
EN

Stack Overflow用户

发布于 2020-04-20 18:18:42

来自xusb22.sys XInputRequestDispatcher::分派():

代码语言:javascript
复制
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);

因此,根据这一点,我们可以反向工程代码:

代码语言:javascript
复制
#include <windows.h>

// https://learn.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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5959129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档