blob: 282350010eaf87fe0d4e14fa330bfa7e00570d1e (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
/*
* 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
|