You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
4.0 KiB
127 lines
4.0 KiB
#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
|