windows-nt/Source/XPSP1/NT/inetsrv/iis/iisrearc/ul/ulkd/ds.c
2020-09-26 16:20:57 +08:00

191 lines
2.8 KiB
C

/*++
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