看流星社区

 找回密码
 注册账号
查看: 1912|回复: 0

遍历当前进程所有内存列表[HeapAlloc|GlobalAlloc]

[复制链接]

该用户从未签到

发表于 2014-5-12 21:28:52 | 显示全部楼层 |阅读模式
#include <WinBase.h>
#include <malloc.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE  hPool =  HeapCreate(NULL,NULL,NULL);


srand(GetTickCount());


LPVOID  hMem =  NULL;
SIZE_T  hSize =  0;
for (int i=0;i<10;i++)
{
//随机分配内存大小
hSize =
i * (rand() & 0xFF) * 0x100;


hMem =
HeapAlloc(hPool,HEAP_ZERO_MEMORY,hSize);


MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(hMem, &mbi, sizeof(mbi));
printf("[%s] Address:0x%X
-> %X/%X
-> Size:%d/%d\n",__FUNCTION__,hMem,hPool,mbi.BaseAddress,HeapSize(hPool,0,hMem),hSize);
}

DWORD HeapNumber
= GetProcessHeaps(NULL,NULL);
PHANDLE  HeapList =  (PHANDLE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,HeapNumber);


HeapNumber  = GetProcessHeaps(HeapNumber,HeapList);


for (int i=0;i<HeapNumber;i++)
{
HANDLE  HeapInfo= HeapList[i];


BOOL HeapState=
HeapValidate(HeapInfo,NULL,NULL);


printf("[%s] %d/%d -> 0x%X State:%s\n",__FUNCTION__,HeapNumber,i,HeapInfo,(HeapState) ? "完整" : "错误");

if(!HeapState) continue;


PROCESS_HEAP_ENTRY HeapEntry;
HeapEntry.lpData
= NULL;


while(HeapWalk(HeapInfo,&HeapEntry))
{
if((HeapEntry.wFlags & PROCESS_HEAP_REGION) ==PROCESS_HEAP_REGION)
{
printf("区域:base:0x%X size:%d Region:%d, control size:%X Mem:0x%X\n", HeapEntry.lpData, HeapEntry.cbData, HeapEntry.iRegionIndex, HeapEntry.cbOverhead, HeapEntry.Block.hMem);
}else if((HeapEntry.wFlags & PROCESS_HEAP_UNCOMMITTED_RANGE) == PROCESS_HEAP_UNCOMMITTED_RANGE)
{
printf("未分配:base:0x%X size:%d Region:%d, control size:%X first:%8p last:%8p, UnCommit:%8x, Commit:%8x\n", HeapEntry.lpData, HeapEntry.cbData, HeapEntry.iRegionIndex,
HeapEntry.cbOverhead, HeapEntry.Region.lpFirstBlock, HeapEntry.Region.lpLastBlock, HeapEntry.Region.dwUnCommittedSize, HeapEntry.Region.dwCommittedSize);
}
else if((HeapEntry.wFlags & PROCESS_HEAP_ENTRY_BUSY) == PROCESS_HEAP_ENTRY_BUSY)
{
printf("忙碌:base:0x%X size:%d Region:%d control size:%X\n", HeapEntry.lpData, HeapEntry.cbData, HeapEntry.iRegionIndex, HeapEntry.cbOverhead);
}
else
{
printf("其它:base:0x%X size:%d Region:%d control size:%X, flag:%4x\n", HeapEntry.lpData, HeapEntry.cbData, HeapEntry.iRegionIndex, HeapEntry.cbOverhead, HeapEntry.wFlags);
}
}
HeapLock(HeapInfo);


//合并内存
printf("[%s] HeapCompact : %dn \n\n",__FUNCTION__,HeapCompact(HeapInfo,0));


HeapUnlock(HeapInfo);


while(HeapWalk(HeapInfo,&HeapEntry))
{
if((HeapEntry.wFlags & PROCESS_HEAP_REGION) ==PROCESS_HEAP_REGION)
{
//printf("区域:base:0x%X size:%d Region:%d, control size:%X Mem:0x%X\n", HeapEntry.lpData, HeapEntry.cbData, HeapEntry.iRegionIndex, HeapEntry.cbOverhead, HeapEntry.Block.hMem);
}else if((HeapEntry.wFlags & PROCESS_HEAP_UNCOMMITTED_RANGE) == PROCESS_HEAP_UNCOMMITTED_RANGE)
{
//printf("未分配:base:0x%X size:%d Region:%d, control size:%X first:%8p last:%8p, UnCommit:%8x, Commit:%8x\n", HeapEntry.lpData, HeapEntry.cbData, HeapEntry.iRegionIndex,
//HeapEntry.cbOverhead, HeapEntry.Region.lpFirstBlock, HeapEntry.Region.lpLastBlock, HeapEntry.Region.dwUnCommittedSize, HeapEntry.Region.dwCommittedSize);
}
else if((HeapEntry.wFlags & PROCESS_HEAP_ENTRY_BUSY) == PROCESS_HEAP_ENTRY_BUSY)
{
printf("忙碌:base:0x%X size:%d Region:%d control size:%X\n", HeapEntry.lpData, HeapEntry.cbData, HeapEntry.iRegionIndex, HeapEntry.cbOverhead);
}
else
{
//printf("其它:base:0x%X size:%d Region:%d control size:%X, flag:%4x\n", HeapEntry.lpData, HeapEntry.cbData, HeapEntry.iRegionIndex, HeapEntry.cbOverhead, HeapEntry.wFlags);
}
}
printf("[%s] --------------------------------------------------------%d\n\n",__FUNCTION__,GetLastError());
}
}
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-14 12:46

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表