long WINAPI CModManager::HandleExceptionGlobal ( _EXCEPTION_POINTERS* pException ) { // Create the exception information class CExceptionInformation_Impl* pExceptionInformation = new CExceptionInformation_Impl; pExceptionInformation->Set ( pException->ExceptionRecord->ExceptionCode, pException ); // Grab the mod manager CModManager* pModManager = CModManager::GetSingletonPtr (); if ( pModManager ) { // Got a client? if ( pModManager->m_pClientBase ) { // Protect us from "double-faults" try { // Let the client handle it. If it could, continue the execution if ( pModManager->m_pClientBase->HandleException ( pExceptionInformation ) ) { // Delete the exception record and continue to search the exception stack delete pExceptionInformation; return EXCEPTION_CONTINUE_SEARCH; } // The client wants us to terminate the process DumpCoreLog ( pExceptionInformation ); DumpMiniDump ( pException ); RunErrorTool ( pExceptionInformation ); TerminateProcess ( GetCurrentProcess (), 1 ); } catch ( ... ) { // Double-fault, terminate the process DumpCoreLog ( pExceptionInformation ); DumpMiniDump ( pException ); RunErrorTool ( pExceptionInformation ); TerminateProcess ( GetCurrentProcess (), 1 ); } } else { // Continue if we're in debug mode, if not terminate #ifdef MTA_DEBUG return EXCEPTION_CONTINUE_SEARCH; #endif } } // Terminate the process DumpCoreLog ( pExceptionInformation ); DumpMiniDump ( pException ); RunErrorTool ( pExceptionInformation ); TerminateProcess ( GetCurrentProcess (), 1 ); return EXCEPTION_CONTINUE_SEARCH; }
long WINAPI CCrashHandler::HandleExceptionGlobal ( _EXCEPTION_POINTERS* pException ) { // Create the exception information class CExceptionInformation_Impl* pExceptionInformation = new CExceptionInformation_Impl; pExceptionInformation->Set ( pException->ExceptionRecord->ExceptionCode, pException ); // Write the dump DumpMiniDump ( pException, pExceptionInformation ); RunErrorTool (); TerminateProcess ( GetCurrentProcess (), 1 ); return EXCEPTION_CONTINUE_SEARCH; }