32#define longjmp ms_longjmp
65} catch_func_nested_frame;
71 catch_func_nested_frame *nested_frame;
74typedef struct _SCOPETABLE
78 void * (*lpfnHandler)(
void);
79} SCOPETABLE, *PSCOPETABLE;
81typedef struct MSVCRT_EXCEPTION_FRAME
86 PSCOPETABLE scopetable;
90} MSVCRT_EXCEPTION_FRAME;
98 SCOPETABLE entries[1];
101#define TRYLEVEL_END (-1)
111 catch_func_nested_frame* nested_frame );
117 "movl 4(%esp), %edx\n\t"
118 "movl 8(%esp), %eax\n\t"
119 "movl -4(%edx), %esp\n\t"
120 "leal 12(%edx), %ebp\n\t"
126 "movl 8(%esp), %ebp\n\t"
134 "movl 20(%esp), %ebp\n\t"
140extern void *call_handler(
void * (*
func)(
void),
void *
ebp );
147 "movl 24(%esp), %ebp\n\t"
158 void * (*handler)(
void);
161 while (trylevel != last_level)
163 if (trylevel < 0 || trylevel >=
descr->unwind_count)
165 ERR(
"invalid trylevel %d\n", trylevel );
171 TRACE(
"calling unwind handler %p trylevel %d last %d ebp %p\n",
175 trylevel =
descr->unwind_table[trylevel].prev;
184 catch_func_nested_frame *nested_frame = (catch_func_nested_frame *)frame;
192 TRACE(
"got nested exception in catch function\n" );
209 TRACE(
"re-propagate: obj: %Ix, type: %Ix\n",
215 TRACE(
"detect threw new exception in catch block\n");
220 NULL, nested_frame->descr, nested_frame );
228 catch_func_nested_frame *catch_frame,
233 catch_func_nested_frame nested_frame;
238 data->processing_throw++;
239 for (
i = 0;
i <
descr->tryblock_count;
i++)
244 if (catch_frame && catch_frame->trylevel > tryblock->
start_level)
continue;
246 if (trylevel < tryblock->start_level)
continue;
247 if (trylevel > tryblock->
end_level)
continue;
256 RtlUnwind( catch_frame ? &catch_frame->frame : &frame->
frame, 0, rec, 0 );
260 nested_frame.frame_info.rec =
data->exc_record;
261 nested_frame.frame_info.context =
data->ctx_record;
262 data->exc_record = rec;
264 data->processing_throw--;
270 nested_frame.frame.Handler = catch_function_nested_handler;
271 nested_frame.cxx_frame = frame;
272 nested_frame.descr =
descr;
273 nested_frame.trylevel = tryblock->
end_level + 1;
279 ((
DWORD*)frame)[-1] = save_esp;
281 TRACE(
"done, continuing at %p\n",
addr );
283 continue_after_catch( frame,
addr );
285 data->processing_throw--;
302 ctx->nested_frame, exc_type );
315 ERR(
"noexcept function propagating exception\n");
328 catch_func_nested_frame* nested_frame )
334 ERR(
"invalid frame magic %x\n",
descr->magic );
347 if (!
descr->tryblock_count)
361 TRACE(
"re-propagate: obj: %Ix, type: %Ix\n",
375 nested_frame ? nested_frame->trylevel : 0,
376 nested_frame ? &nested_frame->frame :
NULL, 0 );
381 TRACE(
"handling C++ exception rec %p frame %p trylevel %d descr %p nested_frame %p\n",
392 TRACE(
"handling C exception code %lx rec %p frame %p trylevel %d descr %p nested_frame %p\n",
395 if (
data->se_translator) {
401 ctx.nested_frame = nested_frame;
416 nested_frame, exc_type );
429 __ASM_CFI(
".cfi_adjust_cfa_offset 4\n\t")
431 __ASM_CFI(
".cfi_adjust_cfa_offset 4\n\t")
433 __ASM_CFI(
".cfi_adjust_cfa_offset 4\n\t")
435 __ASM_CFI(
".cfi_adjust_cfa_offset 4\n\t")
437 __ASM_CFI(
".cfi_adjust_cfa_offset 4\n\t")
439 __ASM_CFI(
".cfi_adjust_cfa_offset 4\n\t")
440 "call " __ASM_NAME(
"cxx_frame_handler")
"\n\t"
442 __ASM_CFI(
".cfi_adjust_cfa_offset -24\n\t")
456 TRACE(
"unwinding frame %p descr %p trylevel %ld\n", frame,
descr,
buf->TryLevel );
466 __ASM_CFI(
".cfi_adjust_cfa_offset 4\n\t")
468 __ASM_CFI(
".cfi_adjust_cfa_offset 4\n\t")
470 __ASM_CFI(
".cfi_adjust_cfa_offset 4\n\t")
472 __ASM_CFI(
".cfi_adjust_cfa_offset 4\n\t")
473 "movl %esp, %fs:0\n\t"
474 "movl 12(%esp), %eax\n\t"
475 "movl %ebp, 12(%esp)\n\t"
476 "leal 12(%esp), %ebp\n\t"
478 __ASM_CFI(
".cfi_adjust_cfa_offset 4\n\t")
497static void msvcrt_local_unwind2(MSVCRT_EXCEPTION_FRAME* frame,
int trylevel,
void *
ebp)
501 TRACE(
"(%p,%d,%d)\n",frame, frame->trylevel, trylevel);
504 reg.Handler = MSVCRT_nested_handler;
508 while (frame->trylevel != TRYLEVEL_END && frame->trylevel != trylevel)
510 int level = frame->trylevel;
511 frame->trylevel = frame->scopetable[
level].previousTryLevel;
512 if (!frame->scopetable[
level].lpfnFilter)
514 TRACE(
"__try block cleanup level %d handler %p ebp %p\n",
516 call_handler( frame->scopetable[
level].lpfnHandler,
ebp );
520 TRACE(
"unwound OK\n");
523static void msvcrt_local_unwind4(
ULONG *
cookie, MSVCRT_EXCEPTION_FRAME* frame,
int trylevel,
void *
ebp )
526 const SCOPETABLE_V4 *scopetable = get_scopetable_v4( frame, *
cookie );
528 TRACE(
"(%p,%d,%d)\n",frame, frame->trylevel, trylevel);
531 reg.Handler = MSVCRT_nested_handler;
535 while (frame->trylevel != -2 && frame->trylevel != trylevel)
537 int level = frame->trylevel;
538 frame->trylevel = scopetable->entries[
level].previousTryLevel;
539 if (!scopetable->entries[
level].lpfnFilter)
541 TRACE(
"__try block cleanup level %d handler %p ebp %p\n",
543 call_handler( scopetable->entries[
level].lpfnHandler,
ebp );
547 TRACE(
"unwound OK\n");
554void CDECL _local_unwind2(MSVCRT_EXCEPTION_FRAME* frame,
int trylevel)
556 msvcrt_local_unwind2( frame, trylevel, &frame->_ebp );
563void CDECL _local_unwind4(
ULONG *
cookie, MSVCRT_EXCEPTION_FRAME* frame,
int trylevel )
565 msvcrt_local_unwind4(
cookie, frame, trylevel, &frame->_ebp );
576 TRACE(
"(%p)\n",frame);
588 FIXME(
"exception %lx flags=%lx at %p handler=%p %p %p stub\n",
598 MSVCRT_EXCEPTION_FRAME* frame,
603 PSCOPETABLE pScopeTable;
605 TRACE(
"exception %lx flags=%lx at %p handler=%p %p %p semi-stub\n",
607 frame->handler,
context, dispatcher);
617 msvcrt_local_unwind2(frame, TRYLEVEL_END, &frame->_ebp);
618 TRACE(
"unwound current frame, returning ExceptionContinueSearch\n");
627 trylevel = frame->trylevel;
628 pScopeTable = frame->scopetable;
630 while (trylevel != TRYLEVEL_END)
632 TRACE(
"level %d prev %d filter %p\n", trylevel, pScopeTable[trylevel].previousTryLevel,
633 pScopeTable[trylevel].lpfnFilter );
634 if (pScopeTable[trylevel].lpfnFilter)
636 retval = call_filter( pScopeTable[trylevel].lpfnFilter, &exceptPtrs, &frame->_ebp );
640 "EXECUTE_HANDLER" :
"CONTINUE_SEARCH");
649 msvcrt_local_unwind2(frame, trylevel, &frame->_ebp);
654 frame->trylevel = pScopeTable[trylevel].previousTryLevel;
655 TRACE(
"__finally block %p\n",pScopeTable[trylevel].lpfnHandler);
656 call_finally_block(pScopeTable[trylevel].lpfnHandler, &frame->_ebp);
659 trylevel = pScopeTable[trylevel].previousTryLevel;
662 TRACE(
"reached TRYLEVEL_END, returning ExceptionContinueSearch\n");
670int CDECL _except_handler4_common(
ULONG *
cookie,
void (*check_cookie)(
void),
676 const SCOPETABLE_V4 *scope_table = get_scopetable_v4( frame, *
cookie );
678 TRACE(
"exception %lx flags=%lx at %p handler=%p %p %p cookie=%lx scope table=%p cookies=%d/%lx,%d/%lx\n",
681 scope_table->gs_cookie_offset, scope_table->gs_cookie_xor,
682 scope_table->eh_cookie_offset, scope_table->eh_cookie_xor );
689 msvcrt_local_unwind4(
cookie, frame, -2, &frame->_ebp );
690 TRACE(
"unwound current frame, returning ExceptionContinueSearch\n");
699 trylevel = frame->trylevel;
701 while (trylevel != -2)
703 TRACE(
"level %d prev %d filter %p\n", trylevel,
704 scope_table->entries[trylevel].previousTryLevel,
705 scope_table->entries[trylevel].lpfnFilter );
706 if (scope_table->entries[trylevel].lpfnFilter)
708 retval = call_filter( scope_table->entries[trylevel].lpfnFilter, &exceptPtrs, &frame->_ebp );
712 "EXECUTE_HANDLER" :
"CONTINUE_SEARCH");
723 msvcrt_local_unwind4(
cookie, frame, trylevel, &frame->_ebp );
728 frame->trylevel = scope_table->entries[trylevel].previousTryLevel;
729 TRACE(
"__finally block %p\n",scope_table->entries[trylevel].lpfnHandler);
730 call_finally_block(scope_table->entries[trylevel].lpfnHandler, &frame->_ebp);
733 trylevel = scope_table->entries[trylevel].previousTryLevel;
736 TRACE(
"reached -2, returning ExceptionContinueSearch\n");
746#define MSVCRT_JMP_MAGIC 0x56433230
747typedef void (
__stdcall *MSVCRT_unwind_function)(
const _JUMP_BUFFER *);
751#define DEFINE_SETJMP_ENTRYPOINT(name) \
752 __ASM_GLOBAL_FUNC( name, \
753 "movl 4(%esp),%ecx\n\t" \
754 "movl %ebp,0(%ecx)\n\t" \
755 "movl %ebx,4(%ecx)\n\t" \
756 "movl %edi,8(%ecx)\n\t" \
757 "movl %esi,12(%ecx)\n\t" \
758 "movl %esp,16(%ecx)\n\t" \
759 "movl 0(%esp),%eax\n\t" \
760 "movl %eax,20(%ecx)\n\t"
\
761 "jmp " __ASM_NAME("__regs_") # name )
767DEFINE_SETJMP_ENTRYPOINT( _setjmp )
768int CDECL __regs__setjmp(_JUMP_BUFFER *jmp)
771 if (jmp->Registration == ~0
UL)
772 jmp->TryLevel = TRYLEVEL_END;
774 jmp->TryLevel = ((MSVCRT_EXCEPTION_FRAME*)jmp->Registration)->trylevel;
776 TRACE(
"buf=%p ebx=%08lx esi=%08lx edi=%08lx ebp=%08lx esp=%08lx eip=%08lx frame=%08lx\n",
777 jmp, jmp->Ebx, jmp->Esi, jmp->Edi, jmp->Ebp, jmp->Esp, jmp->Eip, jmp->Registration );
785int WINAPIV __regs__setjmp3(_JUMP_BUFFER *jmp,
int nb_args, ...)
787 jmp->Cookie = MSVCRT_JMP_MAGIC;
790 if (jmp->Registration == ~0
UL)
792 jmp->TryLevel = TRYLEVEL_END;
800 if (nb_args > 0) jmp->UnwindFunc =
va_arg(
args,
unsigned long );
801 if (nb_args > 1) jmp->TryLevel =
va_arg(
args,
unsigned long );
802 else jmp->TryLevel = ((MSVCRT_EXCEPTION_FRAME*)jmp->Registration)->trylevel;
803 for (
i = 0;
i < 6 &&
i < nb_args - 2;
i++)
804 jmp->UnwindData[
i] =
va_arg(
args,
unsigned long );
808 TRACE(
"buf=%p ebx=%08lx esi=%08lx edi=%08lx ebp=%08lx esp=%08lx eip=%08lx frame=%08lx\n",
809 jmp, jmp->Ebx, jmp->Esi, jmp->Edi, jmp->Ebp, jmp->Esp, jmp->Eip, jmp->Registration );
818 unsigned long cur_frame = 0;
820 TRACE(
"buf=%p ebx=%08lx esi=%08lx edi=%08lx ebp=%08lx esp=%08lx eip=%08lx frame=%08lx retval=%08x\n",
821 jmp, jmp->Ebx, jmp->Esi, jmp->Edi, jmp->Ebp, jmp->Esp, jmp->Eip, jmp->Registration,
retval );
824 TRACE(
"cur_frame=%lx\n",cur_frame);
826 if (cur_frame != jmp->Registration)
829 if (jmp->Registration)
831 if (
IsBadReadPtr(&jmp->Cookie,
sizeof(
long)) || jmp->Cookie != MSVCRT_JMP_MAGIC)
833 msvcrt_local_unwind2((MSVCRT_EXCEPTION_FRAME*)jmp->Registration,
834 jmp->TryLevel, (
void *)jmp->Ebp);
836 else if(jmp->UnwindFunc)
838 MSVCRT_unwind_function unwind_func;
840 unwind_func=(MSVCRT_unwind_function)jmp->UnwindFunc;
857 msvcrt_local_unwind2( (MSVCRT_EXCEPTION_FRAME *)jmp->Registration, jmp->TryLevel, (
void *)jmp->Ebp );
863void __stdcall _seh_longjmp_unwind4(_JUMP_BUFFER *jmp)
865 msvcrt_local_unwind4( (
ULONG *)&jmp->Cookie, (MSVCRT_EXCEPTION_FRAME *)jmp->Registration,
866 jmp->TryLevel, (
void *)jmp->Ebp );
879 memset(&rec, 0,
sizeof(rec));
881 switch((
ctx->ControlWord >> 8) & 0x3) {
906 if(*(
WORD*)
ctx->ErrorOffset == 0x35dc) {
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
void dispatch(HANDLE hStopEvent)
static WCHAR unknown[MAX_STRING_RESOURCE_LEN]
@ ExceptionContinueSearch
@ ExceptionCollidedUnwind
@ ExceptionContinueExecution
struct _EXCEPTION_RECORD * PEXCEPTION_RECORD
BOOL WINAPI IsBadReadPtr(IN LPCVOID lp, IN UINT_PTR ucb)
UINT(* handler)(MSIPACKAGE *)
void CDECL terminate(void)
#define CXX_FRAME_MAGIC_VC6
#define TRACE_EXCEPTION_TYPE(type, base)
#define CXX_FRAME_MAGIC_VC8
#define FUNC_DESCR_SYNCHRONOUS
void dump_function_descr(const cxx_function_descr *descr, uintptr_t base)
int handle_fpieee_flt(__msvcrt_ulong exception_code, EXCEPTION_POINTERS *ep, int(__cdecl *handler)(_FPIEEE_RECORD *))
#define FUNC_DESCR_NOEXCEPT
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)
static void check_noexcept(PEXCEPTION_RECORD rec, const cxx_function_descr *descr, BOOL nested)
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)
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)
static LONG CALLBACK se_translation_filter(EXCEPTION_POINTERS *ep, void *c)
void CDECL __CxxUnregisterExceptionObject(cxx_frame_info *frame_info, BOOL in_use)
#define DECLSPEC_NORETURN
unsigned long __msvcrt_ulong
_ACRTIMP void __cdecl longjmp(jmp_buf, int)
thread_data_t *CDECL msvcrt_get_thread_data(void)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLenum GLuint GLenum GLsizei const GLchar * buf
GLenum const GLvoid * addr
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
void __cdecl _global_unwind2(void *Registration)
void _stdcall _seh_longjmp_unwind(const _JUMP_BUFFER *_Buf)
#define EXCEPTION_EXECUTE_HANDLER
#define EXCEPTION_CONTINUE_SEARCH
#define EXCEPTION_CONTINUE_EXECUTION
#define memcpy(s1, s2, n)
UINT WINAPI nested(MSIHANDLE hinst)
#define __ASM_GLOBAL_FUNC(name, code)
#define STATUS_FLOAT_DIVIDE_BY_ZERO
#define STATUS_FLOAT_INVALID_OPERATION
__asm__(".p2align 4, 0x90\n" ".seh_proc __seh2_global_filter_func\n" "__seh2_global_filter_func:\n" "\tsub %rbp, %rax\n" "\tpush %rbp\n" "\t.seh_pushreg %rbp\n" "\tsub $32, %rsp\n" "\t.seh_stackalloc 32\n" "\t.seh_endprologue\n" "\tsub %rax, %rdx\n" "\tmov %rdx, %rbp\n" "\tjmp *%r8\n" "__seh2_global_filter_func_exit:\n" "\t.p2align 4\n" "\tadd $32, %rsp\n" "\tpop %rbp\n" "\tret\n" "\t.seh_endproc")
int _setjmp3(jmp_buf env, int count,...)
DWORD(* cxx_exc_custom_handler)(PEXCEPTION_RECORD, cxx_exception_frame *, PCONTEXT, EXCEPTION_REGISTRATION_RECORD **, const cxx_function_descr *, int nested_trylevel, EXCEPTION_REGISTRATION_RECORD *nested_frame, DWORD unknown3)
struct __cxx_exception_frame cxx_exception_frame
FLOATING_SAVE_AREA FloatSave
PEXCEPTION_RECORD ExceptionRecord
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]
PEXCEPTION_ROUTINE Handler
unsigned int InvalidOperation
_FPIEEE_EXCEPTION_FLAGS Status
_FPIEEE_EXCEPTION_FLAGS Cause
unsigned int RoundingMode
_FPIEEE_EXCEPTION_FLAGS Enable
union _FPIEEE_VALUE::@577 Value
unsigned int OperandValid
EXCEPTION_REGISTRATION_RECORD frame
unsigned int custom_handler
ecx edi movl ebx edx edi decl ecx esi eax jecxz decl eax andl eax esi movl edx movl TEMP incl eax andl eax ecx incl ebx testl eax jnz xchgl ecx incl TEMP esp ecx subl ebx pushl ecx ecx edx ecx shrl ecx mm0 mm4 mm0 mm4 mm1 mm5 mm1 mm5 mm2 mm6 mm2 mm6 mm3 mm7 mm3 mm7 paddd mm0 paddd mm4 paddd mm0 paddd mm4 paddd mm0 paddd mm4 movq mm1 movq mm5 psrlq mm1 psrlq mm5 paddd mm0 paddd mm4 psrad mm0 psrad mm4 packssdw mm0 packssdw mm4 mm1 punpckldq mm0 pand mm1 pand mm0 por mm1 movq edi esi edx edi decl ecx jnz popl ecx andl ecx jecxz mm0 mm0 mm1 mm1 mm2 mm2 mm3 mm3 paddd mm0 paddd mm0 paddd mm0 movq mm1 psrlq mm1 paddd mm0 psrad mm0 packssdw mm0 movd eax movw edi esi edx esi movl ecx mm0 mm4 mm0 mm4 mm1 mm5 mm1 mm5 mm2 mm6 mm2 mm6 mm3 mm7 mm3 mm7 paddd mm0 paddd mm4 paddd mm0 paddd mm4 paddd mm0 paddd mm4 movq mm1 movq mm5 psrlq mm1 psrlq mm5 paddd mm1 paddd mm5 psrad mm1 psrad mm5 packssdw mm1 packssdw mm5 psubd mm0 psubd mm4 psubsw mm0 psubsw mm4 mm1 punpckldq mm0 pand mm1 pand mm0 por mm1 movq edi subl esi addl edx edi decl ecx jnz mm0 mm0 mm1 mm1 mm2 mm2 mm3 mm3 paddd mm0 paddd mm0 paddd mm0 movq mm1 psrlq mm1 paddd mm1 psrad mm1 packssdw mm1 psubd mm0 psubsw mm0 movd eax movw edi emms popl ebx popl esi popl edi mov ebp
static EXCEPTION_REGISTRATION_RECORD * __wine_push_frame(EXCEPTION_REGISTRATION_RECORD *frame)
#define __EXCEPT_CTX(func, ctx)
DECLSPEC_NORETURN void __cdecl __wine_longjmp(__wine_jmp_buf *buf, int retval)
static EXCEPTION_REGISTRATION_RECORD * __wine_pop_frame(EXCEPTION_REGISTRATION_RECORD *frame)
#define EXCEPTION_EXIT_UNWIND
struct _EXCEPTION_POINTERS * PEXCEPTION_POINTERS
#define EXCEPTION_UNWINDING