我正在尝试保留有关我流程中所有区域的信息。为此我正在使用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.BaseAddress显示为0,我很确定它是正确的,或者只是不做我做的事情我期待着。循环也经历了很多区域,它不适合Visual Studio的控制台,再次,我几乎可以肯定,当唯一被验证的进程是当前进程时,它不应该这样做。
有谁知道为什么会发生这种情况或如何解决它?
编辑:
当while结束并且我正在检查GetLastError时,它显示为ERROR_INVALID_PARAMETER,当它预期为ERROD_BAD_LENGTH时,因为它表示我已到达该进程的页面末尾。
答案 0 :(得分:0)
我看了这个,这很有趣,但并不令人惊讶。随着可执行文件的加载,它会为自己创建内存部分。一些用于包含可执行代码,另一些用于加载全局数据元素,另一些用于为malloc提供一些起始地址空间。有一些部分允许可执行文件创建向其他DLL的向量。这些只是调用外部函数的地址区域,而不是程序的可执行代码的一部分。
查看每个区域的mem-> State字段 - 特别是mem-> State == MEM_COMMIT区域。它们描述了这些地址空间的可访问性。此外,任何区域都不是真正的物理内存,而是在程序需要时留出虚拟地址空间。
不要被地区数量所淹没。所有这些都没有真正描述应用程序的新物理空间,而是可以由应用程序使用的虚拟地址集。