windows-nt/Source/XPSP1/NT/sdktools/debuggers/samples/simplext/exts.c
2020-09-26 16:20:57 +08:00

115 lines
2.6 KiB
C

/*-----------------------------------------------------------------------------
Copyright (c) 2000 Microsoft Corporation
Module:
exts.c
Sample old windbg style interface using extension
------------------------------------------------------------------------------*/
#include "simple.h"
//
// Extension to read and dump dwords from target
//
DECLARE_API( read )
{
ULONG cb;
ULONG64 Address;
ULONG Buffer[4];
Address = GetExpression(args);
// Read and display first 4 dwords at Address
if (ReadMemory(Address, &Buffer, sizeof(Buffer), &cb) && cb == sizeof(Buffer)) {
dprintf("%I64lx: %08lx %08lx %08lx %08lx\n\n", Address,
Buffer[0], Buffer[1], Buffer[2], Buffer[3]);
}
}
//
// Extension to edit a dword on target
//
// !edit <address> <value>
//
DECLARE_API( edit )
{
ULONG cb;
ULONG64 Address;
ULONG Value;
if (GetExpressionEx(args, &Address, &args)) {
Value = (ULONG) GetExpression( args);
} else {
dprintf("Usage: !edit <address> <value>\n");
return;
}
// Read and display first 4 dwords at Address
if (WriteMemory(Address, &Value, sizeof(Value), &cb) && cb == sizeof(Value)) {
dprintf("%I64lx: %08lx\n", Address, Value);
}
}
//
// Extension to dump stacktrace
//
DECLARE_API ( stack )
{
EXTSTACKTRACE64 stk[20];
ULONG frames, i;
CHAR Buffer[256];
ULONG64 displacement;
// Get stacktrace for surrent thread
frames = StackTrace( 0, 0, 0, stk, 20 );
if (!frames) {
dprintf("Stacktrace failed\n");
}
for (i=0; i<frames; i++) {
if (i==0) {
dprintf( "ChildEBP RetAddr Args to Child\n" );
}
Buffer[0] = '!';
GetSymbol(stk[i].ProgramCounter, (PUCHAR)Buffer, &displacement);
dprintf( "%08p %08p %08p %08p %08p %s",
stk[i].FramePointer,
stk[i].ReturnAddress,
stk[i].Args[0],
stk[i].Args[1],
stk[i].Args[2],
Buffer
);
if (displacement) {
dprintf( "+0x%p", displacement );
}
dprintf( "\n" );
}
}
/*
A built-in help for the extension dll
*/
DECLARE_API ( help )
{
dprintf("Help for extension dll simple.dll\n"
" read <addr> - It reads and dumps 4 dwords at <addr>\n"
" edit <addr> <val> - It modifies a dword value to <val> at <addr>\n"
" stack - Printd current stack trace\n"
" help - Shows this help\n"
);
}