抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前段时间迁移到了 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.infxinputhid.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-1SHA-256 哈希值,打开 catroot2 下的 catdb 数据库,在 HashCatNameTableSHA1HashCatNameTableSHA256 表中查找:

然后将 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
2
signtool catdb /v "Microsoft-Windows-Client-Desktop-Required-Package~31bf3856ad364e35~amd64~~10.0.19041.1052.cat"
signtool catdb /v "Microsoft-Windows-Client-Desktop-Required-Package~31bf3856ad364e35~amd64~~10.0.19041.1288.cat"

然后,使用 NSudoPSExec 或者其他你喜欢的工具拉起一个 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 手柄上的灯变为常亮。现在,可以开始游戏了 :)