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);
179static inline int ip_to_state(ipmap_info *ipmap,
UINT count,
int ip)
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;
226static inline void copy_exception(
void *
object,
ULONG64 frame,
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;
309 cxx_catch_ctx *
ctx =
c;
322 cxx_catch_ctx *
ctx =
c;
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--;
483 se_translator_ctx *
ctx = (se_translator_ctx *)
c;
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);
536 !cxx_is_consolidate(rec) &&
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)
578 check_noexcept(rec,
descr, orig_frame != frame);
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) {
609 se_translator_ctx
ctx;
611 ctx.dest_frame = frame;
612 ctx.orig_frame = orig_frame;
630 check_noexcept(rec,
descr, orig_frame != frame);
694unsigned int CDECL __CxxQueryExceptionSize(
void)
726 __wine_longjmp( (__wine_jmp_buf *)jmp,
retval );
750#if _MSVCR_VER>=110 && _MSVCR_VER<=120
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"
int strcmp(const char *String1, const char *String2)
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)
_CRTIMP int __cdecl _fpieee_flt(unsigned long _ExceptionCode, struct _EXCEPTION_POINTERS *_PtExceptionPtr, int(__cdecl *_Handler)(_FPIEEE_RECORD *))
@ 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 *)
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
int CDECL _XcptFilter(NTSTATUS, PEXCEPTION_POINTERS)
static const char * dbgstr_type_info(const type_info *info)
struct __tryblock_info tryblock_info
#define CLASS_IS_SIMPLE_TYPE
#define CXX_FRAME_MAGIC_VC7
struct __catchblock_info catchblock_info
#define CXX_FRAME_MAGIC_VC6
#define CLASS_HAS_VIRTUAL_BASE_CLASS
struct __cxx_exception_type cxx_exception_type
#define CXX_FRAME_MAGIC_VC8
#define FUNC_DESCR_SYNCHRONOUS
struct __unwind_info unwind_info
int CDECL __CppXcptFilter(NTSTATUS, PEXCEPTION_POINTERS)
struct __cxx_function_descr cxx_function_descr
#define TYPE_FLAG_VOLATILE
static void * get_this_pointer(const this_ptr_offsets *off, void *object)
#define TYPE_FLAG_REFERENCE
#define EXCEPTION_EXECUTE_HANDLER
#define EXCEPTION_CONTINUE_SEARCH
void MSVCRT() terminate()
#define memmove(s1, s2, n)
UINT WINAPI nested(MSIHANDLE hinst)
struct __type_info type_info
thread_data_t * msvcrt_get_thread_data(void)
#define __ASM_GLOBAL_FUNC(name, code)
NTSYSAPI VOID NTAPI RtlUnwind(_In_opt_ PVOID TargetFrame, _In_opt_ PVOID TargetIp, _In_opt_ PEXCEPTION_RECORD ExceptionRecord, _In_ PVOID ReturnValue)
#define STATUS_UNWIND_CONSOLIDATE
void * rva_to_ptr(unsigned char *buffer, PIMAGE_NT_HEADERS nt_header, DWORD rva)
#define __EXCEPT_CTX(func, ctx)
#define __FINALLY_CTX(func, ctx)
void CDECL __DestructExceptionObject(EXCEPTION_RECORD *rec)
void CDECL __CxxUnregisterExceptionObject(cxx_frame_info *frame_info, BOOL in_use)
BOOL CDECL __CxxRegisterExceptionObject(EXCEPTION_POINTERS *ep, cxx_frame_info *frame_info)
PEXCEPTION_RECORD ExceptionRecord
struct _EXCEPTION_RECORD * ExceptionRecord
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]
const type_info * type_info
const cxx_type_info_table * type_info_table
const tryblock_info * tryblock
const unwind_info * unwind_table
const cxx_type_info * info[3]
const catchblock_info * catchblock
#define EXCEPTION_NONCONTINUABLE
PEXCEPTION_ROUTINE NTAPI RtlVirtualUnwind(_In_ ULONG HandlerType, _In_ ULONG64 ImageBase, _In_ ULONG64 ControlPc, _In_ PRUNTIME_FUNCTION FunctionEntry, _Inout_ PCONTEXT Context, _Outptr_ PVOID *HandlerData, _Out_ PULONG64 EstablisherFrame, _Inout_opt_ PKNONVOLATILE_CONTEXT_POINTERS ContextPointers)
VOID NTAPI RtlUnwindEx(_In_opt_ PVOID TargetFrame, _In_opt_ PVOID TargetIp, _In_opt_ PEXCEPTION_RECORD ExceptionRecord, _In_ PVOID ReturnValue, _In_ PCONTEXT ContextRecord, _In_opt_ struct _UNWIND_HISTORY_TABLE *HistoryTable)
PRUNTIME_FUNCTION NTAPI RtlLookupFunctionEntry(IN DWORD64 ControlPc, OUT PDWORD64 ImageBase, OUT PUNWIND_HISTORY_TABLE HistoryTable)
Locates the RUNTIME_FUNCTION entry corresponding to a code address. http://msdn.microsoft....
#define FUNC_DESCR_NOEXCEPT
static void dump_type(type_t *t)