DxCapture 1.1



   运行环境: Windows 95/98/Me/NT/2000

     DxCapture 是用于监视在一任务中对 DirectX 调用情况的工具。 它记录任务中对 DirectX 的调用;并记录调用的参数。

  为什么要做这个工具?

  如何使用

  记录文件

  常见问题

  发布历史


为什么要做这个工具?

     做这个工具源于做游戏汉化的需要。

     原来做 2D 的游戏汉化时,一般总是将字模从一块区域送到另一块区域就 OK 了。接触 3D 游戏后,发现它的汉化要麻烦得多;象对待 2D 游戏那样的处理方法,已经快行不通了。不得不去了解渲染、执行缓冲、纹理融合……

     微软这个 DirectX 学起来也太麻烦,一个例子程序,看了两天才搞明白个大概,程序中大量使用的宏定义把人搞得很模糊;还不知道它运行起来究竟是怎么个调用法。

     好不容易懂了一点儿 DirectX ,开始做汉化了,跟踪的时候想知道调用的究竟是哪一个函数,还要对着包含文件一个一个数排在第几位(俺可是这样过来的,哪位朋友有什么好的方法 share 一下了),实在是浪费时间。浪费了两天时间后,就有了做一个程序来查看 DirectX 函数调用情况的念头,也就有了这个工具的产生。


如何使用

     DxCapture 的使用非常简单:如果你想知道某个游戏运行期间对 DirectX 的调用情况,只需要在上面的编辑框(如下图)中输入游戏的主程序名, 下面的编辑框中输入希望生成的记录文件名;点击 Run ,启动游戏;游戏退出后,打开记录文件,你就可以看到在游戏运行期间对 DirectX 的调用情况了。




记录文件

     记录文件的格式如下:

   ret:0 I855482CC DirectDraw::GetCapsDriverCaps
   ret:0 I855482CC DirectDraw::QueryInterface Direct3D:I85C3B020
   ret:0 I855482CC DirectDraw::SetCooperativeLevel
   ret:0 I855482CC DirectDraw::SetDisplayMode
   .
   .
   .
   ret:0 I855484D4 DirectDrawSurface::GetAttachedSurface I85548640
   ret:0 I85548640 DirectDrawSurface::AddAttachedSurface
   ret:0 I85548640 DirectDrawSurface::QueryInterface Direct3DDevice:I85B3A080
   ret:0 I85C3B020 Direct3D::CreateViewport I85B3EA40
   ret:0 I85B3A080 Direct3DDevice::AddViewport
   ret:0 I85B3EA40 Direct3DViewport::SetViewport
   ret:0 I85B3A080 Direct3DDevice::CreateExecuteBuffer size:3CF0 I85B3EAE0


     记录文件的每一行代表一次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的游戏,将出现错误。

为何有的函数记录了参数,而另一些没有记录参数?

     这个工具是本人边用边做,用到一部分,就写一部分。记录了参数的那些函数是过去所汉化的游戏中调用过了的。请关注本工具的升级情况,不久以后,就会有记录多数函数参数的版本完成。


发布历史

  1.1 - 2001.3.30

     将 dll 注入到目标进程的时间修改为进程创建时。

  1.0 - 2002.3.25

     首次发布。


请将您的需求、建议和意见告诉我们,谢谢!