自己学习时写的一个小工具,参考核心编程,做了简化。

说明

系统用虚拟内存主要基于两个考虑:
1.各进程独立地址空间
2.可指定页面安全属性
这里使用函数VirtualQueryEx遍历进程空间区域,打印每块区域的详细信息

当前机器内存状态可使用GlobalMemoryStatusEx获得,注意分配每个区域的基址对齐到分配粒度,区域大小对齐到页面大小,分配粒度和页面大小可使用GetNativeSystemInfo函数获取。
如果要遍历每个区域中的块,需要多次调用VirtualQueryEx测试区域中不同地址处的AllocateBase是否改变,这一点可参考核心编程第14章。

核心代码

//遍历指定进程Mem
LRESULT OnViewMap(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    BOOL bOk                        = TRUE;
    PVOID pvAddress                 = 0x0;
    MEMORY_BASIC_INFORMATION mbi    = {0};
 
    HANDLE hProcess = GetCurrentProcess();
    while (TRUE)
    {
        bOk = sizeof(mbi)==VirtualQueryEx(hProcess, pvAddress, &mbi, sizeof(mbi));
        if (!bOk)
        {
            break;
        }
 
        CString strLine;
        WCHAR szProtect[20] = {0};
        GetProtectText(mbi.Protect, szProtect, 19, TRUE);
        strLine.Format(L"Base:0x%08x  Size:0x%08x  Protect:%19s  State:%10s  Type:%10s  File:%s", 
                       mbi.BaseAddress, 
                       mbi.RegionSize,
                       szProtect,
                       GetMemStorageText(mbi.State),
                       GetMemStorageText(mbi.Type),
                       GetFilename(&mbi).GetBuffer(0));
        m_view.InsertString(-1, strLine);
 
        pvAddress = (PBYTE)mbi.BaseAddress + mbi.RegionSize;
    }
 
    return 0;
}

下载

源码下载链接