成就中心 DouJin Terraria! 社区服务 统计排行 帮助
  • 4618阅读
  • 2回复

[神/TD][代码分析] 关于看不了 th13_ud????.rpy 录像的解决办法

发帖
103
信仰
6
蓝点
462
符卡
0
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 ,将上述缺少的代码移植了进去。下载后覆盖原文件即可(建议先备份原文件),这是一劳永逸的办法(不过毕竟不是官方的,出现任何后果自己负责)。
附件: th13.zip (358 K) 下载次数:22
本帖最近评分记录: 5 条评分 蓝点 +21 隐藏
不动の图书馆 蓝点 +2 2011-04-25 -
沙理魔·雨雾 蓝点 +3 2011-04-23 代码触
incognito 蓝点 +3 2011-04-23 代码帝
snowynight 蓝点 +3 2011-04-23 顶老师
franniss 蓝点 +10 2011-04-23 -
发帖
392
信仰
5
蓝点
329
符卡
0
只看该作者 沙发  发表于: 2011-04-23
OD威武
发帖
12
信仰
3
蓝点
2
符卡
0
只看该作者 板凳  发表于: 2011-04-24
不错,支持代码触~~~~~
本帖最近评分记录: 1 条评分 蓝点 +2 隐藏
franniss 蓝点 +2 2011-04-25 欢迎
描述
快速回复

您目前还是游客,请 登录注册
如果您在写长篇帖子又不马上发表,建议存为草稿
认证码: