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