0

虚拟内存遍历小工具

发表者:wenzhou1219分类:杂货铺2017-09-07 13:29:41 阅读[454]

系统用虚拟内存主要基于两个考虑:

1.各进程独立地址空间

2.可指定页面安全属性

这里使用函数VirtualQueryEx遍历进程空间区域,打印每块区域的详细信息

核心代码如下:

	//遍历指定进程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;
	}

另外,当前机器内存状态可使用GlobalMemoryStatusEx获得,注意分配每个区域的基址对齐到分配粒度,区域大小对齐到页面大小,分配粒度和页面大小可使用GetNativeSystemInfo函数获取。

如果要遍历每个区域中的块,需要多次调用VirtualQueryEx测试区域中不同地址处的AllocateBase是否改变,这一点可参考核心编程第14章。


代码下载链接: https://pan.baidu.com/s/1eSEhgdk 密码: gnrt


名字:

个人主页地址:

E-mail:

评论列表