PoEdu培训 Windows班 第四十五课 Windows 内存(四) 虚拟内存页面区块
文章类别: 培训笔记 0 评论

PoEdu培训 Windows班 第四十五课 Windows 内存(四) 虚拟内存页面区块

文章类别: 培训笔记 0 评论

Windows 内存(四) 虚拟内存页面区块

虚拟内存页面区属性

SIZE_T WINAPI VirtualQueryEx(
  _In_     HANDLE                    hProcess,
  _In_opt_ LPCVOID                   lpAddress,
  _Out_    PMEMORY_BASIC_INFORMATION lpBuffer,
  _In_     SIZE_T                    dwLength
);

来看一下MEMORY_BASIC_INFORMATION结构体

typedef struct _MEMORY_BASIC_INFORMATION {
  PVOID  BaseAddress;
  PVOID  AllocationBase;
  DWORD  AllocationProtect;
  SIZE_T RegionSize;
  DWORD  State;
  DWORD  Protect;
  DWORD  Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
状态 解释
<dl> <dt> <span style="font-weight:bold">MEM_COMMIT</span></dt> <dt>0x1000</dt></dl> <p>表示已分配物理存储的已提交的页面, 位于内存中或磁盘上的页面文件中. <br/>这个值表示内存被使用了</p>
<dl> <dt> <span style="font-weight:bold">MEM_FREE</span></dt> <dt>0x10000</dt></dl> <p>表示空闲的内存, 可以被分配. <br/> 空闲的内存, 它们的 <span style="font-weight:bold">AllocationBase</span>, <span style="font-weight:bold">AllocationProtect</span>, <span style="font-weight:bold">Protect</span>, 和 <span style="font-weight:bold">Type</span> 成员的信息没有定义.</p>
<dl> <dt> <span style="font-weight:bold">MEM_RESERVE</span></dt> <dt>0x2000</dt></dl> <p>进程中保留的内存空间, 它的 <span style="font-weight:bold">Protect</span> 成员信息没有被定义.</p>
类型 解释
<dl> <dt> <span style="font-weight:bold">MEM_IMAGE</span></dt> <dt>0x1000000</dt></dl> <p>表示这个区域内是映射的可执行文件的区域.</p>
<dl> <dt> <span style="font-weight:bold">MEM_MAPPED</span></dt> <dt>0x40000</dt></dl> <p>表示这个区域内是映射的区域.</p>
<dl> <dt> <span style="font-weight:bold">MEM_PRIVATE</span></dt> <dt>0x20000</dt></dl> <p>表示区域内的内存页面是私有的(即不被其他进程共享).</p>

例子

#include <windows.h>
#include <TCHAR.H>

BOOL ShowProcMemInfo(DWORD dwPID);

int _tmain(int argc, char* argv[])
{
    ShowProcMemInfo(GetCurrentProcessId());
    return 0;
}

BOOL ShowProcMemInfo(DWORD dwPID)
{
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
        FALSE,
        dwPID);
    if (hProcess == NULL)
        return FALSE;
    MEMORY_BASIC_INFORMATION mbi;
    PBYTE pAddress = NULL;
    TCHAR szInfo[200] = _T("BaseAddr Size Type State Protect \n");
    _tprintf(szInfo);
    while (TRUE)
    {
        if (VirtualQueryEx(hProcess, pAddress, &mbi, sizeof(mbi)) != sizeof(mbi))
        {
            break;
        }
        if ((mbi.AllocationBase != mbi.BaseAddress) && (mbi.State != MEM_FREE))
        {
            _stprintf(szInfo, _T(" %08X %8dK "),
                mbi.BaseAddress,
                mbi.RegionSize >> 10);
        }
        else
        {
            _stprintf(szInfo, _T("%08X %8dK "),
                mbi.BaseAddress,
                mbi.RegionSize >> 10);
        }
        LPCTSTR pStr = _T("");
        switch (mbi.Type)
        {
        case MEM_IMAGE: pStr = _T("MEM_IMAGE "); break;
        case MEM_MAPPED: pStr = _T("MEM_MAPPED "); break;
        case MEM_PRIVATE: pStr = _T("MEM_PRIVATE"); break;
        default: pStr = _T("-----------"); break;
        }
        _tcscat(szInfo, pStr);
        _tcscat(szInfo, _T(" "));
        switch (mbi.State)
        {
        case MEM_COMMIT: pStr = _T("MEM_COMMIT "); break;
        case MEM_RESERVE: pStr = _T("MEM_RESERVE"); break;
        case MEM_FREE: pStr = _T("MEM_FREE "); break;
        default: pStr = _T("-----------"); break;
        }
        _tcscat(szInfo, pStr);
        _tcscat(szInfo, _T(" "));
        switch (mbi.AllocationProtect)
        {
        case PAGE_READONLY: pStr = _T("PAGE_READONLY "); break;
        case PAGE_READWRITE: pStr = _T("PAGE_READWRITE "); break;
        case PAGE_WRITECOPY: pStr = _T("PAGE_WRITECOPY "); break;
        case PAGE_EXECUTE: pStr = _T("PAGE_EXECUTE "); break;
        case PAGE_EXECUTE_READ: pStr = _T("PAGE_EXECUTE_READ "); break;
        case PAGE_EXECUTE_READWRITE: pStr = _T("PAGE_EXECUTE_READWRITE"); break;
        case PAGE_EXECUTE_WRITECOPY: pStr = _T("PAGE_EXECUTE_WRITECOPY"); break;
        case PAGE_GUARD: pStr = _T("PAGE_GUARD "); break;
        case PAGE_NOACCESS: pStr = _T("PAGE_NOACCESS "); break;
        case PAGE_NOCACHE: pStr = _T("PAGE_NOCACHE "); break;
        default: pStr = _T("----------------------"); break;
        }
        _tcscat(szInfo, pStr);
        _tcscat(szInfo, _T("\n"));
        _tprintf(szInfo);
        pAddress = ((PBYTE)mbi.BaseAddress + mbi.RegionSize);
    }
    CloseHandle(hProcess);
    return TRUE;
}

未完待续...

如有错误,请提出指正!谢谢.

回复