NT4/private/sdktools/imagehlp/dbgexts.c
2020-09-30 17:12:29 +02:00

128 lines
3.9 KiB
C

#include "private.h"
#include <ntsdexts.h>
#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