1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- /*
- * ExceptionHandler.h
- * ------------------
- * Purpose: Code for handling crashes (unhandled exceptions) in OpenMPT.
- * Notes : (currently none)
- * Authors: OpenMPT Devs
- * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
- */
- #pragma once
- #include "openmpt/all/BuildSettings.hpp"
- OPENMPT_NAMESPACE_BEGIN
- class ExceptionHandler
- {
- public:
- struct Context
- {
- void SetDescription(mpt::ustring desc)
- {
- description = std::move(desc);
- }
- mpt::ustring description;
- };
- public:
- static bool fullMemDump;
- static bool stopSoundDeviceOnCrash;
- static bool stopSoundDeviceBeforeDump;
- static bool delegateToWindowsHandler;
- static bool debugExceptionHandler;
- // these are expected to be set on startup and never changed again
- static bool useAnyCrashHandler;
- static bool useImplicitFallbackSEH;
- static bool useExplicitSEH;
- static bool handleStdTerminate;
- static bool handleStdUnexpected;
- static bool handleMfcExceptions;
- // Call this to activate unhandled exception filtering
- // and register a std::terminate_handler.
- static void Register();
- static void ConfigureSystemHandler();
- static void UnconfigureSystemHandler();
- static void Unregister();
- enum class TaintReason
- {
- Driver,
- Plugin,
- };
- static void TaintProcess(TaintReason reason);
- public:
- static Context *SetContext(Context *newContext) noexcept;
- class ContextSetter
- {
- private:
- Context *m_OldContext;
- public:
- inline ContextSetter(Context *newContext) noexcept
- : m_OldContext(SetContext(newContext))
- {
- return;
- }
- ContextSetter(const ContextSetter &) = delete;
- ContextSetter &operator=(const ContextSetter &) = delete;
- inline ~ContextSetter()
- {
- SetContext(m_OldContext);
- }
- };
- static LONG WINAPI UnhandledExceptionFilterContinue(_EXCEPTION_POINTERS *pExceptionInfo);
- static LONG WINAPI ExceptionFilter(_EXCEPTION_POINTERS *pExceptionInfo);
- static void UnhandledMFCException(CException * e, const MSG * pMsg);
- };
- void DebugInjectCrash();
- void DebugTraceDump();
- OPENMPT_NAMESPACE_END
|