X-Git-Url: http://git.jankratochvil.net/?p=reactos.git;a=blobdiff_plain;f=lib%2Fmsvcrt%2Fexcept%2Funwind.c;fp=lib%2Fmsvcrt%2Fexcept%2Funwind.c;h=3cebce4848963d7713885288178b37c9a4f5c1e3;hp=b161263b87b23f8c04988adcee3af099aff0047e;hb=a3df8bf1429570e0bd6c6428f6ed80073578cf4b;hpb=7c0db166f81fbe8c8b913d7f26048e337d383605 diff --git a/lib/msvcrt/except/unwind.c b/lib/msvcrt/except/unwind.c index b161263..3cebce4 100644 --- a/lib/msvcrt/except/unwind.c +++ b/lib/msvcrt/except/unwind.c @@ -1,5 +1,8 @@ #include +/* + * @implemented + */ void __cdecl _global_unwind2(PEXCEPTION_REGISTRATION RegistrationFrame) { @@ -11,3 +14,56 @@ __ret_label: #else #endif } + + +// This is dragged over from WINE: + +typedef struct __EXCEPTION_FRAME +{ + struct __EXCEPTION_FRAME *Prev; + PEXCEPTION_HANDLER Handler; +} EXCEPTION_FRAME, *PEXCEPTION_FRAME; + +/* VC++ extensions to Win32 SEH */ +typedef struct _SCOPETABLE +{ + int previousTryLevel; + int (*lpfnFilter)(PEXCEPTION_POINTERS); + int (*lpfnHandler)(void); +} SCOPETABLE, *PSCOPETABLE; + +typedef struct _MSVCRT_EXCEPTION_FRAME +{ + EXCEPTION_FRAME *prev; + void (*handler)(PEXCEPTION_RECORD, PEXCEPTION_FRAME, + PCONTEXT, PEXCEPTION_RECORD); + PSCOPETABLE scopetable; + int trylevel; + int _ebp; + PEXCEPTION_POINTERS xpointers; +} MSVCRT_EXCEPTION_FRAME; + + +typedef struct __JUMP_BUFFER +{ + unsigned long Ebp; + unsigned long Ebx; + unsigned long Edi; + unsigned long Esi; + unsigned long Esp; + unsigned long Eip; + unsigned long Registration; + unsigned long TryLevel; + /* Start of new struct members */ + unsigned long Cookie; + unsigned long UnwindFunc; + unsigned long UnwindData[6]; +} _JUMP_BUFFER; + +/* + * @implemented +*/ +void __stdcall _seh_longjmp_unwind(_JUMP_BUFFER *jmp) +{ + _local_unwind2((MSVCRT_EXCEPTION_FRAME*) jmp->Registration, jmp->TryLevel); +}