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