windows-nt/Source/XPSP1/NT/base/tools/kdexts2/exceptn.c
2020-09-26 16:20:57 +08:00

178 lines
4.5 KiB
C

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
exceptn.c
Abstract:
WinDbg Extension Api
Author:
Wesley Witt (wesw) 15-Aug-1993
Environment:
User Mode.
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
DECLARE_API( exrlog )
{
ULONG LogCount;
ULONG64 Address;
ULONG result;
ULONG64 LogPointer;
ULONG64 MaxLogRecord;
LAST_EXCEPTION_LOG LogRecord;
ULONG MaxExceptionLog;
CHAR Buffer[256];
ULONG64 displacement;
PUCHAR s;
ULONG64 Finally=0;
ULONG64 Filter=0;
ULONG64 Handler=0;
ULONG SizeOfLogRec;
ULONG ContextRecordOffset;
// Get the offset of ContextRecord in LAST_EXCEPTION_LOG
if (GetFieldOffset("LAST_EXCEPTION_LOG", "ContextRecord", &ContextRecordOffset)){
return E_INVALIDARG ;
}
Address = GetExpression( "nt!RtlpExceptionLogCount" );
if (Address == 0) {
dprintf("exrlog: No symbol for RtlpExceptionLogCount.\n");
return E_INVALIDARG;
}
if ((!ReadMemory(Address,
(PVOID)&LogCount,
sizeof(ULONG),
&result)) || (result < sizeof(ULONG))) {
dprintf("exrlog: Unable to read log\n");
return E_INVALIDARG;
}
Address = GetExpression( "nt!RtlpExceptionLogSize" );
if (Address == 0) {
dprintf("exrlog: No symbol for RtlpExceptionSize.\n");
return E_INVALIDARG;
}
if ((!ReadMemory(Address,
(PVOID)&MaxExceptionLog,
sizeof(ULONG),
&result)) || (result < sizeof(ULONG))) {
dprintf("exrlog: Unable to read log\n");
return E_INVALIDARG;
}
Address = GetExpression( "nt!RtlpExceptionLog" );
if (Address == 0) {
dprintf("exrlog: No symbol for RtlpExceptionLog.\n");
return E_INVALIDARG;
}
if (!ReadPointer(Address,&LogPointer)) {
dprintf("exrlog: Unable to read log pointer\n");
return E_INVALIDARG;
}
if (LogPointer == 0 || MaxExceptionLog == 0) {
dprintf("exrlog: Exception logging is not enabled.\n");
return E_INVALIDARG;
}
MaxLogRecord = LogPointer + MaxExceptionLog;
LogPointer += LogCount;
if (!(SizeOfLogRec = GetTypeSize("LAST_EXCEPTION_LOG"))) {
dprintf("Cannot find LAST_EXCEPTION_LOG type.\n");
return E_INVALIDARG;
}
for (LogCount = 0; LogCount < MaxExceptionLog; LogCount++) {
ULONG Disposition;
if (GetFieldValue(LogPointer,
"LAST_EXCEPTION_LOG",
"Disposition",
Disposition)) {
dprintf("exrlog: Unable to read log entry at %08p\n", LogPointer);
}
dprintf("\n% 2d: ----------------------------------\n", LogCount);
sprintf(Buffer, ".exr %I64lx", LogPointer);
ExecuteCommand(Client, Buffer); // Excveptionrecord is first field in log
dprintf("\n");
// Incomplete - exsup.c
// InterpretExceptionData(&LogRecord, &Finally, &Filter, &Handler);
GetSymbol(Filter, Buffer, &displacement);
dprintf("Filter: %08p", Filter);
if (*Buffer) {
dprintf(" (%s+0x%I64x)\n", Buffer, displacement);
} else {
dprintf("\n");
}
GetSymbol(Handler, Buffer, &displacement);
dprintf("Handler: %08p", Handler);
if (*Buffer) {
dprintf(" (%s+0x%I64x)\n", Buffer, displacement);
} else {
dprintf("\n");
}
GetSymbol(Finally, Buffer, &displacement);
dprintf("Finally: %08p", Finally);
if (*Buffer) {
dprintf(" (%s+0x%I64x)\n", Buffer, displacement);
} else {
dprintf("\n");
}
switch( Disposition ) {
case ExceptionContinueExecution:
s = "ExceptionContinueExecution";
break;
case ExceptionContinueSearch:
s = "ExceptionContinueSearch";
break;
case ExceptionNestedException:
s = "ExceptionNestedException";
break;
case 0xffffffff:
s = "Executed Handler";
break;
}
dprintf("Disposition: %d (%s)\n\n", Disposition, s);
sprintf(Buffer, ".cxr %I64lx", ContextRecordOffset + LogPointer);
ExecuteCommand(Client, Buffer);
ExecuteCommand(Client, ".cxr");
LogPointer += SizeOfLogRec;
if (LogPointer >= MaxLogRecord) {
LogPointer -= MaxExceptionLog;
}
}
return S_OK;
}