29#define WIN32_NO_STATUS
56#define TYPE_FLAG_CONST 1
57#define TYPE_FLAG_VOLATILE 2
58#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;
310 cxx_catch_ctx *
ctx =
c;
323 cxx_catch_ctx *
ctx =
c;
338 void *ret_addr =
NULL;
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);
510 DWORD throw_func_off;
513 int unwindlevel = -1;
517 FIXME(
"unhandled frame magic %x\n",
descr->magic);
524 !cxx_is_consolidate(rec) &&
530 throw_func =
rva_to_ptr(throw_func_off, throw_base);
531 TRACE(
"reconstructed handler pointer: %p\n", throw_func);
532 for (
i=
descr->tryblock_count;
i>0;
i--)
535 tryblock = &tryblock[
i-1];
537 if (trylevel>tryblock->
end_level && trylevel<=tryblock->catch_level)
542 catchblock = &catchblock[
j];
546 TRACE(
"nested exception detected\n");
549 TRACE(
"setting orig_frame to %lx\n", orig_frame);
572 TRACE(
"handling C++ exception rec %p frame %lx descr %p\n", rec, frame,
descr);
582 TRACE(
"handling C exception code %x rec %p frame %lx descr %p\n",
585 if (
data->se_translator) {
587 se_translator_ctx
ctx;
589 ctx.dest_frame = frame;
590 ctx.orig_frame = orig_frame;
671unsigned int CDECL __CxxQueryExceptionSize(
void)
688void __cdecl MSVCRT_longjmp(
struct MSVCRT___JUMP_BUFFER *jmp,
int retval )
692 if (!retval) retval = 1;
703 __wine_longjmp( (__wine_jmp_buf *)jmp, retval );
722 FIXME(
"(%x %p %p) opcode: %s\n", exception_code, ep,
handler,
727#if _MSVCR_VER>=110 && _MSVCR_VER<=120
741 FIXME(
"RtlLookupFunctionEntry failed\n");
750 "movq %rcx,8(%rsp)\n\t"
751 "call " __ASM_NAME(
"RtlCaptureContext")
"\n\t"
752 "movq 8(%rsp),%rcx\n\t"
753 "leaq 8(%rsp),%rax\n\t"
754 "movq %rax,0x98(%rcx)\n\t"
755 "movq (%rsp),%rax\n\t"
756 "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)
@ 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)
_CRTIMP int __cdecl _fpieee_flt(unsigned long _ExceptionCode, struct _EXCEPTION_POINTERS *_PtExceptionPtr, int(__cdecl *_Handler)(_FPIEEE_RECORD *))
GLuint GLuint GLsizei GLenum type
GLuint GLuint GLsizei count
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
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 memmove(s1, s2, n)
struct __type_info type_info
void __cdecl MSVCRT_terminate(void)
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....
static void dump_type(type_t *t)