我试图保留我的进程中所有地区的信息。为此,我使用VirtualQueryEx。我的主菜在哪`
int _tmain(int argc, _TCHAR* argv[])
{
MEMORY_BASIC_INFORMATION mem;
unsigned long addr = 0;
while (VirtualQueryEx(GetCurrentProcess(), (PVOID)addr, &mem, sizeof(mem))) {
addr = (unsigned long)mem.BaseAddress + mem.RegionSize;
printRegionInfo(mem);
}
if (GetLastError() == ERROR_BAD_LENGTH)
_tprintf(_T("--- Reading SUCESSFULL ---\n"));
else
_tprintf(_T("--- ERROR: Read stopped ---\n\tGETLASTERROR = %u\n"), GetLastError());
_tprintf(_T("Prima qualquer tecla para terminar\n"));
getchar();
return 0;
}
`:
pringRegion只是访问结构并打印结果。
在VirtualQueryEx的第一次执行中,addr是0,因此它应该转到当前进程的基址,但它总是将mem.base address显示为0,我非常确定它是正确的,或者只是没有按我的预期执行。此外,这个周期经历了太多的区域,以至于它不适合Visual Studio的控制台,这一次,我几乎可以肯定,当唯一被验证的进程是当前进程时,它不应该这样做。
有人知道为什么会发生这样的事情或者怎么解决吗?
编辑:
当while结束时,我正在检查它,它总是显示为不可预测的,因为它预示着我到达了该过程的页面结束。
最佳答案
我看了这个,它很有趣,但并不奇怪。当可执行文件加载时,它会为自己创建内存段。有的包含可执行代码,有的加载全局数据元素,还有的为malloc提供一些起始地址空间。有些部分允许可执行文件创建矢量到其他dll中。这些只是调用外部函数的地址区域,并不是程序可执行代码的一部分。
查看每个区域的mem->State字段—特别是mem->State==mem_COMMIT区域。它们描述了这些地址空间的可访问性。此外,任何区域都不是真正的物理内存,而是为程序需要而预留的虚拟地址空间。
不要被地区的数量压得喘不过气来。它们并不是真正为应用程序描述新的物理空间,而是可以由应用程序使用的虚拟地址集。
关于c++ - VirtualQueryEx,BaseAddres从0开始,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23305987/