获取进程可读存储器的大小?

问题描述 投票:0回答:2

如何获取进程中所有可读存储器的范围?

VirtualQuery只允许我一次查询页面。

winapi memory
2个回答
1
投票

没有办法仅获取可读页面列表。您需要使用VirtualQuery遍历所有内存(从包含有效内存的最低地址开始)。您可以从MEMORY-BASIC_INFORMATION结构中读取RegionSize来知道要调用的基址。


0
投票

唯一的方法是遍历每个内存区域。

此代码将执行此操作,并输出每个区域的开始和结束地址:

    MEMORY_BASIC_INFORMATION meminfo;
    unsigned char* addr = 0;

    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());

    MEMORY_BASIC_INFORMATION mbi;

    while (VirtualQueryEx(hProc, addr, &mbi, sizeof(mbi)))
    {
        if (mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS)
        {
            std::cout << "base : 0x" << std::hex << mbi.BaseAddress << " end : 0x" << std::hex << (uintptr_t)mbi.BaseAddress + mbi.RegionSize << "\n";
        }
        addr += mbi.RegionSize;
    }
© www.soinside.com 2019 - 2024. All rights reserved.