问题一: 本人在使用OpenProcess时得到的hProcess的值是按照4递增的,就算对同个pid调用也是这样,所以觉的OpenProcess取得的句柄是及时生成的而不是固定的值,是不是这样?
问题二:根据资料用 VirtualQueryEx 循环从0地址扫描内存,然后在上一次的循环后在
初地址上加上RegionSize再进行扫描:
DWORD ret=1;
DWORD add=0;
MEMORY_BASIC_INFORMATION mbi;while(ret)
{

ret=::VirtualQueryEx(hProcess,(LPCVOID)add,&mbi,
                                  sizeof (::MEMORY_BASIC_INFORMATION));
add+=mbi.RegionSize;
}
发现变量add 的值由小变大再变小,知道是不够放的下累计的地址的值,就觉得奇怪,难道Windows不是32位地址吗?还是有其他用法!到底应该怎么扫描??
  小弟用VB多时,现在改学VC,望各位高手指教。

解决方案 »

  1.   

    内存空间实际上是连续的,是按照区域和块来进行分配的。
    VirtualQueryEx返回的mbi里面,BaseAddress表示给定的地址所在的区域首址,
    AllocationBase表示给定的地址所在的块的首址,一个区域包含若干个块,各区域是地址是连续的。块是保护属性相同的多个连续页组成的.
    下一个区域的首址=上一个区域的首址+上一个区域的大小
    区域的大小=区域各块的大小之和
    有了上述算法,不难编出编历一个进程地址空间的程序.