前段时间迁移到了 Windows Server 2022,使用体验还算不错。不过,最近又发现一个新问题:Xbox 手柄没有驱动。
究其原因,还是 Windows Server 缺少 Xbox 相关的一整套软件,包括 Xbox APP、在线游戏服务、驱动服务等。只要想办法将桌面 Windows 的驱动程序移植过来,就可以正常使用了。
在 Google 上找了一圈,未能找到可借鉴的资料。这里记述的操作完全基于我对 Windows 系统的理解,你需要自行承担这些操作可能带来的风险。
有线连接
以 Xbox One 手柄为例,使用 有线连接 会直接报没有驱动的错误:
如果你能忍受有线连接,其实不必大费周折。只要 在 Microsoft Update Catalog 中 搜索 “xbox” 就能找到 能用的驱动包。
如果下载有困难,我也在此提供一个副本,你可以点击 这里 下载。该副本已经过 Microsoft 数字签名,请先验证签名再使用。
直接解压 cab 文件,然后使用设备管理器安装驱动即可。虽然是 Xbox Peripherals (legacy) 驱动,但它工作的很好。
无线连接?
我不喜欢有线连接。目前,Xbox 手柄的无线连接方式有两种:蓝牙或专用的 Xbox Wireless 接收器。
在本文中我只解决了蓝牙驱动问题,至于 Xbox Wireless 接收器,我只能说 “不太可能”,因为其中涉及太多的驱动和软件包了,几乎得将整套 Xbox 软件栈移植过来。如果你能移植成功,欢迎联系我共同交流。
如果你不知道怎么通过蓝牙连接 Xbox 手柄,不妨 问问 YouTube
如果采用 蓝牙连接,则配对成功后会出现一个名为 Xbox Bluetooth Gamepad 的 其他设备,虽然 “运转正常”,手柄却并不能正常工作。此时手柄的指示灯会继续闪烁。
在桌面版中,负责蓝牙 Xbox 手柄驱动是 xinputhid.inf
。而这个组件并不存在于 Server 中。让我们先看看桌面版系统中的驱动:
很不幸,这里只有 xinputhid.inf
和 xinputhid.sys
两个文件,不仅没有 CAT,连 SYS 文件也没有独立签名。如果你熟悉 Windows 系统,就会马上意识到这种驱动是绝对无法在开着 SecureBoot 的环境下加载的。
我也尝试过采用自己的证书和一些古旧的证书(2015年前)对驱动进行签名然后安装,但是这并不是一个优雅的方案。这里,我将提供一个手工移植驱动的 (相对优雅的) 方案。
提取 XInputHID 驱动
这部分只是记录我的操作思路,如果你不想读,可以直接跳到后面的 “安装” 一节
首先,我们将桌面版的 %WINDIR%\System32\DriverStore\FileRepository\xinputhid.inf_amd64_b01c6ccf7f1e23b6
文件夹整个复制出来,这是驱动本体。
然后,我们要解决的最大的问题就是代码签名。这个驱动并没有单独的 Catalog 文件,而是和其他驱动共同打包在一个较大的 Catalog 中。
众所周知,Windows 的 Catalog 数据存在于两个地方:%WINDIR%\System32\CatRoot
和 %WINDIR%\System32\catroot2
,前者存放原始 CAT 文件,后者存放的是包含所有 CAT 文件信息的 ESE 数据库。
要从 CatRoot
的上千个 CAT 文件中手动翻找 Hash 明显是不合理的,因此我们偷个懒采用 Velociraptor 的 authenticode()
函数直接查找 SYS 文件的签名:
现在我们知道 Microsoft-Windows-Client-Desktop-Required-Package~31bf3856ad364e35~amd64~~10.0.19041.1288.cat
是需要的文件之一了。但是事情还没有结束,INF 文件和 SYS 文件的签名并没有被打包在同一个 CAT 中,我们还需要找到 INF 文件对应的 CAT。
由于 authenticode()
函数对 INF 文件是不工作的,这里我们再计算 INF 文件的 SHA-1
和 SHA-256
哈希值,打开 catroot2
下的 catdb
数据库,在 HashCatNameTableSHA1
和 HashCatNameTableSHA256
表中查找:
然后将 HashCatNameTable_CatNameCol
的值转换为字符串,得到 Microsoft-Windows-Client-Desktop-Required-Package~31bf3856ad364e35~amd64~~10.0.19041.1052.cat|Microsoft-Windows-Client-Desktop-Required-Package~31bf3856ad364e35~amd64~~10.0.19041.1288.cat|
,这样我们就拿到两个需要的 CAT 文件了。
接下来,由于我们要直接移植驱动,不走 PNP,还得导出这些注册表项:
- 驱动配置:
HKLM\SYSTEM\DriverDatabase\DriverPackages\xinputhid.inf_amd64_b01c6ccf7f1e23b6
- INF 注册:
HKLM\SYSTEM\DriverDatabase\DriverInfFiles\xinputhid.inf
并且还要查看 INF 中注册的 VID、PID,从 HKLM\SYSTEM\DriverDatabase\DeviceIds\
导出对应的注册信息,以便操作系统能识别这些设备。
最后,顺便将 %WINDIR%\INF\xinputhid.PNF
也复制出来 (BTW,它不需要数字签名),这样我们就准备好需要的所有文件了:
安装 XInputHID 驱动
如果你不想自己提取,可以用我从 Windows 10 21H1 (19043.1052) 中提取的驱动文件。
点击下载 (2021-12-15)我不能保证这个文件一定能工作,也不能保证它不会损坏你的计算机,你将需要自行承担可能存在的风险。如果你同意承担此风险,我会告诉你解压密码是小写的 xwtf
。
首先,我们需要安装 Catalog 文件。使用 SignTool 进行安装 (BTW,你需要有管理员权限):
1 | signtool catdb /v "Microsoft-Windows-Client-Desktop-Required-Package~31bf3856ad364e35~amd64~~10.0.19041.1052.cat" |
然后,使用 NSudo 或 PSExec 或者其他你喜欢的工具拉起一个 TrustedInstaller 或更高权限的命令提示符,复制这些文件:
xinputhid.inf_amd64_b01c6ccf7f1e23b6/
->C:\Windows\System32\DriverStore\FileRepository
xinputhid.PNF
->C:\Windows\INF
xinputhid.inf_amd64_b01c6ccf7f1e23b6/xinputhid.inf
->C:\Windows\INF
xinputhid.inf_amd64_b01c6ccf7f1e23b6/xinputhid.sys
->C:\Windows\System32\drivers
最后,使用同样的高权限用户导入 xinputhid.reg
文件,这样就算安装完成了。
通过蓝牙连接你的 Xbox 手柄,此时你应该会看到一个 Bluetooth XINPUT compatible input device
设备,并且 Xbox 手柄上的灯变为常亮。现在,可以开始游戏了 :)