HOOK DirectDraw 后 如何画图写屏...

qq410423092 2011-07-24 06:10:17
利用程序优先加载本地DLL,写了个伪ddraw 然后拦截了DirectDrawCreate 获得了虚拟函数表 地址 也已经继承了

所有虚拟表函数都会被拦截到,因为自己不了解DDraw的相关知识,所以请教会的人。

是一款3D游戏,正如上面说的,都拦截到了,自己也翻遍了百度关于这类问题的,弄了几天还是没显示出来


HRESULT WINAPI InitInterface(GUID FAR *lpGUID, LPDIRECTDRAW *lplpDD, IUnknown FAR *pUnkOuter)
{
HRESULT hResult = -1;


HINSTANCE gl_hOriginalDll = LoadLibraryA("origddraw.dll");

if (gl_hOriginalDll)
{
FARPROC pProcAddr = GetProcAddress(gl_hOriginalDll,"DirectDrawCreate");
__asm
{
push pUnkOuter
push lplpDD
push lpGUID
Call [pProcAddr]
mov hResult,eax
}
}

return hResult;
}


/* HOOK */
void WINAPI TDirectDraw(void **ppvObj )
{
g_pDirectDraw = new proxyIDirectDraw((LPDIRECTDRAW4)*ppvObj);
*ppvObj = (void*) g_pDirectDraw;
}




HRESULT __stdcall proxyIDirectDraw::CreateSurface( LPDDSURFACEDESC2 lpDDSurfaceDesc2,LPDIRECTDRAWSURFACE4 FAR* lplpDDSurface,IUnknown FAR* pUnkOuter )
{
HRESULT hResult = origIDirectDraw->CreateSurface(lpDDSurfaceDesc2,lplpDDSurface,pUnkOuter);
if(lpDDSurfaceDesc2->ddsCaps.dwCaps== 0x200)//主表面
{
HDC hdc;
g_lpDDSPrimary = *lplpDDSurface;
g_lpDDSPrimary->GetDC(&hdc);
SetBkColor(hdc,0);
SetTextColor(hdc,RGB(255,255,1));
TextOutA(hdc,0,0, "写屏....",8);
g_lpDDSPrimary->ReleaseDC(hdc);
}
}


上面代码,只显示一次,而且是在桌面的。如果去掉主表面判断

在游戏内 不同地方 出都显示出“写屏”并且不会闪烁。

主要是想在游戏内写字,画图,不闪烁就满足了,怎么实现呢?

以下是找的资料
http://topic.csdn.net/u/20081226/14/f7aa1161-988a-4b7e-a5a3-c862e56fc92a.html
http://topic.csdn.net/t/20021214/18/1260983.html
http://blog.csdn.net/harry330/article/details/5299065


...全文
390 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjj67868236 2012-07-14
  • 打赏
  • 举报
回复
楼主,你的问题解决了吧,我也想实现相应的功能
向立天 2011-08-13
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
qq410423092 2011-07-24
  • 打赏
  • 举报
回复
发错地方了嘛,怎么没人。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧