#include "private.h" #include #ifdef __cplusplus #define CPPMOD extern "C" #else #define CPPMOD #endif #define DECLARE_API(s) \ CPPMOD VOID \ s( \ HANDLE hCurrentProcess, \ HANDLE hCurrentThread, \ DWORD dwCurrentPc, \ PNTSD_EXTENSION_APIS lpExtensionApis, \ LPSTR lpArgumentString \ ) #define INIT_API() { \ ExtensionApis = *lpExtensionApis; \ ExtensionCurrentProcess = hCurrentProcess; \ } #define dprintf (ExtensionApis.lpOutputRoutine) #define GetExpression (ExtensionApis.lpGetExpressionRoutine) #define GetSymbol (ExtensionApis.lpGetSymbolRoutine) #define Disassm (ExtensionApis.lpDisasmRoutine) #define CheckControlC (ExtensionApis.lpCheckControlCRoutine) #define ReadMemory(a,b,c,d) ReadProcessMemory( ExtensionCurrentProcess, (LPCVOID)(a), (b), (c), (d) ) #define WriteMemory(a,b,c,d) WriteProcessMemory( ExtensionCurrentProcess, (LPVOID)(a), (LPVOID)(b), (c), (d) ) NTSD_EXTENSION_APIS ExtensionApis; HANDLE ExtensionCurrentProcess; #ifdef IMAGEHLP_HEAP_DEBUG DECLARE_API( allocs ) { PLIST_ENTRY Next; HEAP_BLOCK HeapBlock; ULONG Address; ULONG r; ULONG cb; LIST_ENTRY LocalHeapHeader; ULONG LocalTotalAllocs; ULONG LocalTotalMemory; HANDLE LocalhHeap; INIT_API(); Address = GetExpression("imagehlp!TotalAllocs"); r = ReadMemory(Address, &LocalTotalAllocs, sizeof(LocalTotalAllocs), &cb ); if (!r || cb != sizeof(LocalTotalAllocs)) { dprintf("*** TotalAllocs unreadable\n"); return; } Address = GetExpression("imagehlp!TotalMemory"); r = ReadMemory(Address, &LocalTotalMemory, sizeof(LocalTotalMemory), &cb ); if (!r || cb != sizeof(LocalTotalMemory)) { dprintf("*** TotalMemory unreadable\n"); return; } Address = GetExpression("imagehlp!hHeap"); r = ReadMemory(Address, &LocalhHeap, sizeof(LocalhHeap), &cb ); if (!r || cb != sizeof(LocalhHeap)) { dprintf("*** hHeap unreadable\n"); return; } Address = GetExpression("imagehlp!HeapHeader"); r = ReadMemory(Address, &LocalHeapHeader, sizeof(LocalHeapHeader), &cb ); if (!r || cb != sizeof(LocalHeapHeader)) { dprintf("*** HeapHeader unreadable\n"); return; } Next = LocalHeapHeader.Flink; if (!Next) { return; } dprintf( "-----------------------------------------------------------------------------\n" ); dprintf( "Memory Allocations for Heap 0x%08x, Allocs=%d, TotalMem=%d\n", LocalhHeap, LocalTotalAllocs, LocalTotalMemory ); dprintf( "-----------------------------------------------------------------------------\n" ); dprintf( "*\n" ); while ((ULONG)Next != Address) { r = ReadMemory( CONTAINING_RECORD( Next, HEAP_BLOCK, ListEntry ), &HeapBlock, sizeof(HeapBlock), &cb ); if (!r || cb != sizeof(HeapBlock)) { dprintf("*** list broken\n"); return; } Next = HeapBlock.ListEntry.Flink; dprintf( "%8d %16s @ %5d\n", HeapBlock.Size, HeapBlock.File, HeapBlock.Line ); } return; } #endif