1 #ifndef __WINE_WINE_EXCEPTION_H
2 #define __WINE_WINE_EXCEPTION_H
6 #include <pseh/pseh2.h>
7 #include <pseh/excpt.h>
13 /* Win32 seems to use the same flags as ExceptionFlags in an EXCEPTION_RECORD */
14 #define EH_NONCONTINUABLE 0x01
15 #define EH_UNWINDING 0x02
16 #define EH_EXIT_UNWIND 0x04
17 #define EH_STACK_INVALID 0x08
18 #define EH_NESTED_CALL 0x10
20 #define EXCEPTION_WINE_STUB 0x80000100
21 #define EXCEPTION_WINE_ASSERTION 0x80000101
23 #define EXCEPTION_VM86_INTx 0x80000110
24 #define EXCEPTION_VM86_STI 0x80000111
25 #define EXCEPTION_VM86_PICRETURN 0x80000112
28 struct _EXCEPTION_REGISTRATION_RECORD
;
32 (*PEXCEPTION_HANDLER
)(
33 struct _EXCEPTION_RECORD
*,
34 struct _EXCEPTION_REGISTRATION_RECORD
*,
36 struct _EXCEPTION_REGISTRATION_RECORD
**);
38 typedef struct _EXCEPTION_REGISTRATION_RECORD EXCEPTION_REGISTRATION_RECORD
, *PEXCEPTION_REGISTRATION_RECORD
;
40 struct _EXCEPTION_REGISTRATION_RECORD
42 struct _EXCEPTION_REGISTRATION_RECORD
* Prev
;
43 PEXCEPTION_HANDLER Handler
;
46 typedef struct _WINE_EXCEPTION_REGISTRATION_RECORD
49 PEXCEPTION_ROUTINE Handler
;
50 } WINE_EXCEPTION_REGISTRATION_RECORD
, *PWINE_EXCEPTION_REGISTRATION_RECORD
;
52 #define _EXCEPTION_REGISTRATION_RECORD _WINE_EXCEPTION_REGISTRATION_RECORD
53 #define EXCEPTION_REGISTRATION_RECORD WINE_EXCEPTION_REGISTRATION_RECORD
54 #define PEXCEPTION_REGISTRATION_RECORD PWINE_EXCEPTION_REGISTRATION_RECORD
57 #define __TRY _SEH2_TRY
58 #define __EXCEPT(func) _SEH2_EXCEPT(func(_SEH2_GetExceptionInformation()))
59 #define __EXCEPT_PAGE_FAULT _SEH2_EXCEPT(_SEH2_GetExceptionCode() == STATUS_ACCESS_VIOLATION)
60 #define __EXCEPT_ALL _SEH2_EXCEPT(_SEH_EXECUTE_HANDLER)
61 #define __ENDTRY _SEH2_END
62 #define __FINALLY(func) _SEH2_FINALLY { func(!_SEH2_AbnormalTermination()); }
64 #ifndef GetExceptionCode
65 #define GetExceptionCode() _SEH2_GetExceptionCode()
68 #ifndef GetExceptionInformation
69 #define GetExceptionInformation() _SEH2_GetExceptionInformation()
72 #ifndef AbnormalTermination
73 #define AbnormalTermination() _SEH2_AbnormalTermination()
77 #if defined(__MINGW32__) || defined(__CYGWIN__)
78 #define sigjmp_buf jmp_buf
79 #define sigsetjmp(buf,sigs) setjmp(buf)
80 #define siglongjmp(buf,val) longjmp(buf,val)
85 #pragma warning(disable:4733)
88 static inline EXCEPTION_REGISTRATION_RECORD
*__wine_push_frame( EXCEPTION_REGISTRATION_RECORD
*frame
)
91 frame
->Prev
= (struct _EXCEPTION_REGISTRATION_RECORD
*)__readfsdword(0);
92 __writefsdword(0, (unsigned long)frame
);
95 NT_TIB
*teb
= (NT_TIB
*)NtCurrentTeb();
96 frame
->Prev
= teb
->ExceptionList
;
97 teb
->ExceptionList
= (PVOID
)frame
;
102 static inline EXCEPTION_REGISTRATION_RECORD
*__wine_pop_frame( EXCEPTION_REGISTRATION_RECORD
*frame
)
105 __writefsdword(0, (unsigned long)frame
->Prev
);
108 NT_TIB
*teb
= (NT_TIB
*)NtCurrentTeb();
109 frame
->Prev
= teb
->ExceptionList
;
110 teb
->ExceptionList
= (PVOID
)frame
;
119 extern void __wine_enter_vm86( CONTEXT
*context
);