//老版本的GetAttachedSurface 这个是绑定缓存页面到主页面的函数
DefHookDApi(GetAttachedSurface,HRESULT,(GUID FAR *lpGUID,LPDDSCAPS lpddscap,
LPDIRECTDRAWSURFACE FAR * lpdds))
{
//MessageBox(0,"CreateSurface123","Debug",MB_OK);
//这里是得到游戏的缓存页面
HRESULT ret=Real_GetAttachedSurface(lpGUID,lpddscap,lpdds);
//保存缓存页面
lpDDSB=*lpdds;
return ret;
}//老版本的CreateSurface 这个是创建页面函数
DefHookDApi(CreateSurface,HRESULT,(GUID FAR *lpGUID,LPDDSURFACEDESC lpddsd,
LPDIRECTDRAWSURFACE FAR * lpdds,IUnknown FAR * pUnkOuter))
{
PROC p=NULL;
HRESULT ret=Real_CreateSurface(lpGUID,lpddsd,lpdds,pUnkOuter);
//判断页面是否是主页面
if(lpddsd->ddsCaps.dwCaps&DDSCAPS_PRIMARYSURFACE) 
{
//保存主页面
lpDDSP=*lpdds; //替换Blt函数
p=*(PROC*)(*((DWORD*)lpDDSP)+0x14);
HookDApi(Blt,p); if(lpddsd->dwFlags&DDSD_BACKBUFFERCOUNT)
{
p=*(PROC*)(*((DWORD*)lpDDSP)+0x30);
HookDApi(GetAttachedSurface,p);
//替换Flip函数 p=*(PROC*)(*((DWORD*)lpDDSP)+0x2c);
HookDApi(Flip,p);
} }
//判断页面是否是离屏页面
if(lpddsd->ddsCaps.dwCaps&DDSCAPS_OFFSCREENPLAIN)
{

}
return ret;
}***********************************************************
上面是某个网友的部份程序代码
主要目的是可以在拦截DirectX上的函数
例如可以在Directx的游戏上写字.
可是我发现这个程序只能在系统测试DX的dxdiag上写字?
问题似乎在这
if(lpddsd->dwFlags&DDSD_BACKBUFFERCOUNT)
{
p=*(PROC*)(*((DWORD*)lpDDSP)+0x30);
HookDApi(GetAttachedSurface,p);
//替换Flip函数
p=*(PROC*)(*((DWORD*)lpDDSP)+0x2c);
HookDApi(Flip,p);
}上面的p指针的地址错误?
所以拦截不到GetAttachedSurface????
我不明了那个p=*(PROC*)(*((DWORD*)lpDDSP)+0x30);是什么意思
lpDDSP的宣告是LPDIRECTDRAWSURFACE lpDDSP=NULL;如果我要在其它游戏上写字
这个p要怎么改呢?请告诉我一个方向吧
以经痛苦3天了,还是想不到为什么.
或是要去怎么找那个p的地址 感激不尽
转贴原程序代码在这
请原作者不要生气
http://bbs.gameres.com/upload/sf_2004610205324.rar明确解惑者给200分吧  

解决方案 »

  1.   

    p=*(PROC*)(*((DWORD*)lpDDSP)+0x30);
    是偏移量。看看LPDIRECTDRAWSURFACE 的定义就知道了,函数GetAttachedSurface位于0x0C的偏移位置。
    所以,用0x0C*4=0x30了。用这种方法的话针对由当时的CreateSurface函数创建的LPDIRECTDRAWSURFACE 才有效。
    如果在游戏中是通过其他方式得到的LPDIRECTDRAWSURFACE ,那么就无法进行Hook。
    由于你不知道在这个游戏中是如何得到LPDIRECTDRAWSURFACE,所以不能保证你能Hook。
      

  2.   

    p=*(PROC*)(*((DWORD*)lpDDSP)+0x30);是什么意思
    求偏移地址吧
      

  3.   

    当然是求偏移地址,实际上就是得到GetAttachedSurface函数的地址。
    把lpDDSP看成一个数组,基地址根本不一样不要紧,这个数组的内容一样
    就可以了。另外,这种方法的功能非常有限,放弃吧。