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
6//
7// ---------------------------------------------------------------------------
8// Ex.cpp
9// ---------------------------------------------------------------------------
10
11#include "stdafx.h"
12#include "string.h"
13#include "ex.h"
14#include "holder.h"
15
16// error codes
17#include "corerror.h"
18
19#include "../dlls/mscorrc/resource.h"
20
21#include "olectl.h"
22
23#include "corexcep.h"
24
25#define MAX_EXCEPTION_MSG 200
26
27// Set if fatal error (like stack overflow or out of memory) occurred in this process.
28GVAL_IMPL_INIT(HRESULT, g_hrFatalError, S_OK);
29
30// Helper function to get an exception object from outside the exception. In
31// the CLR, it may be from the Thread object. Non-CLR users have no thread object,
32// and it will do nothing.
33void GetLastThrownObjectExceptionFromThread(void **ppvException);
34
35Exception *Exception::g_OOMException = NULL;
36
37// avoid global constructors
38static BYTE g_OOMExceptionInstance[sizeof(OutOfMemoryException)];
39
40Exception * Exception::GetOOMException()
41{
42 LIMITED_METHOD_CONTRACT;
43
44 if (!g_OOMException) {
45 // Create a local copy on the stack and then copy it over to the static instance.
46 // This avoids race conditions caused by multiple initializations of vtable in the constructor
47
48 OutOfMemoryException local(TRUE); // Construct a "preallocated" instance.
49 memcpy((void*)&g_OOMExceptionInstance, (void*)&local, sizeof(OutOfMemoryException));
50
51 g_OOMException = (OutOfMemoryException*)&g_OOMExceptionInstance;
52 }
53
54 return g_OOMException;
55}
56
57/*virtual*/ Exception *OutOfMemoryException::Clone()
58{
59 LIMITED_METHOD_CONTRACT;
60
61 return GetOOMException();
62}
63
64//------------------------------------------------------------------------------
65void Exception::Delete(Exception* pvMemory)
66{
67 CONTRACTL
68 {
69 GC_NOTRIGGER;
70 NOTHROW;
71 SO_TOLERANT;
72 SUPPORTS_DAC_HOST_ONLY; // Exceptions aren't currently marshalled by DAC - just used in the host
73 }
74 CONTRACTL_END;
75
76 if ((pvMemory == 0) || pvMemory->IsPreallocatedException())
77 {
78 return;
79 }
80
81 ::delete((Exception *) pvMemory);
82}
83
84void Exception::GetMessage(SString &result)
85{
86 WRAPPER_NO_CONTRACT;
87
88 return GenerateTopLevelHRExceptionMessage(GetHR(), result);
89}
90
91void HRMsgException::GetMessage(SString &result)
92{
93 WRAPPER_NO_CONTRACT;
94
95 if (m_msg.IsEmpty())
96 HRException::GetMessage(result);
97 else
98 result = m_msg;
99}
100
101Exception *Exception::Clone()
102{
103 CONTRACTL
104 {
105 GC_NOTRIGGER;
106 THROWS;
107 }
108 CONTRACTL_END;
109
110 NewHolder<Exception> retExcep(CloneHelper());
111 if (m_innerException)
112 {
113 retExcep->m_innerException = m_innerException->Clone();
114 }
115
116 retExcep.SuppressRelease();
117 return retExcep;
118}
119
120Exception *Exception::CloneHelper()
121{
122 StackSString s;
123 GetMessage(s);
124 return new HRMsgException(GetHR(), s);
125}
126
127Exception *Exception::DomainBoundClone()
128{
129 CONTRACTL
130 {
131 // Because we may call DomainBoundCloneHelper() of ObjrefException or CLRLastThrownObjectException
132 // this should be GC_TRIGGERS, but we can not include EE contracts in Utilcode.
133 THROWS;
134 }
135 CONTRACTL_END;
136
137 NewHolder<Exception> retExcep(DomainBoundCloneHelper());
138 if (m_innerException)
139 {
140 retExcep->m_innerException = m_innerException->DomainBoundClone();
141 }
142
143 retExcep.SuppressRelease();
144 return retExcep;
145}
146
147BOOL Exception::IsTerminal()
148{
149 CONTRACTL
150 {
151 GC_NOTRIGGER;
152 NOTHROW;
153
154 // CLRException::GetHR() can eventually call BaseDomain::CreateHandle(),
155 // which can indirectly cause a lock if we get a miss in the handle table
156 // cache (TableCacheMissOnAlloc). Since CLRException::GetHR() is virtual,
157 // SCAN won't find this for you (though 40 minutes of one of the sql stress
158 // tests will :-))
159 CAN_TAKE_LOCK;
160 }
161 CONTRACTL_END;
162
163 HRESULT hr = GetHR();
164 return (COR_E_THREADABORTED == hr);
165}
166
167BOOL Exception::IsTransient()
168{
169 WRAPPER_NO_CONTRACT;
170
171 return IsTransient(GetHR());
172}
173
174/* static */
175BOOL Exception::IsTransient(HRESULT hr)
176{
177 LIMITED_METHOD_CONTRACT;
178
179 return (hr == COR_E_THREADABORTED
180 || hr == COR_E_THREADINTERRUPTED
181 || hr == COR_E_THREADSTOP
182 || hr == COR_E_APPDOMAINUNLOADED
183 || hr == E_OUTOFMEMORY
184 || hr == HRESULT_FROM_WIN32(ERROR_COMMITMENT_LIMIT) // ran out of room in pagefile
185 || hr == HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY)
186 || hr == (HRESULT)STATUS_NO_MEMORY
187 || hr == COR_E_STACKOVERFLOW
188 || hr == MSEE_E_ASSEMBLYLOADINPROGRESS);
189}
190
191//------------------------------------------------------------------------------
192// Functions to manage the preallocated exceptions.
193// Virtual
194BOOL Exception::IsPreallocatedException()
195{ // Most exceptions can't be preallocated. If they can be, their class
196 // should provide a virtual override of this function.
197 return FALSE;
198}
199
200BOOL Exception::IsPreallocatedOOMException()
201{ // This is the preallocated OOM if it is preallocated and is OOM.
202 return IsPreallocatedException() && (GetInstanceType() == OutOfMemoryException::GetType());
203}
204
205//------------------------------------------------------------------------------
206#ifdef _PREFAST_
207#pragma warning(push)
208#pragma warning(disable:21000) // Suppress PREFast warning about overly large function
209#endif
210LPCSTR Exception::GetHRSymbolicName(HRESULT hr)
211{
212 LIMITED_METHOD_CONTRACT;
213
214#define CASE_HRESULT(hrname) case hrname: return #hrname;
215
216 switch (hr)
217 {
218 CASE_HRESULT(S_OK)// 0x00000000L
219 CASE_HRESULT(S_FALSE)// 0x00000001L
220
221 CASE_HRESULT(E_UNEXPECTED)// 0x8000FFFFL
222 CASE_HRESULT(E_NOTIMPL)// 0x80004001L
223 CASE_HRESULT(E_OUTOFMEMORY)// 0x8007000EL
224 CASE_HRESULT(E_INVALIDARG)// 0x80070057L
225 CASE_HRESULT(E_NOINTERFACE)// 0x80004002L
226 CASE_HRESULT(E_POINTER)// 0x80004003L
227 CASE_HRESULT(E_HANDLE)// 0x80070006L
228 CASE_HRESULT(E_ABORT)// 0x80004004L
229 CASE_HRESULT(E_FAIL)// 0x80004005L
230 CASE_HRESULT(E_ACCESSDENIED)// 0x80070005L
231
232#ifdef FEATURE_COMINTEROP
233 CASE_HRESULT(CO_E_INIT_TLS)// 0x80004006L
234 CASE_HRESULT(CO_E_INIT_SHARED_ALLOCATOR)// 0x80004007L
235 CASE_HRESULT(CO_E_INIT_MEMORY_ALLOCATOR)// 0x80004008L
236 CASE_HRESULT(CO_E_INIT_CLASS_CACHE)// 0x80004009L
237 CASE_HRESULT(CO_E_INIT_RPC_CHANNEL)// 0x8000400AL
238 CASE_HRESULT(CO_E_INIT_TLS_SET_CHANNEL_CONTROL)// 0x8000400BL
239 CASE_HRESULT(CO_E_INIT_TLS_CHANNEL_CONTROL)// 0x8000400CL
240 CASE_HRESULT(CO_E_INIT_UNACCEPTED_USER_ALLOCATOR)// 0x8000400DL
241 CASE_HRESULT(CO_E_INIT_SCM_MUTEX_EXISTS)// 0x8000400EL
242 CASE_HRESULT(CO_E_INIT_SCM_FILE_MAPPING_EXISTS)// 0x8000400FL
243 CASE_HRESULT(CO_E_INIT_SCM_MAP_VIEW_OF_FILE)// 0x80004010L
244 CASE_HRESULT(CO_E_INIT_SCM_EXEC_FAILURE)// 0x80004011L
245 CASE_HRESULT(CO_E_INIT_ONLY_SINGLE_THREADED)// 0x80004012L
246
247// ******************
248// FACILITY_ITF
249// ******************
250
251 CASE_HRESULT(OLE_E_OLEVERB)// 0x80040000L
252 CASE_HRESULT(OLE_E_ADVF)// 0x80040001L
253 CASE_HRESULT(OLE_E_ENUM_NOMORE)// 0x80040002L
254 CASE_HRESULT(OLE_E_ADVISENOTSUPPORTED)// 0x80040003L
255 CASE_HRESULT(OLE_E_NOCONNECTION)// 0x80040004L
256 CASE_HRESULT(OLE_E_NOTRUNNING)// 0x80040005L
257 CASE_HRESULT(OLE_E_NOCACHE)// 0x80040006L
258 CASE_HRESULT(OLE_E_BLANK)// 0x80040007L
259 CASE_HRESULT(OLE_E_CLASSDIFF)// 0x80040008L
260 CASE_HRESULT(OLE_E_CANT_GETMONIKER)// 0x80040009L
261 CASE_HRESULT(OLE_E_CANT_BINDTOSOURCE)// 0x8004000AL
262 CASE_HRESULT(OLE_E_STATIC)// 0x8004000BL
263 CASE_HRESULT(OLE_E_PROMPTSAVECANCELLED)// 0x8004000CL
264 CASE_HRESULT(OLE_E_INVALIDRECT)// 0x8004000DL
265 CASE_HRESULT(OLE_E_WRONGCOMPOBJ)// 0x8004000EL
266 CASE_HRESULT(OLE_E_INVALIDHWND)// 0x8004000FL
267 CASE_HRESULT(OLE_E_NOT_INPLACEACTIVE)// 0x80040010L
268 CASE_HRESULT(OLE_E_CANTCONVERT)// 0x80040011L
269 CASE_HRESULT(OLE_E_NOSTORAGE)// 0x80040012L
270 CASE_HRESULT(DV_E_FORMATETC)// 0x80040064L
271 CASE_HRESULT(DV_E_DVTARGETDEVICE)// 0x80040065L
272 CASE_HRESULT(DV_E_STGMEDIUM)// 0x80040066L
273 CASE_HRESULT(DV_E_STATDATA)// 0x80040067L
274 CASE_HRESULT(DV_E_LINDEX)// 0x80040068L
275 CASE_HRESULT(DV_E_TYMED)// 0x80040069L
276 CASE_HRESULT(DV_E_CLIPFORMAT)// 0x8004006AL
277 CASE_HRESULT(DV_E_DVASPECT)// 0x8004006BL
278 CASE_HRESULT(DV_E_DVTARGETDEVICE_SIZE)// 0x8004006CL
279 CASE_HRESULT(DV_E_NOIVIEWOBJECT)// 0x8004006DL
280 CASE_HRESULT(DRAGDROP_E_NOTREGISTERED)// 0x80040100L
281 CASE_HRESULT(DRAGDROP_E_ALREADYREGISTERED)// 0x80040101L
282 CASE_HRESULT(DRAGDROP_E_INVALIDHWND)// 0x80040102L
283 CASE_HRESULT(CLASS_E_NOAGGREGATION)// 0x80040110L
284 CASE_HRESULT(CLASS_E_CLASSNOTAVAILABLE)// 0x80040111L
285 CASE_HRESULT(VIEW_E_DRAW)// 0x80040140L
286 CASE_HRESULT(REGDB_E_READREGDB)// 0x80040150L
287 CASE_HRESULT(REGDB_E_WRITEREGDB)// 0x80040151L
288 CASE_HRESULT(REGDB_E_KEYMISSING)// 0x80040152L
289 CASE_HRESULT(REGDB_E_INVALIDVALUE)// 0x80040153L
290 CASE_HRESULT(REGDB_E_CLASSNOTREG)// 0x80040154L
291 CASE_HRESULT(CACHE_E_NOCACHE_UPDATED)// 0x80040170L
292 CASE_HRESULT(OLEOBJ_E_NOVERBS)// 0x80040180L
293 CASE_HRESULT(INPLACE_E_NOTUNDOABLE)// 0x800401A0L
294 CASE_HRESULT(INPLACE_E_NOTOOLSPACE)// 0x800401A1L
295 CASE_HRESULT(CONVERT10_E_OLESTREAM_GET)// 0x800401C0L
296 CASE_HRESULT(CONVERT10_E_OLESTREAM_PUT)// 0x800401C1L
297 CASE_HRESULT(CONVERT10_E_OLESTREAM_FMT)// 0x800401C2L
298 CASE_HRESULT(CONVERT10_E_OLESTREAM_BITMAP_TO_DIB)// 0x800401C3L
299 CASE_HRESULT(CONVERT10_E_STG_FMT)// 0x800401C4L
300 CASE_HRESULT(CONVERT10_E_STG_NO_STD_STREAM)// 0x800401C5L
301 CASE_HRESULT(CONVERT10_E_STG_DIB_TO_BITMAP)// 0x800401C6L
302 CASE_HRESULT(CLIPBRD_E_CANT_OPEN)// 0x800401D0L
303 CASE_HRESULT(CLIPBRD_E_CANT_EMPTY)// 0x800401D1L
304 CASE_HRESULT(CLIPBRD_E_CANT_SET)// 0x800401D2L
305 CASE_HRESULT(CLIPBRD_E_BAD_DATA)// 0x800401D3L
306 CASE_HRESULT(CLIPBRD_E_CANT_CLOSE)// 0x800401D4L
307 CASE_HRESULT(MK_E_CONNECTMANUALLY)// 0x800401E0L
308 CASE_HRESULT(MK_E_EXCEEDEDDEADLINE)// 0x800401E1L
309 CASE_HRESULT(MK_E_NEEDGENERIC)// 0x800401E2L
310 CASE_HRESULT(MK_E_UNAVAILABLE)// 0x800401E3L
311 CASE_HRESULT(MK_E_SYNTAX)// 0x800401E4L
312 CASE_HRESULT(MK_E_NOOBJECT)// 0x800401E5L
313 CASE_HRESULT(MK_E_INVALIDEXTENSION)// 0x800401E6L
314 CASE_HRESULT(MK_E_INTERMEDIATEINTERFACENOTSUPPORTED)// 0x800401E7L
315 CASE_HRESULT(MK_E_NOTBINDABLE)// 0x800401E8L
316 CASE_HRESULT(MK_E_NOTBOUND)// 0x800401E9L
317 CASE_HRESULT(MK_E_CANTOPENFILE)// 0x800401EAL
318 CASE_HRESULT(MK_E_MUSTBOTHERUSER)// 0x800401EBL
319 CASE_HRESULT(MK_E_NOINVERSE)// 0x800401ECL
320 CASE_HRESULT(MK_E_NOSTORAGE)// 0x800401EDL
321 CASE_HRESULT(MK_E_NOPREFIX)// 0x800401EEL
322 CASE_HRESULT(MK_E_ENUMERATION_FAILED)// 0x800401EFL
323 CASE_HRESULT(CO_E_NOTINITIALIZED)// 0x800401F0L
324 CASE_HRESULT(CO_E_ALREADYINITIALIZED)// 0x800401F1L
325 CASE_HRESULT(CO_E_CANTDETERMINECLASS)// 0x800401F2L
326 CASE_HRESULT(CO_E_CLASSSTRING)// 0x800401F3L
327 CASE_HRESULT(CO_E_IIDSTRING)// 0x800401F4L
328 CASE_HRESULT(CO_E_APPNOTFOUND)// 0x800401F5L
329 CASE_HRESULT(CO_E_APPSINGLEUSE)// 0x800401F6L
330 CASE_HRESULT(CO_E_ERRORINAPP)// 0x800401F7L
331 CASE_HRESULT(CO_E_DLLNOTFOUND)// 0x800401F8L
332 CASE_HRESULT(CO_E_ERRORINDLL)// 0x800401F9L
333 CASE_HRESULT(CO_E_WRONGOSFORAPP)// 0x800401FAL
334 CASE_HRESULT(CO_E_OBJNOTREG)// 0x800401FBL
335 CASE_HRESULT(CO_E_OBJISREG)// 0x800401FCL
336 CASE_HRESULT(CO_E_OBJNOTCONNECTED)// 0x800401FDL
337 CASE_HRESULT(CO_E_APPDIDNTREG)// 0x800401FEL
338 CASE_HRESULT(CO_E_RELEASED)// 0x800401FFL
339
340 CASE_HRESULT(OLE_S_USEREG)// 0x00040000L
341 CASE_HRESULT(OLE_S_STATIC)// 0x00040001L
342 CASE_HRESULT(OLE_S_MAC_CLIPFORMAT)// 0x00040002L
343 CASE_HRESULT(DRAGDROP_S_DROP)// 0x00040100L
344 CASE_HRESULT(DRAGDROP_S_CANCEL)// 0x00040101L
345 CASE_HRESULT(DRAGDROP_S_USEDEFAULTCURSORS)// 0x00040102L
346 CASE_HRESULT(DATA_S_SAMEFORMATETC)// 0x00040130L
347 CASE_HRESULT(VIEW_S_ALREADY_FROZEN)// 0x00040140L
348 CASE_HRESULT(CACHE_S_FORMATETC_NOTSUPPORTED)// 0x00040170L
349 CASE_HRESULT(CACHE_S_SAMECACHE)// 0x00040171L
350 CASE_HRESULT(CACHE_S_SOMECACHES_NOTUPDATED)// 0x00040172L
351 CASE_HRESULT(OLEOBJ_S_INVALIDVERB)// 0x00040180L
352 CASE_HRESULT(OLEOBJ_S_CANNOT_DOVERB_NOW)// 0x00040181L
353 CASE_HRESULT(OLEOBJ_S_INVALIDHWND)// 0x00040182L
354 CASE_HRESULT(INPLACE_S_TRUNCATED)// 0x000401A0L
355 CASE_HRESULT(CONVERT10_S_NO_PRESENTATION)// 0x000401C0L
356 CASE_HRESULT(MK_S_REDUCED_TO_SELF)// 0x000401E2L
357 CASE_HRESULT(MK_S_ME)// 0x000401E4L
358 CASE_HRESULT(MK_S_HIM)// 0x000401E5L
359 CASE_HRESULT(MK_S_US)// 0x000401E6L
360 CASE_HRESULT(MK_S_MONIKERALREADYREGISTERED)// 0x000401E7L
361
362// ******************
363// FACILITY_WINDOWS
364// ******************
365
366 CASE_HRESULT(CO_E_CLASS_CREATE_FAILED)// 0x80080001L
367 CASE_HRESULT(CO_E_SCM_ERROR)// 0x80080002L
368 CASE_HRESULT(CO_E_SCM_RPC_FAILURE)// 0x80080003L
369 CASE_HRESULT(CO_E_BAD_PATH)// 0x80080004L
370 CASE_HRESULT(CO_E_SERVER_EXEC_FAILURE)// 0x80080005L
371 CASE_HRESULT(CO_E_OBJSRV_RPC_FAILURE)// 0x80080006L
372 CASE_HRESULT(MK_E_NO_NORMALIZED)// 0x80080007L
373 CASE_HRESULT(CO_E_SERVER_STOPPING)// 0x80080008L
374 CASE_HRESULT(MEM_E_INVALID_ROOT)// 0x80080009L
375 CASE_HRESULT(MEM_E_INVALID_LINK)// 0x80080010L
376 CASE_HRESULT(MEM_E_INVALID_SIZE)// 0x80080011L
377
378// ******************
379// FACILITY_DISPATCH
380// ******************
381
382 CASE_HRESULT(DISP_E_UNKNOWNINTERFACE)// 0x80020001L
383 CASE_HRESULT(DISP_E_MEMBERNOTFOUND)// 0x80020003L
384 CASE_HRESULT(DISP_E_PARAMNOTFOUND)// 0x80020004L
385 CASE_HRESULT(DISP_E_TYPEMISMATCH)// 0x80020005L
386 CASE_HRESULT(DISP_E_UNKNOWNNAME)// 0x80020006L
387 CASE_HRESULT(DISP_E_NONAMEDARGS)// 0x80020007L
388 CASE_HRESULT(DISP_E_BADVARTYPE)// 0x80020008L
389 CASE_HRESULT(DISP_E_EXCEPTION)// 0x80020009L
390 CASE_HRESULT(DISP_E_OVERFLOW)// 0x8002000AL
391 CASE_HRESULT(DISP_E_BADINDEX)// 0x8002000BL
392 CASE_HRESULT(DISP_E_UNKNOWNLCID)// 0x8002000CL
393 CASE_HRESULT(DISP_E_ARRAYISLOCKED)// 0x8002000DL
394 CASE_HRESULT(DISP_E_BADPARAMCOUNT)// 0x8002000EL
395 CASE_HRESULT(DISP_E_PARAMNOTOPTIONAL)// 0x8002000FL
396 CASE_HRESULT(DISP_E_BADCALLEE)// 0x80020010L
397 CASE_HRESULT(DISP_E_NOTACOLLECTION)// 0x80020011L
398 CASE_HRESULT(TYPE_E_BUFFERTOOSMALL)// 0x80028016L
399 CASE_HRESULT(TYPE_E_INVDATAREAD)// 0x80028018L
400 CASE_HRESULT(TYPE_E_UNSUPFORMAT)// 0x80028019L
401 CASE_HRESULT(TYPE_E_REGISTRYACCESS)// 0x8002801CL
402 CASE_HRESULT(TYPE_E_LIBNOTREGISTERED)// 0x8002801DL
403 CASE_HRESULT(TYPE_E_UNDEFINEDTYPE)// 0x80028027L
404 CASE_HRESULT(TYPE_E_QUALIFIEDNAMEDISALLOWED)// 0x80028028L
405 CASE_HRESULT(TYPE_E_INVALIDSTATE)// 0x80028029L
406 CASE_HRESULT(TYPE_E_WRONGTYPEKIND)// 0x8002802AL
407 CASE_HRESULT(TYPE_E_ELEMENTNOTFOUND)// 0x8002802BL
408 CASE_HRESULT(TYPE_E_AMBIGUOUSNAME)// 0x8002802CL
409 CASE_HRESULT(TYPE_E_NAMECONFLICT)// 0x8002802DL
410 CASE_HRESULT(TYPE_E_UNKNOWNLCID)// 0x8002802EL
411 CASE_HRESULT(TYPE_E_DLLFUNCTIONNOTFOUND)// 0x8002802FL
412 CASE_HRESULT(TYPE_E_BADMODULEKIND)// 0x800288BDL
413 CASE_HRESULT(TYPE_E_SIZETOOBIG)// 0x800288C5L
414 CASE_HRESULT(TYPE_E_DUPLICATEID)// 0x800288C6L
415 CASE_HRESULT(TYPE_E_INVALIDID)// 0x800288CFL
416 CASE_HRESULT(TYPE_E_TYPEMISMATCH)// 0x80028CA0L
417 CASE_HRESULT(TYPE_E_OUTOFBOUNDS)// 0x80028CA1L
418 CASE_HRESULT(TYPE_E_IOERROR)// 0x80028CA2L
419 CASE_HRESULT(TYPE_E_CANTCREATETMPFILE)// 0x80028CA3L
420 CASE_HRESULT(TYPE_E_CANTLOADLIBRARY)// 0x80029C4AL
421 CASE_HRESULT(TYPE_E_INCONSISTENTPROPFUNCS)// 0x80029C83L
422 CASE_HRESULT(TYPE_E_CIRCULARTYPE)// 0x80029C84L
423
424// ******************
425// FACILITY_STORAGE
426// ******************
427
428 CASE_HRESULT(STG_E_INVALIDFUNCTION)// 0x80030001L
429 CASE_HRESULT(STG_E_FILENOTFOUND)// 0x80030002L
430 CASE_HRESULT(STG_E_PATHNOTFOUND)// 0x80030003L
431 CASE_HRESULT(STG_E_TOOMANYOPENFILES)// 0x80030004L
432 CASE_HRESULT(STG_E_ACCESSDENIED)// 0x80030005L
433 CASE_HRESULT(STG_E_INVALIDHANDLE)// 0x80030006L
434 CASE_HRESULT(STG_E_INSUFFICIENTMEMORY)// 0x80030008L
435 CASE_HRESULT(STG_E_INVALIDPOINTER)// 0x80030009L
436 CASE_HRESULT(STG_E_NOMOREFILES)// 0x80030012L
437 CASE_HRESULT(STG_E_DISKISWRITEPROTECTED)// 0x80030013L
438 CASE_HRESULT(STG_E_SEEKERROR)// 0x80030019L
439 CASE_HRESULT(STG_E_WRITEFAULT)// 0x8003001DL
440 CASE_HRESULT(STG_E_READFAULT)// 0x8003001EL
441 CASE_HRESULT(STG_E_SHAREVIOLATION)// 0x80030020L
442 CASE_HRESULT(STG_E_LOCKVIOLATION)// 0x80030021L
443 CASE_HRESULT(STG_E_FILEALREADYEXISTS)// 0x80030050L
444 CASE_HRESULT(STG_E_INVALIDPARAMETER)// 0x80030057L
445 CASE_HRESULT(STG_E_MEDIUMFULL)// 0x80030070L
446 CASE_HRESULT(STG_E_ABNORMALAPIEXIT)// 0x800300FAL
447 CASE_HRESULT(STG_E_INVALIDHEADER)// 0x800300FBL
448 CASE_HRESULT(STG_E_INVALIDNAME)// 0x800300FCL
449 CASE_HRESULT(STG_E_UNKNOWN)// 0x800300FDL
450 CASE_HRESULT(STG_E_UNIMPLEMENTEDFUNCTION)// 0x800300FEL
451 CASE_HRESULT(STG_E_INVALIDFLAG)// 0x800300FFL
452 CASE_HRESULT(STG_E_INUSE)// 0x80030100L
453 CASE_HRESULT(STG_E_NOTCURRENT)// 0x80030101L
454 CASE_HRESULT(STG_E_REVERTED)// 0x80030102L
455 CASE_HRESULT(STG_E_CANTSAVE)// 0x80030103L
456 CASE_HRESULT(STG_E_OLDFORMAT)// 0x80030104L
457 CASE_HRESULT(STG_E_OLDDLL)// 0x80030105L
458 CASE_HRESULT(STG_E_SHAREREQUIRED)// 0x80030106L
459 CASE_HRESULT(STG_E_NOTFILEBASEDSTORAGE)// 0x80030107L
460 CASE_HRESULT(STG_S_CONVERTED)// 0x00030200L
461
462// ******************
463// FACILITY_RPC
464// ******************
465
466 CASE_HRESULT(RPC_E_CALL_REJECTED)// 0x80010001L
467 CASE_HRESULT(RPC_E_CALL_CANCELED)// 0x80010002L
468 CASE_HRESULT(RPC_E_CANTPOST_INSENDCALL)// 0x80010003L
469 CASE_HRESULT(RPC_E_CANTCALLOUT_INASYNCCALL)// 0x80010004L
470 CASE_HRESULT(RPC_E_CANTCALLOUT_INEXTERNALCALL)// 0x80010005L
471 CASE_HRESULT(RPC_E_CONNECTION_TERMINATED)// 0x80010006L
472 CASE_HRESULT(RPC_E_SERVER_DIED)// 0x80010007L
473 CASE_HRESULT(RPC_E_CLIENT_DIED)// 0x80010008L
474 CASE_HRESULT(RPC_E_INVALID_DATAPACKET)// 0x80010009L
475 CASE_HRESULT(RPC_E_CANTTRANSMIT_CALL)// 0x8001000AL
476 CASE_HRESULT(RPC_E_CLIENT_CANTMARSHAL_DATA)// 0x8001000BL
477 CASE_HRESULT(RPC_E_CLIENT_CANTUNMARSHAL_DATA)// 0x8001000CL
478 CASE_HRESULT(RPC_E_SERVER_CANTMARSHAL_DATA)// 0x8001000DL
479 CASE_HRESULT(RPC_E_SERVER_CANTUNMARSHAL_DATA)// 0x8001000EL
480 CASE_HRESULT(RPC_E_INVALID_DATA)// 0x8001000FL
481 CASE_HRESULT(RPC_E_INVALID_PARAMETER)// 0x80010010L
482 CASE_HRESULT(RPC_E_CANTCALLOUT_AGAIN)// 0x80010011L
483 CASE_HRESULT(RPC_E_SERVER_DIED_DNE)// 0x80010012L
484 CASE_HRESULT(RPC_E_SYS_CALL_FAILED)// 0x80010100L
485 CASE_HRESULT(RPC_E_OUT_OF_RESOURCES)// 0x80010101L
486 CASE_HRESULT(RPC_E_ATTEMPTED_MULTITHREAD)// 0x80010102L
487 CASE_HRESULT(RPC_E_NOT_REGISTERED)// 0x80010103L
488 CASE_HRESULT(RPC_E_FAULT)// 0x80010104L
489 CASE_HRESULT(RPC_E_SERVERFAULT)// 0x80010105L
490 CASE_HRESULT(RPC_E_CHANGED_MODE)// 0x80010106L
491 CASE_HRESULT(RPC_E_INVALIDMETHOD)// 0x80010107L
492 CASE_HRESULT(RPC_E_DISCONNECTED)// 0x80010108L
493 CASE_HRESULT(RPC_E_RETRY)// 0x80010109L
494 CASE_HRESULT(RPC_E_SERVERCALL_RETRYLATER)// 0x8001010AL
495 CASE_HRESULT(RPC_E_SERVERCALL_REJECTED)// 0x8001010BL
496 CASE_HRESULT(RPC_E_INVALID_CALLDATA)// 0x8001010CL
497 CASE_HRESULT(RPC_E_CANTCALLOUT_ININPUTSYNCCALL)// 0x8001010DL
498 CASE_HRESULT(RPC_E_WRONG_THREAD)// 0x8001010EL
499 CASE_HRESULT(RPC_E_THREAD_NOT_INIT)// 0x8001010FL
500 CASE_HRESULT(RPC_E_UNEXPECTED)// 0x8001FFFFL
501
502// ******************
503// FACILITY_CTL
504// ******************
505
506 CASE_HRESULT(CTL_E_ILLEGALFUNCTIONCALL)
507 CASE_HRESULT(CTL_E_OVERFLOW)
508 CASE_HRESULT(CTL_E_OUTOFMEMORY)
509 CASE_HRESULT(CTL_E_DIVISIONBYZERO)
510 CASE_HRESULT(CTL_E_OUTOFSTRINGSPACE)
511 CASE_HRESULT(CTL_E_OUTOFSTACKSPACE)
512 CASE_HRESULT(CTL_E_BADFILENAMEORNUMBER)
513 CASE_HRESULT(CTL_E_FILENOTFOUND)
514 CASE_HRESULT(CTL_E_BADFILEMODE)
515 CASE_HRESULT(CTL_E_FILEALREADYOPEN)
516 CASE_HRESULT(CTL_E_DEVICEIOERROR)
517 CASE_HRESULT(CTL_E_FILEALREADYEXISTS)
518 CASE_HRESULT(CTL_E_BADRECORDLENGTH)
519 CASE_HRESULT(CTL_E_DISKFULL)
520 CASE_HRESULT(CTL_E_BADRECORDNUMBER)
521 CASE_HRESULT(CTL_E_BADFILENAME)
522 CASE_HRESULT(CTL_E_TOOMANYFILES)
523 CASE_HRESULT(CTL_E_DEVICEUNAVAILABLE)
524 CASE_HRESULT(CTL_E_PERMISSIONDENIED)
525 CASE_HRESULT(CTL_E_DISKNOTREADY)
526 CASE_HRESULT(CTL_E_PATHFILEACCESSERROR)
527 CASE_HRESULT(CTL_E_PATHNOTFOUND)
528 CASE_HRESULT(CTL_E_INVALIDPATTERNSTRING)
529 CASE_HRESULT(CTL_E_INVALIDUSEOFNULL)
530 CASE_HRESULT(CTL_E_INVALIDFILEFORMAT)
531 CASE_HRESULT(CTL_E_INVALIDPROPERTYVALUE)
532 CASE_HRESULT(CTL_E_INVALIDPROPERTYARRAYINDEX)
533 CASE_HRESULT(CTL_E_SETNOTSUPPORTEDATRUNTIME)
534 CASE_HRESULT(CTL_E_SETNOTSUPPORTED)
535 CASE_HRESULT(CTL_E_NEEDPROPERTYARRAYINDEX)
536 CASE_HRESULT(CTL_E_SETNOTPERMITTED)
537 CASE_HRESULT(CTL_E_GETNOTSUPPORTEDATRUNTIME)
538 CASE_HRESULT(CTL_E_GETNOTSUPPORTED)
539 CASE_HRESULT(CTL_E_PROPERTYNOTFOUND)
540 CASE_HRESULT(CTL_E_INVALIDCLIPBOARDFORMAT)
541 CASE_HRESULT(CTL_E_INVALIDPICTURE)
542 CASE_HRESULT(CTL_E_PRINTERERROR)
543 CASE_HRESULT(CTL_E_CANTSAVEFILETOTEMP)
544 CASE_HRESULT(CTL_E_SEARCHTEXTNOTFOUND)
545 CASE_HRESULT(CTL_E_REPLACEMENTSTOOLONG)
546#endif // FEATURE_COMINTEROP
547
548#ifdef _DEBUG // @todo: do we want to burn strings for this in a free build?
549
550 CASE_HRESULT(CEE_E_CVTRES_NOT_FOUND)
551 CASE_HRESULT(COR_E_APPDOMAINUNLOADED)
552 CASE_HRESULT(COR_E_CANNOTUNLOADAPPDOMAIN)
553 CASE_HRESULT(MSEE_E_ASSEMBLYLOADINPROGRESS)
554 CASE_HRESULT(COR_E_FIXUPSINEXE)
555 CASE_HRESULT(COR_E_MODULE_HASH_CHECK_FAILED)
556 CASE_HRESULT(FUSION_E_LOADFROM_BLOCKED)
557 CASE_HRESULT(FUSION_E_CACHEFILE_FAILED)
558 CASE_HRESULT(FUSION_E_REF_DEF_MISMATCH)
559 CASE_HRESULT(FUSION_E_INVALID_PRIVATE_ASM_LOCATION)
560 CASE_HRESULT(FUSION_E_ASM_MODULE_MISSING)
561 CASE_HRESULT(FUSION_E_PRIVATE_ASM_DISALLOWED)
562 CASE_HRESULT(FUSION_E_SIGNATURE_CHECK_FAILED)
563 CASE_HRESULT(FUSION_E_INVALID_NAME)
564 CASE_HRESULT(FUSION_E_CODE_DOWNLOAD_DISABLED)
565 CASE_HRESULT(CLDB_E_FILE_BADREAD)
566 CASE_HRESULT(CLDB_E_FILE_BADWRITE)
567 CASE_HRESULT(CLDB_S_TRUNCATION)
568 CASE_HRESULT(CLDB_E_FILE_OLDVER)
569 CASE_HRESULT(CLDB_E_SMDUPLICATE)
570 CASE_HRESULT(CLDB_E_NO_DATA)
571 CASE_HRESULT(CLDB_E_INCOMPATIBLE)
572 CASE_HRESULT(CLDB_E_FILE_CORRUPT)
573 CASE_HRESULT(CLDB_E_BADUPDATEMODE)
574 CASE_HRESULT(CLDB_E_INDEX_NOTFOUND)
575 CASE_HRESULT(CLDB_E_RECORD_NOTFOUND)
576 CASE_HRESULT(CLDB_E_RECORD_OUTOFORDER)
577 CASE_HRESULT(CLDB_E_TOO_BIG)
578 CASE_HRESULT(META_E_BADMETADATA)
579 CASE_HRESULT(META_E_BAD_SIGNATURE)
580 CASE_HRESULT(META_E_BAD_INPUT_PARAMETER)
581 CASE_HRESULT(META_E_CANNOTRESOLVETYPEREF)
582 CASE_HRESULT(META_S_DUPLICATE)
583 CASE_HRESULT(META_E_STRINGSPACE_FULL)
584 CASE_HRESULT(META_E_HAS_UNMARKALL)
585 CASE_HRESULT(META_E_MUST_CALL_UNMARKALL)
586 CASE_HRESULT(META_E_CA_INVALID_TARGET)
587 CASE_HRESULT(META_E_CA_INVALID_VALUE)
588 CASE_HRESULT(META_E_CA_INVALID_BLOB)
589 CASE_HRESULT(META_E_CA_REPEATED_ARG)
590 CASE_HRESULT(META_E_CA_UNKNOWN_ARGUMENT)
591 CASE_HRESULT(META_E_CA_UNEXPECTED_TYPE)
592 CASE_HRESULT(META_E_CA_INVALID_ARGTYPE)
593 CASE_HRESULT(META_E_CA_INVALID_ARG_FOR_TYPE)
594 CASE_HRESULT(META_E_CA_INVALID_UUID)
595 CASE_HRESULT(META_E_CA_INVALID_MARSHALAS_FIELDS)
596 CASE_HRESULT(META_E_CA_NT_FIELDONLY)
597 CASE_HRESULT(META_E_CA_NEGATIVE_PARAMINDEX)
598 CASE_HRESULT(META_E_CA_NEGATIVE_CONSTSIZE)
599 CASE_HRESULT(META_E_CA_FIXEDSTR_SIZE_REQUIRED)
600 CASE_HRESULT(META_E_CA_CUSTMARSH_TYPE_REQUIRED)
601 CASE_HRESULT(META_E_CA_BAD_FRIENDS_ARGS)
602 CASE_HRESULT(VLDTR_E_RID_OUTOFRANGE)
603 CASE_HRESULT(VLDTR_E_STRING_INVALID)
604 CASE_HRESULT(VLDTR_E_GUID_INVALID)
605 CASE_HRESULT(VLDTR_E_BLOB_INVALID)
606 CASE_HRESULT(VLDTR_E_MR_BADCALLINGCONV)
607 CASE_HRESULT(VLDTR_E_SIGNULL)
608 CASE_HRESULT(VLDTR_E_MD_BADCALLINGCONV)
609 CASE_HRESULT(VLDTR_E_MD_THISSTATIC)
610 CASE_HRESULT(VLDTR_E_MD_NOTTHISNOTSTATIC)
611 CASE_HRESULT(VLDTR_E_MD_NOARGCNT)
612 CASE_HRESULT(VLDTR_E_SIG_MISSELTYPE)
613 CASE_HRESULT(VLDTR_E_SIG_MISSTKN)
614 CASE_HRESULT(VLDTR_E_SIG_TKNBAD)
615 CASE_HRESULT(VLDTR_E_SIG_MISSFPTR)
616 CASE_HRESULT(VLDTR_E_SIG_MISSFPTRARGCNT)
617 CASE_HRESULT(VLDTR_E_SIG_MISSRANK)
618 CASE_HRESULT(VLDTR_E_SIG_MISSNSIZE)
619 CASE_HRESULT(VLDTR_E_SIG_MISSSIZE)
620 CASE_HRESULT(VLDTR_E_SIG_MISSNLBND)
621 CASE_HRESULT(VLDTR_E_SIG_MISSLBND)
622 CASE_HRESULT(VLDTR_E_SIG_BADELTYPE)
623 CASE_HRESULT(VLDTR_E_TD_ENCLNOTNESTED)
624 CASE_HRESULT(VLDTR_E_FMD_PINVOKENOTSTATIC)
625 CASE_HRESULT(VLDTR_E_SIG_SENTINMETHODDEF)
626 CASE_HRESULT(VLDTR_E_SIG_SENTMUSTVARARG)
627 CASE_HRESULT(VLDTR_E_SIG_MULTSENTINELS)
628 CASE_HRESULT(VLDTR_E_SIG_MISSARG)
629 CASE_HRESULT(VLDTR_E_SIG_BYREFINFIELD)
630 CASE_HRESULT(VLDTR_E_SIG_BADVOID)
631 CASE_HRESULT(CORDBG_E_UNRECOVERABLE_ERROR)
632 CASE_HRESULT(CORDBG_E_PROCESS_TERMINATED)
633 CASE_HRESULT(CORDBG_E_PROCESS_NOT_SYNCHRONIZED)
634 CASE_HRESULT(CORDBG_E_CLASS_NOT_LOADED)
635 CASE_HRESULT(CORDBG_E_IL_VAR_NOT_AVAILABLE)
636 CASE_HRESULT(CORDBG_E_BAD_REFERENCE_VALUE)
637 CASE_HRESULT(CORDBG_E_FIELD_NOT_AVAILABLE)
638 CASE_HRESULT(CORDBG_E_NON_NATIVE_FRAME)
639 CASE_HRESULT(CORDBG_E_CODE_NOT_AVAILABLE)
640 CASE_HRESULT(CORDBG_E_FUNCTION_NOT_IL)
641 CASE_HRESULT(CORDBG_S_BAD_START_SEQUENCE_POINT)
642 CASE_HRESULT(CORDBG_S_BAD_END_SEQUENCE_POINT)
643 CASE_HRESULT(CORDBG_E_CANT_SET_IP_INTO_FINALLY)
644 CASE_HRESULT(CORDBG_E_CANT_SET_IP_OUT_OF_FINALLY)
645 CASE_HRESULT(CORDBG_E_CANT_SET_IP_INTO_CATCH)
646 CASE_HRESULT(CORDBG_E_SET_IP_NOT_ALLOWED_ON_NONLEAF_FRAME)
647 CASE_HRESULT(CORDBG_E_SET_IP_IMPOSSIBLE)
648 CASE_HRESULT(CORDBG_E_FUNC_EVAL_BAD_START_POINT)
649 CASE_HRESULT(CORDBG_E_INVALID_OBJECT)
650 CASE_HRESULT(CORDBG_E_FUNC_EVAL_NOT_COMPLETE)
651 CASE_HRESULT(CORDBG_S_FUNC_EVAL_HAS_NO_RESULT)
652 CASE_HRESULT(CORDBG_S_VALUE_POINTS_TO_VOID)
653 CASE_HRESULT(CORDBG_S_FUNC_EVAL_ABORTED)
654 CASE_HRESULT(CORDBG_E_STATIC_VAR_NOT_AVAILABLE)
655 CASE_HRESULT(CORDBG_E_CANT_SETIP_INTO_OR_OUT_OF_FILTER)
656 CASE_HRESULT(CORDBG_E_CANT_CHANGE_JIT_SETTING_FOR_ZAP_MODULE)
657 CASE_HRESULT(CORDBG_E_CANT_SET_TO_JMC)
658 CASE_HRESULT(CORDBG_E_BAD_THREAD_STATE)
659 CASE_HRESULT(CORDBG_E_DEBUGGER_ALREADY_ATTACHED)
660 CASE_HRESULT(CORDBG_E_SUPERFLOUS_CONTINUE)
661 CASE_HRESULT(CORDBG_E_SET_VALUE_NOT_ALLOWED_ON_NONLEAF_FRAME)
662 CASE_HRESULT(CORDBG_E_ENC_MODULE_NOT_ENC_ENABLED)
663 CASE_HRESULT(CORDBG_E_SET_IP_NOT_ALLOWED_ON_EXCEPTION)
664 CASE_HRESULT(CORDBG_E_VARIABLE_IS_ACTUALLY_LITERAL)
665 CASE_HRESULT(CORDBG_E_PROCESS_DETACHED)
666 CASE_HRESULT(CORDBG_E_ENC_CANT_ADD_FIELD_TO_VALUE_OR_LAYOUT_CLASS)
667 CASE_HRESULT(CORDBG_E_FIELD_NOT_STATIC)
668 CASE_HRESULT(CORDBG_E_FIELD_NOT_INSTANCE)
669 CASE_HRESULT(CORDBG_E_ENC_JIT_CANT_UPDATE)
670 CASE_HRESULT(CORDBG_E_ENC_INTERNAL_ERROR)
671 CASE_HRESULT(CORDBG_E_ENC_HANGING_FIELD)
672 CASE_HRESULT(CORDBG_E_MODULE_NOT_LOADED)
673 CASE_HRESULT(CORDBG_E_UNABLE_TO_SET_BREAKPOINT)
674 CASE_HRESULT(CORDBG_E_DEBUGGING_NOT_POSSIBLE)
675 CASE_HRESULT(CORDBG_E_KERNEL_DEBUGGER_ENABLED)
676 CASE_HRESULT(CORDBG_E_KERNEL_DEBUGGER_PRESENT)
677 CASE_HRESULT(CORDBG_E_INCOMPATIBLE_PROTOCOL)
678 CASE_HRESULT(CORDBG_E_TOO_MANY_PROCESSES)
679 CASE_HRESULT(CORDBG_E_INTEROP_NOT_SUPPORTED)
680 CASE_HRESULT(CORDBG_E_NO_REMAP_BREAKPIONT)
681 CASE_HRESULT(CORDBG_E_OBJECT_NEUTERED)
682 CASE_HRESULT(CORPROF_E_FUNCTION_NOT_COMPILED)
683 CASE_HRESULT(CORPROF_E_DATAINCOMPLETE)
684 CASE_HRESULT(CORPROF_E_FUNCTION_NOT_IL)
685 CASE_HRESULT(CORPROF_E_NOT_MANAGED_THREAD)
686 CASE_HRESULT(CORPROF_E_CALL_ONLY_FROM_INIT)
687 CASE_HRESULT(CORPROF_E_NOT_YET_AVAILABLE)
688 CASE_HRESULT(SECURITY_E_INCOMPATIBLE_SHARE)
689 CASE_HRESULT(SECURITY_E_UNVERIFIABLE)
690 CASE_HRESULT(SECURITY_E_INCOMPATIBLE_EVIDENCE)
691 CASE_HRESULT(CLDB_E_INTERNALERROR)
692 CASE_HRESULT(CORSEC_E_POLICY_EXCEPTION)
693 CASE_HRESULT(CORSEC_E_MIN_GRANT_FAIL)
694 CASE_HRESULT(CORSEC_E_NO_EXEC_PERM)
695 CASE_HRESULT(CORSEC_E_XMLSYNTAX)
696 CASE_HRESULT(CORSEC_E_INVALID_STRONGNAME)
697 CASE_HRESULT(CORSEC_E_MISSING_STRONGNAME)
698 CASE_HRESULT(CORSEC_E_INVALID_IMAGE_FORMAT)
699 CASE_HRESULT(CORSEC_E_CRYPTO)
700 CASE_HRESULT(CORSEC_E_CRYPTO_UNEX_OPER)
701 CASE_HRESULT(CORSECATTR_E_BAD_ACTION)
702 CASE_HRESULT(COR_E_APPLICATION)
703 CASE_HRESULT(COR_E_ARGUMENTOUTOFRANGE)
704 CASE_HRESULT(COR_E_ARITHMETIC)
705 CASE_HRESULT(COR_E_ARRAYTYPEMISMATCH)
706 CASE_HRESULT(COR_E_CONTEXTMARSHAL)
707 CASE_HRESULT(COR_E_TIMEOUT)
708 CASE_HRESULT(COR_E_DIVIDEBYZERO)
709 CASE_HRESULT(COR_E_EXCEPTION)
710 CASE_HRESULT(COR_E_EXECUTIONENGINE)
711 CASE_HRESULT(COR_E_FIELDACCESS)
712 CASE_HRESULT(COR_E_FORMAT)
713 CASE_HRESULT(COR_E_BADIMAGEFORMAT)
714 CASE_HRESULT(COR_E_ASSEMBLYEXPECTED)
715 CASE_HRESULT(COR_E_TYPEUNLOADED)
716 CASE_HRESULT(COR_E_INDEXOUTOFRANGE)
717 CASE_HRESULT(COR_E_INVALIDOPERATION)
718 CASE_HRESULT(COR_E_INVALIDPROGRAM)
719 CASE_HRESULT(COR_E_MEMBERACCESS)
720 CASE_HRESULT(COR_E_METHODACCESS)
721 CASE_HRESULT(COR_E_MISSINGFIELD)
722 CASE_HRESULT(COR_E_MISSINGMANIFESTRESOURCE)
723 CASE_HRESULT(COR_E_MISSINGMEMBER)
724 CASE_HRESULT(COR_E_MISSINGMETHOD)
725 CASE_HRESULT(COR_E_MULTICASTNOTSUPPORTED)
726 CASE_HRESULT(COR_E_NOTFINITENUMBER)
727 CASE_HRESULT(COR_E_DUPLICATEWAITOBJECT)
728 CASE_HRESULT(COR_E_PLATFORMNOTSUPPORTED)
729 CASE_HRESULT(COR_E_NOTSUPPORTED)
730 CASE_HRESULT(COR_E_OVERFLOW)
731 CASE_HRESULT(COR_E_RANK)
732 CASE_HRESULT(COR_E_SECURITY)
733 CASE_HRESULT(COR_E_SERIALIZATION)
734 CASE_HRESULT(COR_E_STACKOVERFLOW)
735 CASE_HRESULT(COR_E_SYNCHRONIZATIONLOCK)
736 CASE_HRESULT(COR_E_SYSTEM)
737 CASE_HRESULT(COR_E_THREADABORTED)
738 CASE_HRESULT(COR_E_THREADINTERRUPTED)
739 CASE_HRESULT(COR_E_THREADSTATE)
740 CASE_HRESULT(COR_E_THREADSTOP)
741 CASE_HRESULT(COR_E_TYPEINITIALIZATION)
742 CASE_HRESULT(COR_E_TYPELOAD)
743 CASE_HRESULT(COR_E_ENTRYPOINTNOTFOUND)
744 CASE_HRESULT(COR_E_DLLNOTFOUND)
745 CASE_HRESULT(COR_E_VERIFICATION)
746 CASE_HRESULT(COR_E_INVALIDCOMOBJECT)
747 CASE_HRESULT(COR_E_MARSHALDIRECTIVE)
748 CASE_HRESULT(COR_E_INVALIDOLEVARIANTTYPE)
749 CASE_HRESULT(COR_E_SAFEARRAYTYPEMISMATCH)
750 CASE_HRESULT(COR_E_SAFEARRAYRANKMISMATCH)
751 CASE_HRESULT(COR_E_INVALIDFILTERCRITERIA)
752 CASE_HRESULT(COR_E_REFLECTIONTYPELOAD)
753 CASE_HRESULT(COR_E_TARGET)
754 CASE_HRESULT(COR_E_TARGETINVOCATION)
755 CASE_HRESULT(COR_E_CUSTOMATTRIBUTEFORMAT)
756 CASE_HRESULT(COR_E_ENDOFSTREAM)
757 CASE_HRESULT(COR_E_FILELOAD)
758 CASE_HRESULT(COR_E_FILENOTFOUND)
759 CASE_HRESULT(COR_E_IO)
760 CASE_HRESULT(COR_E_DIRECTORYNOTFOUND)
761 CASE_HRESULT(COR_E_PATHTOOLONG)
762 CASE_HRESULT(COR_E_OBJECTDISPOSED)
763 CASE_HRESULT(COR_E_NEWER_RUNTIME)
764 CASE_HRESULT(CLR_E_SHIM_RUNTIMELOAD)
765 CASE_HRESULT(VER_E_FIELD_SIG)
766 CASE_HRESULT(CORDBG_E_THREAD_NOT_SCHEDULED)
767#endif
768
769 default:
770 return NULL;
771 }
772}
773#ifdef _PREFAST_
774#pragma warning(pop)
775#endif
776
777
778// ---------------------------------------------------------------------------
779// HRException class. Implements exception API for exceptions from HRESULTS
780// ---------------------------------------------------------------------------
781
782HRESULT HRException::GetHR()
783{
784 LIMITED_METHOD_DAC_CONTRACT;
785 return m_hr;
786}
787
788// ---------------------------------------------------------------------------
789// COMException class. - moved to COMEx.cpp
790// ---------------------------------------------------------------------------
791
792// ---------------------------------------------------------------------------
793// SEHException class. Implements exception API for SEH exception info
794// ---------------------------------------------------------------------------
795
796HRESULT SEHException::GetHR()
797{
798 LIMITED_METHOD_DAC_CONTRACT;
799
800 if (IsComPlusException(&m_exception)) // EE exception
801 return (HRESULT) m_exception.ExceptionInformation[0];
802 else
803 return m_exception.ExceptionCode;
804}
805
806IErrorInfo *SEHException::GetErrorInfo()
807{
808 LIMITED_METHOD_CONTRACT;
809 return NULL;
810}
811
812void SEHException::GetMessage(SString &string)
813{
814 WRAPPER_NO_CONTRACT;
815
816 if (IsComPlusException(&m_exception)) // EE exception
817 {
818 GenerateTopLevelHRExceptionMessage(GetHR(), string);
819 }
820 else
821 {
822 if (m_exception.ExceptionCode != 0)
823 {
824 string.Printf("Exception code 0x%.8x", m_exception.ExceptionCode);
825 }
826 else
827 {
828 // If we don't have a valid exception code, then give a generic message that's a little nicer than
829 // "code 0x00000000".
830 string.Printf("Unknown exception");
831 }
832 }
833}
834
835//==============================================================================
836// DelegatingException class. Implements exception API for "foreign" exceptions.
837//==============================================================================
838
839DelegatingException::DelegatingException()
840 : m_delegatedException((Exception*)DELEGATE_NOT_YET_SET)
841{
842 LIMITED_METHOD_DAC_CONTRACT;
843} // DelegatingException::DelegatingException()
844
845//------------------------------------------------------------------------------
846DelegatingException::~DelegatingException()
847{
848 WRAPPER_NO_CONTRACT;
849
850 // If there is a valid delegate pointer (inited and non-NULL), delete it.
851 if (IsDelegateValid())
852 Delete(m_delegatedException);
853
854 // Avoid confusion.
855 m_delegatedException = NULL;
856} // DelegatingException::~DelegatingException()
857
858//------------------------------------------------------------------------------
859// Retrieve the delegating exception, or get one from the Thread, or get NULL.
860Exception* DelegatingException::GetDelegate()
861{
862 WRAPPER_NO_CONTRACT;
863
864 // If we haven't gotten the exception pointer before..
865 if (!IsDelegateSet())
866 {
867 // .. get it now. NULL in case there isn't one and we take default action.
868 m_delegatedException = NULL;
869 GetLastThrownObjectExceptionFromThread(reinterpret_cast<void**>(&m_delegatedException));
870 }
871
872 return m_delegatedException;
873} // Exception* DelegatingException::GetDelegate()
874
875//------------------------------------------------------------------------------
876// Virtual overrides
877HRESULT DelegatingException::GetHR()
878{
879 WRAPPER_NO_CONTRACT;
880 SUPPORTS_DAC_HOST_ONLY;
881
882 // Retrieve any delegating exception.
883 Exception *pDelegate = GetDelegate();
884
885 // If there is a delegate exception, defer to it. Otherwise,
886 // default to E_FAIL.
887 return pDelegate ? pDelegate->GetHR() : E_FAIL;
888
889} // HRESULT DelegatingException::GetHR()
890
891//------------------------------------------------------------------------------
892IErrorInfo *DelegatingException::GetErrorInfo()
893{
894 WRAPPER_NO_CONTRACT;
895
896 // Retrieve any delegating exception.
897 Exception *pDelegate = GetDelegate();
898
899 // If there is a delegate exception, defer to it. Otherwise,
900 // default to NULL.
901 return pDelegate ? pDelegate->GetErrorInfo() : NULL;
902
903} // IErrorInfo *DelegatingException::GetErrorInfo()
904
905//------------------------------------------------------------------------------
906void DelegatingException::GetMessage(SString &result)
907{
908 WRAPPER_NO_CONTRACT;
909
910 // Retrieve any delegating exception.
911 Exception *pDelegate = GetDelegate();
912
913 // If there is a delegate exception, defer to it. Otherwise,
914 // default to a generic message.
915 if (pDelegate)
916 {
917 pDelegate->GetMessage(result);
918 }
919 else
920 {
921 // If we don't have a valid exception code, then give a generic message
922 // that's a little nicer than "code 0x00000000".
923 result.Printf("Unknown exception");
924 }
925} // void DelegatingException::GetMessage()
926
927//------------------------------------------------------------------------------
928Exception *DelegatingException::Clone()
929{
930 WRAPPER_NO_CONTRACT;
931
932 // Clone the base exception, this will also take care of cloning the inner
933 // exception if there is one.
934 NewHolder<DelegatingException> retExcep((DelegatingException*)Exception::Clone());
935
936 // If there is a valid delegating exception...
937 if (IsDelegateValid())
938 { // ... clone it.
939 retExcep->m_delegatedException = m_delegatedException->Clone();
940 }
941 else
942 { // ... but if there is not, just copy -- either NULL or DELEGATE_NOT_YET_SET
943 retExcep->m_delegatedException = m_delegatedException;
944 }
945
946 retExcep.SuppressRelease();
947 return retExcep;
948} // virtual Exception *DelegatingException::Clone()
949
950//==============================================================================
951//==============================================================================
952
953void DECLSPEC_NORETURN ThrowHR(HRESULT hr)
954{
955 WRAPPER_NO_CONTRACT;
956
957 STRESS_LOG1(LF_EH, LL_INFO100, "ThrowHR: HR = %x\n", hr);
958
959 if (hr == E_OUTOFMEMORY)
960 ThrowOutOfMemory();
961
962 // Catchers assume only failing hresults
963 _ASSERTE(FAILED(hr));
964 if (hr == S_OK)
965 hr = E_FAIL;
966
967 EX_THROW(HRException, (hr));
968}
969
970void DECLSPEC_NORETURN ThrowHR(HRESULT hr, SString const &msg)
971{
972 STATIC_CONTRACT_SO_TOLERANT;
973 WRAPPER_NO_CONTRACT;
974
975 STRESS_LOG1(LF_EH, LL_INFO100, "ThrowHR: HR = %x\n", hr);
976
977 if (hr == E_OUTOFMEMORY)
978 ThrowOutOfMemory();
979
980 // Catchers assume only failing hresults
981 _ASSERTE(FAILED(hr));
982 if (hr == S_OK)
983 hr = E_FAIL;
984
985 EX_THROW(HRMsgException, (hr, msg));
986}
987
988void DECLSPEC_NORETURN ThrowHR(HRESULT hr, UINT uText)
989{
990 WRAPPER_NO_CONTRACT;
991 SUPPORTS_DAC_HOST_ONLY;
992
993 if (hr == E_OUTOFMEMORY)
994 ThrowOutOfMemory();
995
996 // Catchers assume only failing hresults
997 _ASSERTE(FAILED(hr));
998 if (hr == S_OK)
999 hr = E_FAIL;
1000
1001 SString sExceptionText;
1002
1003 // We won't check the return value here. If it fails, we'll just
1004 // throw the HR
1005 sExceptionText.LoadResource(CCompRC::Error, uText);
1006
1007 EX_THROW(HRMsgException, (hr, sExceptionText));
1008}
1009
1010void DECLSPEC_NORETURN ThrowWin32(DWORD err)
1011{
1012 STATIC_CONTRACT_SO_TOLERANT;
1013 WRAPPER_NO_CONTRACT;
1014 if (err == ERROR_NOT_ENOUGH_MEMORY)
1015 {
1016 ThrowOutOfMemory();
1017 }
1018 else
1019 {
1020 ThrowHR(HRESULT_FROM_WIN32(err));
1021 }
1022}
1023
1024void DECLSPEC_NORETURN ThrowLastError()
1025{
1026 WRAPPER_NO_CONTRACT;
1027 SUPPORTS_DAC;
1028
1029 ThrowWin32(GetLastError());
1030}
1031
1032void DECLSPEC_NORETURN ThrowOutOfMemory()
1033{
1034 CONTRACTL
1035 {
1036 THROWS;
1037 GC_NOTRIGGER;
1038 SO_TOLERANT;
1039 SUPPORTS_DAC;
1040 }
1041 CONTRACTL_END;
1042
1043#ifndef DACCESS_COMPILE
1044
1045 // Use volatile store to prevent compiler from optimizing the static variable away
1046 VolatileStoreWithoutBarrier<HRESULT>(&g_hrFatalError, COR_E_OUTOFMEMORY);
1047
1048 // Regular CLR builds - throw our pre-created OOM exception object
1049 PAL_CPP_THROW(Exception *, Exception::GetOOMException());
1050
1051#else
1052
1053 // DAC builds - raise a DacError
1054 DacError(E_OUTOFMEMORY);
1055
1056 // DacError always throws but isn't marked DECLSPEC_NORETURN so we have to
1057 // tell the compiler that this code is unreachable. We could mark DacError
1058 // (and DacNotImpl) as DECLSPEC_NORETURN, but then we've have to update a
1059 // lot of code where we do something afterwards. Also, due to inlining,
1060 // we'd sometimes have to change functions which call functions that only
1061 // call DacNotImpl. I have these changes in a bbpack and some of them look
1062 // nice, but I'm not sure if it's worth the risk of merge conflicts.
1063 UNREACHABLE();
1064
1065#endif
1066}
1067
1068#include "corexcep.h"
1069
1070#ifdef FEATURE_STACK_PROBE
1071void DECLSPEC_NORETURN ThrowStackOverflow()
1072{
1073 CONTRACTL
1074 {
1075 // This should be throws... But it isn't because a SO doesn't technically
1076 // fall into the same THROW/NOTHROW conventions as the rest of the contract
1077 // infrastructure.
1078 NOTHROW;
1079
1080 GC_NOTRIGGER;
1081 SO_TOLERANT;
1082 SUPPORTS_DAC;
1083 }
1084 CONTRACTL_END;
1085
1086 //g_hrFatalError=COR_E_STACKOVERFLOW;
1087 PTR_INT32 p_ghrFatalError = dac_cast<PTR_INT32>(GVAL_ADDR(g_hrFatalError));
1088 _ASSERTE(p_ghrFatalError != NULL);
1089 *p_ghrFatalError = COR_E_STACKOVERFLOW;
1090
1091
1092 RaiseException(EXCEPTION_SOFTSO, 0, 0, NULL);
1093 UNREACHABLE();
1094}
1095#endif
1096
1097void DECLSPEC_NORETURN ThrowMessage(LPCSTR string, ...)
1098{
1099 CONTRACTL
1100 {
1101 THROWS;
1102 GC_NOTRIGGER;
1103 SO_TOLERANT;
1104 }
1105 CONTRACTL_END;
1106
1107 StackSString message;
1108
1109 va_list args;
1110 va_start(args, string);
1111 message.VPrintf(string, args);
1112 va_end(args);
1113
1114 EX_THROW(HRMsgException, (E_FAIL, message));
1115}
1116
1117
1118//--------------------------------------------------------------------------------
1119// Helper for EX_THROW_WITH_INNER()
1120//
1121// Clones an exception into the current domain. Also handles special cases for
1122// OOM and other stuff. Making this a function so we don't inline all this logic
1123// every place we call EX_THROW_WITH_INNER.
1124//
1125// If the "inner" is a transient exception such as OOM or ThreadAbort, this function
1126// will just throw it rather than allow it to be wrapped in another exception.
1127//--------------------------------------------------------------------------------
1128Exception *ExThrowWithInnerHelper(Exception *inner)
1129{
1130 CONTRACTL
1131 {
1132 THROWS;
1133 GC_NOTRIGGER;
1134 }
1135 CONTRACTL_END
1136
1137 // Yes, NULL is a legal case. Makes it easier to author uniform helpers for
1138 // both wrapped and normal exceptions.
1139 if (inner == NULL)
1140 {
1141 return NULL;
1142 }
1143
1144 if (inner == Exception::GetOOMException())
1145 {
1146 // We don't want to do allocations if we're already throwing an OOM!
1147 PAL_CPP_THROW(Exception*, inner);
1148 }
1149
1150 inner = inner->DomainBoundClone();
1151
1152 // It isn't useful to wrap OOMs and StackOverflows in other exceptions. Just throw them now.
1153 //
1154 if (inner->IsTransient())
1155 {
1156 PAL_CPP_THROW(Exception*, inner);
1157 }
1158 return inner;
1159}
1160
1161#ifdef _DEBUG
1162
1163#ifdef _MSC_VER
1164#pragma optimize("", off)
1165#endif // _MSC_VER
1166
1167void ExThrowTrap(const char *fcn, const char *file, int line, const char *szType, HRESULT hr, const char *args)
1168{
1169 SUPPORTS_DAC;
1170 return;
1171}
1172
1173#ifdef _MSC_VER
1174#pragma optimize("", on)
1175#endif // _MSC_VER
1176
1177#endif
1178
1179
1180
1181
1182//-------------------------------------------------------------------------------------------
1183// This routine will generate the most descriptive possible error message for an hresult.
1184// It will generate at minimum the hex value. It will also try to generate the symbolic name
1185// (E_POINTER) and the friendly description (from the message tables.)
1186//
1187// bNoGeekStuff suppresses hex HR codes. Use this sparingly as most error strings generated by the
1188// CLR are aimed at developers, not end-users.
1189//-------------------------------------------------------------------------------------------
1190void GetHRMsg(HRESULT hr, SString &result, BOOL bNoGeekStuff/* = FALSE*/)
1191{
1192 CONTRACTL
1193 {
1194 GC_NOTRIGGER;
1195 THROWS;
1196 }
1197 CONTRACTL_END;
1198
1199 result = W(""); // Make sure this routine isn't an inadvertent data-leak exploit!
1200
1201
1202
1203 SString strDescr;
1204 BOOL fHaveDescr = FALSE;
1205
1206 if (FAILED(hr) && HRESULT_FACILITY(hr) == FACILITY_URT && HRESULT_CODE(hr) < MAX_URT_HRESULT_CODE)
1207 {
1208 fHaveDescr = strDescr.LoadResource(CCompRC::Error, MSG_FOR_URT_HR(hr));
1209 }
1210 else
1211 {
1212 DWORD dwFlags = FORMAT_MESSAGE_FROM_SYSTEM;
1213 dwFlags |= FORMAT_MESSAGE_MAX_WIDTH_MASK;
1214
1215#if FEATURE_USE_LCID
1216 fHaveDescr = strDescr.FormatMessage(dwFlags, 0, hr, LANG_USER_DEFAULT);
1217#else
1218 fHaveDescr = strDescr.FormatMessage(dwFlags, 0, hr, 0);
1219#endif
1220 }
1221
1222 LPCSTR name = Exception::GetHRSymbolicName(hr);
1223
1224 // If we can't get a resource string, print the hresult regardless.
1225 if (!fHaveDescr)
1226 {
1227 bNoGeekStuff = FALSE;
1228 }
1229
1230 if (fHaveDescr)
1231 {
1232 result.Append(strDescr);
1233 }
1234
1235
1236 if (!bNoGeekStuff)
1237 {
1238 if (fHaveDescr)
1239 {
1240 result.Append(W(" ("));
1241 }
1242
1243 SString strExcepFromHR;
1244 strExcepFromHR.LoadResource(CCompRC::Error, IDS_EE_EXCEPTION_FROM_HRESULT);
1245 result.Append(strExcepFromHR);
1246 result.AppendPrintf(W("0x%.8X"), hr);
1247 if (name != NULL)
1248 {
1249 result.AppendPrintf(W(" (%S)"), name);
1250 }
1251
1252
1253 if (fHaveDescr)
1254 {
1255 result.Append(W(")"));
1256 }
1257
1258 }
1259}
1260
1261
1262//-------------------------------------------------------------------------------------------
1263// Similar to GetHRMsg but phrased for top-level exception message.
1264//-------------------------------------------------------------------------------------------
1265void GenerateTopLevelHRExceptionMessage(HRESULT hresult, SString &result)
1266{
1267 CONTRACTL
1268 {
1269 GC_NOTRIGGER;
1270 THROWS;
1271 }
1272 CONTRACTL_END;
1273
1274 result = W(""); // Make sure this routine isn't an inadvertent data-leak exploit!
1275
1276 GetHRMsg(hresult, result);
1277}
1278
1279#if !defined(DACCESS_COMPILE)
1280
1281void GetCurrentExceptionPointers(PEXCEPTION_POINTERS pExceptionInfo)
1282{
1283 WRAPPER_NO_CONTRACT;
1284
1285 PEXCEPTION_RECORD pRecord = (PEXCEPTION_RECORD)ClrFlsGetValue(TlsIdx_PEXCEPTION_RECORD);
1286 PCONTEXT pContext = (PCONTEXT)ClrFlsGetValue(TlsIdx_PCONTEXT);
1287
1288 pExceptionInfo->ContextRecord = pContext;
1289 pExceptionInfo->ExceptionRecord = pRecord;
1290
1291#ifdef _DEBUG
1292 if (pRecord != NULL)
1293 {
1294 _ASSERTE ((PVOID)(pRecord) > (PVOID)(&pRecord));
1295 }
1296#endif
1297}
1298#endif // !defined(DACCESS_COMPILE)
1299
1300DWORD GetCurrentExceptionCode()
1301{
1302 WRAPPER_NO_CONTRACT;
1303 SUPPORTS_DAC_HOST_ONLY;
1304
1305 return (DWORD)(size_t)ClrFlsGetValue(TlsIdx_EXCEPTION_CODE);
1306}
1307
1308bool IsCurrentExceptionSO()
1309{
1310 WRAPPER_NO_CONTRACT;
1311 DWORD exceptionCode = GetCurrentExceptionCode();
1312 return IsSOExceptionCode(exceptionCode);
1313}
1314
1315bool IsSOExceptionCode(DWORD exceptionCode)
1316{
1317 if (exceptionCode == STATUS_STACK_OVERFLOW
1318#ifdef FEATURE_STACK_PROBE
1319 || exceptionCode == EXCEPTION_SOFTSO
1320#endif
1321 )
1322 {
1323 return TRUE;
1324 }
1325 else
1326 return FALSE;
1327}
1328
1329
1330//===========================================================================================
1331// These abstractions hide the difference between legacy desktop CLR's (that don't support
1332// side-by-side-inproc and rely on a fixed SEH code to identify managed exceptions) and
1333// new CLR's that support side-by-side inproc.
1334//
1335// The new CLR's use a different set of SEH codes to avoid conflicting with the legacy CLR's.
1336// In addition, to distinguish between EH's raised by different inproc instances of the CLR,
1337// the module handle of the owning CLR is stored in ExceptionRecord.ExceptionInformation[4].
1338//
1339// (Note: all existing SEH's use either only slot [0] or no slots at all. We are leaving
1340// slots [1] thru [3] open for future expansion.)
1341//===========================================================================================
1342
1343// Is this exception code one of the special CLR-specific SEH codes that participate in the
1344// instance-tagging scheme?
1345BOOL IsInstanceTaggedSEHCode(DWORD dwExceptionCode)
1346{
1347 LIMITED_METHOD_DAC_CONTRACT;
1348
1349 return dwExceptionCode == EXCEPTION_COMPLUS;
1350}
1351
1352// This set of overloads generates the NumberParameters and ExceptionInformation[] array to
1353// pass to RaiseException().
1354//
1355// Parameters:
1356// exceptionArgs: a fixed-size array of size INSTANCE_TAGGED_SEH_PARAM_ARRAY_SIZE.
1357// This will get filled in by this function. (The module handle goes
1358// in the last slot if this is a side-by-side-inproc enabled build.)
1359//
1360// exceptionArg1... up to four arguments that go in slots [0]..[3]. These depends
1361// the specific requirements of your exception code.
1362//
1363// Returns:
1364// The NumberParameters to pass to RaiseException().
1365//
1366// Basically, this is either INSTANCE_TAGGED_SEH_PARAM_ARRAY_SIZE or the count of your
1367// fixed arguments depending on whether this tagged-SEH-enabled build.
1368//
1369// This function is not permitted to fail.
1370
1371// (the existing system can support more overloads up to 4 fixed arguments but we don't need them at this time.)
1372
1373static DWORD MarkAsThrownByUsWorker(UINT numArgs, /*out*/ ULONG_PTR exceptionArgs[INSTANCE_TAGGED_SEH_PARAM_ARRAY_SIZE], ULONG_PTR arg0 = 0)
1374{
1375 STATIC_CONTRACT_NOTHROW;
1376 STATIC_CONTRACT_GC_NOTRIGGER;
1377 STATIC_CONTRACT_FORBID_FAULT;
1378
1379
1380 _ASSERTE(numArgs < INSTANCE_TAGGED_SEH_PARAM_ARRAY_SIZE);
1381 FillMemory(exceptionArgs, sizeof(ULONG_PTR) * INSTANCE_TAGGED_SEH_PARAM_ARRAY_SIZE, 0);
1382
1383 exceptionArgs[0] = arg0;
1384
1385#if !defined(FEATURE_UTILCODE_NO_DEPENDENCIES)
1386 exceptionArgs[INSTANCE_TAGGED_SEH_PARAM_ARRAY_SIZE - 1] = (ULONG_PTR) (GetCLRModule());
1387#endif // !defined(FEATURE_UTILCODE_NO_DEPENDENCIES)
1388
1389 return INSTANCE_TAGGED_SEH_PARAM_ARRAY_SIZE;
1390}
1391
1392DWORD MarkAsThrownByUs(/*out*/ ULONG_PTR exceptionArgs[INSTANCE_TAGGED_SEH_PARAM_ARRAY_SIZE])
1393{
1394 STATIC_CONTRACT_NOTHROW;
1395 STATIC_CONTRACT_GC_NOTRIGGER;
1396 STATIC_CONTRACT_FORBID_FAULT;
1397
1398 return MarkAsThrownByUsWorker(0, exceptionArgs);
1399}
1400
1401DWORD MarkAsThrownByUs(/*out*/ ULONG_PTR exceptionArgs[INSTANCE_TAGGED_SEH_PARAM_ARRAY_SIZE], ULONG_PTR arg0)
1402{
1403 STATIC_CONTRACT_NOTHROW;
1404 STATIC_CONTRACT_GC_NOTRIGGER;
1405 STATIC_CONTRACT_FORBID_FAULT;
1406
1407 return MarkAsThrownByUsWorker(1, exceptionArgs, arg0);
1408}
1409
1410// Given an exception record, checks if it's exception code matches a specific exception code
1411// *and* whether it was tagged by the calling instance of the CLR.
1412//
1413// If this is a non-tagged-SEH-enabled build, it is blindly assumed to be tagged by the
1414// calling instance of the CLR.
1415BOOL WasThrownByUs(const EXCEPTION_RECORD *pcER, DWORD dwExceptionCode)
1416{
1417 STATIC_CONTRACT_NOTHROW;
1418 STATIC_CONTRACT_GC_NOTRIGGER;
1419 STATIC_CONTRACT_FORBID_FAULT;
1420 STATIC_CONTRACT_SO_TOLERANT;
1421 STATIC_CONTRACT_SUPPORTS_DAC;
1422
1423 _ASSERTE(IsInstanceTaggedSEHCode(dwExceptionCode));
1424 _ASSERTE(pcER != NULL);
1425 if (dwExceptionCode != pcER->ExceptionCode)
1426 {
1427 return FALSE;
1428 }
1429
1430 if (pcER->NumberParameters != INSTANCE_TAGGED_SEH_PARAM_ARRAY_SIZE)
1431 {
1432 return FALSE;
1433 }
1434#if!defined(FEATURE_UTILCODE_NO_DEPENDENCIES)
1435 if ( ((ULONG_PTR)(GetCLRModule())) != pcER->ExceptionInformation[INSTANCE_TAGGED_SEH_PARAM_ARRAY_SIZE - 1] )
1436 {
1437 return FALSE;
1438 }
1439 return TRUE;
1440#else // !(!defined(FEATURE_UTILCODE_NO_DEPENDENCIES)
1441 return FALSE;
1442#endif // !defined(FEATURE_UTILCODE_NO_DEPENDENCIES)
1443}
1444
1445
1446
1447//-----------------------------------------------------------------------------------
1448// The following group wraps the basic abstracts specifically for EXCEPTION_COMPLUS.
1449//-----------------------------------------------------------------------------------
1450BOOL IsComPlusException(const EXCEPTION_RECORD *pcER)
1451{
1452 STATIC_CONTRACT_WRAPPER;
1453
1454 return WasThrownByUs(pcER, EXCEPTION_COMPLUS);
1455}
1456
1457VOID RaiseComPlusException()
1458{
1459 STATIC_CONTRACT_THROWS;
1460 STATIC_CONTRACT_GC_NOTRIGGER;
1461 STATIC_CONTRACT_FORBID_FAULT;
1462
1463
1464 ULONG_PTR exceptionArgs[INSTANCE_TAGGED_SEH_PARAM_ARRAY_SIZE];
1465 DWORD numParams = MarkAsThrownByUs(exceptionArgs);
1466 RaiseException(EXCEPTION_COMPLUS, 0, numParams, exceptionArgs);
1467}
1468
1469//===========================================================================================
1470//===========================================================================================
1471