首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

DLL文件整个内存里只有一份?该怎么处理

2012-02-13 
DLL文件整个内存里只有一份??对于DLL,书上是这么说的:  “它们有助于节省内存。如果两个或多个应用程序使用

DLL文件整个内存里只有一份??
对于DLL,书上是这么说的:

  “它们有助于节省内存。如果两个或多个应用程序使用同一个D   L   L,那么该D   L   L的页面只要放入R   A   M一次,所有的应用程序都可以共享它的各个页面。”
                         -摘自《windows核心编程》

  但是实际操作中,却有些疑问:
  我用APIHook时,必须针对每个我感兴趣的进程、对我感兴趣的API进行hook,而若果按照书中的说法,实际上我只需要对我感兴趣的API进行一次Hook就好了,跟进程无关。

  这么看起来,实际与书中的说法似乎有些矛盾。琢磨了半天,只想出一个可能性:copy-on-write机制(具体的机制《windows核心编程》里也有详细的说明)。

  So,自己动手写了个修改Ntdll.dll代码段的DLL,代码如下:
/*
  WriteCopy_Test.cpp
*/
#include   <windows.h>

    BOOL   WINAPI   DllMain(
        HINSTANCE   hinstDLL,     //   handle   to   the   DLL   module
        DWORD   fdwReason,           //   reason   for   calling   function
        LPVOID   lpvReserved       //   reserved
)
{
        if   (DLL_PROCESS_ATTACH   ==   fdwReason)
        {
                unsigned   char   ucBuf[1]   =   {0};
                HMODULE   hModule   =   GetModuleHandle( "ntdll.dll ");

                typedef   VOID   (NTAPI   *_DbgBreakPoint)(VOID);
                _DbgBreakPoint   DbgBreakPoint   =   (_DbgBreakPoint)GetProcAddress(hModule,   "DbgBreakPoint ");
                memcpy(&ucBuf,   DbgBreakPoint,   1);
                DWORD   dwOldProtect   =   0;
                VirtualProtect(DbgBreakPoint,   1,   PAGE_EXECUTE_READWRITE,   &dwOldProtect);
                memcpy(DbgBreakPoint,   &ucBuf,   1);
        }
  //为了省内存,避免干扰,干脆连DLL_PROCESS_DETACH部分的代码也省略了
}

  我机子上的NtDll.dll文件大小为578KB,启动了一个基本上什么事都不干的小程序,该程序初始占用内存442KB。
  将上面的WriteCopy_Test.dll注入该程序,发现内存占用达到1524KB。

  测试的结果让我很迷惑,测试前后内存占用相差约1MB,除去NtDLL.dll的代码体积和一些WriteCopy.dll、注入程序申请的少许内存(不到1KB),还有500K去哪了?
是不是我分析的有问题?疑惑中。

[解决办法]
MagicMoon,向你学习,我也埋头真正钻研一下,赶下时髦,平生头一次写Blog,我的实验报告:

http://blog.csdn.net/feimingbiao/archive/2007/08/10/1736371.aspx

我觉得可以定论了,你不满意我们再研究。

热点排行