30#define WIN32_NO_STATUS
44#if _MSVCR_VER>=70 && _MSVCR_VER<=71
58 TRACE(
"unwind table: %p %d\n", unwind_table,
descr->unwind_count );
59 for (
i = 0;
i <
descr->unwind_count;
i++)
61 TRACE(
" %d: prev %d func %p\n",
i, unwind_table[
i].prev,
64 TRACE(
"try table: %p %d\n", tryblock,
descr->tryblock_count );
65 for (
i = 0;
i <
descr->tryblock_count;
i++)
69 TRACE(
" %d: start %d end %d catchlevel %d catch %p %d\n",
i,
70 tryblock[
i].start_level, tryblock[
i].end_level,
71 tryblock[
i].catch_level, catchblock, tryblock[
i].catchblock_count);
75 TRACE(
" %d: flags %x offset %d handler %p",
79 TRACE(
" frame %x", catchblock[
j].frame );
84 TRACE(
"ipmap: %p %d\n", ipmap,
descr->ipmap_count );
85 for (
i = 0;
i <
descr->ipmap_count;
i++)
88 TRACE(
"unwind_help %+d\n",
descr->unwind_help );
113 TRACE(
"matched type %p in catchblock %d\n",
type,
i );
118 void **
dest = (
void **)(frame + catchblock[
i].
offset);
126 TRACE(
"found catch(...) block\n" );
167 int *unwind_help = (
int *)(frame +
descr->unwind_help);
168 int trylevel = unwind_help[0];
172 TRACE(
"current level: %d, last level: %d\n", trylevel, last_level);
173 while (trylevel > last_level)
175 if (trylevel<0 || trylevel>=
descr->unwind_count)
177 ERR(
"invalid trylevel %d\n", trylevel);
180 if (unwind_table[trylevel].
handler)
185 trylevel = unwind_table[trylevel].
prev;
187 unwind_help[0] = trylevel;
217 int *unwind_help = (
int *)(frame +
descr->unwind_help);
220 void *ret_addr =
NULL;
223 ctx.prev_rec = prev_rec;
240 RaiseException(untrans_rec->ExceptionCode, untrans_rec->ExceptionFlags,
241 untrans_rec->NumberParameters, untrans_rec->ExceptionInformation);
281 data->processing_throw++;
282 for (
i=
descr->tryblock_count;
i>0;
i--)
285 in_catch = &in_catch[
i-1];
287 if (trylevel>in_catch->
end_level && trylevel<=in_catch->catch_level)
293 unwind_help = (
int *)(orig_frame +
descr->unwind_help);
294 if (trylevel > unwind_help[1])
295 unwind_help[0] = unwind_help[1] = trylevel;
297 trylevel = unwind_help[1];
298 TRACE(
"current trylevel: %d\n", trylevel);
300 for (
i=0;
i<
descr->tryblock_count;
i++)
303 tryblock = &tryblock[
i];
305 if (trylevel < tryblock->start_level)
continue;
306 if (trylevel > tryblock->
end_level)
continue;
318 memset(&catch_record, 0,
sizeof(catch_record));
335 TRACE(
"no matching catch block found\n");
336 data->processing_throw--;
353 ctx->descr, exc_type,
ctx->orig_frame);
366 ERR(
"noexcept function propagating exception\n");
379 DWORD throw_func_off;
382 int unwindlevel = -1;
386 FIXME(
"unhandled frame magic %x\n",
descr->magic);
399 throw_func =
rtti_rva(throw_func_off, throw_base);
400 TRACE(
"reconstructed handler pointer: %p\n", throw_func);
401 for (
i=
descr->tryblock_count;
i>0;
i--)
404 tryblock = &tryblock[
i-1];
406 if (trylevel>tryblock->
end_level && trylevel<=tryblock->catch_level)
411 catchblock = &catchblock[
j];
417 orig_frame = *(
ULONG_PTR *)(frame + catchblock->frame);
421 TRACE(
"nested exception detected, setting orig_frame to %Ix\n", orig_frame);
436 if (!
descr->tryblock_count)
445 TRACE(
"rethrow detected.\n");
454 TRACE(
"handling C++ exception rec %p frame %Ix descr %p\n", rec, frame,
descr);
464 TRACE(
"handling C exception code %lx rec %p frame %Ix descr %p\n",
467 if (
data->se_translator) {
471 ctx.dest_frame = frame;
472 ctx.orig_frame = orig_frame;
558 switch (
except->ExceptionRecord->ExceptionCode)
599 except->ExceptionRecord->ExceptionCode)
686 TRACE(
"(%d)\n", sig);
814 FIXME(
"(void)stub\n");
845#if _MSVCR_VER>=70 && _MSVCR_VER<=71
857 security_error_handler =
handler;
866 if(security_error_handler)
895 fi->next =
data->frame_info_head;
896 data->frame_info_head = fi;
913 data->frame_info_head =
cur->next;
921 cur->next = fi->next;
926 ERR(
"frame not found, native crashes in this case\n");
955 TRACE(
"(%p)\n", rec);
1024 if(
src->dofree &&
src->what) {
1058void**
CDECL __current_exception_context(
void)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
void dispatch(HANDLE hStopEvent)
INT copy(TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], INT append, DWORD lpdwFlags, BOOL bTouch)
@ ExceptionContinueSearch
enum _EXCEPTION_DISPOSITION EXCEPTION_DISPOSITION
BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add)
VOID WINAPI RaiseException(_In_ DWORD dwExceptionCode, _In_ DWORD dwExceptionFlags, _In_ DWORD nNumberOfArguments, _In_opt_ const ULONG_PTR *lpArguments)
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI DECLSPEC_HOTPATCH SetUnhandledExceptionFilter(IN LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter)
UINT(* handler)(MSIPACKAGE *)
void CDECL terminate(void)
static const char * dbgstr_type_info(const type_info *info)
static const cxx_type_info * find_caught_type(cxx_exception_type *exc_type, uintptr_t base, const type_info *catch_ti, UINT catch_flags)
#define CXX_FRAME_MAGIC_VC7
static void call_dtor(void *func, void *this)
#define CXX_FRAME_MAGIC_VC6
#define TRACE_EXCEPTION_TYPE(type, base)
#define CXX_FRAME_MAGIC_VC8
#define FUNC_DESCR_SYNCHRONOUS
static BOOL is_cxx_exception(EXCEPTION_RECORD *rec)
static void copy_exception(void *object, void **dest, UINT catch_flags, const cxx_type_info *type, uintptr_t base)
void * call_unwind_handler(void *func, uintptr_t frame, DISPATCHER_CONTEXT *dispatch)
int handle_fpieee_flt(__msvcrt_ulong exception_code, EXCEPTION_POINTERS *ep, int(__cdecl *handler)(_FPIEEE_RECORD *))
#define FUNC_DESCR_NOEXCEPT
void * call_catch_handler(EXCEPTION_RECORD *rec)
ULONG_PTR get_exception_pc(DISPATCHER_CONTEXT *dispatch)
static void * rtti_rva(unsigned int rva, uintptr_t base)
static int ip_to_state(const cxx_function_descr *descr, uintptr_t ip, uintptr_t base)
int CDECL __CppXcptFilter(NTSTATUS ex, PEXCEPTION_POINTERS ptr)
int CDECL __CxxExceptionFilter(EXCEPTION_POINTERS *ptrs, const type_info *ti, UINT flags, void **copy)
BOOL CDECL __uncaught_exception(void)
static void check_noexcept(PEXCEPTION_RECORD rec, const cxx_function_descr *descr, BOOL nested)
static void find_catch_block(EXCEPTION_RECORD *rec, CONTEXT *context, EXCEPTION_RECORD *untrans_rec, ULONG_PTR frame, DISPATCHER_CONTEXT *dispatch, const cxx_function_descr *descr, cxx_exception_type *info, ULONG_PTR orig_frame)
static __sighandler_t sighandlers[NSIG]
void CDECL __DestructExceptionObject(EXCEPTION_RECORD *rec)
static void *WINAPI call_catch_block(EXCEPTION_RECORD *rec)
static void cxx_local_unwind(ULONG_PTR frame, DISPATCHER_CONTEXT *dispatch, const cxx_function_descr *descr, int last_level)
EXCEPTION_DISPOSITION CDECL __CxxFrameHandler(EXCEPTION_RECORD *rec, ULONG_PTR frame, CONTEXT *context, DISPATCHER_CONTEXT *dispatch)
static BOOL cxx_is_consolidate(const EXCEPTION_RECORD *rec)
int __cdecl _fpieee_flt(__msvcrt_ulong code, EXCEPTION_POINTERS *ep, int(__cdecl *handler)(_FPIEEE_RECORD *))
static void CALLBACK cxx_catch_cleanup(BOOL normal, void *c)
static const struct @575 float_exception_map[]
frame_info *CDECL _CreateFrameInfo(frame_info *fi, void *obj)
static DWORD cxx_frame_handler(EXCEPTION_RECORD *rec, ULONG_PTR frame, CONTEXT *context, DISPATCHER_CONTEXT *dispatch, const cxx_function_descr *descr)
void msvcrt_free_signals(void)
static LONG CALLBACK se_translation_filter(EXCEPTION_POINTERS *ep, void *c)
static LONG msvcrt_exception_filter(struct _EXCEPTION_POINTERS *except)
void CDECL __CxxUnregisterExceptionObject(cxx_frame_info *frame_info, BOOL in_use)
BOOL CDECL __CxxRegisterExceptionObject(EXCEPTION_POINTERS *ep, cxx_frame_info *frame_info)
int CDECL __intrinsic_abnormal_termination(void)
int CDECL _XcptFilter(NTSTATUS ex, PEXCEPTION_POINTERS ptr)
void **CDECL __pxcptinfoptrs(void)
void dump_function_descr(const cxx_function_descr *descr, uintptr_t base)
void(CDECL * float_handler)(int, int)
BOOL CDECL __CxxDetectRethrow(PEXCEPTION_POINTERS ptrs)
void msvcrt_init_signals(void)
unsigned int CDECL __CxxQueryExceptionSize(void)
void CDECL _FindAndUnlinkFrame(frame_info *fi)
static BOOL WINAPI msvcrt_console_handler(DWORD ctrlType)
BOOL __cdecl _IsExceptionObjectToBeDestroyed(const void *obj)
static LONG CALLBACK cxx_rethrow_filter(PEXCEPTION_POINTERS eptrs, void *c)
void * find_catch_handler(void *object, uintptr_t frame, uintptr_t exc_base, const tryblock_info *tryblock, cxx_exception_type *exc_type, uintptr_t image_base)
void CDECL _exit(int exitcode)
unsigned long __msvcrt_ulong
#define _FPE_STACKOVERFLOW
void(__cdecl * __sighandler_t)(int)
thread_data_t *CDECL msvcrt_get_thread_data(void)
void(__cdecl * MSVCRT_security_error_handler)(int, void *)
void **__cdecl __current_exception(void)
int *__cdecl __processing_throw(void)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
static void * image_base(void)
GLuint GLuint GLsizei GLenum type
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
#define EXCEPTION_EXECUTE_HANDLER
#define EXCEPTION_CONTINUE_SEARCH
#define EXCEPTION_CONTINUE_EXECUTION
#define EXCEPTION_FLT_STACK_CHECK
#define EXCEPTION_FLT_UNDERFLOW
#define EXCEPTION_FLT_OVERFLOW
#define EXCEPTION_FLT_DENORMAL_OPERAND
#define EXCEPTION_FLT_INEXACT_RESULT
#define EXCEPTION_ILLEGAL_INSTRUCTION
#define EXCEPTION_ACCESS_VIOLATION
#define EXCEPTION_FLT_INVALID_OPERATION
#define EXCEPTION_PRIV_INSTRUCTION
#define EXCEPTION_FLT_DIVIDE_BY_ZERO
UINT WINAPI nested(MSIHANDLE hinst)
#define STATUS_FLOAT_UNDERFLOW
#define STATUS_FLOAT_OVERFLOW
#define STATUS_UNWIND_CONSOLIDATE
#define STATUS_FLOAT_DIVIDE_BY_ZERO
#define STATUS_FLOAT_INVALID_OPERATION
#define STATUS_FLOAT_INEXACT_RESULT
NTSYSAPI PRUNTIME_FUNCTION WINAPI RtlLookupFunctionEntry(ULONG_PTR, ULONG_PTR *, UNWIND_HISTORY_TABLE *)
NTSYSAPI void WINAPI RtlUnwindEx(void *, void *, EXCEPTION_RECORD *, void *, CONTEXT *, UNWIND_HISTORY_TABLE *)
PEXCEPTION_RECORD ExceptionRecord
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]
EXCEPTION_RECORD * prev_rec
cxx_frame_info frame_info
DISPATCHER_CONTEXT * dispatch
const cxx_function_descr * descr
EXCEPTION_RECORD * seh_rec
#define EXCEPTION_NONCONTINUABLE
PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER
#define __EXCEPT_CTX(func, ctx)
#define __FINALLY_CTX(func, ctx)
#define EXCEPTION_EXIT_UNWIND
#define EXCEPTION_UNWINDING
#define EXCEPTION_TARGET_UNWIND