带有BaseAddres的VirtualQueryEx从0开始

时间:2014-04-26 02:39:54

标签: c++ c

我正在尝试保留有关我流程中所有区域的信息。为此我正在使用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时,因为它表示我已到达该进程的页面末尾。

1 个答案:

答案 0 :(得分:0)

我看了这个,这很有趣,但并不令人惊讶。随着可执行文件的加载,它会为自己创建内存部分。一些用于包含可执行代码,另一些用于加载全局数据元素,另一些用于为malloc提供一些起始地址空间。有一些部分允许可执行文件创建向其他DLL的向量。这些只是调用外部函数的地址区域,而不是程序的可执行代码的一部分。

查看每个区域的mem-> State字段 - 特别是mem-> State == MEM_COMMIT区域。它们描述了这些地址空间的可访问性。此外,任何区域都不是真正的物理内存,而是在程序需要时留出虚拟地址空间。

不要被地区数量所淹没。所有这些都没有真正描述应用程序的新物理空间,而是可以由应用程序使用的虚拟地址集。