Moved GET_IP macro to winnt.h
[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 "windef.h"
11
12 #include "pshpack1.h"
13 /* Defines */
14
15 /* Argument 1 passed to the DllEntryProc. */
16 #define DLL_PROCESS_DETACH      0       /* detach process (unload library) */
17 #define DLL_PROCESS_ATTACH      1       /* attach process (load library) */
18 #define DLL_THREAD_ATTACH       2       /* attach new thread */
19 #define DLL_THREAD_DETACH       3       /* detach thread */
20
21
22 /* u.x.wProcessorArchitecture (NT) */
23 #define PROCESSOR_ARCHITECTURE_INTEL    0
24 #define PROCESSOR_ARCHITECTURE_MIPS     1
25 #define PROCESSOR_ARCHITECTURE_ALPHA    2
26 #define PROCESSOR_ARCHITECTURE_PPC      3
27 #define PROCESSOR_ARCHITECTURE_SHX      4
28 #define PROCESSOR_ARCHITECTURE_ARM      5
29 #define PROCESSOR_ARCHITECTURE_UNKNOWN  0xFFFF
30
31 /* dwProcessorType */
32 #define PROCESSOR_INTEL_386      386
33 #define PROCESSOR_INTEL_486      486
34 #define PROCESSOR_INTEL_PENTIUM  586
35 #define PROCESSOR_INTEL_860      860
36 #define PROCESSOR_MIPS_R2000     2000
37 #define PROCESSOR_MIPS_R3000     3000
38 #define PROCESSOR_MIPS_R4000     4000
39 #define PROCESSOR_ALPHA_21064    21064
40 #define PROCESSOR_PPC_601        601
41 #define PROCESSOR_PPC_603        603
42 #define PROCESSOR_PPC_604        604
43 #define PROCESSOR_PPC_620        620
44 #define PROCESSOR_HITACHI_SH3    10003
45 #define PROCESSOR_HITACHI_SH3E   10004
46 #define PROCESSOR_HITACHI_SH4    10005
47 #define PROCESSOR_MOTOROLA_821   821
48 #define PROCESSOR_SHx_SH3        103
49 #define PROCESSOR_SHx_SH4        104
50 #define PROCESSOR_STRONGARM      2577
51 #define PROCESSOR_ARM720         1824    /* 0x720 */
52 #define PROCESSOR_ARM820         2080    /* 0x820 */
53 #define PROCESSOR_ARM920         2336    /* 0x920 */
54 #define PROCESSOR_ARM_7TDMI      70001
55
56 #define ANYSIZE_ARRAY 1
57
58 #define MINCHAR       0x80
59 #define MAXCHAR       0x7f
60 #define MINSHORT      0x8000
61 #define MAXSHORT      0x7fff
62 #define MINLONG       0x80000000
63 #define MAXLONG       0x7fffffff
64 #define MAXBYTE       0xff
65 #define MAXWORD       0xffff
66 #define MAXDWORD      0xffffffff
67
68 #define FIELD_OFFSET(type, field) \
69   ((LONG)(INT)&(((type *)0)->field))
70
71 #define CONTAINING_RECORD(address, type, field) \
72   ((type *)((PCHAR)(address) - (PCHAR)(&((type *)0)->field)))
73
74 /* Types */
75
76 /* TCHAR data types definitions for Winelib. */
77 /* These types are _not_ defined for the emulator, because they */
78 /* depend on the UNICODE macro that only exists in user's code. */
79
80 #ifndef __WINE__
81 # ifdef UNICODE
82 typedef LPWSTR LPTSTR;
83 typedef LPCWSTR LPCTSTR;
84 #define __TEXT(string) L##string /*probably wrong */
85 # else  /* UNICODE */
86 typedef LPSTR LPTSTR;
87 typedef LPCSTR LPCTSTR;
88 #define __TEXT(string) string
89 # endif /* UNICODE */
90 #endif   /* __WINE__ */
91 #define TEXT(quote) __TEXT(quote)
92
93 typedef BYTE     BOOLEAN;
94 typedef BOOLEAN *PBOOLEAN;
95
96 typedef struct _LIST_ENTRY {
97   struct _LIST_ENTRY *Flink;
98   struct _LIST_ENTRY *Blink;
99 } LIST_ENTRY, *PLIST_ENTRY;
100
101 typedef struct _SINGLE_LIST_ENTRY {
102   struct _SINGLE_LIST_ENTRY *Next;
103 } SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
104
105 /* Heap flags */
106
107 #define HEAP_NO_SERIALIZE               0x00000001
108 #define HEAP_GROWABLE                   0x00000002
109 #define HEAP_GENERATE_EXCEPTIONS        0x00000004
110 #define HEAP_ZERO_MEMORY                0x00000008
111 #define HEAP_REALLOC_IN_PLACE_ONLY      0x00000010
112 #define HEAP_TAIL_CHECKING_ENABLED      0x00000020
113 #define HEAP_FREE_CHECKING_ENABLED      0x00000040
114 #define HEAP_DISABLE_COALESCE_ON_FREE   0x00000080
115 #define HEAP_CREATE_ALIGN_16            0x00010000
116 #define HEAP_CREATE_ENABLE_TRACING      0x00020000
117 #define HEAP_WINE_SEGPTR                0x01000000  /* Not a Win32 flag */
118 #define HEAP_WINE_CODESEG               0x02000000  /* Not a Win32 flag */
119 #define HEAP_WINE_CODE16SEG             0x04000000  /* Not a Win32 flag */
120
121 /* Processor feature flags.  */
122 #define PF_FLOATING_POINT_PRECISION_ERRATA      0
123 #define PF_FLOATING_POINT_EMULATED              1
124 #define PF_COMPARE_EXCHANGE_DOUBLE              2
125 #define PF_MMX_INSTRUCTIONS_AVAILABLE           3
126 #define PF_PPC_MOVEMEM_64BIT_OK                 4
127 #define PF_ALPHA_BYTE_INSTRUCTIONS              5
128
129
130 /* The Win32 register context */
131
132 /* CONTEXT is the CPU-dependent context; it should be used        */
133 /* wherever a platform-specific context is needed (e.g. exception */
134 /* handling, Win32 register functions). */
135
136 /* CONTEXT86 is the i386-specific context; it should be used     */
137 /* wherever only a 386 context makes sense (e.g. DOS interrupts, */
138 /* Win16 register functions), so that this code can be compiled  */
139 /* on all platforms. */
140
141 #define SIZE_OF_80387_REGISTERS      80
142
143 typedef struct _FLOATING_SAVE_AREA
144 {
145     DWORD   ControlWord;
146     DWORD   StatusWord;
147     DWORD   TagWord;    
148     DWORD   ErrorOffset;
149     DWORD   ErrorSelector;
150     DWORD   DataOffset;
151     DWORD   DataSelector;    
152     BYTE    RegisterArea[SIZE_OF_80387_REGISTERS];
153     DWORD   Cr0NpxState;
154 } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
155
156 typedef struct _CONTEXT86
157 {
158     DWORD   ContextFlags;
159
160     /* These are selected by CONTEXT_DEBUG_REGISTERS */
161     DWORD   Dr0;
162     DWORD   Dr1;
163     DWORD   Dr2;
164     DWORD   Dr3;
165     DWORD   Dr6;
166     DWORD   Dr7;
167
168     /* These are selected by CONTEXT_FLOATING_POINT */
169     FLOATING_SAVE_AREA FloatSave;
170
171     /* These are selected by CONTEXT_SEGMENTS */
172     DWORD   SegGs;
173     DWORD   SegFs;
174     DWORD   SegEs;
175     DWORD   SegDs;    
176
177     /* These are selected by CONTEXT_INTEGER */
178     DWORD   Edi;
179     DWORD   Esi;
180     DWORD   Ebx;
181     DWORD   Edx;    
182     DWORD   Ecx;
183     DWORD   Eax;
184
185     /* These are selected by CONTEXT_CONTROL */
186     DWORD   Ebp;    
187     DWORD   Eip;
188     DWORD   SegCs;
189     DWORD   EFlags;
190     DWORD   Esp;
191     DWORD   SegSs;
192 } CONTEXT86;
193
194 #define CONTEXT_X86       0x00010000
195 #define CONTEXT_i386      CONTEXT_X86
196 #define CONTEXT_i486      CONTEXT_X86
197
198 #define CONTEXT86_CONTROL   (CONTEXT_i386 | 0x0001) /* SS:SP, CS:IP, FLAGS, BP */
199 #define CONTEXT86_INTEGER   (CONTEXT_i386 | 0x0002) /* AX, BX, CX, DX, SI, DI */
200 #define CONTEXT86_SEGMENTS  (CONTEXT_i386 | 0x0004) /* DS, ES, FS, GS */
201 #define CONTEXT86_FLOATING_POINT  (CONTEXT_i386 | 0x0008L) /* 387 state */
202 #define CONTEXT86_DEBUG_REGISTERS (CONTEXT_i386 | 0x0010L) /* DB 0-3,6,7 */
203 #define CONTEXT86_FULL (CONTEXT86_CONTROL | CONTEXT86_INTEGER | CONTEXT86_SEGMENTS)
204
205 /* i386 context definitions */
206 #ifdef __i386__
207
208 #define CONTEXT_CONTROL         CONTEXT86_CONTROL
209 #define CONTEXT_INTEGER         CONTEXT86_INTEGER
210 #define CONTEXT_SEGMENTS        CONTEXT86_SEGMENTS
211 #define CONTEXT_FLOATING_POINT  CONTEXT86_FLOATING_POINT
212 #define CONTEXT_DEBUG_REGISTERS CONTEXT86_DEBUG_REGISTERS
213 #define CONTEXT_FULL            CONTEXT86_FULL
214
215 typedef CONTEXT86 CONTEXT;
216
217 #endif  /* __i386__ */
218
219 /* Alpha context definitions */
220 #ifdef _ALPHA_
221
222 #define CONTEXT_ALPHA   0x00020000
223  
224 #define CONTEXT_CONTROL         (CONTEXT_ALPHA | 0x00000001L)
225 #define CONTEXT_FLOATING_POINT  (CONTEXT_ALPHA | 0x00000002L)
226 #define CONTEXT_INTEGER         (CONTEXT_ALPHA | 0x00000004L)
227 #define CONTEXT_FULL  (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
228
229 typedef struct _CONTEXT
230 {
231     /* selected by CONTEXT_FLOATING_POINT */
232     ULONGLONG FltF0;
233     ULONGLONG FltF1;
234     ULONGLONG FltF2;
235     ULONGLONG FltF3;
236     ULONGLONG FltF4;
237     ULONGLONG FltF5;
238     ULONGLONG FltF6;
239     ULONGLONG FltF7;
240     ULONGLONG FltF8;
241     ULONGLONG FltF9;
242     ULONGLONG FltF10;
243     ULONGLONG FltF11;
244     ULONGLONG FltF12;
245     ULONGLONG FltF13;
246     ULONGLONG FltF14;
247     ULONGLONG FltF15;
248     ULONGLONG FltF16;
249     ULONGLONG FltF17;
250     ULONGLONG FltF18;
251     ULONGLONG FltF19;
252     ULONGLONG FltF20;
253     ULONGLONG FltF21;
254     ULONGLONG FltF22;
255     ULONGLONG FltF23;
256     ULONGLONG FltF24;
257     ULONGLONG FltF25;
258     ULONGLONG FltF26;
259     ULONGLONG FltF27;
260     ULONGLONG FltF28;
261     ULONGLONG FltF29;
262     ULONGLONG FltF30;
263     ULONGLONG FltF31;
264
265     /* selected by CONTEXT_INTEGER */
266     ULONGLONG IntV0;
267     ULONGLONG IntT0;
268     ULONGLONG IntT1;
269     ULONGLONG IntT2;
270     ULONGLONG IntT3;
271     ULONGLONG IntT4;
272     ULONGLONG IntT5;
273     ULONGLONG IntT6;
274     ULONGLONG IntT7;
275     ULONGLONG IntS0;
276     ULONGLONG IntS1;
277     ULONGLONG IntS2;
278     ULONGLONG IntS3;
279     ULONGLONG IntS4;
280     ULONGLONG IntS5;
281     ULONGLONG IntFp;
282     ULONGLONG IntA0;
283     ULONGLONG IntA1;
284     ULONGLONG IntA2;
285     ULONGLONG IntA3;
286     ULONGLONG IntA4;
287     ULONGLONG IntA5;
288     ULONGLONG IntT8;
289     ULONGLONG IntT9;
290     ULONGLONG IntT10;
291     ULONGLONG IntT11;
292     ULONGLONG IntRa;
293     ULONGLONG IntT12;
294     ULONGLONG IntAt;
295     ULONGLONG IntGp;
296     ULONGLONG IntSp;
297     ULONGLONG IntZero;
298
299     /* selected by CONTEXT_FLOATING_POINT */
300     ULONGLONG Fpcr;
301     ULONGLONG SoftFpcr;
302
303     /* selected by CONTEXT_CONTROL */
304     ULONGLONG Fir;
305     DWORD Psr;
306     DWORD ContextFlags;
307     DWORD Fill[4];
308 } CONTEXT;
309
310 #define _QUAD_PSR_OFFSET   HighSoftFpcr
311 #define _QUAD_FLAGS_OFFSET HighFir
312
313 #endif  /* _ALPHA_ */
314
315 /* Mips context definitions */
316 #ifdef _MIPS_
317
318 #define CONTEXT_R4000   0x00010000
319
320 #define CONTEXT_CONTROL         (CONTEXT_R4000 | 0x00000001)
321 #define CONTEXT_FLOATING_POINT  (CONTEXT_R4000 | 0x00000002)
322 #define CONTEXT_INTEGER         (CONTEXT_R4000 | 0x00000004)
323
324 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
325
326 typedef struct _CONTEXT
327 {
328     DWORD Argument[4];
329     /* These are selected by CONTEXT_FLOATING_POINT */
330     DWORD FltF0;
331     DWORD FltF1;
332     DWORD FltF2;
333     DWORD FltF3;
334     DWORD FltF4;
335     DWORD FltF5;
336     DWORD FltF6;
337     DWORD FltF7;
338     DWORD FltF8;
339     DWORD FltF9;
340     DWORD FltF10;
341     DWORD FltF11;
342     DWORD FltF12;
343     DWORD FltF13;
344     DWORD FltF14;
345     DWORD FltF15;
346     DWORD FltF16;
347     DWORD FltF17;
348     DWORD FltF18;
349     DWORD FltF19;
350     DWORD FltF20;
351     DWORD FltF21;
352     DWORD FltF22;
353     DWORD FltF23;
354     DWORD FltF24;
355     DWORD FltF25;
356     DWORD FltF26;
357     DWORD FltF27;
358     DWORD FltF28;
359     DWORD FltF29;
360     DWORD FltF30;
361     DWORD FltF31;
362
363     /* These are selected by CONTEXT_INTEGER */
364     DWORD IntZero;
365     DWORD IntAt;
366     DWORD IntV0;
367     DWORD IntV1;
368     DWORD IntA0;
369     DWORD IntA1;
370     DWORD IntA2;
371     DWORD IntA3;
372     DWORD IntT0;
373     DWORD IntT1;
374     DWORD IntT2;
375     DWORD IntT3;
376     DWORD IntT4;
377     DWORD IntT5;
378     DWORD IntT6;
379     DWORD IntT7;
380     DWORD IntS0;
381     DWORD IntS1;
382     DWORD IntS2;
383     DWORD IntS3;
384     DWORD IntS4;
385     DWORD IntS5;
386     DWORD IntS6;
387     DWORD IntS7;
388     DWORD IntT8;
389     DWORD IntT9;
390     DWORD IntK0;
391     DWORD IntK1;
392     DWORD IntGp;
393     DWORD IntSp;
394     DWORD IntS8;
395     DWORD IntRa;
396     DWORD IntLo;
397     DWORD IntHi;
398
399     /* These are selected by CONTEXT_FLOATING_POINT */
400     DWORD Fsr;
401
402     /* These are selected by CONTEXT_CONTROL */
403     DWORD Fir;
404     DWORD Psr;
405
406     DWORD ContextFlags;
407     DWORD Fill[2];
408 } CONTEXT;
409
410 #endif  /* _MIPS_ */
411
412 /* PowerPC context definitions */
413 #ifdef __PPC__
414
415 #define CONTEXT_CONTROL         0x0001
416 #define CONTEXT_FLOATING_POINT  0x0002
417 #define CONTEXT_INTEGER         0x0004
418 #define CONTEXT_DEBUG_REGISTERS 0x0008
419 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
420
421 typedef struct
422 {
423     /* These are selected by CONTEXT_FLOATING_POINT */
424     double Fpr0;
425     double Fpr1;
426     double Fpr2;
427     double Fpr3;
428     double Fpr4;
429     double Fpr5;
430     double Fpr6;
431     double Fpr7;
432     double Fpr8;
433     double Fpr9;
434     double Fpr10;
435     double Fpr11;
436     double Fpr12;
437     double Fpr13;
438     double Fpr14;
439     double Fpr15;
440     double Fpr16;
441     double Fpr17;
442     double Fpr18;
443     double Fpr19;
444     double Fpr20;
445     double Fpr21;
446     double Fpr22;
447     double Fpr23;
448     double Fpr24;
449     double Fpr25;
450     double Fpr26;
451     double Fpr27;
452     double Fpr28;
453     double Fpr29;
454     double Fpr30;
455     double Fpr31;
456     double Fpscr;
457
458     /* These are selected by CONTEXT_INTEGER */
459     DWORD Gpr0;
460     DWORD Gpr1;
461     DWORD Gpr2;
462     DWORD Gpr3;
463     DWORD Gpr4;
464     DWORD Gpr5;
465     DWORD Gpr6;
466     DWORD Gpr7;
467     DWORD Gpr8;
468     DWORD Gpr9;
469     DWORD Gpr10;
470     DWORD Gpr11;
471     DWORD Gpr12;
472     DWORD Gpr13;
473     DWORD Gpr14;
474     DWORD Gpr15;
475     DWORD Gpr16;
476     DWORD Gpr17;
477     DWORD Gpr18;
478     DWORD Gpr19;
479     DWORD Gpr20;
480     DWORD Gpr21;
481     DWORD Gpr22;
482     DWORD Gpr23;
483     DWORD Gpr24;
484     DWORD Gpr25;
485     DWORD Gpr26;
486     DWORD Gpr27;
487     DWORD Gpr28;
488     DWORD Gpr29;
489     DWORD Gpr30;
490     DWORD Gpr31;
491
492     DWORD Cr;
493     DWORD Xer;
494
495     /* These are selected by CONTEXT_CONTROL */
496     DWORD Msr;
497     DWORD Iar;
498     DWORD Lr;
499     DWORD Ctr;
500
501     DWORD ContextFlags;
502     DWORD Fill[3];
503
504     /* These are selected by CONTEXT_DEBUG_REGISTERS */
505     DWORD Dr0;
506     DWORD Dr1;
507     DWORD Dr2;
508     DWORD Dr3;
509     DWORD Dr4;
510     DWORD Dr5;
511     DWORD Dr6;
512     DWORD Dr7;
513 } CONTEXT;
514
515 typedef struct _STACK_FRAME_HEADER
516 {
517     DWORD BackChain;
518     DWORD GlueSaved1;
519     DWORD GlueSaved2;
520     DWORD Reserved1;
521     DWORD Spare1;
522     DWORD Spare2;
523
524     DWORD Parameter0;
525     DWORD Parameter1;
526     DWORD Parameter2;
527     DWORD Parameter3;
528     DWORD Parameter4;
529     DWORD Parameter5;
530     DWORD Parameter6;
531     DWORD Parameter7;
532 } STACK_FRAME_HEADER,*PSTACK_FRAME_HEADER;
533
534 #endif  /* __PPC__ */
535
536 #ifdef __sparc__
537
538 /* 
539  * FIXME:  
540  *
541  * There is no official CONTEXT structure defined for the SPARC 
542  * architecture, so I just made one up.
543  *
544  * This structure is valid only for 32-bit SPARC architectures,
545  * not for 64-bit SPARC.
546  *
547  * Note that this structure contains only the 'top-level' registers;
548  * the rest of the register window chain is not visible.
549  *
550  * The layout follows the Solaris 'prgregset_t' structure.
551  * 
552  */ 
553
554 #define CONTEXT_SPARC            0x10000000
555
556 #define CONTEXT_CONTROL         (CONTEXT_SPARC | 0x00000001)
557 #define CONTEXT_FLOATING_POINT  (CONTEXT_SPARC | 0x00000002)
558 #define CONTEXT_INTEGER         (CONTEXT_SPARC | 0x00000004)
559
560 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
561
562 typedef struct _CONTEXT
563 {
564     /* These are selected by CONTEXT_INTEGER */
565     DWORD g0;
566     DWORD g1;
567     DWORD g2;
568     DWORD g3;
569     DWORD g4;
570     DWORD g5;
571     DWORD g6;
572     DWORD g7;
573     DWORD o0;
574     DWORD o1;
575     DWORD o2;
576     DWORD o3;
577     DWORD o4;
578     DWORD o5;
579     DWORD o6;
580     DWORD o7;
581     DWORD l0;
582     DWORD l1;
583     DWORD l2;
584     DWORD l3;
585     DWORD l4;
586     DWORD l5;
587     DWORD l6;
588     DWORD l7;
589     DWORD i0;
590     DWORD i1;
591     DWORD i2;
592     DWORD i3;
593     DWORD i4;
594     DWORD i5;
595     DWORD i6;
596     DWORD i7;
597
598     /* These are selected by CONTEXT_CONTROL */
599     DWORD psr;
600     DWORD pc;
601     DWORD npc;
602     DWORD y;
603     DWORD wim;
604     DWORD tbr;
605
606     /* FIXME: floating point registers missing */
607
608 } CONTEXT;
609
610 #endif
611
612 #if !defined(CONTEXT_FULL) && !defined(RC_INVOKED)
613 #error You need to define a CONTEXT for your CPU
614 #endif
615
616 typedef CONTEXT *PCONTEXT;
617 typedef HANDLE *PHANDLE;
618
619 #ifdef __WINE__
620
621 /* Macros for easier access to i386 context registers */
622
623 #define EAX_reg(context)     ((context)->Eax)
624 #define EBX_reg(context)     ((context)->Ebx)
625 #define ECX_reg(context)     ((context)->Ecx)
626 #define EDX_reg(context)     ((context)->Edx)
627 #define ESI_reg(context)     ((context)->Esi)
628 #define EDI_reg(context)     ((context)->Edi)
629 #define EBP_reg(context)     ((context)->Ebp)
630
631 #define CS_reg(context)      ((context)->SegCs)
632 #define DS_reg(context)      ((context)->SegDs)
633 #define ES_reg(context)      ((context)->SegEs)
634 #define FS_reg(context)      ((context)->SegFs)
635 #define GS_reg(context)      ((context)->SegGs)
636 #define SS_reg(context)      ((context)->SegSs)
637
638 #define EFL_reg(context)     ((context)->EFlags)
639 #define EIP_reg(context)     ((context)->Eip)
640 #define ESP_reg(context)     ((context)->Esp)
641
642 #define AX_reg(context)      (*(WORD*)&EAX_reg(context))
643 #define BX_reg(context)      (*(WORD*)&EBX_reg(context))
644 #define CX_reg(context)      (*(WORD*)&ECX_reg(context))
645 #define DX_reg(context)      (*(WORD*)&EDX_reg(context))
646 #define SI_reg(context)      (*(WORD*)&ESI_reg(context))
647 #define DI_reg(context)      (*(WORD*)&EDI_reg(context))
648 #define BP_reg(context)      (*(WORD*)&EBP_reg(context))
649
650 #define AL_reg(context)      (*(BYTE*)&EAX_reg(context))
651 #define AH_reg(context)      (*((BYTE*)&EAX_reg(context)+1))
652 #define BL_reg(context)      (*(BYTE*)&EBX_reg(context))
653 #define BH_reg(context)      (*((BYTE*)&EBX_reg(context)+1))
654 #define CL_reg(context)      (*(BYTE*)&ECX_reg(context))
655 #define CH_reg(context)      (*((BYTE*)&ECX_reg(context)+1))
656 #define DL_reg(context)      (*(BYTE*)&EDX_reg(context))
657 #define DH_reg(context)      (*((BYTE*)&EDX_reg(context)+1))
658                             
659 #define SET_CFLAG(context)   (EFL_reg(context) |= 0x0001)
660 #define RESET_CFLAG(context) (EFL_reg(context) &= ~0x0001)
661 #define SET_ZFLAG(context)   (EFL_reg(context) |= 0x0040)
662 #define RESET_ZFLAG(context) (EFL_reg(context) &= ~0x0040)
663
664 #define ISV86(context)       (EFL_reg(context) & 0x00020000)
665 #define V86BASE(context)     ((context)->Dr7) /* ugly */
666
667 #ifdef __i386__
668 # define GET_IP(context) ((LPVOID)(context)->Eip)
669 #endif
670 #ifdef __sparc__
671 # define GET_IP(context) ((LPVOID)(context)->pc)
672 #endif
673  
674 #if !defined(GET_IP) && !defined(RC_INVOKED)
675 # error You must define GET_IP for this CPU
676 #endif
677
678 #endif  /* __WINE__ */
679
680 /*
681  * Exception codes
682  */
683  
684 #define STATUS_SUCCESS                   0x00000000
685 #define STATUS_WAIT_0                    0x00000000
686 #define STATUS_ABANDONED_WAIT_0          0x00000080
687 #define STATUS_USER_APC                  0x000000C0
688 #define STATUS_TIMEOUT                   0x00000102
689 #define STATUS_PENDING                   0x00000103
690 #define STATUS_GUARD_PAGE_VIOLATION      0x80000001    
691 #define STATUS_DATATYPE_MISALIGNMENT     0x80000002
692 #define STATUS_BREAKPOINT                0x80000003
693 #define STATUS_SINGLE_STEP               0x80000004
694 #define STATUS_BUFFER_OVERFLOW           0x80000005
695 #define STATUS_UNSUCCESSFUL              0xC0000001
696 #define STATUS_ACCESS_VIOLATION          0xC0000005
697 #define STATUS_IN_PAGE_ERROR             0xC0000006
698 #define STATUS_INVALID_PARAMETER         0xC000000D
699 #define STATUS_NO_MEMORY                 0xC0000017
700 #define STATUS_CONFLICTING_ADDRESSES     0xC0000018
701 #define STATUS_ILLEGAL_INSTRUCTION       0xC000001D
702 #define STATUS_BUFFER_TOO_SMALL          0xC0000023
703 #define STATUS_NONCONTINUABLE_EXCEPTION  0xC0000025
704 #define STATUS_INVALID_DISPOSITION       0xC0000026
705 #define STATUS_UNWIND                    0xC0000027
706 #define STATUS_BAD_STACK                 0xC0000028
707 #define STATUS_INVALID_UNWIND_TARGET     0xC0000029
708 #define STATUS_UNKNOWN_REVISION          0xC0000058
709 #define STATUS_INVALID_SECURITY_DESCR    0xC0000079
710 #define STATUS_ARRAY_BOUNDS_EXCEEDED     0xC000008C
711 #define STATUS_FLOAT_DENORMAL_OPERAND    0xC000008D
712 #define STATUS_FLOAT_DIVIDE_BY_ZERO      0xC000008E
713 #define STATUS_FLOAT_INEXACT_RESULT      0xC000008F
714 #define STATUS_FLOAT_INVALID_OPERATION   0xC0000090
715 #define STATUS_FLOAT_OVERFLOW            0xC0000091
716 #define STATUS_FLOAT_STACK_CHECK         0xC0000092
717 #define STATUS_FLOAT_UNDERFLOW           0xC0000093
718 #define STATUS_INTEGER_DIVIDE_BY_ZERO    0xC0000094
719 #define STATUS_INTEGER_OVERFLOW          0xC0000095
720 #define STATUS_PRIVILEGED_INSTRUCTION    0xC0000096
721 #define STATUS_INVALID_PARAMETER_2       0xC00000F0
722 #define STATUS_STACK_OVERFLOW            0xC00000FD
723 #define STATUS_CONTROL_C_EXIT            0xC000013A
724
725 #define MAXIMUM_WAIT_OBJECTS 64
726 #define MAXIMUM_SUSPEND_COUNT 127
727
728
729 /*
730  * Return values from the actual exception handlers
731  */
732
733 #define ExceptionContinueExecution 0
734 #define ExceptionContinueSearch    1
735 #define ExceptionNestedException   2
736 #define ExceptionCollidedUnwind    3
737  
738 /*
739  * Return values from filters in except() and from UnhandledExceptionFilter
740  */
741  
742 #define EXCEPTION_EXECUTE_HANDLER        1
743 #define EXCEPTION_CONTINUE_SEARCH        0
744 #define EXCEPTION_CONTINUE_EXECUTION    -1
745
746 /*
747  * From OS/2 2.0 exception handling
748  * Win32 seems to use the same flags as ExceptionFlags in an EXCEPTION_RECORD
749  */
750
751 #define EH_NONCONTINUABLE   0x01
752 #define EH_UNWINDING        0x02
753 #define EH_EXIT_UNWIND      0x04
754 #define EH_STACK_INVALID    0x08
755 #define EH_NESTED_CALL      0x10
756
757 #define EXCEPTION_CONTINUABLE        0
758 #define EXCEPTION_NONCONTINUABLE     EH_NONCONTINUABLE
759  
760 /*
761  * The exception record used by Win32 to give additional information 
762  * about exception to exception handlers.
763  */
764
765 #define EXCEPTION_MAXIMUM_PARAMETERS 15
766
767 typedef struct __EXCEPTION_RECORD
768 {
769     DWORD    ExceptionCode;
770     DWORD    ExceptionFlags;
771     struct __EXCEPTION_RECORD *ExceptionRecord;
772
773     LPVOID   ExceptionAddress;
774     DWORD    NumberParameters;
775     DWORD    ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
776 } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
777
778 /*
779  * The exception pointers structure passed to exception filters
780  * in except() and the UnhandledExceptionFilter().
781  */
782  
783 typedef struct _EXCEPTION_POINTERS 
784 {
785   PEXCEPTION_RECORD  ExceptionRecord;
786   PCONTEXT           ContextRecord;
787 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
788
789
790 /*
791  * The exception frame, used for registering exception handlers 
792  * Win32 cares only about this, but compilers generally emit 
793  * larger exception frames for their own use.
794  */
795
796 struct __EXCEPTION_FRAME;
797
798 typedef DWORD (*PEXCEPTION_HANDLER)(PEXCEPTION_RECORD,struct __EXCEPTION_FRAME*,
799                                     PCONTEXT,struct __EXCEPTION_FRAME **);
800
801 typedef struct __EXCEPTION_FRAME
802 {
803   struct __EXCEPTION_FRAME *Prev;
804   PEXCEPTION_HANDLER       Handler;
805 } EXCEPTION_FRAME, *PEXCEPTION_FRAME;
806
807 #include "poppack.h"
808
809 /*
810  * function pointer to a exception filter
811  */
812
813 typedef LONG (CALLBACK *PTOP_LEVEL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS ExceptionInfo);
814 typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
815
816 DWORD WINAPI UnhandledExceptionFilter( PEXCEPTION_POINTERS epointers );
817 LPTOP_LEVEL_EXCEPTION_FILTER
818 WINAPI SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER filter );
819
820 /* status values for ContinueDebugEvent */
821 #define DBG_CONTINUE                0x00010002
822 #define DBG_TERMINATE_THREAD        0x40010003
823 #define DBG_TERMINATE_PROCESS       0x40010004
824 #define DBG_CONTROL_C               0x40010005
825 #define DBG_CONTROL_BREAK           0x40010008
826 #define DBG_EXCEPTION_NOT_HANDLED   0x80010001
827
828 struct _TEB;
829
830 #ifdef __WINE__
831
832 #if defined(__i386__)
833 static inline struct _TEB * WINE_UNUSED __get_teb(void)
834 {
835     struct _TEB *teb;
836     __asm__(".byte 0x64\n\tmovl (0x18),%0" : "=r" (teb));
837     return teb;
838 }
839 #elif defined(HAVE__LWP_CREATE)
840 extern void *_lwp_getprivate(void);
841 static inline struct _TEB * WINE_UNUSED __get_teb(void)
842 {
843     return (struct _TEB *)_lwp_getprivate();
844 }
845 #else
846 #error NtCurrentTeb() not defined for this architecture!
847 #endif
848
849 #define NtCurrentTeb() __get_teb()
850
851 #else /* __WINE__ */
852 extern struct _TEB * WINAPI NtCurrentTeb(void);
853 #endif
854
855 /*
856  * Here follows typedefs for security and tokens.
857  */ 
858
859 /*
860  * First a constant for the following typdefs.
861  */
862
863 #define ANYSIZE_ARRAY   1
864
865 /* FIXME:  Orphan.  What does it point to? */
866 typedef PVOID PACCESS_TOKEN;
867
868 /*
869  * TOKEN_INFORMATION_CLASS
870  */
871
872 typedef enum _TOKEN_INFORMATION_CLASS {
873   TokenUser = 1, 
874   TokenGroups, 
875   TokenPrivileges, 
876   TokenOwner, 
877   TokenPrimaryGroup, 
878   TokenDefaultDacl, 
879   TokenSource, 
880   TokenType, 
881   TokenImpersonationLevel, 
882   TokenStatistics 
883 } TOKEN_INFORMATION_CLASS; 
884
885 #ifndef _SECURITY_DEFINED
886 #define _SECURITY_DEFINED
887
888 #include "pshpack1.h"
889
890 typedef DWORD ACCESS_MASK, *PACCESS_MASK;
891
892 typedef struct _GENERIC_MAPPING {
893     ACCESS_MASK GenericRead;
894     ACCESS_MASK GenericWrite;
895     ACCESS_MASK GenericExecute;
896     ACCESS_MASK GenericAll;
897 } GENERIC_MAPPING, *PGENERIC_MAPPING;
898
899 #ifndef SID_IDENTIFIER_AUTHORITY_DEFINED
900 #define SID_IDENTIFIER_AUTHORITY_DEFINED
901 typedef struct {
902     BYTE Value[6];
903 } SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
904 #endif /* !defined(SID_IDENTIFIER_AUTHORITY_DEFINED) */
905
906 #ifndef SID_DEFINED
907 #define SID_DEFINED
908 typedef struct _SID {
909     BYTE Revision;
910     BYTE SubAuthorityCount;
911     SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
912     DWORD SubAuthority[1];
913 } SID,*PSID;
914 #endif /* !defined(SID_DEFINED) */
915
916 #define SID_REVISION                    (1)     /* Current revision */
917 #define SID_MAX_SUB_AUTHORITIES         (15)    /* current max subauths */
918 #define SID_RECOMMENDED_SUB_AUTHORITIES (1)     /* recommended subauths */
919
920
921 /* 
922  * ACL 
923  */
924
925 typedef struct _ACL {
926     BYTE AclRevision;
927     BYTE Sbz1;
928     WORD AclSize;
929     WORD AceCount;
930     WORD Sbz2;
931 } ACL, *PACL;
932
933 /* SECURITY_DESCRIPTOR */
934 #define SECURITY_DESCRIPTOR_REVISION    1
935 #define SECURITY_DESCRIPTOR_REVISION1   1
936
937
938 #define SE_OWNER_DEFAULTED      0x0001
939 #define SE_GROUP_DEFAULTED      0x0002
940 #define SE_DACL_PRESENT         0x0004
941 #define SE_DACL_DEFAULTED       0x0008
942 #define SE_SACL_PRESENT         0x0010
943 #define SE_SACL_DEFAULTED       0x0020
944 #define SE_SELF_RELATIVE        0x8000
945
946 typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;
947 typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
948
949 /* The security descriptor structure */
950 typedef struct {
951     BYTE Revision;
952     BYTE Sbz1;
953     SECURITY_DESCRIPTOR_CONTROL Control;
954     PSID Owner;
955     PSID Group;
956     PACL Sacl;
957     PACL Dacl;
958 } SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;
959
960 #define SECURITY_DESCRIPTOR_MIN_LENGTH   (sizeof(SECURITY_DESCRIPTOR)) 
961
962 #include "poppack.h"
963
964 #endif /* _SECURITY_DEFINED */
965
966 #include "pshpack1.h"
967
968 /* 
969  * SID_AND_ATTRIBUTES
970  */
971
972 typedef struct _SID_AND_ATTRIBUTES {
973   PSID  Sid; 
974   DWORD Attributes; 
975 } SID_AND_ATTRIBUTES ; 
976  
977 /*
978  * TOKEN_USER
979  */
980
981 typedef struct _TOKEN_USER {
982   SID_AND_ATTRIBUTES User; 
983 } TOKEN_USER; 
984
985 /*
986  * TOKEN_GROUPS
987  */
988
989 typedef struct _TOKEN_GROUPS  {
990   DWORD GroupCount; 
991   SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]; 
992 } TOKEN_GROUPS; 
993
994 /*
995  * LUID_AND_ATTRIBUTES
996  */
997
998 typedef union _LARGE_INTEGER {
999     struct {
1000         DWORD    LowPart;
1001         LONG     HighPart;
1002     } DUMMYSTRUCTNAME;
1003     LONGLONG QuadPart;
1004 } LARGE_INTEGER, *LPLARGE_INTEGER, *PLARGE_INTEGER;
1005
1006 typedef union _ULARGE_INTEGER {
1007     struct {
1008         DWORD    LowPart;
1009         LONG     HighPart;
1010     } DUMMYSTRUCTNAME;
1011     LONGLONG QuadPart;
1012 } ULARGE_INTEGER, *LPULARGE_INTEGER, *PULARGE_INTEGER;
1013
1014 /*
1015  * Locally Unique Identifier
1016  */
1017
1018 typedef LARGE_INTEGER LUID,*PLUID;
1019
1020 typedef struct _LUID_AND_ATTRIBUTES {
1021   LUID   Luid; 
1022   DWORD  Attributes; 
1023 } LUID_AND_ATTRIBUTES; 
1024
1025 /*
1026  * PRIVILEGE_SET
1027  */
1028
1029 typedef struct _PRIVILEGE_SET {
1030     DWORD PrivilegeCount;
1031     DWORD Control;
1032     LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
1033 } PRIVILEGE_SET, *PPRIVILEGE_SET;
1034
1035 /*
1036  * TOKEN_PRIVILEGES
1037  */
1038
1039 typedef struct _TOKEN_PRIVILEGES {
1040   DWORD PrivilegeCount; 
1041   LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; 
1042 } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; 
1043
1044 /*
1045  * TOKEN_OWNER
1046  */
1047
1048 typedef struct _TOKEN_OWNER {
1049   PSID Owner; 
1050 } TOKEN_OWNER; 
1051
1052 /*
1053  * TOKEN_PRIMARY_GROUP
1054  */
1055
1056 typedef struct _TOKEN_PRIMARY_GROUP {
1057   PSID PrimaryGroup; 
1058 } TOKEN_PRIMARY_GROUP; 
1059
1060
1061 /*
1062  * TOKEN_DEFAULT_DACL
1063  */
1064
1065 typedef struct _TOKEN_DEFAULT_DACL { 
1066   PACL DefaultDacl; 
1067 } TOKEN_DEFAULT_DACL; 
1068
1069 /*
1070  * TOKEN_SOURCEL
1071  */
1072
1073 typedef struct _TOKEN_SOURCE {
1074   char Sourcename[8]; 
1075   LUID SourceIdentifier; 
1076 } TOKEN_SOURCE; 
1077
1078 /*
1079  * TOKEN_TYPE
1080  */
1081
1082 typedef enum tagTOKEN_TYPE {
1083   TokenPrimary = 1, 
1084   TokenImpersonation 
1085 } TOKEN_TYPE; 
1086
1087 /*
1088  * SECURITY_IMPERSONATION_LEVEL
1089  */
1090
1091 typedef enum _SECURITY_IMPERSONATION_LEVEL {
1092   SecurityAnonymous, 
1093   SecurityIdentification, 
1094   SecurityImpersonation, 
1095   SecurityDelegation 
1096 } SECURITY_IMPERSONATION_LEVEL, *PSECURITY_IMPERSONATION_LEVEL; 
1097
1098
1099 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,
1100         * PSECURITY_CONTEXT_TRACKING_MODE;
1101 /*
1102  *      Quality of Service
1103  */
1104
1105 typedef struct _SECURITY_QUALITY_OF_SERVICE {
1106   DWORD                         Length;
1107   SECURITY_IMPERSONATION_LEVEL  ImpersonationLevel;
1108   SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
1109   BOOL                          EffectiveOnly;
1110 } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
1111
1112 /*
1113  * TOKEN_STATISTICS
1114  */
1115
1116 typedef struct _TOKEN_STATISTICS {
1117   LUID  TokenId; 
1118   LUID  AuthenticationId; 
1119   LARGE_INTEGER ExpirationTime; 
1120   TOKEN_TYPE    TokenType; 
1121   SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; 
1122   DWORD DynamicCharged; 
1123   DWORD DynamicAvailable; 
1124   DWORD GroupCount; 
1125   DWORD PrivilegeCount; 
1126   LUID  ModifiedId; 
1127 } TOKEN_STATISTICS; 
1128
1129 /* 
1130  *      ACLs of NT 
1131  */
1132
1133 #define ACL_REVISION    2
1134
1135 #define ACL_REVISION1   1
1136 #define ACL_REVISION2   2
1137
1138 /* ACEs, directly starting after an ACL */
1139 typedef struct _ACE_HEADER {
1140         BYTE    AceType;
1141         BYTE    AceFlags;
1142         WORD    AceSize;
1143 } ACE_HEADER,*PACE_HEADER;
1144
1145 /* AceType */
1146 #define ACCESS_ALLOWED_ACE_TYPE         0
1147 #define ACCESS_DENIED_ACE_TYPE          1
1148 #define SYSTEM_AUDIT_ACE_TYPE           2
1149 #define SYSTEM_ALARM_ACE_TYPE           3
1150
1151 /* inherit AceFlags */
1152 #define OBJECT_INHERIT_ACE              0x01
1153 #define CONTAINER_INHERIT_ACE           0x02
1154 #define NO_PROPAGATE_INHERIT_ACE        0x04
1155 #define INHERIT_ONLY_ACE                0x08
1156 #define VALID_INHERIT_FLAGS             0x0F
1157
1158 /* AceFlags mask for what events we (should) audit */
1159 #define SUCCESSFUL_ACCESS_ACE_FLAG      0x40
1160 #define FAILED_ACCESS_ACE_FLAG          0x80
1161
1162 /* different ACEs depending on AceType 
1163  * SidStart marks the begin of a SID
1164  * so the thing finally looks like this:
1165  * 0: ACE_HEADER
1166  * 4: ACCESS_MASK
1167  * 8... : SID
1168  */
1169 typedef struct _ACCESS_ALLOWED_ACE {
1170         ACE_HEADER      Header;
1171         DWORD           Mask;
1172         DWORD           SidStart;
1173 } ACCESS_ALLOWED_ACE,*PACCESS_ALLOWED_ACE;
1174
1175 typedef struct _ACCESS_DENIED_ACE {
1176         ACE_HEADER      Header;
1177         DWORD           Mask;
1178         DWORD           SidStart;
1179 } ACCESS_DENIED_ACE,*PACCESS_DENIED_ACE;
1180
1181 typedef struct _SYSTEM_AUDIT_ACE {
1182         ACE_HEADER      Header;
1183         DWORD           Mask;
1184         DWORD           SidStart;
1185 } SYSTEM_AUDIT_ACE,*PSYSTEM_AUDIT_ACE;
1186
1187 typedef struct _SYSTEM_ALARM_ACE {
1188         ACE_HEADER      Header;
1189         DWORD           Mask;
1190         DWORD           SidStart;
1191 } SYSTEM_ALARM_ACE,*PSYSTEM_ALARM_ACE;
1192
1193 typedef enum tagSID_NAME_USE {
1194         SidTypeUser = 1,
1195         SidTypeGroup,
1196         SidTypeDomain,
1197         SidTypeAlias,
1198         SidTypeWellKnownGroup,
1199         SidTypeDeletedAccount,
1200         SidTypeInvalid,
1201         SidTypeUnknown
1202 } SID_NAME_USE,*PSID_NAME_USE;
1203
1204 /* Access rights */
1205
1206 #define DELETE                     0x00010000
1207 #define READ_CONTROL               0x00020000
1208 #define WRITE_DAC                  0x00040000
1209 #define WRITE_OWNER                0x00080000
1210 #define SYNCHRONIZE                0x00100000
1211 #define STANDARD_RIGHTS_REQUIRED   0x000f0000
1212
1213 #define STANDARD_RIGHTS_READ       READ_CONTROL
1214 #define STANDARD_RIGHTS_WRITE      READ_CONTROL
1215 #define STANDARD_RIGHTS_EXECUTE    READ_CONTROL
1216
1217 #define STANDARD_RIGHTS_ALL        0x001f0000
1218
1219 #define SPECIFIC_RIGHTS_ALL        0x0000ffff
1220
1221 #define GENERIC_READ               0x80000000
1222 #define GENERIC_WRITE              0x40000000
1223 #define GENERIC_EXECUTE            0x20000000
1224 #define GENERIC_ALL                0x10000000
1225
1226 #define EVENT_MODIFY_STATE         0x0002
1227 #define EVENT_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
1228
1229 #define SEMAPHORE_MODIFY_STATE     0x0002
1230 #define SEMAPHORE_ALL_ACCESS       (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
1231
1232 #define MUTEX_MODIFY_STATE         0x0001
1233 #define MUTEX_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1)
1234
1235 #define PROCESS_TERMINATE          0x0001
1236 #define PROCESS_CREATE_THREAD      0x0002
1237 #define PROCESS_VM_OPERATION       0x0008
1238 #define PROCESS_VM_READ            0x0010
1239 #define PROCESS_VM_WRITE           0x0020
1240 #define PROCESS_DUP_HANDLE         0x0040
1241 #define PROCESS_CREATE_PROCESS     0x0080
1242 #define PROCESS_SET_QUOTA          0x0100
1243 #define PROCESS_SET_INFORMATION    0x0200
1244 #define PROCESS_QUERY_INFORMATION  0x0400
1245 #define PROCESS_ALL_ACCESS         (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xfff)
1246
1247 #define THREAD_TERMINATE           0x0001
1248 #define THREAD_SUSPEND_RESUME      0x0002
1249 #define THREAD_GET_CONTEXT         0x0008
1250 #define THREAD_SET_CONTEXT         0x0010
1251 #define THREAD_SET_INFORMATION     0x0020
1252 #define THREAD_QUERY_INFORMATION   0x0040
1253 #define THREAD_SET_THREAD_TOKEN    0x0080
1254 #define THREAD_IMPERSONATE         0x0100
1255 #define THREAD_DIRECT_IMPERSONATION 0x0200
1256 #define THREAD_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3ff)
1257
1258 #define THREAD_BASE_PRIORITY_LOWRT  15 
1259 #define THREAD_BASE_PRIORITY_MAX    2 
1260 #define THREAD_BASE_PRIORITY_MIN   -2
1261 #define THREAD_BASE_PRIORITY_IDLE  -15
1262
1263 #define FILE_READ_DATA            0x0001    /* file & pipe */
1264 #define FILE_LIST_DIRECTORY       0x0001    /* directory */
1265 #define FILE_WRITE_DATA           0x0002    /* file & pipe */
1266 #define FILE_ADD_FILE             0x0002    /* directory */
1267 #define FILE_APPEND_DATA          0x0004    /* file */
1268 #define FILE_ADD_SUBDIRECTORY     0x0004    /* directory */
1269 #define FILE_CREATE_PIPE_INSTANCE 0x0004    /* named pipe */
1270 #define FILE_READ_EA              0x0008    /* file & directory */
1271 #define FILE_READ_PROPERTIES      FILE_READ_EA
1272 #define FILE_WRITE_EA             0x0010    /* file & directory */
1273 #define FILE_WRITE_PROPERTIES     FILE_WRITE_EA
1274 #define FILE_EXECUTE              0x0020    /* file */
1275 #define FILE_TRAVERSE             0x0020    /* directory */
1276 #define FILE_DELETE_CHILD         0x0040    /* directory */
1277 #define FILE_READ_ATTRIBUTES      0x0080    /* all */
1278 #define FILE_WRITE_ATTRIBUTES     0x0100    /* all */
1279 #define FILE_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1ff)
1280
1281 #define FILE_GENERIC_READ         (STANDARD_RIGHTS_READ | FILE_READ_DATA | \
1282                                    FILE_READ_ATTRIBUTES | FILE_READ_EA | \
1283                                    SYNCHRONIZE)
1284 #define FILE_GENERIC_WRITE        (STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | \
1285                                    FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | \
1286                                    FILE_APPEND_DATA | SYNCHRONIZE)
1287 #define FILE_GENERIC_EXECUTE      (STANDARD_RIGHTS_EXECUTE | FILE_EXECUTE | \
1288                                    FILE_READ_ATTRIBUTES | SYNCHRONIZE)
1289
1290
1291 /* File attribute flags
1292  */
1293 #define FILE_SHARE_READ                 0x00000001L
1294 #define FILE_SHARE_WRITE                0x00000002L
1295 #define FILE_SHARE_DELETE               0x00000004L
1296 #define FILE_ATTRIBUTE_READONLY         0x00000001L
1297 #define FILE_ATTRIBUTE_HIDDEN           0x00000002L
1298 #define FILE_ATTRIBUTE_SYSTEM           0x00000004L
1299 #define FILE_ATTRIBUTE_LABEL            0x00000008L  /* Not in Windows API */
1300 #define FILE_ATTRIBUTE_DIRECTORY        0x00000010L
1301 #define FILE_ATTRIBUTE_ARCHIVE          0x00000020L
1302 #define FILE_ATTRIBUTE_NORMAL           0x00000080L
1303 #define FILE_ATTRIBUTE_TEMPORARY        0x00000100L
1304 #define FILE_ATTRIBUTE_ATOMIC_WRITE     0x00000200L
1305 #define FILE_ATTRIBUTE_XACTION_WRITE    0x00000400L
1306 #define FILE_ATTRIBUTE_COMPRESSED       0x00000800L
1307 #define FILE_ATTRIBUTE_OFFLINE          0x00001000L
1308
1309 /* File alignments (NT) */
1310 #define FILE_BYTE_ALIGNMENT             0x00000000
1311 #define FILE_WORD_ALIGNMENT             0x00000001
1312 #define FILE_LONG_ALIGNMENT             0x00000003
1313 #define FILE_QUAD_ALIGNMENT             0x00000007
1314 #define FILE_OCTA_ALIGNMENT             0x0000000f
1315 #define FILE_32_BYTE_ALIGNMENT          0x0000001f
1316 #define FILE_64_BYTE_ALIGNMENT          0x0000003f
1317 #define FILE_128_BYTE_ALIGNMENT         0x0000007f
1318 #define FILE_256_BYTE_ALIGNMENT         0x000000ff
1319 #define FILE_512_BYTE_ALIGNMENT         0x000001ff
1320
1321 /* Registry security values */
1322 #define OWNER_SECURITY_INFORMATION  0x00000001
1323 #define GROUP_SECURITY_INFORMATION  0x00000002
1324 #define DACL_SECURITY_INFORMATION   0x00000004
1325 #define SACL_SECURITY_INFORMATION   0x00000008
1326
1327 #include "poppack.h"
1328
1329 #endif  /* __WINE_WINNT_H */