Source code of Windows XP (NT5)
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.
|
|
/*++
Copyright (c) 1999-2001 Microsoft Corporation
Module Name:
ds.c
Abstract:
Dumps symbols found on the stack.
Author:
Keith Moore (keithmo) 12-Nov-1999
Environment:
User Mode.
Revision History:
--*/
#include "precomp.h"
#define NUM_STACK_SYMBOLS_TO_DUMP 48
//
// Public functions.
//
DECLARE_API( ds )
/*++
Routine Description:
Dumps symbols found on the stack.
Arguments:
None.
Return Value:
None.
--*/
{ ULONG_PTR startingAddress; ULONG_PTR stack; ULONG i; ULONG result; CHAR symbol[MAX_SYMBOL_LENGTH]; ULONG_PTR offset; PCHAR format; BOOLEAN validSymbolsOnly = FALSE;
SNAPSHOT_EXTENSION_DATA();
//
// Skip leading blanks.
//
while (*args == ' ' || *args == '\t') { args++; }
if (*args == '-') { args++;
switch (*args) { case 'v' : case 'V' : validSymbolsOnly = TRUE; args++; break;
default : PrintUsage( "ds" ); return; } }
while (*args == ' ') { args++; }
//
// By default, start at the current stack location. Otherwise,
// start at the given address.
//
if (!*args) { #if defined(_X86_)
args = "esp"; #elif defined(_AMD64_)
args = "rsp"; #elif defined(_IA64_)
args = "sp"; #else
#error "unsupported CPU"
#endif
}
startingAddress = GetExpression( args );
if (startingAddress == 0) { dprintf( "!inetdbg.ds: cannot evaluate \"%s\"\n", args ); return; }
//
// Ensure startingAddress is properly aligned.
//
startingAddress &= ~(sizeof(ULONG_PTR) - 1);
//
// Read the stack.
//
for (i = 0 ; i < NUM_STACK_SYMBOLS_TO_DUMP ; startingAddress += sizeof(ULONG_PTR) ) { if (CheckControlC()) { break; }
if (!ReadMemory( startingAddress, &stack, sizeof(stack), &result )) { dprintf( "ds: cannot read memory @ %p\n", startingAddress ); return; }
GetSymbol( (PVOID)stack, symbol, &offset );
if (symbol[0] == '\0') { if (validSymbolsOnly) { continue; }
format = "%p : %p\n"; } else if (offset == 0) { format = "%p : %p : %s\n"; } else { format = "%p : %p : %s+0x%lx\n"; }
dprintf( format, startingAddress, stack, symbol, offset );
i++; }
dprintf( "!ulkd.ds %s%lx to dump next block\n", validSymbolsOnly ? "-v " : "", startingAddress );
} // ds
|