DxCapture 1.1
运行环境: Windows 95/98/Me/NT/2000 DxCapture 是用于监视在一任务中对 DirectX 调用情况的工具。 它记录任务中对 DirectX 的调用;并记录调用的参数。 为什么要做这个工具? 如何使用 记录文件 常见问题 发布历史 为什么要做这个工具? 做这个工具源于做游戏汉化的需要。 原来做 2D 的游戏汉化时,一般总是将字模从一块区域送到另一块区域就 OK 了。接触 3D 游戏后,发现它的汉化要麻烦得多;象对待 2D 游戏那样的处理方法,已经快行不通了。不得不去了解渲染、执行缓冲、纹理融合…… 微软这个 DirectX 学起来也太麻烦,一个例子程序,看了两天才搞明白个大概,程序中大量使用的宏定义把人搞得很模糊;还不知道它运行起来究竟是怎么个调用法。 好不容易懂了一点儿 DirectX ,开始做汉化了,跟踪的时候想知道调用的究竟是哪一个函数,还要对着包含文件一个一个数排在第几位(俺可是这样过来的,哪位朋友有什么好的方法 share 一下了),实在是浪费时间。浪费了两天时间后,就有了做一个程序来查看 DirectX 函数调用情况的念头,也就有了这个工具的产生。 如何使用 DxCapture 的使用非常简单:如果你想知道某个游戏运行期间对 DirectX 的调用情况,只需要在上面的编辑框(如下图)中输入游戏的主程序名, 下面的编辑框中输入希望生成的记录文件名;点击 Run ,启动游戏;游戏退出后,打开记录文件,你就可以看到在游戏运行期间对 DirectX 的调用情况了。 ![]() 记录文件 记录文件的格式如下:
记录文件的每一行代表一次DirectX函数调用,行首处的 ret:0 表示此次调用的返回值为0,随后的 Ixxxxxxxx 是表示此次调用的 interface ,后面的 DirectXXXXX:: 是微软给这个 interface 起的名字,其后是调用的函数名字,后面跟的是参数。 也许你已经注意到:有的行结束是一个 Ixxxxxxxx ,它表示的是生成了新的 Interface 。比如第二行的结尾为 I85C3B020 ,表示生成了新的 interface 为 85C3B020 ,而前面的 Direct3D: 表示此 interface 为 IDirect3D 。而最后一行的 I85B3EAE0 前面没有此 interface 的名字,原因是 Direct3DDevice::CreateExecuteBuffer 生成的只能是 IDirect3DExecuteBuffer ,就省略了(事实上我只在 QueryInterface 函数后加上了新 interface 的名字)。 为避免一行太长,我将参数的名字进行了简化,如上面最后一行的 size:3CF0 是指 lpDesc->dwBufferSize = 0x3CF0 。至所以没有其它的参数,是因为我感觉其它的参数并不重要,如 lpDesc->dwSize ,几乎总是 sizeof(D3DEXECUTEBUFFERDESC) ,而缓冲在系统内存还是在显示内存中,我并不关心(不知你是否关心 :))。 要注意的是记录文件中出现的数字全部为十六进制。 常见问题 为什么游戏结束后,发现记录文件为空? 这是因为DxCapture没有截到DirectX调用。原因最可能是因为游戏主程序外面还有壳,比如有些汉化后的游戏、有些加密过的游戏。对此情况,我这边还有一稍早的版本可以截到DirectX调用,但要知道操作系统的版本,如有需要,请发Mail索取,并告知系统版本。 可不可以截到DirectX 8的调用? 目前不行。兄弟还没有做支持截取DirectX 8调用的那部分程序,如果你试图利用DxCapture截取调用DirectX 8的游戏,将出现错误。 为何有的函数记录了参数,而另一些没有记录参数? 这个工具是本人边用边做,用到一部分,就写一部分。记录了参数的那些函数是过去所汉化的游戏中调用过了的。请关注本工具的升级情况,不久以后,就会有记录多数函数参数的版本完成。 将 dll 注入到目标进程的时间修改为进程创建时。 1.0 - 2002.3.25
首次发布。 |