您现在的位置: IT专家网 > WinSystem子站 > 技巧
XP两种工具在代码中检测并堵塞 GDI 泄漏
Windows 需要一种不太相同的 GDI 泄漏方法,他构建并说明了两种工具,这两种工具旨在检测并消除在 Windows XP、Windows 2000 和 Windows NT 上运行的应用程序中的 GDI 泄漏。
在该特例中,包含所有已修补函数地址的列表应是 initial@。

图 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() |
第二步通过下列宏实现每个静态成员,作为挂钩系统函数地址的别名:
| DEFINE_API_REFLECT(CGDIReflect, GetDC); |
| CGDIReflect::GetDCProc CGDIReflect::__GetDC = 0; |
- 本文关键词:
- API
- IT技术
- Windows
- Windows XP
- 操作系统

