1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4//*****************************************************************************
5// EEMessageBox.h
6//
7
8//
9// This module contains the implementation for the message box utility code for
10// use inside the Execution Engine. These APIs ensure the GC mode is properly
11// toggled to preemptive before the dialog is displayed.
12//
13//*****************************************************************************
14
15#include "common.h"
16#include "eemessagebox.h"
17
18// Undef these so we can call them from the EE versions.
19#undef UtilMessageBoxCatastrophicVA
20#undef UtilMessageBoxVA
21#undef UtilMessageBoxNonLocalizedVA
22
23int EEMessageBoxCatastrophicVA(
24 UINT uText, // Text for MessageBox
25 UINT uTitle, // Title for MessageBox
26 UINT uType, // Style of MessageBox
27 BOOL showFileNameInTitle, // Flag to show FileName in Caption
28 va_list insertionArgs) // Additional Arguments
29{
30 CONTRACTL
31 {
32 MODE_ANY;
33 GC_NOTRIGGER;
34 NOTHROW;
35 }
36 CONTRACTL_END;
37
38 return UtilMessageBoxCatastrophicVA(uText, uTitle, uType, showFileNameInTitle, insertionArgs);
39}
40
41int EEMessageBoxCatastrophic(
42 UINT uText, // Text for MessageBox
43 UINT uTitle, // Title for MessageBox
44 ...) // Additional Arguments
45{
46 CONTRACTL
47 {
48 MODE_ANY;
49 GC_NOTRIGGER;
50 NOTHROW;
51 }
52 CONTRACTL_END;
53
54 va_list marker;
55 va_start(marker, uTitle);
56
57 int result = EEMessageBoxCatastrophicVA(uText, uTitle, MB_OK | MB_ICONERROR, TRUE, marker);
58 va_end( marker );
59
60 return result;
61}
62
63int EEMessageBoxCatastrophicWithCustomizedStyle(
64 UINT uText, // Text for MessageBox
65 UINT uTitle, // Title for MessageBox
66 UINT uType, // Style of MessageBox
67 BOOL showFileNameInTitle, // Flag to show FileName in Caption
68 ...) // Additional Arguments
69{
70 CONTRACTL
71 {
72 MODE_ANY;
73 GC_NOTRIGGER;
74 NOTHROW;
75 }
76 CONTRACTL_END;
77
78 va_list marker;
79 va_start(marker, showFileNameInTitle);
80
81 int result = EEMessageBoxCatastrophicVA(uText, uTitle, uType, showFileNameInTitle, marker);
82 va_end( marker );
83
84 return result;
85}
86
87#ifdef _DEBUG
88
89int EEMessageBoxNonLocalizedDebugOnly(
90 LPCWSTR lpText, // Text message
91 LPCWSTR lpTitle, // Caption
92 UINT uType, // Style of MessageBox
93 ... ) // Additional Arguments
94{
95 CONTRACTL
96 {
97 MODE_ANY;
98 GC_TRIGGERS;
99 NOTHROW;
100 }
101 CONTRACTL_END;
102
103 GCX_PREEMP();
104
105 va_list marker;
106 va_start(marker, uType);
107
108 int result = UtilMessageBoxNonLocalizedVA(NULL, lpText, lpTitle, uType, FALSE, TRUE, NULL, marker);
109 va_end( marker );
110
111 return result;
112}
113
114#endif // _DEBUG
115
116// If we didn't display a dialog to the user, this method returns IDIGNORE, unlike the others that return IDABORT.
117int EEMessageBoxNonLocalizedNonFatal(
118 LPCWSTR lpText, // Text message
119 LPCWSTR lpTitle, // Caption
120 UINT uType, // Style of MessageBox
121 ... ) // Additional Arguments
122{
123 CONTRACTL
124 {
125 MODE_ANY;
126 GC_TRIGGERS;
127 NOTHROW;
128 }
129 CONTRACTL_END;
130
131 GCX_PREEMP();
132
133 va_list marker;
134 va_start(marker, uType);
135 BOOL inputFromUser = FALSE;
136
137 int result = UtilMessageBoxNonLocalizedVA(NULL, lpText, lpTitle, NULL, uType, FALSE, TRUE, &inputFromUser, marker);
138 va_end( marker );
139
140 if (inputFromUser == FALSE && result == IDABORT)
141 result = IDIGNORE;
142
143 return result;
144}
145
146// If we didn't display a dialog to the user, this method returns IDIGNORE, unlike the others that return IDABORT.
147int EEMessageBoxNonLocalizedNonFatal(
148 LPCWSTR lpText, // Text message
149 LPCWSTR lpTitle, // Caption
150 LPCWSTR lpDetails,// Detailed message like a stack trace
151 UINT uType, // Style of MessageBox
152 ... ) // Additional Arguments
153{
154 CONTRACTL
155 {
156 MODE_ANY;
157 GC_TRIGGERS;
158 NOTHROW;
159 }
160 CONTRACTL_END;
161
162 GCX_PREEMP();
163
164 va_list marker;
165 va_start(marker, uType);
166 BOOL inputFromUser = FALSE;
167
168 int result = UtilMessageBoxNonLocalizedVA(NULL, lpText, lpTitle, lpDetails, uType, FALSE, TRUE, &inputFromUser, marker);
169 va_end( marker );
170
171 if (inputFromUser == FALSE && result == IDABORT)
172 result = IDIGNORE;
173
174 return result;
175}
176
177// Redefine these to errors just in case code is added after this point in the file.
178#define UtilMessageBoxCatastrophicVA __error("Use one of the EEMessageBox APIs (defined in eemessagebox.h) from inside the EE")
179#define UtilMessageBoxVA __error("Use one of the EEMessageBox APIs (defined in eemessagebox.h) from inside the EE")
180#define UtilMessageBoxNonLocalizedVA __error("Use one of the EEMessageBox APIs (defined in eemessagebox.h) from inside the EE")
181
182