28#define WIN32_NO_STATUS
55#define TYPE_FLAG_CONST 1
56#define TYPE_FLAG_VOLATILE 2
57#define TYPE_FLAG_REFERENCE 8
106 return rva ? (
void*)(
base+rva) :
NULL;
113 TRACE(
"flags %x type %x %s offsets %d,%d,%d size %d copy ctor %x(%p)\n",
115 type->offsets.this_offset,
type->offsets.vbase_descr,
type->offsets.vbase_offset,
124 TRACE(
"flags %x destr %x(%p) handler %x(%p) type info %x(%p)\n",
127 type->type_info_table, type_info_table);
128 for (
i = 0;
i < type_info_table->
count;
i++)
143 TRACE(
"unwind table: %x(%p) %d\n",
descr->unwind_table, unwind_table,
descr->unwind_count);
144 for (
i=0;
i<
descr->unwind_count;
i++)
146 TRACE(
" %d: prev %d func %x(%p)\n",
i, unwind_table[
i].prev,
149 TRACE(
"try table: %x(%p) %d\n",
descr->tryblock, tryblock,
descr->tryblock_count);
150 for (
i=0;
i<
descr->tryblock_count;
i++)
154 TRACE(
" %d: start %d end %d catchlevel %d catch %x(%p) %d\n",
i,
155 tryblock[
i].start_level, tryblock[
i].end_level,
156 tryblock[
i].catch_level, tryblock[
i].catchblock,
157 catchblock, tryblock[
i].catchblock_count);
160 TRACE(
" %d: flags %x offset %d handler %x(%p) frame %x type %x %s\n",
168 for (
i=0;
i<
descr->ipmap_count;
i++)
172 TRACE(
"unwind_help %d\n",
descr->unwind_help);
174 TRACE(
"expect list: %x\n",
descr->expect_list);
184 med = low + (high-low)/2;
186 if (ipmap[med].
ip <=
ip && ipmap[med+1].
ip >
ip)
191 if (ipmap[med].
ip <
ip) low = med+1;
196 return ipmap[low].
state;
206 for (
i = 0;
i < type_info_table->
count;
i++)
211 if (!catch_ti)
return type;
234 if (!catch_ti || !catch_ti->
mangled[0])
return;
235 if (!catchblock->
offset)
return;
277 if (unwind_help[0] == -2)
284 trylevel = unwind_help[0];
287 TRACE(
"current level: %d, last level: %d\n", trylevel, last_level);
288 while (trylevel > last_level)
290 if (trylevel<0 || trylevel>=
descr->unwind_count)
292 ERR(
"invalid trylevel %d\n", trylevel);
301 trylevel = unwind_table[trylevel].
prev;
303 unwind_help[0] = trylevel;
337 void *ret_addr =
NULL;
342 ctx.prev_rec = prev_rec;
353 TRACE(
"detect rethrow: exception code: %x\n", prev_rec->ExceptionCode);
365 prev_rec->NumberParameters, prev_rec->ExceptionInformation);
399 data->processing_throw++;
400 for (
i=
descr->tryblock_count;
i>0;
i--)
403 in_catch = &in_catch[
i-1];
405 if (trylevel>in_catch->
end_level && trylevel<=in_catch->catch_level)
412 if (trylevel > unwind_help[1])
413 unwind_help[0] = unwind_help[1] = trylevel;
415 trylevel = unwind_help[1];
416 TRACE(
"current trylevel: %d\n", trylevel);
418 for (
i=0;
i<
descr->tryblock_count;
i++)
421 tryblock = &tryblock[
i];
423 if (trylevel < tryblock->start_level)
continue;
424 if (trylevel > tryblock->
end_level)
continue;
436 catchblock = &catchblock[
j];
445 TRACE(
"matched type %p in tryblock %d catchblock %d\n",
type,
i,
j);
456 TRACE(
"found catch(...) block\n");
460 memset(&catch_record, 0,
sizeof(catch_record));
477 TRACE(
"no matching catch block found\n");
478 data->processing_throw--;
495 ctx->descr, exc_type,
ctx->orig_frame);
508 ERR(
"noexcept function propagating exception\n");
522 DWORD throw_func_off;
525 int unwindlevel = -1;
529 FIXME(
"unhandled frame magic %x\n",
descr->magic);
542 throw_func =
rva_to_ptr(throw_func_off, throw_base);
543 TRACE(
"reconstructed handler pointer: %p\n", throw_func);
544 for (
i=
descr->tryblock_count;
i>0;
i--)
547 tryblock = &tryblock[
i-1];
549 if (trylevel>tryblock->
end_level && trylevel<=tryblock->catch_level)
554 catchblock = &catchblock[
j];
558 TRACE(
"nested exception detected\n");
561 TRACE(
"setting orig_frame to %lx\n", orig_frame);
576 if (!
descr->tryblock_count)
586 TRACE(
"rethrow detected.\n");
594 TRACE(
"handling C++ exception rec %p frame %lx descr %p\n", rec, frame,
descr);
604 TRACE(
"handling C exception code %x rec %p frame %lx descr %p\n",
607 if (
data->se_translator) {
611 ctx.dest_frame = frame;
612 ctx.orig_frame = orig_frame;
750#if _MSVCR_VER>=110 && _MSVCR_VER<=120
757 RUNTIME_FUNCTION *rf;
764 FIXME(
"RtlLookupFunctionEntry failed\n");
773 "movq %rcx,8(%rsp)\n\t"
774 "call " __ASM_NAME(
"RtlCaptureContext")
"\n\t"
775 "movq 8(%rsp),%rcx\n\t"
776 "leaq 8(%rsp),%rax\n\t"
777 "movq %rax,0x98(%rcx)\n\t"
778 "movq (%rsp),%rax\n\t"
779 "movq %rax,0xf8(%rcx)\n\t"
void __cdecl _local_unwind(void *frame, void *target)
#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
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
enum _EXCEPTION_DISPOSITION EXCEPTION_DISPOSITION
VOID WINAPI RaiseException(_In_ DWORD dwExceptionCode, _In_ DWORD dwExceptionFlags, _In_ DWORD nNumberOfArguments, _In_opt_ const ULONG_PTR *lpArguments)
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 CLASS_IS_SIMPLE_TYPE
#define CXX_FRAME_MAGIC_VC7
#define CXX_FRAME_MAGIC_VC6
#define CLASS_HAS_VIRTUAL_BASE_CLASS
#define CXX_FRAME_MAGIC_VC8
#define FUNC_DESCR_SYNCHRONOUS
void dump_function_descr(const cxx_function_descr *descr, uintptr_t base)
static void copy_exception(void *object, void **dest, UINT catch_flags, const cxx_type_info *type, uintptr_t base)
#define FUNC_DESCR_NOEXCEPT
#define TYPE_FLAG_VOLATILE
static void * get_this_pointer(const this_ptr_offsets *off, void *object)
#define TYPE_FLAG_REFERENCE
struct __type_info type_info
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)
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)
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 DWORD cxx_frame_handler(EXCEPTION_RECORD *rec, ULONG_PTR frame, CONTEXT *context, DISPATCHER_CONTEXT *dispatch, const cxx_function_descr *descr)
static LONG CALLBACK se_translation_filter(EXCEPTION_POINTERS *ep, void *c)
void CDECL __CxxUnregisterExceptionObject(cxx_frame_info *frame_info, BOOL in_use)
BOOL CDECL __CxxRegisterExceptionObject(EXCEPTION_POINTERS *ep, cxx_frame_info *frame_info)
int CDECL _XcptFilter(NTSTATUS ex, PEXCEPTION_POINTERS ptr)
BOOL CDECL __CxxDetectRethrow(PEXCEPTION_POINTERS ptrs)
unsigned int CDECL __CxxQueryExceptionSize(void)
static LONG CALLBACK cxx_rethrow_filter(PEXCEPTION_POINTERS eptrs, void *c)
unsigned long __msvcrt_ulong
_ACRTIMP int __cdecl strcmp(const char *, const char *)
thread_data_t *CDECL msvcrt_get_thread_data(void)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
static void * image_base(void)
GLuint GLuint GLsizei count
GLuint GLuint GLsizei GLenum type
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
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 UNW_FLAG_NHANDLER
#define EXCEPTION_EXECUTE_HANDLER
#define EXCEPTION_CONTINUE_SEARCH
#define memmove(s1, s2, n)
UINT WINAPI nested(MSIHANDLE hinst)
#define __ASM_GLOBAL_FUNC(name, code)
#define STATUS_UNWIND_CONSOLIDATE
void * rva_to_ptr(unsigned char *buffer, PIMAGE_NT_HEADERS nt_header, DWORD rva)
NTSYSAPI PEXCEPTION_ROUTINE WINAPI RtlVirtualUnwind(ULONG, ULONG_PTR, ULONG_PTR, RUNTIME_FUNCTION *, CONTEXT *, void **, ULONG_PTR *, KNONVOLATILE_CONTEXT_POINTERS *)
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
struct _EXCEPTION_RECORD * ExceptionRecord
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]
const tryblock_info * tryblock
const unwind_info * unwind_table
unsigned int type_info_table
#define EXCEPTION_NONCONTINUABLE
#define __EXCEPT_CTX(func, ctx)
DECLSPEC_NORETURN void __cdecl __wine_longjmp(__wine_jmp_buf *buf, int retval)
#define __FINALLY_CTX(func, ctx)
static void dump_type(type_t *t)