- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
#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());
}
} |
|