OD 了一下 th13.exe,发现程序内部查找 th13_ud????.rpy 时实际查找的是 th13.exe 所在目录 。但是如果只是简单地将 ud 录像放到游戏目录下也没有用。为了搞清楚原因,就 OD 了一下 th128.exe(妖精大战争,因为这一作的 rpy 文件也是放在 %APPDATA% 下的),对比了一下两者搜索 rpy 文件的代码后发现,原来,也许是酒喝多了,神主在 th13.exe 中漏了一段代码...
th128.exe 的部分代码
引用
0044B4DF . 8B7424 18 MOV ESI,DWORD PTR SS:[ESP+18]
0044B4E3 . B8 04000000 MOV EAX,4
0044B4E8 . 8486 CC5B0000 TEST BYTE PTR DS:[ESI+5BCC],AL
0044B4EE . 75 0E JNZ SHORT th128.0044B4FE
0044B4F0 . 014424 14 ADD DWORD PTR SS:[ESP+14],EAX
0044B4F4 . 47 INC EDI
0044B4F5 . 83FF 19 CMP EDI,19
0044B4F8 .^ 0F8E 42FFFFFF JLE th128.0044B440
0044B4FE > 68 99394D00 PUSH th128.004D3999 ; ASCII "D:\Documents and Settings\username\Application Data\ShanghaiAlice\th128\"
0044B503 . E8 FE830200 CALL th128.00473906 ; 调用 SetCurrentDirectory
0044B508 . 68 14454A00 PUSH th128.004A4514 ; replay
0044B50D . E8 1D850200 CALL th128.00473A2F ; 调用 CreateDirectory
0044B512 . 68 14454A00 PUSH th128.004A4514 ; replay
0044B517 . E8 EA830200 CALL th128.00473906 ; 调用 SetCurrentDirectory
0044B51C . 83C4 0C ADD ESP,0C
0044B51F . 8D4424 24 LEA EAX,DWORD PTR SS:[ESP+24]
0044B523 . 50 PUSH EAX ; /pFindFileData
0044B524 . 68 1C454A00 PUSH th128.004A451C ; |th128_ud????.rpy
0044B529 . FF15 78A04900 CALL DWORD PTR DS:[<&KERNEL32.F>; \FindFirstFileA
0044B52F . 894424 1C MOV DWORD PTR SS:[ESP+1C],EAX
0044B533 . 83F8 FF CMP EAX,-1
0044B536 . 0F84 E8000000 JE th128.0044B624
0044B53C . C74424 14 190>MOV DWORD PTR SS:[ESP+14],19
0044B544 . 8DBE 985A0000 LEA EDI,DWORD PTR DS:[ESI+5A98]
0044B54A > 68 30454A00 PUSH th128.004A4530 ; ../
0044B54F . E8 B2830200 CALL th128.00473906
0044B554 . 68 B4040000 PUSH 4B4
0044B559 . E8 0E740200 CALL th128.0047296C
0044B55E . 8BF0 MOV ESI,EAX
0044B560 . 83C4 08 ADD ESP,8
0044B563 . 897424 20 MOV DWORD PTR SS:[ESP+20],ESI
0044B567 . C78424 B80100>MOV DWORD PTR SS:[ESP+1B8],1
0044B572 . 85F6 TEST ESI,ESI
th13.exe:
引用
0044FC6C . 8B7424 18 MOV ESI,DWORD PTR SS:[ESP+18]
0044FC70 . B8 04000000 MOV EAX,4
0044FC75 . 8486 2C5B0000 TEST BYTE PTR DS:[ESI+5B2C],AL
0044FC7B . 75 0E JNZ SHORT th13.0044FC8B
0044FC7D . 014424 14 ADD DWORD PTR SS:[ESP+14],EAX
0044FC81 . 47 INC EDI
0044FC82 . 83FF 19 CMP EDI,19
0044FC85 .^ 0F8E 45FFFFFF JLE th13.0044FBD0
0044FC8B > 8D4424 24 LEA EAX,DWORD PTR SS:[ESP+24]
0044FC8F . 50 PUSH EAX ; /pFindFileData
0044FC90 . 68 6C744A00 PUSH th13.004A746C ; |th13_ud????.rpy
0044FC95 . FF15 78D04900 CALL DWORD PTR DS:[<&KERNEL32.F>; \FindFirstFileA
0044FC9B . 894424 1C MOV DWORD PTR SS:[ESP+1C],EAX
0044FC9F . 83F8 FF CMP EAX,-1
0044FCA2 . 0F84 E5000000 JE th13.0044FD8D
0044FCA8 . C74424 14 190>MOV DWORD PTR SS:[ESP+14],19
0044FCB0 . 8DBE F8590000 LEA EDI,DWORD PTR DS:[ESI+59F8]
0044FCB6 > 68 7C744A00 PUSH th13.004A747C ; ../
0044FCBB . E8 C2620200 CALL th13.00475F82
0044FCC0 . 68 30020000 PUSH 230
0044FCC5 . E8 07590200 CALL th13.004755D1
0044FCCA . 8BF0 MOV ESI,EAX
0044FCCC . 83C4 08 ADD ESP,8
0044FCCF . 897424 20 MOV DWORD PTR SS:[ESP+20],ESI
0044FCD3 . C78424 B80100>MOV DWORD PTR SS:[ESP+1B8],1
0044FCDE . 85F6 TEST ESI,ESI
红色和蓝色部分是两者类似的代码(除了地址和部分常数外几乎相同),而 th13.exe 中缺少了 th128.exe 中的黑色代码,这段代码干了些什么呢?很简单:
1. 设置当前目录为 %APPDATA%\ShanghaiAlice\th128\
2. 创建 replay 目录
3. 设置当前目录为 %APPDATA%\ShanghaiAlice\th128\replay\
由于 th13.exe 没有这些代码,导致接下来的 FindFirstFile() 函数 和 FindNextFile() 函数搜索的是主程序所在的目录。但是如果只是简单的将 th13_ud????.rpy 放到该目录下,却还是不显示,可能之后打开 rpy 文件时又设置了当前目录到 %APPDATA%\ShanghaiAlice\th128\replay\ ,如果这个目录下没有这些文件,当然就不会显示。
总之目前解决办法有二:1. 所有的 %APPDATA%\ShanghaiAlice\th13tr\replay\ 下的 th13_ud????.rpy 文件都在 th13.exe 所在目录(不是 replay 子目录)下放个备份。
2. 下载附件,是我修改的 th13.exe ,将上述缺少的代码移植了进去。下载后覆盖原文件即可(建议先备份原文件),这是一劳永逸的办法(不过毕竟不是官方的,出现任何后果自己负责)。