You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
4.1 KiB
C++

/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 1997-2001, All Rights Reserved */
/* */
/* MODULE NAME : msjexhnd.cpp */
/* PRODUCT(S) : */
/* */
/* MODULE DESCRIPTION : Unhandled Exception Hanlder */
/* */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 05/14/02 DSF 02 Added support for PDBs */
/* 02/08/02 MDE 01 Added Debug Exception and Slog support */
/************************************************************************/
#ifndef __MSJEXHND_H__
#define __MSJEXHND_H__
#define EXCEPTION_DIAGNOSTIC_DEBUG 0xE0000001
#ifdef __cplusplus
class MSJExceptionHandler
{
public:
MSJExceptionHandler( );
~MSJExceptionHandler( );
void SetLogFileName( PTSTR pszLogFileName );
#ifdef DEBUG_SISCO
static void SetLogCtrl (LOG_CTRL *pLogCtrl);
#endif
private:
// entry point where control comes on an unhandled exception
static LONG WINAPI MSJUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo );
// where report info is extracted and generated
static void GenerateExceptionReport( PEXCEPTION_POINTERS pExceptionInfo );
// Helper functions
static LPTSTR GetExceptionString( DWORD dwCode );
static BOOL GetLogicalAddress( PVOID addr, PTSTR szModule, DWORD len,
DWORD& section, DWORD& offset );
static void IntelStackWalk( PCONTEXT pContext );
#if 1
static void ImagehlpStackWalk( PCONTEXT pContext );
#endif
static int __cdecl _tprintf(const TCHAR * format, ...);
#if 1
static BOOL InitImagehlpFunctions( void );
#endif
// Variables used by the class
static TCHAR m_szPath[MAX_PATH];
static TCHAR m_szLogFileName[MAX_PATH];
static LPTOP_LEVEL_EXCEPTION_FILTER m_previousFilter;
#ifdef DEBUG_SISCO
static LOG_CTRL *m_pLogCtrl;
#endif
static HANDLE m_hReportFile;
static BOOL m_bDebugExcept;
static BOOL m_bFirstTime;
#if 1
// Make typedefs for some IMAGEHLP.DLL functions so that we can use them
// with GetProcAddress
typedef BOOL (__stdcall * SYMINITIALIZEPROC)( HANDLE, LPSTR, BOOL );
typedef BOOL (__stdcall *SYMCLEANUPPROC)( HANDLE );
typedef BOOL (__stdcall * STACKWALKPROC)
( DWORD, HANDLE, HANDLE, LPSTACKFRAME, LPVOID,
PREAD_PROCESS_MEMORY_ROUTINE,PFUNCTION_TABLE_ACCESS_ROUTINE,
PGET_MODULE_BASE_ROUTINE, PTRANSLATE_ADDRESS_ROUTINE );
typedef LPVOID (__stdcall *SYMFUNCTIONTABLEACCESSPROC)( HANDLE, DWORD );
typedef DWORD (__stdcall *SYMGETMODULEBASEPROC)( HANDLE, DWORD );
typedef BOOL (__stdcall *SYMGETSYMFROMADDRPROC) ( HANDLE, DWORD, PDWORD, PIMAGEHLP_SYMBOL );
typedef BOOL (__stdcall *SYMGETSEARCHPATHPROC) ( HANDLE, PSTR, DWORD );
typedef BOOL (__stdcall *SYMSETSEARCHPATHPROC) ( HANDLE, PSTR );
typedef DWORD (__stdcall *SYMGETOPTIONSPROC) ();
typedef DWORD (__stdcall *SYMSETOPTIONSPROC) (DWORD);
typedef BOOL (__stdcall *SYMGETLINEFROMADDRPROC) (HANDLE, DWORD, PDWORD, PIMAGEHLP_LINE);
static SYMINITIALIZEPROC _SymInitialize;
static SYMCLEANUPPROC _SymCleanup;
static STACKWALKPROC _StackWalk;
static SYMFUNCTIONTABLEACCESSPROC _SymFunctionTableAccess;
static SYMGETMODULEBASEPROC _SymGetModuleBase;
static SYMGETSYMFROMADDRPROC _SymGetSymFromAddr;
static SYMGETSEARCHPATHPROC _SymGetSearchPath;
static SYMSETSEARCHPATHPROC _SymSetSearchPath;
static SYMGETOPTIONSPROC _SymGetOptions;
static SYMSETOPTIONSPROC _SymSetOptions;
static SYMGETLINEFROMADDRPROC _SymGetLineFromAddr;
#endif
};
extern MSJExceptionHandler g_MSJExceptionHandler; // global instance of class
#endif
#ifdef __cplusplus
extern "C" {
#endif
void ExpInit ();
void ExpRaiseDebugException ();
#ifdef DEBUG_SISCO
void ExpSetLogCtrl (LOG_CTRL *pLogCtrl);
#endif
#ifdef __cplusplus
}
#endif
#endif