65.9K
CodeProject 正在变化。 阅读更多。
Home

低碎片堆和函数拦截

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.50/5 (8投票s)

2004年1月15日

2分钟阅读

viewsIcon

43032

downloadIcon

330

如何通过拦截 HeapAlloc 实现低碎片堆。

引言

本文展示了如何在 Windows 2003 Server/ XP 和 Windows 2000 SP5 中实现低碎片堆。

我最初昨天发布了这篇文章,但后来发现了 Detours,所以重新发布了它。

背景

该项目使用了从 Detours 下载的 Detours 项目的源代码。我已经下载并将其重新打包成一个可以使用 IDE 构建的项目,而原始项目使用 NMake。

核心要素是 LFH.Dll 通过调用 SetLFH 加载。在处理过程中,附加的 DLL 修改了调用程序的代码,以拦截对 HeapAlloc 的调用,以便所有调用现在都由 LFH.Dll 的该函数版本处理。

我不会解释关于 Detours 的任何内容,因为您需要的一切都可以从上面的链接下载。

这个程序本身并不复杂,因为 Detours 执行了所有的核心工作。 LFH 只是维护一个堆句柄的链表,用于设置 LFH 的堆,并优化每个分配的内存块大小,使其为 8、16、32、64、128、512 的倍数。

Using the Code

stdafx.h 文件中包含头文件 allocator.h,并将 LFH.Lib 添加到链接器输入。提供了两个 TestHarness 示例程序。

// Set LFH on for this processes heap
SetLFH( GetProcessHeap(), true);

// Allocate using new allocators
pTest = new CTest;
//

结论

我预计这可以在 Windows 的早期版本(Win2K 之前)上工作,但我尚未测试。 如果您没有 Visual Studio 2003,则需要创建一个导出符号的 Windows DLL,并将 allocator.hallocator.cpp 复制到您新创建的项目中。您需要对 Detours 执行相同的操作,或使用来自 Microsoft 下载链接的源代码。

Detours 还打开了各种程序检测的可能性,因为它很容易拦截任何函数调用并生成诊断、跟踪、性能统计信息。

如果您发现任何错误,请告诉我(请友善地告知)。我的代码和别人的代码一样好……它也有错误……

历史

  • 2005 年 1 月 15 日 - 文章发布。
© . All rights reserved.