BaseAddres从0开始的VirtualQueryEx

VirtualQueryEx with BaseAddres starting at 0

本文关键字:VirtualQueryEx 开始 BaseAddres      更新时间:2023-10-16

我正在努力保留流程中所有区域的信息。为此,我使用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 ---ntGETLASTERROR = %un"), GetLastError());
    _tprintf(_T("Prima qualquer tecla para terminarn"));
    getchar();
    return 0;
}

`:

springRegion只是访问结构和打印结果。

在VirtualQueryEx的第一次执行中,addr是0,因此它应该转到当前进程的基地址,但它总是显示mem。BaseAddress为0,我很确定它是正确的,或者只是没有达到我的预期。此外,这个周期要经过太多的区域,以至于它不适合Visual Studio的控制台,我几乎可以肯定,当唯一被验证的进程是当前进程时,它不应该这样做。

有人知道为什么会发生这种情况或如何解决吗?

编辑:

当这段时间结束并且我正在检查GetLastError时,它总是显示为ERROR_INVALID_PARAMETER,而它应该是ERROR_BAD_LENGTH,因为它表明我已经到达了该进程的页面末尾。

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

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

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