Added null check in GlobalHandle.
[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     DWORD ContextFlags;
565
566     /* These are selected by CONTEXT_INTEGER */
567     DWORD g0;
568     DWORD g1;
569     DWORD g2;
570     DWORD g3;
571     DWORD g4;
572     DWORD g5;
573     DWORD g6;
574     DWORD g7;
575     DWORD o0;
576     DWORD o1;
577     DWORD o2;
578     DWORD o3;
579     DWORD o4;
580     DWORD o5;
581     DWORD o6;
582     DWORD o7;
583     DWORD l0;
584     DWORD l1;
585     DWORD l2;
586     DWORD l3;
587     DWORD l4;
588     DWORD l5;
589     DWORD l6;
590     DWORD l7;
591     DWORD i0;
592     DWORD i1;
593     DWORD i2;
594     DWORD i3;
595     DWORD i4;
596     DWORD i5;
597     DWORD i6;
598     DWORD i7;
599
600     /* These are selected by CONTEXT_CONTROL */
601     DWORD psr;
602     DWORD pc;
603     DWORD npc;
604     DWORD y;
605     DWORD wim;
606     DWORD tbr;
607
608     /* FIXME: floating point registers missing */
609
610 } CONTEXT;
611
612 #endif
613
614 #if !defined(CONTEXT_FULL) && !defined(RC_INVOKED)
615 #error You need to define a CONTEXT for your CPU
616 #endif
617
618 typedef CONTEXT *PCONTEXT;
619 typedef HANDLE *PHANDLE;
620
621 #ifdef __WINE__
622
623 /* Macros for easier access to i386 context registers */
624
625 #define EAX_reg(context)     ((context)->Eax)
626 #define EBX_reg(context)     ((context)->Ebx)
627 #define ECX_reg(context)     ((context)->Ecx)
628 #define EDX_reg(context)     ((context)->Edx)
629 #define ESI_reg(context)     ((context)->Esi)
630 #define EDI_reg(context)     ((context)->Edi)
631 #define EBP_reg(context)     ((context)->Ebp)
632
633 #define CS_reg(context)      ((context)->SegCs)
634 #define DS_reg(context)      ((context)->SegDs)
635 #define ES_reg(context)      ((context)->SegEs)
636 #define FS_reg(context)      ((context)->SegFs)
637 #define GS_reg(context)      ((context)->SegGs)
638 #define SS_reg(context)      ((context)->SegSs)
639
640 #define EFL_reg(context)     ((context)->EFlags)
641 #define EIP_reg(context)     ((context)->Eip)
642 #define ESP_reg(context)     ((context)->Esp)
643
644 #define AX_reg(context)      (*(WORD*)&EAX_reg(context))
645 #define BX_reg(context)      (*(WORD*)&EBX_reg(context))
646 #define CX_reg(context)      (*(WORD*)&ECX_reg(context))
647 #define DX_reg(context)      (*(WORD*)&EDX_reg(context))
648 #define SI_reg(context)      (*(WORD*)&ESI_reg(context))
649 #define DI_reg(context)      (*(WORD*)&EDI_reg(context))
650 #define BP_reg(context)      (*(WORD*)&EBP_reg(context))
651
652 #define AL_reg(context)      (*(BYTE*)&EAX_reg(context))
653 #define AH_reg(context)      (*((BYTE*)&EAX_reg(context)+1))
654 #define BL_reg(context)      (*(BYTE*)&EBX_reg(context))
655 #define BH_reg(context)      (*((BYTE*)&EBX_reg(context)+1))
656 #define CL_reg(context)      (*(BYTE*)&ECX_reg(context))
657 #define CH_reg(context)      (*((BYTE*)&ECX_reg(context)+1))
658 #define DL_reg(context)      (*(BYTE*)&EDX_reg(context))
659 #define DH_reg(context)      (*((BYTE*)&EDX_reg(context)+1))
660                             
661 #define SET_CFLAG(context)   (EFL_reg(context) |= 0x0001)
662 #define RESET_CFLAG(context) (EFL_reg(context) &= ~0x0001)
663 #define SET_ZFLAG(context)   (EFL_reg(context) |= 0x0040)
664 #define RESET_ZFLAG(context) (EFL_reg(context) &= ~0x0040)
665
666 #define ISV86(context)       (EFL_reg(context) & 0x00020000)
667 #define V86BASE(context)     ((context)->Dr7) /* ugly */
668
669
670 /* Macros to retrieve the current context */
671
672 #ifdef __i386__
673 #define _DEFINE_REGS_ENTRYPOINT( name, fn, args ) \
674   __asm__(".align 4\n\t"                         \
675           ".globl " #name "\n\t"                 \
676           ".type " #name ",@function\n\t"        \
677           #name ":\n\t"                          \
678           "call CALL32_Regs\n\t"                 \
679           ".long " #fn "\n\t"                    \
680           ".byte " #args ", " #args "\n\t");
681
682 #define DEFINE_REGS_ENTRYPOINT_0( name, fn ) \
683   _DEFINE_REGS_ENTRYPOINT( name, fn, 0 )
684 #define DEFINE_REGS_ENTRYPOINT_1( name, fn, t1 ) \
685   _DEFINE_REGS_ENTRYPOINT( name, fn, 4 )
686 #define DEFINE_REGS_ENTRYPOINT_2( name, fn, t1, t2 ) \
687   _DEFINE_REGS_ENTRYPOINT( name, fn, 8 )
688 #define DEFINE_REGS_ENTRYPOINT_3( name, fn, t1, t2, t3 ) \
689   _DEFINE_REGS_ENTRYPOINT( name, fn, 12 )
690 #define DEFINE_REGS_ENTRYPOINT_4( name, fn, t1, t2, t3, t4 ) \
691   _DEFINE_REGS_ENTRYPOINT( name, fn, 16 )
692
693 #endif  /* __i386__ */
694
695 #ifdef __sparc__
696 /* FIXME: use getcontext() to retrieve full context */
697 #define _GET_CONTEXT \
698     CONTEXT context;   \
699     do { memset(&context, 0, sizeof(CONTEXT));            \
700          context.ContextFlags = CONTEXT_CONTROL;          \
701          context.pc = (DWORD)__builtin_return_address(0); \
702        } while (0)
703
704 #define DEFINE_REGS_ENTRYPOINT_0( name, fn ) \
705   void WINAPI name ( void ) \
706   { _GET_CONTEXT; fn( &context ); }
707 #define DEFINE_REGS_ENTRYPOINT_1( name, fn, t1 ) \
708   void WINAPI name ( t1 a1 ) \
709   { _GET_CONTEXT; fn( a1, &context ); }
710 #define DEFINE_REGS_ENTRYPOINT_2( name, fn, t1, t2 ) \
711   void WINAPI name ( t1 a1, t2 a2 ) \
712   { _GET_CONTEXT; fn( a1, a2, &context ); }
713 #define DEFINE_REGS_ENTRYPOINT_3( name, fn, t1, t2, t3 ) \
714   void WINAPI name ( t1 a1, t2 a2, t3 a3 ) \
715   { _GET_CONTEXT; fn( a1, a2, a3, &context ); }
716 #define DEFINE_REGS_ENTRYPOINT_4( name, fn, t1, t2, t3, t4 ) \
717   void WINAPI name ( t1 a1, t2 a2, t3 a3, t4 a4 ) \
718   { _GET_CONTEXT; fn( a1, a2, a3, a4, &context ); }
719
720 #endif /* __sparc__ */
721
722 #ifndef DEFINE_REGS_ENTRYPOINT_0
723 #error You need to define DEFINE_REGS_ENTRYPOINT macros for your CPU
724 #endif
725
726 #ifdef __i386__
727 # define GET_IP(context) ((LPVOID)(context)->Eip)
728 #endif
729 #ifdef __sparc__
730 # define GET_IP(context) ((LPVOID)(context)->pc)
731 #endif
732  
733 #if !defined(GET_IP) && !defined(RC_INVOKED)
734 # error You must define GET_IP for this CPU
735 #endif
736
737 #endif  /* __WINE__ */
738
739 /*
740  * Exception codes
741  */
742  
743 #define STATUS_SUCCESS                   0x00000000
744 #define STATUS_WAIT_0                    0x00000000
745 #define STATUS_ABANDONED_WAIT_0          0x00000080
746 #define STATUS_USER_APC                  0x000000C0
747 #define STATUS_TIMEOUT                   0x00000102
748 #define STATUS_PENDING                   0x00000103
749
750 #define STATUS_GUARD_PAGE_VIOLATION      0x80000001    
751 #define STATUS_DATATYPE_MISALIGNMENT     0x80000002
752 #define STATUS_BREAKPOINT                0x80000003
753 #define STATUS_SINGLE_STEP               0x80000004
754 #define STATUS_BUFFER_OVERFLOW           0x80000005
755 #define STATUS_NO_MORE_FILES             0x80000006
756 #define STATUS_WAKE_SYSTEM_DEBUGGER      0x80000007
757
758 #define STATUS_HANDLES_CLOSED            0x8000000A
759 #define STATUS_NO_INHERITANCE            0x8000000B
760 #define STATUS_GUID_SUBSTITUTION_MADE    0x8000000C
761 #define STATUS_PARTIAL_COPY              0x8000000D
762 #define STATUS_DEVICE_PAPER_EMPTY        0x8000000E
763 #define STATUS_DEVICE_POWERED_OFF        0x8000000F
764 #define STATUS_DEVICE_OFF_LINE           0x80000010
765 #define STATUS_DEVICE_BUSY               0x80000011
766 #define STATUS_NO_MORE_EAS               0x80000012
767 #define STATUS_INVALID_EA_NAME           0x80000013
768 #define STATUS_EA_LIST_INCONSISTENT      0x80000014
769 #define STATUS_INVALID_EA_FLAG           0x80000015
770 #define STATUS_VERIFY_REQUIRED           0x80000016
771 #define STATUS_EXTRANEOUS_INFORMATION    0x80000017
772 #define STATUS_RXACT_COMMIT_NECESSARY    0x80000018
773 #define STATUS_NO_MORE_ENTRIES           0x8000001A
774 #define STATUS_FILEMARK_DETECTED         0x8000001B
775 #define STATUS_MEDIA_CHANGED             0x8000001C
776 #define STATUS_BUS_RESET                 0x8000001D
777 #define STATUS_END_OF_MEDIA              0x8000001E
778 #define STATUS_BEGINNING_OF_MEDIA        0x8000001F
779 #define STATUS_MEDIA_CHECK               0x80000020
780 #define STATUS_SETMARK_DETECTED          0x80000021
781 #define STATUS_NO_DATA_DETECTED          0x80000022
782 #define STATUS_REDIRECTOR_HAS_OPEN_HANDLES 0x80000023
783 #define STATUS_SERVER_HAS_OPEN_HANDLES   0x80000024
784 #define STATUS_ALREADY_DISCONNECTED      0x80000025
785 #define STATUS_LONGJUMP                  0x80000026
786
787 #define STATUS_UNSUCCESSFUL              0xC0000001
788 #define STATUS_NOT_IMPLEMENTED           0xC0000002
789 #define STATUS_INVALID_INFO_CLASS        0xC0000003
790 #define STATUS_INFO_LENGTH_MISMATCH      0xC0000004
791 #define STATUS_ACCESS_VIOLATION          0xC0000005
792 #define STATUS_IN_PAGE_ERROR             0xC0000006
793 #define STATUS_PAGEFILE_QUOTA            0xC0000007
794 #define STATUS_INVALID_HANDLE            0xC0000008
795 #define STATUS_BAD_INITIAL_STACK         0xC0000009
796 #define STATUS_BAD_INITIAL_PC            0xC000000A
797 #define STATUS_INVALID_CID               0xC000000B
798 #define STATUS_TIMER_NOT_CANCELED        0xC000000C
799 #define STATUS_INVALID_PARAMETER         0xC000000D
800 #define STATUS_NO_SUCH_DEVICE            0xC000000E
801 #define STATUS_NO_SUCH_FILE              0xC000000F
802 #define STATUS_INVALID_DEVICE_REQUEST    0xC0000010
803 #define STATUS_END_OF_FILE               0xC0000011
804 #define STATUS_WRONG_VOLUME              0xC0000012
805 #define STATUS_NO_MEDIA_IN_DEVICE        0xC0000013
806 #define STATUS_UNRECOGNIZED_MEDIA        0xC0000014
807 #define STATUS_NONEXISTENT_SECTOR        0xC0000015
808 #define STATUS_MORE_PROCESSING_REQUIRED  0xC0000016
809 #define STATUS_NO_MEMORY                 0xC0000017
810 #define STATUS_CONFLICTING_ADDRESSES     0xC0000018
811 #define STATUS_NOT_MAPPED_VIEW           0xC0000019
812 #define STATUS_UNABLE_TO_FREE_VM         0xC000001A
813 #define STATUS_UNABLE_TO_DELETE_SECTION  0xC000001B
814 #define STATUS_INVALID_SYSTEM_SERVICE    0xC000001C
815 #define STATUS_ILLEGAL_INSTRUCTION       0xC000001D
816 #define STATUS_INVALID_LOCK_SEQUENCE     0xC000001E
817 #define STATUS_INVALID_VIEW_SIZE         0xC000001F
818 #define STATUS_INVALID_FILE_FOR_SECTION  0xC0000020
819 #define STATUS_ALREADY_COMMITTED         0xC0000021
820 #define STATUS_ACCESS_DENIED             0xC0000022
821 #define STATUS_BUFFER_TOO_SMALL          0xC0000023
822 #define STATUS_OBJECT_TYPE_MISMATCH      0xC0000024
823 #define STATUS_NONCONTINUABLE_EXCEPTION  0xC0000025
824 #define STATUS_INVALID_DISPOSITION       0xC0000026
825 #define STATUS_UNWIND                    0xC0000027
826 #define STATUS_BAD_STACK                 0xC0000028
827 #define STATUS_INVALID_UNWIND_TARGET     0xC0000029
828 #define STATUS_NOT_LOCKED                0xC000002A
829 #define STATUS_PARITY_ERROR              0xC000002B
830 #define STATUS_UNABLE_TO_DECOMMIT_VM     0xC000002C
831 #define STATUS_NOT_COMMITTED             0xC000002D
832 #define STATUS_INVALID_PORT_ATTRIBUTES   0xC000002E
833 #define STATUS_PORT_MESSAGE_TOO_LONG     0xC000002F
834 #define STATUS_INVALID_PARAMETER_MIX     0xC0000030
835 #define STATUS_INVALID_QUOTA_LOWER       0xC0000031
836 #define STATUS_DISK_CORRUPT_ERROR        0xC0000032
837 #define STATUS_OBJECT_NAME_INVALID       0xC0000033
838 #define STATUS_OBJECT_NAME_NOT_FOUND     0xC0000034
839 #define STATUS_OBJECT_NAME_COLLISION     0xC0000035
840 #define STATUS_PORT_DISCONNECTED         0xC0000037
841 #define STATUS_DEVICE_ALREADY_ATTACHED   0xC0000038
842 #define STATUS_OBJECT_PATH_INVALID       0xC0000039
843 #define STATUS_OBJECT_PATH_NOT_FOUND     0xC000003A
844 #define STATUS_PATH_SYNTAX_BAD           0xC000003B
845 #define STATUS_DATA_OVERRUN              0xC000003C
846 #define STATUS_DATA_LATE_ERROR           0xC000003D
847 #define STATUS_DATA_ERROR                0xC000003E
848 #define STATUS_CRC_ERROR                 0xC000003F
849 #define STATUS_SECTION_TOO_BIG           0xC0000040
850 #define STATUS_PORT_CONNECTION_REFUSED   0xC0000041
851 #define STATUS_INVALID_PORT_HANDLE       0xC0000042
852 #define STATUS_SHARING_VIOLATION         0xC0000043
853 #define STATUS_QUOTA_EXCEEDED            0xC0000044
854 #define STATUS_INVALID_PAGE_PROTECTION   0xC0000045
855 #define STATUS_MUTANT_NOT_OWNED          0xC0000046
856 #define STATUS_SEMAPHORE_LIMIT_EXCEEDED  0xC0000047
857 #define STATUS_PORT_ALREADY_SET          0xC0000048
858
859 #define STATUS_UNKNOWN_REVISION          0xC0000058
860 #define STATUS_INVALID_SECURITY_DESCR    0xC0000079
861 #define STATUS_SECTION_NOT_EXTENDED      0xC0000087
862 #define STATUS_ARRAY_BOUNDS_EXCEEDED     0xC000008C
863 #define STATUS_FLOAT_DENORMAL_OPERAND    0xC000008D
864 #define STATUS_FLOAT_DIVIDE_BY_ZERO      0xC000008E
865 #define STATUS_FLOAT_INEXACT_RESULT      0xC000008F
866 #define STATUS_FLOAT_INVALID_OPERATION   0xC0000090
867 #define STATUS_FLOAT_OVERFLOW            0xC0000091
868 #define STATUS_FLOAT_STACK_CHECK         0xC0000092
869 #define STATUS_FLOAT_UNDERFLOW           0xC0000093
870 #define STATUS_INTEGER_DIVIDE_BY_ZERO    0xC0000094
871 #define STATUS_INTEGER_OVERFLOW          0xC0000095
872 #define STATUS_PRIVILEGED_INSTRUCTION    0xC0000096
873 #define STATUS_INVALID_PARAMETER_2       0xC00000F0
874 #define STATUS_STACK_OVERFLOW            0xC00000FD
875 #define STATUS_CONTROL_C_EXIT            0xC000013A
876 #define STATUS_NOT_REGISTRY_FILE         0xC000015C
877 #define STATUS_PARTITION_FAILURE         0xC0000172
878 #define STATUS_INVALID_BLOCK_LENGTH      0xC0000173
879 #define STATUS_DEVICE_NOT_PARTITIONED    0xC0000174
880 #define STATUS_UNABLE_TO_LOCK_MEDIA      0xC0000175
881 #define STATUS_UNABLE_TO_UNLOAD_MEDIA    0xC0000176
882 #define STATUS_EOM_OVERFLOW              0xC0000177
883 #define STATUS_NO_MEDIA                  0xC0000178
884 #define STATUS_NO_SUCH_MEMBER            0xC000017A
885 #define STATUS_INVALID_MEMBER            0xC000017B
886 #define STATUS_KEY_DELETED               0xC000017C
887 #define STATUS_NO_LOG_SPACE              0xC000017D
888 #define STATUS_TOO_MANY_SIDS             0xC000017E
889 #define STATUS_LM_CROSS_ENCRYPTION_REQUIRED 0xC000017F
890 #define STATUS_KEY_HAS_CHILDREN          0xC0000180
891 #define STATUS_CHILD_MUST_BE_VOLATILE    0xC0000181
892 #define STATUS_DEVICE_CONFIGURATION_ERROR0xC0000182
893 #define STATUS_DRIVER_INTERNAL_ERROR     0xC0000183
894 #define STATUS_INVALID_DEVICE_STATE      0xC0000184
895 #define STATUS_IO_DEVICE_ERROR           0xC0000185
896 #define STATUS_DEVICE_PROTOCOL_ERROR     0xC0000186
897 #define STATUS_BACKUP_CONTROLLER         0xC0000187
898 #define STATUS_LOG_FILE_FULL             0xC0000188
899 #define STATUS_TOO_LATE                  0xC0000189
900 #define STATUS_NO_TRUST_LSA_SECRET       0xC000018A
901 #define STATUS_NO_TRUST_SAM_ACCOUNT      0xC000018B
902 #define STATUS_TRUSTED_DOMAIN_FAILURE    0xC000018C
903 #define STATUS_TRUSTED_RELATIONSHIP_FAILURE 0xC000018D
904 #define STATUS_EVENTLOG_FILE_CORRUPT     0xC000018E
905 #define STATUS_EVENTLOG_CANT_START       0xC000018F
906 #define STATUS_TRUST_FAILURE             0xC0000190
907 #define STATUS_MUTANT_LIMIT_EXCEEDED     0xC0000191
908 #define STATUS_NETLOGON_NOT_STARTED      0xC0000192
909 #define STATUS_ACCOUNT_EXPIRED           0xC0000193
910 #define STATUS_POSSIBLE_DEADLOCK         0xC0000194
911 #define STATUS_NETWORK_CREDENTIAL_CONFLICT 0xC0000195
912 #define STATUS_REMOTE_SESSION_LIMIT      0xC0000196
913 #define STATUS_EVENTLOG_FILE_CHANGED     0xC0000197
914 #define STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT 0xC0000198
915 #define STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT 0xC0000199
916 #define STATUS_NOLOGON_SERVER_TRUST_ACCOUNT 0xC000019A
917 #define STATUS_DOMAIN_TRUST_INCONSISTENT 0xC000019B
918 #define STATUS_FS_DRIVER_REQUIRED        0xC000019C
919
920 #define STATUS_RESOURCE_LANG_NOT_FOUND   0xC0000204
921
922 #define MAXIMUM_WAIT_OBJECTS 64
923 #define MAXIMUM_SUSPEND_COUNT 127
924
925
926 /*
927  * Return values from the actual exception handlers
928  */
929
930 #define ExceptionContinueExecution 0
931 #define ExceptionContinueSearch    1
932 #define ExceptionNestedException   2
933 #define ExceptionCollidedUnwind    3
934  
935 /*
936  * Return values from filters in except() and from UnhandledExceptionFilter
937  */
938  
939 #define EXCEPTION_EXECUTE_HANDLER        1
940 #define EXCEPTION_CONTINUE_SEARCH        0
941 #define EXCEPTION_CONTINUE_EXECUTION    -1
942
943 /*
944  * From OS/2 2.0 exception handling
945  * Win32 seems to use the same flags as ExceptionFlags in an EXCEPTION_RECORD
946  */
947
948 #define EH_NONCONTINUABLE   0x01
949 #define EH_UNWINDING        0x02
950 #define EH_EXIT_UNWIND      0x04
951 #define EH_STACK_INVALID    0x08
952 #define EH_NESTED_CALL      0x10
953
954 #define EXCEPTION_CONTINUABLE        0
955 #define EXCEPTION_NONCONTINUABLE     EH_NONCONTINUABLE
956  
957 /*
958  * The exception record used by Win32 to give additional information 
959  * about exception to exception handlers.
960  */
961
962 #define EXCEPTION_MAXIMUM_PARAMETERS 15
963
964 typedef struct __EXCEPTION_RECORD
965 {
966     DWORD    ExceptionCode;
967     DWORD    ExceptionFlags;
968     struct __EXCEPTION_RECORD *ExceptionRecord;
969
970     LPVOID   ExceptionAddress;
971     DWORD    NumberParameters;
972     DWORD    ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
973 } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
974
975 /*
976  * The exception pointers structure passed to exception filters
977  * in except() and the UnhandledExceptionFilter().
978  */
979  
980 typedef struct _EXCEPTION_POINTERS 
981 {
982   PEXCEPTION_RECORD  ExceptionRecord;
983   PCONTEXT           ContextRecord;
984 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
985
986
987 /*
988  * The exception frame, used for registering exception handlers 
989  * Win32 cares only about this, but compilers generally emit 
990  * larger exception frames for their own use.
991  */
992
993 struct __EXCEPTION_FRAME;
994
995 typedef DWORD (*PEXCEPTION_HANDLER)(PEXCEPTION_RECORD,struct __EXCEPTION_FRAME*,
996                                     PCONTEXT,struct __EXCEPTION_FRAME **);
997
998 typedef struct __EXCEPTION_FRAME
999 {
1000   struct __EXCEPTION_FRAME *Prev;
1001   PEXCEPTION_HANDLER       Handler;
1002 } EXCEPTION_FRAME, *PEXCEPTION_FRAME;
1003
1004 #include "poppack.h"
1005
1006 /*
1007  * function pointer to a exception filter
1008  */
1009
1010 typedef LONG (CALLBACK *PTOP_LEVEL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS ExceptionInfo);
1011 typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
1012
1013 DWORD WINAPI UnhandledExceptionFilter( PEXCEPTION_POINTERS epointers );
1014 LPTOP_LEVEL_EXCEPTION_FILTER
1015 WINAPI SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER filter );
1016
1017 /* status values for ContinueDebugEvent */
1018 #define DBG_CONTINUE                0x00010002
1019 #define DBG_TERMINATE_THREAD        0x40010003
1020 #define DBG_TERMINATE_PROCESS       0x40010004
1021 #define DBG_CONTROL_C               0x40010005
1022 #define DBG_CONTROL_BREAK           0x40010008
1023 #define DBG_EXCEPTION_NOT_HANDLED   0x80010001
1024
1025 typedef struct _NT_TIB 
1026 {
1027         struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
1028         PVOID StackBase;
1029         PVOID StackLimit;
1030         PVOID SubSystemTib;
1031         union {
1032           PVOID FiberData;
1033           DWORD Version;
1034         } DUMMYUNIONNAME;
1035         PVOID ArbitraryUserPointer;
1036         struct _NT_TIB *Self;
1037 } NT_TIB, *PNT_TIB;
1038
1039 struct _TEB;
1040
1041 #ifdef __WINE__
1042
1043 #if defined(__i386__)
1044 static inline struct _TEB * WINE_UNUSED __get_teb(void)
1045 {
1046     struct _TEB *teb;
1047     __asm__(".byte 0x64\n\tmovl (0x18),%0" : "=r" (teb));
1048     return teb;
1049 }
1050 #elif defined(HAVE__LWP_CREATE)
1051 extern void *_lwp_getprivate(void);
1052 static inline struct _TEB * WINE_UNUSED __get_teb(void)
1053 {
1054     return (struct _TEB *)_lwp_getprivate();
1055 }
1056 #else
1057 #error NtCurrentTeb() not defined for this architecture!
1058 #endif
1059
1060 #define NtCurrentTeb() __get_teb()
1061
1062 #else /* __WINE__ */
1063 extern struct _TEB * WINAPI NtCurrentTeb(void);
1064 #endif
1065
1066 /*
1067  * Here follows typedefs for security and tokens.
1068  */ 
1069
1070 /*
1071  * First a constant for the following typdefs.
1072  */
1073
1074 #define ANYSIZE_ARRAY   1
1075
1076 /* FIXME:  Orphan.  What does it point to? */
1077 typedef PVOID PACCESS_TOKEN;
1078
1079 /*
1080  * TOKEN_INFORMATION_CLASS
1081  */
1082
1083 typedef enum _TOKEN_INFORMATION_CLASS {
1084   TokenUser = 1, 
1085   TokenGroups, 
1086   TokenPrivileges, 
1087   TokenOwner, 
1088   TokenPrimaryGroup, 
1089   TokenDefaultDacl, 
1090   TokenSource, 
1091   TokenType, 
1092   TokenImpersonationLevel, 
1093   TokenStatistics 
1094 } TOKEN_INFORMATION_CLASS; 
1095
1096 #ifndef _SECURITY_DEFINED
1097 #define _SECURITY_DEFINED
1098
1099 #include "pshpack1.h"
1100
1101 typedef DWORD ACCESS_MASK, *PACCESS_MASK;
1102
1103 typedef struct _GENERIC_MAPPING {
1104     ACCESS_MASK GenericRead;
1105     ACCESS_MASK GenericWrite;
1106     ACCESS_MASK GenericExecute;
1107     ACCESS_MASK GenericAll;
1108 } GENERIC_MAPPING, *PGENERIC_MAPPING;
1109
1110 #ifndef SID_IDENTIFIER_AUTHORITY_DEFINED
1111 #define SID_IDENTIFIER_AUTHORITY_DEFINED
1112 typedef struct {
1113     BYTE Value[6];
1114 } SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
1115 #endif /* !defined(SID_IDENTIFIER_AUTHORITY_DEFINED) */
1116
1117 #ifndef SID_DEFINED
1118 #define SID_DEFINED
1119 typedef struct _SID {
1120     BYTE Revision;
1121     BYTE SubAuthorityCount;
1122     SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
1123     DWORD SubAuthority[1];
1124 } SID,*PSID;
1125 #endif /* !defined(SID_DEFINED) */
1126
1127 #define SID_REVISION                    (1)     /* Current revision */
1128 #define SID_MAX_SUB_AUTHORITIES         (15)    /* current max subauths */
1129 #define SID_RECOMMENDED_SUB_AUTHORITIES (1)     /* recommended subauths */
1130
1131
1132 /* 
1133  * ACL 
1134  */
1135
1136 #define ACL_REVISION1 1
1137 #define ACL_REVISION2 2
1138 #define ACL_REVISION3 3
1139 #define ACL_REVISION4 4
1140
1141 #define MIN_ACL_REVISION ACL_REVISION2
1142 #define MAX_ACL_REVISION ACL_REVISION4
1143
1144 typedef struct _ACL {
1145     BYTE AclRevision;
1146     BYTE Sbz1;
1147     WORD AclSize;
1148     WORD AceCount;
1149     WORD Sbz2;
1150 } ACL, *PACL;
1151
1152 /* SECURITY_DESCRIPTOR */
1153 #define SECURITY_DESCRIPTOR_REVISION    1
1154 #define SECURITY_DESCRIPTOR_REVISION1   1
1155
1156
1157 #define SE_OWNER_DEFAULTED      0x0001
1158 #define SE_GROUP_DEFAULTED      0x0002
1159 #define SE_DACL_PRESENT         0x0004
1160 #define SE_DACL_DEFAULTED       0x0008
1161 #define SE_SACL_PRESENT         0x0010
1162 #define SE_SACL_DEFAULTED       0x0020
1163 #define SE_SELF_RELATIVE        0x8000
1164
1165 typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;
1166 typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
1167
1168 /* The security descriptor structure */
1169 typedef struct {
1170     BYTE Revision;
1171     BYTE Sbz1;
1172     SECURITY_DESCRIPTOR_CONTROL Control;
1173     DWORD Owner;
1174     DWORD Group;
1175     DWORD Sacl;
1176     DWORD Dacl;
1177 } SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
1178
1179 typedef struct {
1180     BYTE Revision;
1181     BYTE Sbz1;
1182     SECURITY_DESCRIPTOR_CONTROL Control;
1183     PSID Owner;
1184     PSID Group;
1185     PACL Sacl;
1186     PACL Dacl;
1187 } SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;
1188
1189 #define SECURITY_DESCRIPTOR_MIN_LENGTH   (sizeof(SECURITY_DESCRIPTOR)) 
1190
1191 #include "poppack.h"
1192
1193 #endif /* _SECURITY_DEFINED */
1194
1195 #include "pshpack1.h"
1196
1197 /* 
1198  * SID_AND_ATTRIBUTES
1199  */
1200
1201 typedef struct _SID_AND_ATTRIBUTES {
1202   PSID  Sid; 
1203   DWORD Attributes; 
1204 } SID_AND_ATTRIBUTES ; 
1205  
1206 /* security entities */
1207 #define SECURITY_NULL_RID                       (0x00000000L)
1208 #define SECURITY_WORLD_RID                      (0x00000000L)
1209 #define SECURITY_LOCAL_RID                      (0X00000000L)
1210
1211 #define SECURITY_NULL_SID_AUTHORITY             {0,0,0,0,0,0}
1212
1213 /* S-1-1 */
1214 #define SECURITY_WORLD_SID_AUTHORITY            {0,0,0,0,0,1}
1215
1216 /* S-1-2 */
1217 #define SECURITY_LOCAL_SID_AUTHORITY            {0,0,0,0,0,2}
1218
1219 /* S-1-3 */
1220 #define SECURITY_CREATOR_SID_AUTHORITY          {0,0,0,0,0,3}
1221 #define SECURITY_CREATOR_OWNER_RID              (0x00000000L) 
1222 #define SECURITY_CREATOR_GROUP_RID              (0x00000001L)
1223 #define SECURITY_CREATOR_OWNER_SERVER_RID       (0x00000002L)
1224 #define SECURITY_CREATOR_GROUP_SERVER_RID       (0x00000003L)
1225
1226 /* S-1-4 */
1227 #define SECURITY_NON_UNIQUE_AUTHORITY           {0,0,0,0,0,4}
1228
1229 /* S-1-5 */
1230 #define SECURITY_NT_AUTHORITY                   {0,0,0,0,0,5} 
1231 #define SECURITY_DIALUP_RID                     0x00000001L
1232 #define SECURITY_NETWORK_RID                    0x00000002L
1233 #define SECURITY_BATCH_RID                      0x00000003L
1234 #define SECURITY_INTERACTIVE_RID                0x00000004L
1235 #define SECURITY_LOGON_IDS_RID                  0x00000005L
1236 #define SECURITY_SERVICE_RID                    0x00000006L
1237 #define SECURITY_ANONYMOUS_LOGON_RID            0x00000007L
1238 #define SECURITY_PROXY_RID                      0x00000008L
1239 #define SECURITY_ENTERPRISE_CONTROLLERS_RID     0x00000009L
1240 #define SECURITY_PRINCIPAL_SELF_RID             0x0000000AL
1241 #define SECURITY_AUTHENTICATED_USER_RID         0x0000000BL
1242 #define SECURITY_RESTRICTED_CODE_RID            0x0000000CL
1243 #define SECURITY_TERMINAL_SERVER_RID            0x0000000DL
1244 #define SECURITY_LOCAL_SYSTEM_RID               0x00000012L
1245 #define SECURITY_NT_NON_UNIQUE                  0x00000015L
1246 #define SECURITY_BUILTIN_DOMAIN_RID             0x00000020L
1247
1248 #define DOMAIN_GROUP_RID_ADMINS                 0x00000200L
1249 #define DOMAIN_GROUP_RID_USERS                  0x00000201L
1250 #define DOMAIN_GROUP_RID_GUESTS                 0x00000202L
1251
1252 #define DOMAIN_ALIAS_RID_ADMINS                 0x00000220L
1253 #define DOMAIN_ALIAS_RID_USERS                  0x00000221L
1254 #define DOMAIN_ALIAS_RID_GUESTS                 0x00000222L
1255
1256 #define SECURITY_SERVER_LOGON_RID               SECURITY_ENTERPRISE_CONTROLLERS_RID
1257
1258 #define SECURITY_LOGON_IDS_RID_COUNT            (3L)
1259
1260 /*
1261  * TOKEN_USER
1262  */
1263
1264 typedef struct _TOKEN_USER {
1265   SID_AND_ATTRIBUTES User; 
1266 } TOKEN_USER; 
1267
1268 /*
1269  * TOKEN_GROUPS
1270  */
1271
1272 typedef struct _TOKEN_GROUPS  {
1273   DWORD GroupCount; 
1274   SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]; 
1275 } TOKEN_GROUPS; 
1276
1277 /*
1278  * LUID_AND_ATTRIBUTES
1279  */
1280
1281 typedef union _LARGE_INTEGER {
1282     struct {
1283         DWORD    LowPart;
1284         LONG     HighPart;
1285     } DUMMYSTRUCTNAME;
1286     LONGLONG QuadPart;
1287 } LARGE_INTEGER, *LPLARGE_INTEGER, *PLARGE_INTEGER;
1288
1289 typedef union _ULARGE_INTEGER {
1290     struct {
1291         DWORD    LowPart;
1292         LONG     HighPart;
1293     } DUMMYSTRUCTNAME;
1294     LONGLONG QuadPart;
1295 } ULARGE_INTEGER, *LPULARGE_INTEGER, *PULARGE_INTEGER;
1296
1297 /*
1298  * Locally Unique Identifier
1299  */
1300
1301 typedef LARGE_INTEGER LUID,*PLUID;
1302
1303 typedef struct _LUID_AND_ATTRIBUTES {
1304   LUID   Luid; 
1305   DWORD  Attributes; 
1306 } LUID_AND_ATTRIBUTES; 
1307
1308 /*
1309  * PRIVILEGE_SET
1310  */
1311
1312 typedef struct _PRIVILEGE_SET {
1313     DWORD PrivilegeCount;
1314     DWORD Control;
1315     LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
1316 } PRIVILEGE_SET, *PPRIVILEGE_SET;
1317
1318 /*
1319  * TOKEN_PRIVILEGES
1320  */
1321
1322 typedef struct _TOKEN_PRIVILEGES {
1323   DWORD PrivilegeCount; 
1324   LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; 
1325 } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; 
1326
1327 /*
1328  * TOKEN_OWNER
1329  */
1330
1331 typedef struct _TOKEN_OWNER {
1332   PSID Owner; 
1333 } TOKEN_OWNER; 
1334
1335 /*
1336  * TOKEN_PRIMARY_GROUP
1337  */
1338
1339 typedef struct _TOKEN_PRIMARY_GROUP {
1340   PSID PrimaryGroup; 
1341 } TOKEN_PRIMARY_GROUP; 
1342
1343
1344 /*
1345  * TOKEN_DEFAULT_DACL
1346  */
1347
1348 typedef struct _TOKEN_DEFAULT_DACL { 
1349   PACL DefaultDacl; 
1350 } TOKEN_DEFAULT_DACL; 
1351
1352 /*
1353  * TOKEN_SOURCEL
1354  */
1355
1356 typedef struct _TOKEN_SOURCE {
1357   char Sourcename[8]; 
1358   LUID SourceIdentifier; 
1359 } TOKEN_SOURCE; 
1360
1361 /*
1362  * TOKEN_TYPE
1363  */
1364
1365 typedef enum tagTOKEN_TYPE {
1366   TokenPrimary = 1, 
1367   TokenImpersonation 
1368 } TOKEN_TYPE; 
1369
1370 /*
1371  * SECURITY_IMPERSONATION_LEVEL
1372  */
1373
1374 typedef enum _SECURITY_IMPERSONATION_LEVEL {
1375   SecurityAnonymous, 
1376   SecurityIdentification, 
1377   SecurityImpersonation, 
1378   SecurityDelegation 
1379 } SECURITY_IMPERSONATION_LEVEL, *PSECURITY_IMPERSONATION_LEVEL; 
1380
1381
1382 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,
1383         * PSECURITY_CONTEXT_TRACKING_MODE;
1384 /*
1385  *      Quality of Service
1386  */
1387
1388 typedef struct _SECURITY_QUALITY_OF_SERVICE {
1389   DWORD                         Length;
1390   SECURITY_IMPERSONATION_LEVEL  ImpersonationLevel;
1391   SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
1392   BOOL                          EffectiveOnly;
1393 } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
1394
1395 /*
1396  * TOKEN_STATISTICS
1397  */
1398
1399 typedef struct _TOKEN_STATISTICS {
1400   LUID  TokenId; 
1401   LUID  AuthenticationId; 
1402   LARGE_INTEGER ExpirationTime; 
1403   TOKEN_TYPE    TokenType; 
1404   SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; 
1405   DWORD DynamicCharged; 
1406   DWORD DynamicAvailable; 
1407   DWORD GroupCount; 
1408   DWORD PrivilegeCount; 
1409   LUID  ModifiedId; 
1410 } TOKEN_STATISTICS; 
1411
1412 /* 
1413  *      ACLs of NT 
1414  */
1415
1416 #define ACL_REVISION    2
1417
1418 #define ACL_REVISION1   1
1419 #define ACL_REVISION2   2
1420
1421 /* ACEs, directly starting after an ACL */
1422 typedef struct _ACE_HEADER {
1423         BYTE    AceType;
1424         BYTE    AceFlags;
1425         WORD    AceSize;
1426 } ACE_HEADER,*PACE_HEADER;
1427
1428 /* AceType */
1429 #define ACCESS_ALLOWED_ACE_TYPE         0
1430 #define ACCESS_DENIED_ACE_TYPE          1
1431 #define SYSTEM_AUDIT_ACE_TYPE           2
1432 #define SYSTEM_ALARM_ACE_TYPE           3
1433
1434 /* inherit AceFlags */
1435 #define OBJECT_INHERIT_ACE              0x01
1436 #define CONTAINER_INHERIT_ACE           0x02
1437 #define NO_PROPAGATE_INHERIT_ACE        0x04
1438 #define INHERIT_ONLY_ACE                0x08
1439 #define VALID_INHERIT_FLAGS             0x0F
1440
1441 /* AceFlags mask for what events we (should) audit */
1442 #define SUCCESSFUL_ACCESS_ACE_FLAG      0x40
1443 #define FAILED_ACCESS_ACE_FLAG          0x80
1444
1445 /* different ACEs depending on AceType 
1446  * SidStart marks the begin of a SID
1447  * so the thing finally looks like this:
1448  * 0: ACE_HEADER
1449  * 4: ACCESS_MASK
1450  * 8... : SID
1451  */
1452 typedef struct _ACCESS_ALLOWED_ACE {
1453         ACE_HEADER      Header;
1454         DWORD           Mask;
1455         DWORD           SidStart;
1456 } ACCESS_ALLOWED_ACE,*PACCESS_ALLOWED_ACE;
1457
1458 typedef struct _ACCESS_DENIED_ACE {
1459         ACE_HEADER      Header;
1460         DWORD           Mask;
1461         DWORD           SidStart;
1462 } ACCESS_DENIED_ACE,*PACCESS_DENIED_ACE;
1463
1464 typedef struct _SYSTEM_AUDIT_ACE {
1465         ACE_HEADER      Header;
1466         DWORD           Mask;
1467         DWORD           SidStart;
1468 } SYSTEM_AUDIT_ACE,*PSYSTEM_AUDIT_ACE;
1469
1470 typedef struct _SYSTEM_ALARM_ACE {
1471         ACE_HEADER      Header;
1472         DWORD           Mask;
1473         DWORD           SidStart;
1474 } SYSTEM_ALARM_ACE,*PSYSTEM_ALARM_ACE;
1475
1476 typedef enum tagSID_NAME_USE {
1477         SidTypeUser = 1,
1478         SidTypeGroup,
1479         SidTypeDomain,
1480         SidTypeAlias,
1481         SidTypeWellKnownGroup,
1482         SidTypeDeletedAccount,
1483         SidTypeInvalid,
1484         SidTypeUnknown
1485 } SID_NAME_USE,*PSID_NAME_USE;
1486
1487 /* Access rights */
1488
1489 #define DELETE                     0x00010000
1490 #define READ_CONTROL               0x00020000
1491 #define WRITE_DAC                  0x00040000
1492 #define WRITE_OWNER                0x00080000
1493 #define SYNCHRONIZE                0x00100000
1494 #define STANDARD_RIGHTS_REQUIRED   0x000f0000
1495
1496 #define STANDARD_RIGHTS_READ       READ_CONTROL
1497 #define STANDARD_RIGHTS_WRITE      READ_CONTROL
1498 #define STANDARD_RIGHTS_EXECUTE    READ_CONTROL
1499
1500 #define STANDARD_RIGHTS_ALL        0x001f0000
1501
1502 #define SPECIFIC_RIGHTS_ALL        0x0000ffff
1503
1504 #define GENERIC_READ               0x80000000
1505 #define GENERIC_WRITE              0x40000000
1506 #define GENERIC_EXECUTE            0x20000000
1507 #define GENERIC_ALL                0x10000000
1508
1509 #define MAXIMUM_ALLOWED            0x02000000
1510 #define ACCESS_SYSTEM_SECURITY     0x01000000
1511
1512 #define EVENT_MODIFY_STATE         0x0002
1513 #define EVENT_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
1514
1515 #define SEMAPHORE_MODIFY_STATE     0x0002
1516 #define SEMAPHORE_ALL_ACCESS       (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
1517
1518 #define MUTEX_MODIFY_STATE         0x0001
1519 #define MUTEX_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1)
1520
1521 #define PROCESS_TERMINATE          0x0001
1522 #define PROCESS_CREATE_THREAD      0x0002
1523 #define PROCESS_VM_OPERATION       0x0008
1524 #define PROCESS_VM_READ            0x0010
1525 #define PROCESS_VM_WRITE           0x0020
1526 #define PROCESS_DUP_HANDLE         0x0040
1527 #define PROCESS_CREATE_PROCESS     0x0080
1528 #define PROCESS_SET_QUOTA          0x0100
1529 #define PROCESS_SET_INFORMATION    0x0200
1530 #define PROCESS_QUERY_INFORMATION  0x0400
1531 #define PROCESS_ALL_ACCESS         (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xfff)
1532
1533 #define THREAD_TERMINATE           0x0001
1534 #define THREAD_SUSPEND_RESUME      0x0002
1535 #define THREAD_GET_CONTEXT         0x0008
1536 #define THREAD_SET_CONTEXT         0x0010
1537 #define THREAD_SET_INFORMATION     0x0020
1538 #define THREAD_QUERY_INFORMATION   0x0040
1539 #define THREAD_SET_THREAD_TOKEN    0x0080
1540 #define THREAD_IMPERSONATE         0x0100
1541 #define THREAD_DIRECT_IMPERSONATION 0x0200
1542 #define THREAD_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3ff)
1543
1544 #define THREAD_BASE_PRIORITY_LOWRT  15 
1545 #define THREAD_BASE_PRIORITY_MAX    2 
1546 #define THREAD_BASE_PRIORITY_MIN   -2
1547 #define THREAD_BASE_PRIORITY_IDLE  -15
1548
1549 #define FILE_READ_DATA            0x0001    /* file & pipe */
1550 #define FILE_LIST_DIRECTORY       0x0001    /* directory */
1551 #define FILE_WRITE_DATA           0x0002    /* file & pipe */
1552 #define FILE_ADD_FILE             0x0002    /* directory */
1553 #define FILE_APPEND_DATA          0x0004    /* file */
1554 #define FILE_ADD_SUBDIRECTORY     0x0004    /* directory */
1555 #define FILE_CREATE_PIPE_INSTANCE 0x0004    /* named pipe */
1556 #define FILE_READ_EA              0x0008    /* file & directory */
1557 #define FILE_READ_PROPERTIES      FILE_READ_EA
1558 #define FILE_WRITE_EA             0x0010    /* file & directory */
1559 #define FILE_WRITE_PROPERTIES     FILE_WRITE_EA
1560 #define FILE_EXECUTE              0x0020    /* file */
1561 #define FILE_TRAVERSE             0x0020    /* directory */
1562 #define FILE_DELETE_CHILD         0x0040    /* directory */
1563 #define FILE_READ_ATTRIBUTES      0x0080    /* all */
1564 #define FILE_WRITE_ATTRIBUTES     0x0100    /* all */
1565 #define FILE_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1ff)
1566
1567 #define FILE_GENERIC_READ         (STANDARD_RIGHTS_READ | FILE_READ_DATA | \
1568                                    FILE_READ_ATTRIBUTES | FILE_READ_EA | \
1569                                    SYNCHRONIZE)
1570 #define FILE_GENERIC_WRITE        (STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | \
1571                                    FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | \
1572                                    FILE_APPEND_DATA | SYNCHRONIZE)
1573 #define FILE_GENERIC_EXECUTE      (STANDARD_RIGHTS_EXECUTE | FILE_EXECUTE | \
1574                                    FILE_READ_ATTRIBUTES | SYNCHRONIZE)
1575
1576
1577 /* File attribute flags
1578  */
1579 #define FILE_SHARE_READ                 0x00000001L
1580 #define FILE_SHARE_WRITE                0x00000002L
1581 #define FILE_SHARE_DELETE               0x00000004L
1582 #define FILE_ATTRIBUTE_READONLY         0x00000001L
1583 #define FILE_ATTRIBUTE_HIDDEN           0x00000002L
1584 #define FILE_ATTRIBUTE_SYSTEM           0x00000004L
1585 #define FILE_ATTRIBUTE_LABEL            0x00000008L  /* Not in Windows API */
1586 #define FILE_ATTRIBUTE_DIRECTORY        0x00000010L
1587 #define FILE_ATTRIBUTE_ARCHIVE          0x00000020L
1588 #define FILE_ATTRIBUTE_NORMAL           0x00000080L
1589 #define FILE_ATTRIBUTE_TEMPORARY        0x00000100L
1590 #define FILE_ATTRIBUTE_ATOMIC_WRITE     0x00000200L
1591 #define FILE_ATTRIBUTE_XACTION_WRITE    0x00000400L
1592 #define FILE_ATTRIBUTE_COMPRESSED       0x00000800L
1593 #define FILE_ATTRIBUTE_OFFLINE          0x00001000L
1594
1595 /* File alignments (NT) */
1596 #define FILE_BYTE_ALIGNMENT             0x00000000
1597 #define FILE_WORD_ALIGNMENT             0x00000001
1598 #define FILE_LONG_ALIGNMENT             0x00000003
1599 #define FILE_QUAD_ALIGNMENT             0x00000007
1600 #define FILE_OCTA_ALIGNMENT             0x0000000f
1601 #define FILE_32_BYTE_ALIGNMENT          0x0000001f
1602 #define FILE_64_BYTE_ALIGNMENT          0x0000003f
1603 #define FILE_128_BYTE_ALIGNMENT         0x0000007f
1604 #define FILE_256_BYTE_ALIGNMENT         0x000000ff
1605 #define FILE_512_BYTE_ALIGNMENT         0x000001ff
1606
1607 /* Registry security values */
1608 #define OWNER_SECURITY_INFORMATION  0x00000001
1609 #define GROUP_SECURITY_INFORMATION  0x00000002
1610 #define DACL_SECURITY_INFORMATION   0x00000004
1611 #define SACL_SECURITY_INFORMATION   0x00000008
1612
1613 #include "poppack.h"
1614
1615 #endif  /* __WINE_WINNT_H */