症状:加载出 icon, 菜单栏,然后闪退。
扔 ida, 发现

没啥用的信息。
上面走了一堆弯路,略过不表。
debug 发现报错在这。
425AA0: The instruction at 0x425AA0 referenced memory at 0x0. The memory could not be read -> 00000000 (exc.code c0000005, tid 740)
坑点在这
F5 看到解引用了 2 重指针,解第一重时就是 NULL ,说明解引用了空指针。
根据底下的调用,v36 / init 是一个成员的成员函数(有可能是初始化函数)。goto 应该是错误处理,试试看能否干掉。
通过修改 nop 把解引用干掉了。
修改步骤:
- 解指针替换 nop
- 下面的 call 替换 nop
- if 的内部改成 nop(每个跳转块在汇编里都是一个 label)
- if 的 jle 改成 nop
说明这个对象可能是构造失败(测试发现是和 save 有关)。
然后。。就能进入画面了。
nsfw

进游戏时结果 wine/win7 都闪退。观察可能是自动保存触发的闪退。(不管了)但是存档会保存。
找个存档试试。
nsfw

修改结果:游戏保存会闪退,但是能正常玩。
算是治好了一部分。。。?
用 linux 一年零三个月,部分解决了 Galgame 的运行问题。
这游戏心肠好,没有加防 debugger 的函数。所以我能调试发现解引用了空对象。虽然正宗的解决方法应该是把 double_ptr 对象的定义补上,但是合理怀疑这是 wine 缺失的 api。那就只能先治标了。
下面是更深的猜测
微少女
4256D0: The instruction at 0x4256D0 referenced memory at 0x0. The memory could not be read -> 00000000 (exc.code c0000005, tid 628)
解引用了 nullptr, 上面一看
可以判断是 malloc_data 出问题了。
有可能是 com ref object 相关的挂了。
搜索关键字,发现
2d3468c1-36a7-43b6-ac24-d3f02fd9607a 是这个挂了。
找到
头部是
是 shell 没有
%SystemRoot%\system32\shell32.dll
REG_EXPAND_SZ
Check the key HKEY_CLASSES_ROOT\CLSID\{deadbeef-d5c7-42d4-ba4d-2d073e2e96f4}
. The default value for the key will give you the object's "friendly name". More importantly the key will generally have subkeys, notably InprocServer32. This will have a default value like C:\WINDOWS\System32\foobar.dll, and then a ThreadingModel value (usually either Apartment or Both).
看上去需要手动注册一下?
注册了,还是报找不到。

所以这 tm 是啥??COM ?
提交了 bug, 看看回复。