XBOX游戏手柄在Windows下的分析
学习学习,对USB的学习其实带着问题有目的的解决问题,是最棒的。
昨日本站USB中文网技术交流群一位同学拿了一个游戏手柄,没想到在本群中关于它的分析出展开了…
该游戏手柄接入PC机后,在Windows下的设备管理器中的设备树如下:
usbtreeview给出的设备信息如下:
Device Description : 支持 Windows 的 XBOX 360 手柄
Device Path : \\?\usb#vid_045e&pid_028e#5&92c31b4&0&12#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
Device ID : USB\VID_045E&PID_028E\5&92C31B4&0&12
Hardware IDs : USB\VID_045E&PID_028E&REV_0110 USB\VID_045E&PID_028E
Driver KeyName : {d61ca365-5af4-4486-998b-9db4734c6ca3}\0000 ({D61CA365-5AF4-4486-998B-9DB4734C6CA3})
Driver : \SystemRoot\System32\drivers\xusb22.sys (Version: 10.0.18362.1 Date: 2019-03-19)
Driver Inf : C:\Windows\inf\xusb22.inf
Legacy BusType : PNPBus
Class : XnaComposite
Class GUID : {d61ca365-5af4-4486-998b-9db4734c6ca3}
Interface GUID : {a5dcbf10-6530-11d2-901f-00c04fb951ed} (GUID_DEVINTERFACE_USB_DEVICE)
Service : xusb22
Enumerator : USB
Location Info : Port_#0012.Hub_#0001
Location IDs : PCIROOT(0)#PCI(1400)#USBROOT(0)#USB(12), ACPI(_SB_)#ACPI(PCI0)#ACPI(XHC_)#ACPI(RHUB)#ACPI(HS12)
Container ID : {45ac991f-dcca-11eb-a34d-b025aa2b39ec}
Manufacturer Info : Microsoft
Capabilities : 0x84 (Removable, SurpriseRemovalOK)
Status : 0x0180600A (DN_DRIVER_LOADED, DN_STARTED, DN_DISABLEABLE, DN_REMOVABLE, DN_NT_ENUMERATOR, DN_NT_DRIVER)
Problem Code : 0
Power State : D0 (supported: D0, D3, wake from D0)
Child Device 1 : USB 输入设备
Device ID : USB\VID_045E&PID_028E&IG_00\6&4C290CB&0&00
Class : HIDClass
Child Device 1 : HID-compliant game controller
DevicePath : \\?\hid#vid_045e&pid_028e&ig_00#7&53b87d7&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
KernelName : \Device\00000129
Device ID : HID\VID_045E&PID_028E&IG_00\7&53B87D7&0&0000
Class : HIDClass
`
我们可以知道,根设备是由xusb22.sys驱动的,该驱动作为总线驱动又枚举出了一个USB input设备,USB input设备通过分析该USB HID INPUT设备的报表描述符,又枚举出了一个 HID-compliant game controller即游戏手柄设备。
而在微软的官方文档中 DirectInput and XUSB Devices 一节中,链接为:https://docs.microsoft.com/en-us/windows/win32/xinput/directinput-and-xusb-devices
其有一段话如下:
The driver for the Xbox Common Controller class (XUSB) on Windows implements the kernel-mode interface for the XINPUT DLL. To provide a good experience for legacy titles that use the DirectInput API with the common controller device, the driver also exports a Human Interface Device (HID) class interface, which is picked up by DirectInput. We chose the mapping of XUSB to HID based on typical behavior in a set of gaming applications for the original XINPUT version, and we updated the mapping for newer subtypes. This topic describes the mapping.
所以通过以上文,本人的理解是:
- XBOX 360 手柄接入PC机后,使用Xbox Common Controller class (XUSB)驱动(在win10当前的版本中是xusb22.sys ),该驱动提供了游戏专用 XINPUT DLL 的内核模式接口。
- 为了使用DirectInput API 和通用控制器设备的传统游戏提供良好的体验,驱动程序还额外导出了一个由 DirectInput 选取的人机接口设备 (HID) 类接口,该接口是标准的HID 游戏手柄接口。该游戏手柄的HID设备的报表描述符类似USBIF提供的标准游戏手柄报表描述符。详见:http://www.usbzh.com/article/detail-113.html
以上都是猜测,实际并未真正测试验证。。。。