Release 980301
[wine] / include / winnt.h
1 /*
2  * Win32 definitions for Windows NT
3  *
4  * Copyright 1996 Alexandre Julliard
5  */
6
7 #ifndef __WINE_WINNT_H
8 #define __WINE_WINNT_H
9
10 #include "wintypes.h"
11
12 /* Heap flags */
13
14 #define HEAP_NO_SERIALIZE               0x00000001
15 #define HEAP_GROWABLE                   0x00000002
16 #define HEAP_GENERATE_EXCEPTIONS        0x00000004
17 #define HEAP_ZERO_MEMORY                0x00000008
18 #define HEAP_REALLOC_IN_PLACE_ONLY      0x00000010
19 #define HEAP_TAIL_CHECKING_ENABLED      0x00000020
20 #define HEAP_FREE_CHECKING_ENABLED      0x00000040
21 #define HEAP_DISABLE_COALESCE_ON_FREE   0x00000080
22 #define HEAP_CREATE_ALIGN_16            0x00010000
23 #define HEAP_CREATE_ENABLE_TRACING      0x00020000
24 #define HEAP_WINE_SEGPTR                0x01000000  /* Not a Win32 flag */
25 #define HEAP_WINE_CODESEG               0x02000000  /* Not a Win32 flag */
26
27 /* Processor feature flags.  */
28 #define PF_FLOATING_POINT_PRECISION_ERRATA      0
29 #define PF_FLOATING_POINT_EMULATED              1
30 #define PF_COMPARE_EXCHANGE_DOUBLE              2
31 #define PF_MMX_INSTRUCTIONS_AVAILABLE           3
32 #define PF_PPC_MOVEMEM_64BIT_OK                 4
33 #define PF_ALPHA_BYTE_INSTRUCTIONS              5
34
35
36 /* The Win32 register context */
37
38 #define CONTEXT_i386      0x00010000
39 #define CONTEXT_i486      CONTEXT_i386
40 #define CONTEXT_CONTROL   (CONTEXT_i386 | 0x0001) /* SS:SP, CS:IP, FLAGS, BP */
41 #define CONTEXT_INTEGER   (CONTEXT_i386 | 0x0002) /* AX, BX, CX, DX, SI, DI */
42 #define CONTEXT_SEGMENTS  (CONTEXT_i386 | 0x0004) /* DS, ES, FS, GS */
43 #define CONTEXT_FLOATING_POINT  (CONTEXT_i386 | 0x0008L) /* 387 state */
44 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x0010L) /* DB 0-3,6,7 */
45 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
46
47 #define SIZE_OF_80387_REGISTERS      80
48
49 typedef struct
50 {
51     DWORD   ControlWord;
52     DWORD   StatusWord;
53     DWORD   TagWord;    
54     DWORD   ErrorOffset;
55     DWORD   ErrorSelector;
56     DWORD   DataOffset;
57     DWORD   DataSelector;    
58     BYTE    RegisterArea[SIZE_OF_80387_REGISTERS];
59     DWORD   Cr0NpxState;
60 } FLOATING_SAVE_AREA;
61
62 typedef struct
63 {
64     DWORD   ContextFlags;
65
66     /* These are selected by CONTEXT_DEBUG_REGISTERS */
67     DWORD   Dr0;
68     DWORD   Dr1;
69     DWORD   Dr2;
70     DWORD   Dr3;
71     DWORD   Dr6;
72     DWORD   Dr7;
73
74     /* These are selected by CONTEXT_FLOATING_POINT */
75     FLOATING_SAVE_AREA FloatSave;
76
77     /* These are selected by CONTEXT_SEGMENTS */
78     DWORD   SegGs;
79     DWORD   SegFs;
80     DWORD   SegEs;
81     DWORD   SegDs;    
82
83     /* These are selected by CONTEXT_INTEGER */
84     DWORD   Edi;
85     DWORD   Esi;
86     DWORD   Ebx;
87     DWORD   Edx;    
88     DWORD   Ecx;
89     DWORD   Eax;
90
91     /* These are selected by CONTEXT_CONTROL */
92     DWORD   Ebp;    
93     DWORD   Eip;
94     DWORD   SegCs;
95     DWORD   EFlags;
96     DWORD   Esp;
97     DWORD   SegSs;
98 } CONTEXT, *PCONTEXT;
99
100
101 #ifdef __WINE__
102
103 /* Macros for easier access to context registers */
104
105 #define EAX_reg(context)     ((context)->Eax)
106 #define EBX_reg(context)     ((context)->Ebx)
107 #define ECX_reg(context)     ((context)->Ecx)
108 #define EDX_reg(context)     ((context)->Edx)
109 #define ESI_reg(context)     ((context)->Esi)
110 #define EDI_reg(context)     ((context)->Edi)
111 #define EBP_reg(context)     ((context)->Ebp)
112
113 #define CS_reg(context)      ((context)->SegCs)
114 #define DS_reg(context)      ((context)->SegDs)
115 #define ES_reg(context)      ((context)->SegEs)
116 #define FS_reg(context)      ((context)->SegFs)
117 #define GS_reg(context)      ((context)->SegGs)
118 #define SS_reg(context)      ((context)->SegSs)
119
120 #define EFL_reg(context)     ((context)->EFlags)
121 #define EIP_reg(context)     ((context)->Eip)
122 #define ESP_reg(context)     ((context)->Esp)
123
124 #define AX_reg(context)      (*(WORD*)&EAX_reg(context))
125 #define BX_reg(context)      (*(WORD*)&EBX_reg(context))
126 #define CX_reg(context)      (*(WORD*)&ECX_reg(context))
127 #define DX_reg(context)      (*(WORD*)&EDX_reg(context))
128 #define SI_reg(context)      (*(WORD*)&ESI_reg(context))
129 #define DI_reg(context)      (*(WORD*)&EDI_reg(context))
130 #define BP_reg(context)      (*(WORD*)&EBP_reg(context))
131
132 #define AL_reg(context)      (*(BYTE*)&EAX_reg(context))
133 #define AH_reg(context)      (*((BYTE*)&EAX_reg(context)+1))
134 #define BL_reg(context)      (*(BYTE*)&EBX_reg(context))
135 #define BH_reg(context)      (*((BYTE*)&EBX_reg(context)+1))
136 #define CL_reg(context)      (*(BYTE*)&ECX_reg(context))
137 #define CH_reg(context)      (*((BYTE*)&ECX_reg(context)+1))
138 #define DL_reg(context)      (*(BYTE*)&EDX_reg(context))
139 #define DH_reg(context)      (*((BYTE*)&EDX_reg(context)+1))
140                             
141 #define IP_reg(context)      (*(WORD*)&EIP_reg(context))
142 #define SP_reg(context)      (*(WORD*)&ESP_reg(context))
143                             
144 #define FL_reg(context)      (*(WORD*)&EFL_reg(context))
145
146 #define SET_CFLAG(context)   (EFL_reg(context) |= 0x0001)
147 #define RESET_CFLAG(context) (EFL_reg(context) &= 0xfffffffe)
148
149 #endif  /* __WINE__ */
150
151 /*
152  * Exception codes
153  */
154  
155 #define STATUS_WAIT_0                    0x00000000
156 #define STATUS_ABANDONED_WAIT_0          0x00000080
157 #define STATUS_USER_APC                  0x000000C0
158 #define STATUS_TIMEOUT                   0x00000102
159 #define STATUS_PENDING                   0x00000103
160 #define STATUS_DATATYPE_MISALIGNMENT     0x80000002
161 #define STATUS_BREAKPOINT                0x80000003
162 #define STATUS_SINGLE_STEP               0x80000004
163 #define STATUS_ACCESS_VIOLATION          0xC0000005
164 #define STATUS_IN_PAGE_ERROR             0xC0000006
165 #define STATUS_NO_MEMORY                 0xC0000017
166 #define STATUS_ILLEGAL_INSTRUCTION       0xC000001D
167 #define STATUS_NONCONTINUABLE_EXCEPTION  0xC0000025
168 #define STATUS_INVALID_DISPOSITION       0xC0000026
169 #define STATUS_ARRAY_BOUNDS_EXCEEDED     0xC000008C
170 #define STATUS_FLOAT_DENORMAL_OPERAND    0xC000008D
171 #define STATUS_FLOAT_DIVIDE_BY_ZERO      0xC000008E
172 #define STATUS_FLOAT_INEXACT_RESULT      0xC000008F
173 #define STATUS_FLOAT_INVALID_OPERATION   0xC0000090
174 #define STATUS_FLOAT_OVERFLOW            0xC0000091
175 #define STATUS_FLOAT_STACK_CHECK         0xC0000092
176 #define STATUS_FLOAT_UNDERFLOW           0xC0000093
177 #define STATUS_INTEGER_DIVIDE_BY_ZERO    0xC0000094
178 #define STATUS_INTEGER_OVERFLOW          0xC0000095
179 #define STATUS_PRIVILEGED_INSTRUCTION    0xC0000096
180 #define STATUS_STACK_OVERFLOW            0xC00000FD
181 #define STATUS_CONTROL_C_EXIT            0xC000013A
182
183 #define EXCEPTION_ACCESS_VIOLATION      STATUS_ACCESS_VIOLATION
184 #define EXCEPTION_DATATYPE_MISALIGNMENT STATUS_DATATYPE_MISALIGNMENT
185 #define EXCEPTION_BREAKPOINT            STATUS_BREAKPOINT
186 #define EXCEPTION_SINGLE_STEP           STATUS_SINGLE_STEP
187 #define EXCEPTION_ARRAY_BOUNDS_EXCEEDED STATUS_ARRAY_BOUNDS_EXCEEDED
188 #define EXCEPTION_FLT_DENORMAL_OPERAND  STATUS_FLOAT_DENORMAL_OPERAND
189 #define EXCEPTION_FLT_DIVIDE_BY_ZERO    STATUS_FLOAT_DIVIDE_BY_ZERO
190 #define EXCEPTION_FLT_INEXACT_RESULT    STATUS_FLOAT_INEXACT_RESULT
191 #define EXCEPTION_FLT_INVALID_OPERATION STATUS_FLOAT_INVALID_OPERATION
192 #define EXCEPTION_FLT_OVERFLOW          STATUS_FLOAT_OVERFLOW
193 #define EXCEPTION_FLT_STACK_CHECK       STATUS_FLOAT_STACK_CHECK
194 #define EXCEPTION_FLT_UNDERFLOW         STATUS_FLOAT_UNDERFLOW
195 #define EXCEPTION_INT_DIVIDE_BY_ZERO    STATUS_INTEGER_DIVIDE_BY_ZERO
196 #define EXCEPTION_INT_OVERFLOW          STATUS_INTEGER_OVERFLOW
197 #define EXCEPTION_PRIV_INSTRUCTION      STATUS_PRIVILEGED_INSTRUCTION
198 #define EXCEPTION_IN_PAGE_ERROR         STATUS_IN_PAGE_ERROR
199
200 #define MAXIMUM_WAIT_OBJECTS 64
201 #define MAXIMUM_SUSPEND_COUNT 127
202
203
204 /*
205  * Return values from the actual exception handlers
206  */
207
208 #define ExceptionContinueExecution 0
209 #define ExceptionContinueSearch    1
210 #define ExceptionNestedException   2
211 #define ExceptionCollidedUnwind    3
212  
213 /*
214  * Return values from filters in except() and from UnhandledExceptionFilter
215  */
216  
217 #define EXCEPTION_EXECUTE_HANDLER        1
218 #define EXCEPTION_CONTINUE_SEARCH        0
219 #define EXCEPTION_CONTINUE_EXECUTION    -1
220
221 /*
222  * From OS/2 2.0 exception handling
223  * Win32 seems to use the same flags as ExceptionFlags in an EXCEPTION_RECORD
224  */
225
226 #define EH_NONCONTINUABLE   0x01
227 #define EH_UNWINDING        0x02
228 #define EH_EXIT_UNWIND      0x04
229 #define EH_STACK_INVALID    0x08
230 #define EH_NESTED_CALL      0x10
231
232 #define EXCEPTION_CONTINUABLE        0
233 #define EXCEPTION_NONCONTINUABLE     EH_NONCONTINUABLE
234  
235 /*
236  * The exception record used by Win32 to give additional information 
237  * about exception to exception handlers.
238  */
239
240 #define EXCEPTION_MAXIMUM_PARAMETERS 15
241
242 typedef struct __EXCEPTION_RECORD
243 {
244     DWORD    ExceptionCode;
245     DWORD    ExceptionFlags;
246     struct __EXCEPTION_RECORD *ExceptionRecord;
247
248     LPVOID   ExceptionAddress;
249     DWORD    NumberParameters;
250     DWORD    ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
251 } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
252
253 /*
254  * The exception pointers structure passed to exception filters
255  * in except() and the UnhandledExceptionFilter().
256  */
257  
258 typedef struct _EXCEPTION_POINTERS 
259 {
260   PEXCEPTION_RECORD  ExceptionRecord;
261   PCONTEXT           ContextRecord;
262 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
263
264 /*
265  * function pointer to a exception filter
266  */
267
268 typedef LONG (CALLBACK *PTOP_LEVEL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS ExceptionInfo);
269 typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
270
271 DWORD WINAPI UnhandledExceptionFilter( PEXCEPTION_POINTERS epointers );
272 LPTOP_LEVEL_EXCEPTION_FILTER
273 WINAPI SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER filter );
274
275 /* Language IDs */
276
277 #define LANG_NEUTRAL                     0x00
278 #define LANG_ARABIC                      0x01
279 #define LANG_AFRIKAANS                   0x36
280 #define LANG_ALBANIAN                    0x1c
281 #define LANG_BASQUE                      0x2d
282 #define LANG_BULGARIAN                   0x02
283 #define LANG_BYELORUSSIAN                0x23
284 #define LANG_CATALAN                     0x03
285 #define LANG_CHINESE                     0x04
286 #define LANG_CROATIAN                    0x1a
287 #define LANG_CZECH                       0x05
288 #define LANG_DANISH                      0x06
289 #define LANG_DUTCH                       0x13
290 #define LANG_ENGLISH                     0x09
291 #define LANG_ESTONIAN                    0x25
292 #define LANG_FAEROESE                    0x38
293 #define LANG_FARSI                       0x29
294 #define LANG_FINNISH                     0x0b
295 #define LANG_FRENCH                      0x0c
296 #define LANG_GERMAN                      0x07
297 #define LANG_GREEK                       0x08
298 #define LANG_HEBREW                      0x0D
299 #define LANG_HUNGARIAN                   0x0e
300 #define LANG_ICELANDIC                   0x0f
301 #define LANG_INDONESIAN                  0x21
302 #define LANG_ITALIAN                     0x10
303 #define LANG_JAPANESE                    0x11
304 #define LANG_KOREAN                      0x12
305 #define LANG_LATVIAN                     0x26
306 #define LANG_LITHUANIAN                  0x27
307 #define LANG_NORWEGIAN                   0x14
308 #define LANG_POLISH                      0x15
309 #define LANG_PORTUGUESE                  0x16
310 #define LANG_ROMANIAN                    0x18
311 #define LANG_RUSSIAN                     0x19
312 #define LANG_SLOVAK                      0x1b
313 #define LANG_SLOVENIAN                   0x24
314 #define LANG_SORBIAN                     0x2e
315 #define LANG_SPANISH                     0x0a
316 #define LANG_SWEDISH                     0x1d
317 #define LANG_THAI                        0x1e
318 #define LANG_TURKISH                     0x1f
319 #define LANG_UKRAINIAN                   0x22
320
321
322 /* Access rights */
323
324 #define DELETE                     0x00010000
325 #define READ_CONTROL               0x00020000
326 #define WRITE_DAC                  0x00040000
327 #define WRITE_OWNER                0x00080000
328 #define SYNCHRONIZE                0x00100000
329 #define STANDARD_RIGHTS_REQUIRED   0x000f0000
330
331 #define STANDARD_RIGHTS_READ       READ_CONTROL
332 #define STANDARD_RIGHTS_WRITE      READ_CONTROL
333 #define STANDARD_RIGHTS_EXECUTE    READ_CONTROL
334
335 #define STANDARD_RIGHTS_ALL        0x001f0000
336
337 #define SPECIFIC_RIGHTS_ALL        0x0000ffff
338
339 #define GENERIC_READ               0x80000000
340 #define GENERIC_WRITE              0x40000000
341 #define GENERIC_EXECUTE            0x20000000
342 #define GENERIC_ALL                0x10000000
343
344 #define EVENT_MODIFY_STATE         0x0002
345 #define EVENT_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
346
347 #define SEMAPHORE_MODIFY_STATE     0x0002
348 #define SEMAPHORE_ALL_ACCESS       (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
349
350 #define MUTEX_MODIFY_STATE         0x0001
351 #define MUTEX_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1)
352
353 #define PROCESS_TERMINATE          0x0001
354 #define PROCESS_CREATE_THREAD      0x0002
355 #define PROCESS_VM_OPERATION       0x0008
356 #define PROCESS_VM_READ            0x0010
357 #define PROCESS_VM_WRITE           0x0020
358 #define PROCESS_DUP_HANDLE         0x0040
359 #define PROCESS_CREATE_PROCESS     0x0080
360 #define PROCESS_SET_QUOTA          0x0100
361 #define PROCESS_SET_INFORMATION    0x0200
362 #define PROCESS_QUERY_INFORMATION  0x0400
363 #define PROCESS_ALL_ACCESS         (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xfff)
364
365 #define THREAD_TERMINATE           0x0001
366 #define THREAD_SUSPEND_RESUME      0x0002
367 #define THREAD_GET_CONTEXT         0x0008
368 #define THREAD_SET_CONTEXT         0x0010
369 #define THREAD_SET_INFORMATION     0x0020
370 #define THREAD_QUERY_INFORMATION   0x0040
371 #define THREAD_SET_THREAD_TOKEN    0x0080
372 #define THREAD_IMPERSONATE         0x0100
373 #define THREAD_DIRECT_IMPERSONATION 0x0200
374 #define THREAD_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3ff)
375
376 #define FILE_READ_DATA            0x0001    /* file & pipe */
377 #define FILE_LIST_DIRECTORY       0x0001    /* directory */
378 #define FILE_WRITE_DATA           0x0002    /* file & pipe */
379 #define FILE_ADD_FILE             0x0002    /* directory */
380 #define FILE_APPEND_DATA          0x0004    /* file */
381 #define FILE_ADD_SUBDIRECTORY     0x0004    /* directory */
382 #define FILE_CREATE_PIPE_INSTANCE 0x0004    /* named pipe */
383 #define FILE_READ_EA              0x0008    /* file & directory */
384 #define FILE_READ_PROPERTIES      FILE_READ_EA
385 #define FILE_WRITE_EA             0x0010    /* file & directory */
386 #define FILE_WRITE_PROPERTIES     FILE_WRITE_EA
387 #define FILE_EXECUTE              0x0020    /* file */
388 #define FILE_TRAVERSE             0x0020    /* directory */
389 #define FILE_DELETE_CHILD         0x0040    /* directory */
390 #define FILE_READ_ATTRIBUTES      0x0080    /* all */
391 #define FILE_WRITE_ATTRIBUTES     0x0100    /* all */
392 #define FILE_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1ff)
393
394 #define FILE_GENERIC_READ         (STANDARD_RIGHTS_READ | FILE_READ_DATA | \
395                                    FILE_READ_ATTRIBUTES | FILE_READ_EA | \
396                                    SYNCHRONIZE)
397 #define FILE_GENERIC_WRITE        (STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | \
398                                    FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | \
399                                    FILE_APPEND_DATA | SYNCHRONIZE)
400 #define FILE_GENERIC_EXECUTE      (STANDARD_RIGHTS_EXECUTE | FILE_EXECUTE | \
401                                    FILE_READ_ATTRIBUTES | SYNCHRONIZE)
402
403 #endif  /* __WINE_WINNT_H */