Release 960712
[wine/testsucceed.git] / include / except.h
blobee93e3e207101cf02f9aafa9a5518ff549f0733c
1 /*
2 * except.h
3 * Copyright (c) 1996, Onno Hovers (onno@stack.urc.tue.nl)
4 */
6 #ifndef __WINE_EXCEPT_H
7 #define __WINE_EXCEPT_H
9 #include"wintypes.h"
12 * exception codes
15 #define STATUS_WAIT_0 0x00000000
16 #define STATUS_ABANDONED_WAIT_0 0x00000080
17 #define STATUS_USER_APC 0x000000C0
18 #define STATUS_TIMEOUT 0x00000102
19 #define STATUS_PENDING 0x00000103
20 #define STATUS_DATATYPE_MISALIGNMENT 0x80000002
21 #define STATUS_BREAKPOINT 0x80000003
22 #define STATUS_SINGLE_STEP 0x80000004
23 #define STATUS_ACCESS_VIOLATION 0xC0000005
24 #define STATUS_IN_PAGE_ERROR 0xC0000006
25 #define STATUS_NO_MEMORY 0xC0000017
26 #define STATUS_ILLEGAL_INSTRUCTION 0xC000001D
27 #define STATUS_NONCONTINUABLE_EXCEPTION 0xC0000025
28 #define STATUS_INVALID_DISPOSITION 0xC0000026
29 #define STATUS_ARRAY_BOUNDS_EXCEEDED 0xC000008C
30 #define STATUS_FLOAT_DENORMAL_OPERAND 0xC000008D
31 #define STATUS_FLOAT_DIVIDE_BY_ZERO 0xC000008E
32 #define STATUS_FLOAT_INEXACT_RESULT 0xC000008F
33 #define STATUS_FLOAT_INVALID_OPERATION 0xC0000090
34 #define STATUS_FLOAT_OVERFLOW 0xC0000091
35 #define STATUS_FLOAT_STACK_CHECK 0xC0000092
36 #define STATUS_FLOAT_UNDERFLOW 0xC0000093
37 #define STATUS_INTEGER_DIVIDE_BY_ZERO 0xC0000094
38 #define STATUS_INTEGER_OVERFLOW 0xC0000095
39 #define STATUS_PRIVILEGED_INSTRUCTION 0xC0000096
40 #define STATUS_STACK_OVERFLOW 0xC00000FD
41 #define STATUS_CONTROL_C_EXIT 0xC000013A
43 #define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION
44 #define EXCEPTION_DATATYPE_MISALIGNMENT STATUS_DATATYPE_MISALIGNMENT
45 #define EXCEPTION_BREAKPOINT STATUS_BREAKPOINT
46 #define EXCEPTION_SINGLE_STEP STATUS_SINGLE_STEP
47 #define EXCEPTION_ARRAY_BOUNDS_EXCEEDED STATUS_ARRAY_BOUNDS_EXCEEDED
48 #define EXCEPTION_FLT_DENORMAL_OPERAND STATUS_FLOAT_DENORMAL_OPERAND
49 #define EXCEPTION_FLT_DIVIDE_BY_ZERO STATUS_FLOAT_DIVIDE_BY_ZERO
50 #define EXCEPTION_FLT_INEXACT_RESULT STATUS_FLOAT_INEXACT_RESULT
51 #define EXCEPTION_FLT_INVALID_OPERATION STATUS_FLOAT_INVALID_OPERATION
52 #define EXCEPTION_FLT_OVERFLOW STATUS_FLOAT_OVERFLOW
53 #define EXCEPTION_FLT_STACK_CHECK STATUS_FLOAT_STACK_CHECK
54 #define EXCEPTION_FLT_UNDERFLOW STATUS_FLOAT_UNDERFLOW
55 #define EXCEPTION_INT_DIVIDE_BY_ZERO STATUS_INTEGER_DIVIDE_BY_ZERO
56 #define EXCEPTION_INT_OVERFLOW STATUS_INTEGER_OVERFLOW
57 #define EXCEPTION_PRIV_INSTRUCTION STATUS_PRIVILEGED_INSTRUCTION
58 #define EXCEPTION_IN_PAGE_ERROR STATUS_IN_PAGE_ERROR
61 * return values from the actual exception handlers
64 #define ExceptionContinueExecution 0
65 #define ExceptionContinueSearch 1
66 #define ExceptionNestedException 2
67 #define ExceptionCollidedUnwind 3
70 * return values from filters in except() and from UnhandledExceptionFilter
73 #define EXCEPTION_EXECUTE_HANDLER 1
74 #define EXCEPTION_CONTINUE_SEARCH 0
75 #define EXCEPTION_CONTINUE_EXECUTION -1
78 * from OS/2 2.0 exception handling
79 * Win32 seems to use the same flags as ExceptionFlags in an EXCEPTION_RECORD
82 #define EH_NONCONTINUABLE 0x01
83 #define EH_UNWINDING 0x02
84 #define EH_EXIT_UNWIND 0x04
85 #define EH_STACK_INVALID 0x08
86 #define EH_NESTED_CALL 0x10
88 #define EXCEPTION_CONTINUABLE 0
89 #define EXCEPTION_NONCONTINUABLE EH_NONCONTINUABLE
91 /*
92 * data types
96 * The i386 context used by Win32 for almost everything.
99 #define SIZE_OF_80387_REGISTERS 80
101 typedef struct _FLOATING_SAVE_AREA
103 DWORD ControlWord;
104 DWORD StatusWord;
105 DWORD TagWord;
106 DWORD ErrorOffset;
107 DWORD ErrorSelector;
108 DWORD DataOffset;
109 DWORD DataSelector;
110 BYTE RegisterArea[SIZE_OF_80387_REGISTERS];
111 DWORD Cr0NpxState;
112 } FLOATING_SAVE_AREA;
114 typedef struct __CONTEXT
116 DWORD ContextFlags;
117 DWORD Dr0;
118 DWORD Dr1;
119 DWORD Dr2;
120 DWORD Dr3;
121 DWORD Dr6;
122 DWORD Dr7;
123 FLOATING_SAVE_AREA FloatSave;
124 DWORD SegGs;
125 DWORD SegFs;
126 DWORD SegEs;
127 DWORD SegDs;
128 DWORD Edi;
129 DWORD Esi;
130 DWORD Ebx;
131 DWORD Edx;
132 DWORD Ecx;
133 DWORD Eax;
134 DWORD Ebp;
135 DWORD Eip;
136 DWORD SegCs;
137 DWORD EFlags;
138 DWORD Esp;
139 DWORD SegSs;
140 } CONTEXT;
142 typedef struct __CONTEXT *PCONTEXT;
145 * The exception record used by Win32 to give additional information
146 * about exception to exception handlers.
149 #define EXCEPTION_MAXIMUM_PARAMETERS 15
151 typedef struct __EXCEPTION_RECORD
153 DWORD ExceptionCode;
154 DWORD ExceptionFlags;
155 struct __EXCEPTION_RECORD *ExceptionRecord;
157 LPVOID ExceptionAddress;
158 DWORD NumberParameters;
159 DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
160 } EXCEPTION_RECORD;
162 typedef struct __EXCEPTION_RECORD_MIN
164 DWORD ExceptionCode;
165 DWORD ExceptionFlags;
166 struct __EXCEPTION_RECORD *ExceptionRecord;
168 LPVOID ExceptionAddress;
169 DWORD NumberParameters;
170 DWORD ExceptionInformation[0];
171 } EXCEPTION_RECORD_MIN;
173 typedef struct __EXCEPTION_RECORD *PEXCEPTION_RECORD;
176 * The exception pointers structure passed to exception filters
177 * in except() and the UnhandledExceptionFilter().
180 typedef struct __EXCEPTION_POINTERS
182 PEXCEPTION_RECORD ExceptionRecord;
183 PCONTEXT ContextRecord;
184 } EXCEPTION_POINTERS;
186 typedef struct __EXCEPTION_POINTERS *PEXCEPTION_POINTERS;
189 * the function pointer to a exception handler
192 /* forward definition */
193 struct __EXCEPTION_FRAME;
195 typedef DWORD ( *PEXCEPTION_HANDLER)( PEXCEPTION_RECORD pexcrec,
196 struct __EXCEPTION_FRAME *pestframe,
197 PCONTEXT pcontext,
198 LPVOID pdispatcher);
201 * function pointer to a UnhandledExceptionFilter();
204 typedef long (*__PTOP_EXCFILTER)
205 (PEXCEPTION_POINTERS ExceptionInfo);
207 typedef __PTOP_EXCFILTER PTOP_LEVER_EXCEPTION_FILTER;
208 typedef __PTOP_EXCFILTER LPTOP_LEVEL_EXCEPTION_FILTER;
211 * The exception frame, used for registering exception handlers
212 * Win32 cares only about this, but compilers generally emit
213 * larger exception frames for their own use.
216 typedef struct __EXCEPTION_FRAME
218 struct __EXCEPTION_FRAME *Prev;
219 PEXCEPTION_HANDLER Handler;
220 } EXCEPTION_FRAME;
222 typedef struct __EXCEPTION_FRAME *PEXCEPTION_FRAME;
224 extern PEXCEPTION_FRAME TebExceptionFrame asm("%fs:0");
226 #define EXC_GetFrame() TebExceptionFrame
227 #define EXC_SetFrame(a) (TebExceptionFrame=(a))
230 * Function definitions
233 void EXC_RaiseException(DWORD exccode, DWORD excflags,
234 DWORD nargs, const LPDWORD pargs,
235 PCONTEXT pcontext);
237 void EXC_RtlUnwind( PEXCEPTION_FRAME pestframe,
238 LPVOID unusedEIP,
239 PEXCEPTION_RECORD pexcrec,
240 DWORD contextEAX,
241 PCONTEXT pcontext );
243 DWORD EXC_CallUnhandledExceptionFilter( PEXCEPTION_RECORD precord,
244 PCONTEXT pcontext);
246 void EXC_Init(void);
248 BOOL RaiseException(DWORD exccode, DWORD excflags,
249 DWORD nargs, const LPDWORD pargs);
252 * this undocumented function is called when an exception
253 * handler wants all the frames to be unwound. RtlUnwind
254 * calls all exception handlers with the EH_UNWIND or
255 * EH_EXIT_UNWIND flags set in the exception record
257 * This prototype assumes RtlUnwind takes the same
258 * parameters as OS/2 2.0 DosUnwindException
259 * Disassembling RtlUnwind shows this is true, except for
260 * the TargetEIP parameter, which is unused. There is
261 * a fourth parameter, that is used as the eax in the
262 * context.
265 BOOL RtlUnwind( PEXCEPTION_FRAME pestframe,
266 LPVOID unusedEIP,
267 PEXCEPTION_RECORD pexcrec,
268 DWORD contextEAX );
270 DWORD UnhandledExceptionFilter(PEXCEPTION_POINTERS epointers);
272 __PTOP_EXCFILTER SetUnhandledExceptionFilter(
273 LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);
275 #endif /* __WINE_EXCEPT_H */