winamp/Src/external_dependencies/openmpt-trunk/mptrack/ExceptionHandler.h

96 lines
2.0 KiB
C++

/*
* 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