Windows and macOS both use thread slot 0x20, so fiber games crash under Wine
a day ago
- Windows和macOS都使用线程槽位0x20,导致基于纤程的游戏在Mac上的Wine中崩溃。
- 《漫威银河护卫队》和《暗喻幻想:ReFantazio》这两款游戏因该槽位冲突而出现不同的故障。
- 槽位0x20被Windows用于当前纤程指针,被macOS用于线程QoS优先级。
- Wine将一些字段复制到macOS槽位,但由于槽位0x20已被占用,无法复制纤程指针。
- 故障一:QoS类被读取为纤程指针,导致《暗喻幻想》和《银河护卫队》崩溃。
- 故障二:纤程指针被读取为QoS类,导致《暗喻幻想》中出现libdispatch错误。
- 修复方案是在ntdll的边界交叉处交换Windows和macOS代码之间的槽位内容。
- 初始补丁版本因寄存器使用错误而崩溃,通过使用rax并更新快速退出路径修复。
- 修复后,两款游戏均以可玩的帧率运行,无错误。
- 上游Wine在10.5版本中通过交换整个GS基址的方式解决了此问题,而Highball的引擎不具备此功能。
- Highball的引擎采用槽位交换作为廉价修复方案,直到集成上游更改。