//老版本的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分吧
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分吧
解决方案 »
- 关于控件中右键菜单的问题
- 请问各位大侠如何将24位位图转换为16色或者256色,谢谢,郁闷好久了。麻烦帮忙啊。
- 如何在VC中调用DLL
- 要疯掉了,有帮帮忙的吗?
- 真的不好意思,要麻烦大家,现在学习很吃力,都不知道如何下手
- 请问chs格式的文件用什么打开?
- 很简单的问题,怎么用button改变skin!
- CFileDialog问题,急啊!!!
- 每次向控件高效的添加信息,而不是setwindowtext
- 小的有分相送,只求带我入DDK之门,宁愿倾家荡产
- 有苏州或上海软件公司愿意带我毕业设计吗
- 又一疑惑:今天刚安装了vcsp5,竟然我的程序编译通过,但是无法运行,一运行就出现运行错误!!!估计是BCG搞得鬼,怎么办呢?!
是偏移量。看看LPDIRECTDRAWSURFACE 的定义就知道了,函数GetAttachedSurface位于0x0C的偏移位置。
所以,用0x0C*4=0x30了。用这种方法的话针对由当时的CreateSurface函数创建的LPDIRECTDRAWSURFACE 才有效。
如果在游戏中是通过其他方式得到的LPDIRECTDRAWSURFACE ,那么就无法进行Hook。
由于你不知道在这个游戏中是如何得到LPDIRECTDRAWSURFACE,所以不能保证你能Hook。
求偏移地址吧
把lpDDSP看成一个数组,基地址根本不一样不要紧,这个数组的内容一样
就可以了。另外,这种方法的功能非常有限,放弃吧。