CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

您现在的位置: IT专家网 > WinSystem子站 > 技巧

XP两种工具在代码中检测并堵塞 GDI 泄漏

作者: Christophe Nasarre ,  出处:微软, 责任编辑: 韩博颖, 
2008-05-20 13:13
  Windows 需要一种不太相同的 GDI 泄漏方法,他构建并说明了两种工具,这两种工具旨在检测并消除在 Windows XP、Windows 2000 和 Windows NT 上运行的应用程序中的 GDI 泄漏。

  在该特例中,包含所有已修补函数地址的列表应是 initial@。

  对 GetDC 修补调用的内存布局

  图 3 对 GetDC 修补调用的内存布局

  除了列出的每个函数调用外,用同一机制来挂钩自由的 GDI 对象的函数。 有了这两种类型的通知,您就有可能跟踪运行的活动 GDI 对象。

  CGDIReflect 类负责提供静态的存根方法,这些方法将替代系统函数被调用。该类派生于 CAPIReflect,其主要目标是利用宏将给定模块的函数调用重新定向到静态类成员中。这种替换是通过对 DoReflect 的调用来完成的,DoReflect 接受调用方模块句柄作为参数。派生类的作用就是将您有兴趣接收有关信息的每个系统函数映射到适当的存根函数,本文后面的部分将对此进行讨论。

  遵循消息映射机制,定义了一组宏来帮助您自动定义并声明存根函数。在 /P 编译器选项的帮助下,可获得每个包含所有扩展宏代码的源文件的 .i file。您需要观察结果文件的大小,该结果文件可能很大,但这种方法准确地显示了哪些代码被执行,您将在本文后面的图和源代码中看到。

  从 USER 和 GDI 重定向函数需要三步,稍后我将对这三步进行概述。使用同一示例,我将讲述如何修补 user.dll 中的 GetDC。

  第一步是利用 DECLARE_REFLECT_APIxxx 宏声明 CGDIReflect 中的静态变量,其中 xxx 表示该函数的参数数量(GetDC 有 1个,它接受 HWND 作为参数)。该声明用 BEGIN_REFLECT_LIST 和 END_REFLECT_LIST 框起来,前者定义了一个隐藏的、提供跟踪服务的 TraceReflectCall helper 方法,后者没起什么作用:

  

      BEGIN_REFLECT_LIST()
  DECLARE_REFLECT_API1(GetDC, HDC, HWND, hWnd)
  END_REFLECT_LIST()
  但是,DECLARE_REFLECT_API 宏需要提供系统函数名、其返回类型及其参数列表(类型和名称)。提供这些信息允许将宏扩展到 CGDIReflect(实际上是个存根)的静态方法中,该方法共享同一原型并执行下列步骤。首先,通过别名调用初始的系统函数(后来由DEFINE_API_REFLECT 实例化)。之后,由前一调用分配的句柄及其类型被存储到一个 CHandleInfo 结构中,这是供将来使用的一些额外数据(参见下一部分有关 DoStackAddressDump 的讨论)。最后,CGDIReflect 的静态映射成员被更新,从而用前面讲到的结构来与新分配的句柄以及想俘获的创建对象相关联。

  第二步通过下列宏实现每个静态成员,作为挂钩系统函数地址的别名:

  

DEFINE_API_REFLECT(CGDIReflect, GetDC);
  在我的示例中,宏可扩展到:

  

CGDIReflect::GetDCProc CGDIReflect::__GetDC = 0;
  在第三步和最后一步,需要实例化所有这些成员,然后在执行时使用。在这两种情况下都要调用 FillStubs 方法。首先,将 APIR STATE INIT 作为参数,由 Init调用 FillStubs,并且没有模块句柄要修补。这在利用 GetProcAddress 计算系统函数的地址时发生,然后地址存储在别名成员(对于 __GetDC 为 GetDC)中。
?10?? 9 1 2 3 4 5 6 7 8 9 :

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅

天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2008, Ctocio.com.cn
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i