这个分数可能归我了,解释看你满意不?
1. Win32应用程序就是由一个个模块dll构成的,每次程序运行时,由loader装入组装成应用程序.所以说它是动态的,不过,每个模块装入的地址一般都是固定的
2. 这个地址由谁指定呢?在模块的export项中,把以loader在装入dll时,这些dll的指定的装入地址不会有冲突,loader就会把dll模块装入指定区域,否则loader必须重装入,并且修改其它模块的import项,这样,很耽误时间呀.
3. VC编译器生成的exe模块的输出地址:0x00400000
4. VC编译器生成的dll模块的输出地址:0x10000000
5. 系统dll的地址一般为:0x770000000
6. 每个编译器可以改变缺省输出地址,可以指定另外的一个输出装入地址
7. 想知道每个模块装入的起始地址及结束地址,可以用depends查看.
8. 在Debug运行下,也可以看到各模块动态装入的地址

解决方案 »

  1.   

    我觉得你可以用ToolHelp函数来枚举进程地址空间中的每一个模块,查看它们加载的地址。
      

  2.   

    到www.myvc.net 或www.easthot.net去看看,有你要的答案
      

  3.   

    WinMain()的第一个参数就是hIntance,它被叫做当前句柄,其实它就是你的.exe文件装入进程虚拟地址空间的起始地址。
      

  4.   

    http://nowcan.yeah.net
    我的作品里的进程列表。注:win9X下不能运行。
      

  5.   

    用VirtualQueryEx可以查询该进程所有使用的内存及其模式。
      

  6.   

    可能要用Vxd;
    #define DEVICE_MAIN
    #include "heap.h"
    Declare_Virtual_Device(HEAP)
    #undef DEVICE_MAINHeapVM::HeapVM(VMHANDLE hVM) : VVirtualMachine(hVM) {}HeapThread::HeapThread(THREADHANDLE hThread) : VThread(hThread) {}BOOL HeapDevice::OnSysDynamicDeviceInit()
    {
       PVOID plin=0;
       MEMHANDLE hMem=0;
       hMem=GetNulPageHandle();
       dout<<"NULL page Handle: "<<hMem<<endl;
       if(!(plin=HeapAllocate(100,HEAPZEROINIT)))
       {
        dout<<"HeapAllocate Error"<<endl;
        return FALSE;
       }
       dout<<"HeapAllocate Address: "<<(DWORD)plin<<endl;
       MEMORY_BASIC_INFORMATION mbi;
       memset(&mbi,0,sizeof(mbi));
       if(!(PageQuery((DWORD)plin,&mbi,sizeof(mbi))))
       {
          dout<<"PageQuery Error"<<endl;
          return FALSE;
       }
       Show_Mem_Info(&mbi);
       char *srcdata="123456789";
       char *desdata=0;
       memset(desdata,0,10);
       _asm
        {
          pushad
          mov eax,plin
          mov edi,eax
          mov eax,srcdata
          mov esi,eax
          mov ecx,10
          rep movsb
          mov eax,plin
          mov esi,eax
          mov eax,desdata
          mov edi,eax
          mov ecx,10
          rep movsb
          popad
        }
       dout<<"srcdata: "<<srcdata<<endl;
       dout<<"desdata: "<<desdata<<endl;
        if(!(HeapFree(plin,0)))
       {
        dout<<"HeapFree Error"<<endl;
        return FALSE;
       } 
    return TRUE;
    }void HeapDevice::Show_Mem_Info(PMEMORY_BASIC_INFORMATION mbi)
    {
       dout<<"Basic_Address: "<<mbi->mbi_BaseAddress<<endl;
       dout<<"AllocationBase: "<<mbi->mbi_AllocationBase<<endl;
       dout<<"AllocationProtect: ";
       Show_Info(mbi->mbi_AllocationProtect);
       dout<<"RegionSize: "<<mbi->mbi_RegionSize<<endl;
       dout<<"State: ";
       Show_Info(mbi->mbi_State);
       dout<<"Protect: ";
       Show_Info(mbi->mbi_Protect);
       dout<<"Type: ";
       Show_Info(mbi->mbi_Type);
    }void HeapDevice::Show_Info(DWORD info)
    {
       if(info&MEM_COMMIT) dout<<"Memory Commited"<<endl;
       if(info&MEM_FREE)   dout<<"Memory Free"<<endl;
       if(info&MEM_RESERVE) dout<<"Memory Reserve"<<endl;
       if(info&MEM_PRIVATE) dout<<"Memory Private"<<endl;
       if(info&PAGE_NOACCESS) dout<<"Memory NoAccess"<<endl;
       if(info&PAGE_READONLY) dout<<"Memory ReadOnly"<<endl;
       if(info&PAGE_READWRITE) dout<<"Memory ReadWrite"<<endl;
    }
    这是Vxd的查看系统那内存地址的代码!
      

  7.   

    vxd不适于nt/2k啊?
    有没有别的方法啊?