e481d4f7009dcaceb3993e7f85f00a88fb18d79b
[reactos.git] / reactos / lib / crt / except / unwind.c
1 #include "precomp.h"
2 #include <winternl.h>
3
4 /*
5 * @implemented
6 */
7 void __cdecl
8 _global_unwind2(PEXCEPTION_REGISTRATION RegistrationFrame)
9 {
10 #ifdef __GNUC__
11 RtlUnwind(RegistrationFrame, &&__ret_label, NULL, 0);
12 __ret_label:
13 // return is important
14 return;
15 #else
16 #endif
17 }
18
19
20 // This is dragged over from WINE:
21
22 typedef struct __EXCEPTION_FRAME
23 {
24 struct __EXCEPTION_FRAME *Prev;
25 PEXCEPTION_HANDLER Handler;
26 } EXCEPTION_FRAME, *PEXCEPTION_FRAME;
27
28 /* VC++ extensions to Win32 SEH */
29 typedef struct _SCOPETABLE
30 {
31 int previousTryLevel;
32 int (*lpfnFilter)(PEXCEPTION_POINTERS);
33 int (*lpfnHandler)(void);
34 } SCOPETABLE, *PSCOPETABLE;
35
36 typedef struct _MSVCRT_EXCEPTION_FRAME
37 {
38 EXCEPTION_FRAME *prev;
39 void (*handler)(PEXCEPTION_RECORD, PEXCEPTION_FRAME,
40 PCONTEXT, PEXCEPTION_RECORD);
41 PSCOPETABLE scopetable;
42 int trylevel;
43 int _ebp;
44 PEXCEPTION_POINTERS xpointers;
45 } MSVCRT_EXCEPTION_FRAME;
46
47
48 typedef struct __JUMP_BUFFER
49 {
50 unsigned long Ebp;
51 unsigned long Ebx;
52 unsigned long Edi;
53 unsigned long Esi;
54 unsigned long Esp;
55 unsigned long Eip;
56 unsigned long Registration;
57 unsigned long TryLevel;
58 /* Start of new struct members */
59 unsigned long Cookie;
60 unsigned long UnwindFunc;
61 unsigned long UnwindData[6];
62 } _JUMP_BUFFER;
63
64 void
65 _local_unwind2(MSVCRT_EXCEPTION_FRAME *RegistrationFrame,
66 LONG TryLevel);
67
68 /*
69 * @implemented
70 */
71
72 void __stdcall _seh_longjmp_unwind(_JUMP_BUFFER *jmp)
73 {
74 _local_unwind2((MSVCRT_EXCEPTION_FRAME*) jmp->Registration, jmp->TryLevel);
75 }