windows-nt/Source/XPSP1/NT/base/tools/resmon/heapwalk.c
2020-09-26 16:20:57 +08:00

91 lines
2.7 KiB
C

#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
DWORD NumberOfHeaps;
HANDLE ProcessHeaps[ 64 ];
char MyBuffer[ 256 ];
int
_cdecl
main()
{
struct _heapinfo info;
PROCESS_HEAP_ENTRY Entry;
size_t i;
LPBYTE s;
info._pentry = NULL;
setvbuf( stdout, MyBuffer, _IOFBF, sizeof( MyBuffer ) );
_heapset( 0xAE );
while (_heapwalk( &info ) == _HEAPOK) {
printf( "%08x: %05x - %s", info._pentry, info._size, info._useflag ? "busy" : "free" );
if (info._useflag == _FREEENTRY) {
s = (LPBYTE)info._pentry;
for (i=0; i<info._size; i++) {
if (s[i] != 0xAE) {
printf( " *** free block invalid at offset %x [%x]", i, s[i] );
break;
}
}
}
printf( "\n" );
fflush( stdout );
}
printf( "*** end of heap ***\n\n" );
fflush( stdout );
NumberOfHeaps = GetProcessHeaps( 64, ProcessHeaps );
Entry.lpData = NULL;
for (i=0; i<NumberOfHeaps; i++) {
printf( "Heap[ %u ]: %x HeapCompact result: %lx\n",
i,
ProcessHeaps[ i ],
HeapCompact( ProcessHeaps[ i ], 0 )
);
while (HeapWalk( ProcessHeaps[ i ], &Entry )) {
if (Entry.wFlags & PROCESS_HEAP_REGION) {
printf( " %08x: %08x - Region(First: %08x Last: %08x Committed: %x Uncommitted: %08x)\n",
Entry.lpData, Entry.cbData,
Entry.Region.lpFirstBlock,
Entry.Region.lpLastBlock,
Entry.Region.dwCommittedSize,
Entry.Region.dwUnCommittedSize
);
}
else
if (Entry.wFlags & PROCESS_HEAP_UNCOMMITTED_RANGE) {
printf( " %08x: %08x - Uncommitted\n",
Entry.lpData, Entry.cbData
);
}
else
if (Entry.wFlags & PROCESS_HEAP_ENTRY_BUSY) {
printf( " %08x: %08x - Busy", Entry.lpData, Entry.cbData );
if (Entry.wFlags & PROCESS_HEAP_ENTRY_MOVEABLE) {
printf( " hMem: %08x", Entry.Block.hMem );
}
if (Entry.wFlags & PROCESS_HEAP_ENTRY_DDESHARE) {
printf( " DDE" );
}
printf( "\n" );
}
else {
printf( " %08x: %08x - Free\n", Entry.lpData, Entry.cbData );
}
fflush( stdout );
}
printf( "*** end of heap ***\n\n" );
fflush( stdout );
}
return 0;
}