Suppressed compiler warning by using the 'unused' attribute.
[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_UNKNOWN  0xFFFF
28
29 /* dwProcessorType */
30 #define PROCESSOR_INTEL_386     386
31 #define PROCESSOR_INTEL_486     486
32 #define PROCESSOR_INTEL_PENTIUM 586
33 #define PROCESSOR_MIPS_R4000    4000
34 #define PROCESSOR_ALPHA_21064   21064
35
36
37 #define ANYSIZE_ARRAY 1
38
39 #define MINCHAR       0x80
40 #define MAXCHAR       0x7f
41 #define MINSHORT      0x8000
42 #define MAXSHORT      0x7fff
43 #define MINLONG       0x80000000
44 #define MAXLONG       0x7fffffff
45 #define MAXBYTE       0xff
46 #define MAXWORD       0xffff
47 #define MAXDWORD      0xffffffff
48
49 #define FIELD_OFFSET(type, field) \
50   ((LONG)(INT)&(((type *)0)->field))
51
52 #define CONTAINING_RECORD(address, type, field) \
53   ((type *)((PCHAR)(address) - (PCHAR)(&((type *)0)->field)))
54
55 /* Types */
56
57 /* TCHAR data types definitions for Winelib. */
58 /* These types are _not_ defined for the emulator, because they */
59 /* depend on the UNICODE macro that only exists in user's code. */
60
61 #ifndef __WINE__
62 # ifdef UNICODE
63 typedef LPWSTR LPTSTR;
64 typedef LPCWSTR LPCTSTR;
65 #define __TEXT(string) L##string /*probably wrong */
66 # else  /* UNICODE */
67 typedef LPSTR LPTSTR;
68 typedef LPCSTR LPCTSTR;
69 #define __TEXT(string) string
70 # endif /* UNICODE */
71 #endif   /* __WINE__ */
72 #define TEXT(quote) __TEXT(quote)
73
74 typedef BYTE     BOOLEAN;
75 typedef BOOLEAN *PBOOLEAN;
76
77 typedef struct _LIST_ENTRY {
78   struct _LIST_ENTRY *Flink;
79   struct _LIST_ENTRY *Blink;
80 } LIST_ENTRY, *PLIST_ENTRY;
81
82 typedef struct _SINGLE_LIST_ENTRY {
83   struct _SINGLE_LIST_ENTRY *Next;
84 } SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
85
86 /* Heap flags */
87
88 #define HEAP_NO_SERIALIZE               0x00000001
89 #define HEAP_GROWABLE                   0x00000002
90 #define HEAP_GENERATE_EXCEPTIONS        0x00000004
91 #define HEAP_ZERO_MEMORY                0x00000008
92 #define HEAP_REALLOC_IN_PLACE_ONLY      0x00000010
93 #define HEAP_TAIL_CHECKING_ENABLED      0x00000020
94 #define HEAP_FREE_CHECKING_ENABLED      0x00000040
95 #define HEAP_DISABLE_COALESCE_ON_FREE   0x00000080
96 #define HEAP_CREATE_ALIGN_16            0x00010000
97 #define HEAP_CREATE_ENABLE_TRACING      0x00020000
98 #define HEAP_WINE_SEGPTR                0x01000000  /* Not a Win32 flag */
99 #define HEAP_WINE_CODESEG               0x02000000  /* Not a Win32 flag */
100 #define HEAP_WINE_CODE16SEG             0x04000000  /* Not a Win32 flag */
101
102 /* Processor feature flags.  */
103 #define PF_FLOATING_POINT_PRECISION_ERRATA      0
104 #define PF_FLOATING_POINT_EMULATED              1
105 #define PF_COMPARE_EXCHANGE_DOUBLE              2
106 #define PF_MMX_INSTRUCTIONS_AVAILABLE           3
107 #define PF_PPC_MOVEMEM_64BIT_OK                 4
108 #define PF_ALPHA_BYTE_INSTRUCTIONS              5
109
110
111 /* The Win32 register context */
112
113 /* CONTEXT is the CPU-dependent context; it should be used        */
114 /* wherever a platform-specific context is needed (e.g. exception */
115 /* handling, Win32 register functions). */
116
117 /* CONTEXT86 is the i386-specific context; it should be used     */
118 /* wherever only a 386 context makes sense (e.g. DOS interrupts, */
119 /* Win16 register functions), so that this code can be compiled  */
120 /* on all platforms. */
121
122 #define SIZE_OF_80387_REGISTERS      80
123
124 typedef struct _FLOATING_SAVE_AREA
125 {
126     DWORD   ControlWord;
127     DWORD   StatusWord;
128     DWORD   TagWord;    
129     DWORD   ErrorOffset;
130     DWORD   ErrorSelector;
131     DWORD   DataOffset;
132     DWORD   DataSelector;    
133     BYTE    RegisterArea[SIZE_OF_80387_REGISTERS];
134     DWORD   Cr0NpxState;
135 } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
136
137 typedef struct _CONTEXT86
138 {
139     DWORD   ContextFlags;
140
141     /* These are selected by CONTEXT_DEBUG_REGISTERS */
142     DWORD   Dr0;
143     DWORD   Dr1;
144     DWORD   Dr2;
145     DWORD   Dr3;
146     DWORD   Dr6;
147     DWORD   Dr7;
148
149     /* These are selected by CONTEXT_FLOATING_POINT */
150     FLOATING_SAVE_AREA FloatSave;
151
152     /* These are selected by CONTEXT_SEGMENTS */
153     DWORD   SegGs;
154     DWORD   SegFs;
155     DWORD   SegEs;
156     DWORD   SegDs;    
157
158     /* These are selected by CONTEXT_INTEGER */
159     DWORD   Edi;
160     DWORD   Esi;
161     DWORD   Ebx;
162     DWORD   Edx;    
163     DWORD   Ecx;
164     DWORD   Eax;
165
166     /* These are selected by CONTEXT_CONTROL */
167     DWORD   Ebp;    
168     DWORD   Eip;
169     DWORD   SegCs;
170     DWORD   EFlags;
171     DWORD   Esp;
172     DWORD   SegSs;
173 } CONTEXT86;
174
175 #define CONTEXT_X86       0x00010000
176 #define CONTEXT_i386      CONTEXT_X86
177 #define CONTEXT_i486      CONTEXT_X86
178
179 #define CONTEXT86_CONTROL   (CONTEXT_i386 | 0x0001) /* SS:SP, CS:IP, FLAGS, BP */
180 #define CONTEXT86_INTEGER   (CONTEXT_i386 | 0x0002) /* AX, BX, CX, DX, SI, DI */
181 #define CONTEXT86_SEGMENTS  (CONTEXT_i386 | 0x0004) /* DS, ES, FS, GS */
182 #define CONTEXT86_FLOATING_POINT  (CONTEXT_i386 | 0x0008L) /* 387 state */
183 #define CONTEXT86_DEBUG_REGISTERS (CONTEXT_i386 | 0x0010L) /* DB 0-3,6,7 */
184 #define CONTEXT86_FULL (CONTEXT86_CONTROL | CONTEXT86_INTEGER | CONTEXT86_SEGMENTS)
185
186 /* i386 context definitions */
187 #ifdef __i386__
188
189 #define CONTEXT_CONTROL         CONTEXT86_CONTROL
190 #define CONTEXT_INTEGER         CONTEXT86_INTEGER
191 #define CONTEXT_SEGMENTS        CONTEXT86_SEGMENTS
192 #define CONTEXT_FLOATING_POINT  CONTEXT86_FLOATING_POINT
193 #define CONTEXT_DEBUG_REGISTERS CONTEXT86_DEBUG_REGISTERS
194 #define CONTEXT_FULL            CONTEXT86_FULL
195
196 typedef CONTEXT86 CONTEXT;
197
198 #endif  /* __i386__ */
199
200 /* PowerPC context definitions (untested) */
201 #ifdef __ppc__
202
203 #define CONTEXT_CONTROL         0x0001
204 #define CONTEXT_FLOATING_POINT  0x0002
205 #define CONTEXT_INTEGER         0x0004
206 #define CONTEXT_DEBUG_REGISTERS 0x0008
207 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
208
209 typedef struct
210 {
211     /* These are selected by CONTEXT_FLOATING_POINT */
212     double Fpr0;
213     double Fpr1;
214     double Fpr2;
215     double Fpr3;
216     double Fpr4;
217     double Fpr5;
218     double Fpr6;
219     double Fpr7;
220     double Fpr8;
221     double Fpr9;
222     double Fpr10;
223     double Fpr11;
224     double Fpr12;
225     double Fpr13;
226     double Fpr14;
227     double Fpr15;
228     double Fpr16;
229     double Fpr17;
230     double Fpr18;
231     double Fpr19;
232     double Fpr20;
233     double Fpr21;
234     double Fpr22;
235     double Fpr23;
236     double Fpr24;
237     double Fpr25;
238     double Fpr26;
239     double Fpr27;
240     double Fpr28;
241     double Fpr29;
242     double Fpr30;
243     double Fpr31;
244     double Fpscr;
245
246     /* These are selected by CONTEXT_INTEGER */
247     DWORD Gpr0;
248     DWORD Gpr1;
249     DWORD Gpr2;
250     DWORD Gpr3;
251     DWORD Gpr4;
252     DWORD Gpr5;
253     DWORD Gpr6;
254     DWORD Gpr7;
255     DWORD Gpr8;
256     DWORD Gpr9;
257     DWORD Gpr10;
258     DWORD Gpr11;
259     DWORD Gpr12;
260     DWORD Gpr13;
261     DWORD Gpr14;
262     DWORD Gpr15;
263     DWORD Gpr16;
264     DWORD Gpr17;
265     DWORD Gpr18;
266     DWORD Gpr19;
267     DWORD Gpr20;
268     DWORD Gpr21;
269     DWORD Gpr22;
270     DWORD Gpr23;
271     DWORD Gpr24;
272     DWORD Gpr25;
273     DWORD Gpr26;
274     DWORD Gpr27;
275     DWORD Gpr28;
276     DWORD Gpr29;
277     DWORD Gpr30;
278     DWORD Gpr31;
279
280     DWORD Cr;
281     DWORD Xer;
282
283     /* These are selected by CONTEXT_CONTROL */
284     DWORD Msr;
285     DWORD Iar;
286     DWORD Lr;
287     DWORD Ctr;
288
289     DWORD ContextFlags;
290     DWORD Fill[3];
291
292     /* These are selected by CONTEXT_DEBUG_REGISTERS */
293     DWORD Dr0;
294     DWORD Dr1;
295     DWORD Dr2;
296     DWORD Dr3;
297     DWORD Dr4;
298     DWORD Dr5;
299     DWORD Dr6;
300     DWORD Dr7;
301 } CONTEXT;
302
303 #endif  /* __ppc__ */
304
305 #if !defined(CONTEXT_FULL) && !defined(RC_INVOKED)
306 #error You need to define a CONTEXT for your CPU
307 #endif
308
309 typedef CONTEXT *PCONTEXT;
310 typedef HANDLE *PHANDLE;
311
312 #ifdef __WINE__
313
314 /* Macros for easier access to i386 context registers */
315
316 #define EAX_reg(context)     ((context)->Eax)
317 #define EBX_reg(context)     ((context)->Ebx)
318 #define ECX_reg(context)     ((context)->Ecx)
319 #define EDX_reg(context)     ((context)->Edx)
320 #define ESI_reg(context)     ((context)->Esi)
321 #define EDI_reg(context)     ((context)->Edi)
322 #define EBP_reg(context)     ((context)->Ebp)
323
324 #define CS_reg(context)      ((context)->SegCs)
325 #define DS_reg(context)      ((context)->SegDs)
326 #define ES_reg(context)      ((context)->SegEs)
327 #define FS_reg(context)      ((context)->SegFs)
328 #define GS_reg(context)      ((context)->SegGs)
329 #define SS_reg(context)      ((context)->SegSs)
330
331 #define EFL_reg(context)     ((context)->EFlags)
332 #define EIP_reg(context)     ((context)->Eip)
333 #define ESP_reg(context)     ((context)->Esp)
334
335 #define AX_reg(context)      (*(WORD*)&EAX_reg(context))
336 #define BX_reg(context)      (*(WORD*)&EBX_reg(context))
337 #define CX_reg(context)      (*(WORD*)&ECX_reg(context))
338 #define DX_reg(context)      (*(WORD*)&EDX_reg(context))
339 #define SI_reg(context)      (*(WORD*)&ESI_reg(context))
340 #define DI_reg(context)      (*(WORD*)&EDI_reg(context))
341 #define BP_reg(context)      (*(WORD*)&EBP_reg(context))
342
343 #define AL_reg(context)      (*(BYTE*)&EAX_reg(context))
344 #define AH_reg(context)      (*((BYTE*)&EAX_reg(context)+1))
345 #define BL_reg(context)      (*(BYTE*)&EBX_reg(context))
346 #define BH_reg(context)      (*((BYTE*)&EBX_reg(context)+1))
347 #define CL_reg(context)      (*(BYTE*)&ECX_reg(context))
348 #define CH_reg(context)      (*((BYTE*)&ECX_reg(context)+1))
349 #define DL_reg(context)      (*(BYTE*)&EDX_reg(context))
350 #define DH_reg(context)      (*((BYTE*)&EDX_reg(context)+1))
351                             
352 #define IP_reg(context)      (*(WORD*)&EIP_reg(context))
353 #define SP_reg(context)      (*(WORD*)&ESP_reg(context))
354                             
355 #define FL_reg(context)      (*(WORD*)&EFL_reg(context))
356
357 #define SET_CFLAG(context)   (EFL_reg(context) |= 0x0001)
358 #define RESET_CFLAG(context) (EFL_reg(context) &= ~0x0001)
359 #define SET_ZFLAG(context)   (EFL_reg(context) |= 0x0040)
360 #define RESET_ZFLAG(context) (EFL_reg(context) &= ~0x0040)
361
362 #define ISV86(context)       (EFL_reg(context) & 0x00020000)
363 #define V86BASE(context)     ((context)->Dr7) /* ugly */
364
365 #endif  /* __WINE__ */
366
367 /*
368  * Exception codes
369  */
370  
371 #define STATUS_SUCCESS                   0x00000000
372 #define STATUS_WAIT_0                    0x00000000
373 #define STATUS_ABANDONED_WAIT_0          0x00000080
374 #define STATUS_USER_APC                  0x000000C0
375 #define STATUS_TIMEOUT                   0x00000102
376 #define STATUS_PENDING                   0x00000103
377 #define STATUS_GUARD_PAGE_VIOLATION      0x80000001    
378 #define STATUS_DATATYPE_MISALIGNMENT     0x80000002
379 #define STATUS_BREAKPOINT                0x80000003
380 #define STATUS_SINGLE_STEP               0x80000004
381 #define STATUS_BUFFER_OVERFLOW           0x80000005
382 #define STATUS_UNSUCCESSFUL              0xC0000001
383 #define STATUS_ACCESS_VIOLATION          0xC0000005
384 #define STATUS_IN_PAGE_ERROR             0xC0000006
385 #define STATUS_INVALID_PARAMETER         0xC000000D
386 #define STATUS_NO_MEMORY                 0xC0000017
387 #define STATUS_CONFLICTING_ADDRESSES     0xC0000018
388 #define STATUS_ILLEGAL_INSTRUCTION       0xC000001D
389 #define STATUS_BUFFER_TOO_SMALL          0xC0000023
390 #define STATUS_NONCONTINUABLE_EXCEPTION  0xC0000025
391 #define STATUS_INVALID_DISPOSITION       0xC0000026
392 #define STATUS_UNWIND                    0xC0000027
393 #define STATUS_BAD_STACK                 0xC0000028
394 #define STATUS_INVALID_UNWIND_TARGET     0xC0000029
395 #define STATUS_UNKNOWN_REVISION          0xC0000058
396 #define STATUS_INVALID_SECURITY_DESCR    0xC0000079
397 #define STATUS_ARRAY_BOUNDS_EXCEEDED     0xC000008C
398 #define STATUS_FLOAT_DENORMAL_OPERAND    0xC000008D
399 #define STATUS_FLOAT_DIVIDE_BY_ZERO      0xC000008E
400 #define STATUS_FLOAT_INEXACT_RESULT      0xC000008F
401 #define STATUS_FLOAT_INVALID_OPERATION   0xC0000090
402 #define STATUS_FLOAT_OVERFLOW            0xC0000091
403 #define STATUS_FLOAT_STACK_CHECK         0xC0000092
404 #define STATUS_FLOAT_UNDERFLOW           0xC0000093
405 #define STATUS_INTEGER_DIVIDE_BY_ZERO    0xC0000094
406 #define STATUS_INTEGER_OVERFLOW          0xC0000095
407 #define STATUS_PRIVILEGED_INSTRUCTION    0xC0000096
408 #define STATUS_INVALID_PARAMETER_2       0xC00000F0
409 #define STATUS_STACK_OVERFLOW            0xC00000FD
410 #define STATUS_CONTROL_C_EXIT            0xC000013A
411
412 #define MAXIMUM_WAIT_OBJECTS 64
413 #define MAXIMUM_SUSPEND_COUNT 127
414
415
416 /*
417  * Return values from the actual exception handlers
418  */
419
420 #define ExceptionContinueExecution 0
421 #define ExceptionContinueSearch    1
422 #define ExceptionNestedException   2
423 #define ExceptionCollidedUnwind    3
424  
425 /*
426  * Return values from filters in except() and from UnhandledExceptionFilter
427  */
428  
429 #define EXCEPTION_EXECUTE_HANDLER        1
430 #define EXCEPTION_CONTINUE_SEARCH        0
431 #define EXCEPTION_CONTINUE_EXECUTION    -1
432
433 /*
434  * From OS/2 2.0 exception handling
435  * Win32 seems to use the same flags as ExceptionFlags in an EXCEPTION_RECORD
436  */
437
438 #define EH_NONCONTINUABLE   0x01
439 #define EH_UNWINDING        0x02
440 #define EH_EXIT_UNWIND      0x04
441 #define EH_STACK_INVALID    0x08
442 #define EH_NESTED_CALL      0x10
443
444 #define EXCEPTION_CONTINUABLE        0
445 #define EXCEPTION_NONCONTINUABLE     EH_NONCONTINUABLE
446  
447 /*
448  * The exception record used by Win32 to give additional information 
449  * about exception to exception handlers.
450  */
451
452 #define EXCEPTION_MAXIMUM_PARAMETERS 15
453
454 typedef struct __EXCEPTION_RECORD
455 {
456     DWORD    ExceptionCode;
457     DWORD    ExceptionFlags;
458     struct __EXCEPTION_RECORD *ExceptionRecord;
459
460     LPVOID   ExceptionAddress;
461     DWORD    NumberParameters;
462     DWORD    ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
463 } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
464
465 /*
466  * The exception pointers structure passed to exception filters
467  * in except() and the UnhandledExceptionFilter().
468  */
469  
470 typedef struct _EXCEPTION_POINTERS 
471 {
472   PEXCEPTION_RECORD  ExceptionRecord;
473   PCONTEXT           ContextRecord;
474 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
475
476
477 /*
478  * The exception frame, used for registering exception handlers 
479  * Win32 cares only about this, but compilers generally emit 
480  * larger exception frames for their own use.
481  */
482
483 struct __EXCEPTION_FRAME;
484
485 typedef DWORD (CALLBACK *PEXCEPTION_HANDLER)(PEXCEPTION_RECORD,struct __EXCEPTION_FRAME*,
486                                              PCONTEXT,struct __EXCEPTION_FRAME **);
487
488 typedef struct __EXCEPTION_FRAME
489 {
490   struct __EXCEPTION_FRAME *Prev;
491   PEXCEPTION_HANDLER       Handler;
492 } EXCEPTION_FRAME, *PEXCEPTION_FRAME;
493
494 #include "poppack.h"
495
496 /*
497  * function pointer to a exception filter
498  */
499
500 typedef LONG (CALLBACK *PTOP_LEVEL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS ExceptionInfo);
501 typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
502
503 DWORD WINAPI UnhandledExceptionFilter( PEXCEPTION_POINTERS epointers );
504 LPTOP_LEVEL_EXCEPTION_FILTER
505 WINAPI SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER filter );
506
507 /* status values for ContinueDebugEvent */
508 #define DBG_CONTINUE                0x00010002
509 #define DBG_TERMINATE_THREAD        0x40010003
510 #define DBG_TERMINATE_PROCESS       0x40010004
511 #define DBG_CONTROL_C               0x40010005
512 #define DBG_CONTROL_BREAK           0x40010008
513 #define DBG_EXCEPTION_NOT_HANDLED   0x80010001
514
515 struct _TEB;
516 #if defined(__i386__) && defined(__WINE__)
517 static inline struct _TEB * WINE_UNUSED __get_teb(void)
518 {
519     struct _TEB *teb;
520     __asm__(".byte 0x64\n\tmovl (0x18),%0" : "=r" (teb));
521     return teb;
522 }
523 #define NtCurrentTeb() __get_teb()
524 #else
525 extern struct _TEB * WINAPI NtCurrentTeb(void);
526 #endif
527
528 /*
529  * Here follows typedefs for security and tokens.
530  */ 
531
532 /*
533  * First a constant for the following typdefs.
534  */
535
536 #define ANYSIZE_ARRAY   1
537
538 /* FIXME:  Orphan.  What does it point to? */
539 typedef PVOID PACCESS_TOKEN;
540
541 /*
542  * TOKEN_INFORMATION_CLASS
543  */
544
545 typedef enum _TOKEN_INFORMATION_CLASS {
546   TokenUser = 1, 
547   TokenGroups, 
548   TokenPrivileges, 
549   TokenOwner, 
550   TokenPrimaryGroup, 
551   TokenDefaultDacl, 
552   TokenSource, 
553   TokenType, 
554   TokenImpersonationLevel, 
555   TokenStatistics 
556 } TOKEN_INFORMATION_CLASS; 
557
558 #ifndef _SECURITY_DEFINED
559 #define _SECURITY_DEFINED
560
561 #include "pshpack1.h"
562
563 typedef DWORD ACCESS_MASK, *PACCESS_MASK;
564
565 typedef struct _GENERIC_MAPPING {
566     ACCESS_MASK GenericRead;
567     ACCESS_MASK GenericWrite;
568     ACCESS_MASK GenericExecute;
569     ACCESS_MASK GenericAll;
570 } GENERIC_MAPPING, *PGENERIC_MAPPING;
571
572 #ifndef SID_IDENTIFIER_AUTHORITY_DEFINED
573 #define SID_IDENTIFIER_AUTHORITY_DEFINED
574 typedef struct {
575     BYTE Value[6];
576 } SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
577 #endif /* !defined(SID_IDENTIFIER_AUTHORITY_DEFINED) */
578
579 #ifndef SID_DEFINED
580 #define SID_DEFINED
581 typedef struct _SID {
582     BYTE Revision;
583     BYTE SubAuthorityCount;
584     SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
585     DWORD SubAuthority[1];
586 } SID,*PSID;
587 #endif /* !defined(SID_DEFINED) */
588
589 #define SID_REVISION                    (1)     /* Current revision */
590 #define SID_MAX_SUB_AUTHORITIES         (15)    /* current max subauths */
591 #define SID_RECOMMENDED_SUB_AUTHORITIES (1)     /* recommended subauths */
592
593
594 /* 
595  * ACL 
596  */
597
598 typedef struct _ACL {
599     BYTE AclRevision;
600     BYTE Sbz1;
601     WORD AclSize;
602     WORD AceCount;
603     WORD Sbz2;
604 } ACL, *PACL;
605
606 /* SECURITY_DESCRIPTOR */
607 #define SECURITY_DESCRIPTOR_REVISION    1
608 #define SECURITY_DESCRIPTOR_REVISION1   1
609
610
611 #define SE_OWNER_DEFAULTED      0x0001
612 #define SE_GROUP_DEFAULTED      0x0002
613 #define SE_DACL_PRESENT         0x0004
614 #define SE_DACL_DEFAULTED       0x0008
615 #define SE_SACL_PRESENT         0x0010
616 #define SE_SACL_DEFAULTED       0x0020
617 #define SE_SELF_RELATIVE        0x8000
618
619 typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;
620 typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
621
622 /* The security descriptor structure */
623 typedef struct {
624     BYTE Revision;
625     BYTE Sbz1;
626     SECURITY_DESCRIPTOR_CONTROL Control;
627     PSID Owner;
628     PSID Group;
629     PACL Sacl;
630     PACL Dacl;
631 } SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;
632
633 #define SECURITY_DESCRIPTOR_MIN_LENGTH   (sizeof(SECURITY_DESCRIPTOR)) 
634
635 #include "poppack.h"
636
637 #endif /* _SECURITY_DEFINED */
638
639 #include "pshpack1.h"
640
641 /* 
642  * SID_AND_ATTRIBUTES
643  */
644
645 typedef struct _SID_AND_ATTRIBUTES {
646   PSID  Sid; 
647   DWORD Attributes; 
648 } SID_AND_ATTRIBUTES ; 
649  
650 /*
651  * TOKEN_USER
652  */
653
654 typedef struct _TOKEN_USER {
655   SID_AND_ATTRIBUTES User; 
656 } TOKEN_USER; 
657
658 /*
659  * TOKEN_GROUPS
660  */
661
662 typedef struct _TOKEN_GROUPS  {
663   DWORD GroupCount; 
664   SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]; 
665 } TOKEN_GROUPS; 
666
667 /*
668  * LUID_AND_ATTRIBUTES
669  */
670
671 typedef struct _LARGE_INTEGER
672 {
673     DWORD    LowPart;
674     LONG     HighPart;
675 } LARGE_INTEGER, *LPLARGE_INTEGER, *PLARGE_INTEGER;
676
677 typedef struct _ULARGE_INTEGER
678 {
679     DWORD    LowPart;
680     DWORD    HighPart;
681 } ULARGE_INTEGER, *LPULARGE_INTEGER, *PULARGE_INTEGER;
682
683 /*
684  * Locally Unique Identifier
685  */
686
687 typedef LARGE_INTEGER LUID,*PLUID;
688
689 typedef struct _LUID_AND_ATTRIBUTES {
690   LUID   Luid; 
691   DWORD  Attributes; 
692 } LUID_AND_ATTRIBUTES; 
693
694 /*
695  * PRIVILEGE_SET
696  */
697
698 typedef struct _PRIVILEGE_SET {
699     DWORD PrivilegeCount;
700     DWORD Control;
701     LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
702 } PRIVILEGE_SET, *PPRIVILEGE_SET;
703
704 /*
705  * TOKEN_PRIVILEGES
706  */
707
708 typedef struct _TOKEN_PRIVILEGES {
709   DWORD PrivilegeCount; 
710   LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; 
711 } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; 
712
713 /*
714  * TOKEN_OWNER
715  */
716
717 typedef struct _TOKEN_OWNER {
718   PSID Owner; 
719 } TOKEN_OWNER; 
720
721 /*
722  * TOKEN_PRIMARY_GROUP
723  */
724
725 typedef struct _TOKEN_PRIMARY_GROUP {
726   PSID PrimaryGroup; 
727 } TOKEN_PRIMARY_GROUP; 
728
729
730 /*
731  * TOKEN_DEFAULT_DACL
732  */
733
734 typedef struct _TOKEN_DEFAULT_DACL { 
735   PACL DefaultDacl; 
736 } TOKEN_DEFAULT_DACL; 
737
738 /*
739  * TOKEN_SOURCEL
740  */
741
742 typedef struct _TOKEN_SOURCE {
743   char Sourcename[8]; 
744   LUID SourceIdentifier; 
745 } TOKEN_SOURCE; 
746
747 /*
748  * TOKEN_TYPE
749  */
750
751 typedef enum tagTOKEN_TYPE {
752   TokenPrimary = 1, 
753   TokenImpersonation 
754 } TOKEN_TYPE; 
755
756 /*
757  * SECURITY_IMPERSONATION_LEVEL
758  */
759
760 typedef enum _SECURITY_IMPERSONATION_LEVEL {
761   SecurityAnonymous, 
762   SecurityIdentification, 
763   SecurityImpersonation, 
764   SecurityDelegation 
765 } SECURITY_IMPERSONATION_LEVEL, *PSECURITY_IMPERSONATION_LEVEL; 
766
767
768 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,
769         * PSECURITY_CONTEXT_TRACKING_MODE;
770 /*
771  *      Quality of Service
772  */
773
774 typedef struct _SECURITY_QUALITY_OF_SERVICE {
775   DWORD                         Length;
776   SECURITY_IMPERSONATION_LEVEL  ImpersonationLevel;
777   SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
778   BOOL                          EffectiveOnly;
779 } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
780
781 /*
782  * TOKEN_STATISTICS
783  */
784
785 typedef struct _TOKEN_STATISTICS {
786   LUID  TokenId; 
787   LUID  AuthenticationId; 
788   LARGE_INTEGER ExpirationTime; 
789   TOKEN_TYPE    TokenType; 
790   SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; 
791   DWORD DynamicCharged; 
792   DWORD DynamicAvailable; 
793   DWORD GroupCount; 
794   DWORD PrivilegeCount; 
795   LUID  ModifiedId; 
796 } TOKEN_STATISTICS; 
797
798 /* 
799  *      ACLs of NT 
800  */
801
802 #define ACL_REVISION    2
803
804 #define ACL_REVISION1   1
805 #define ACL_REVISION2   2
806
807 /* ACEs, directly starting after an ACL */
808 typedef struct _ACE_HEADER {
809         BYTE    AceType;
810         BYTE    AceFlags;
811         WORD    AceSize;
812 } ACE_HEADER,*PACE_HEADER;
813
814 /* AceType */
815 #define ACCESS_ALLOWED_ACE_TYPE         0
816 #define ACCESS_DENIED_ACE_TYPE          1
817 #define SYSTEM_AUDIT_ACE_TYPE           2
818 #define SYSTEM_ALARM_ACE_TYPE           3
819
820 /* inherit AceFlags */
821 #define OBJECT_INHERIT_ACE              0x01
822 #define CONTAINER_INHERIT_ACE           0x02
823 #define NO_PROPAGATE_INHERIT_ACE        0x04
824 #define INHERIT_ONLY_ACE                0x08
825 #define VALID_INHERIT_FLAGS             0x0F
826
827 /* AceFlags mask for what events we (should) audit */
828 #define SUCCESSFUL_ACCESS_ACE_FLAG      0x40
829 #define FAILED_ACCESS_ACE_FLAG          0x80
830
831 /* different ACEs depending on AceType 
832  * SidStart marks the begin of a SID
833  * so the thing finally looks like this:
834  * 0: ACE_HEADER
835  * 4: ACCESS_MASK
836  * 8... : SID
837  */
838 typedef struct _ACCESS_ALLOWED_ACE {
839         ACE_HEADER      Header;
840         DWORD           Mask;
841         DWORD           SidStart;
842 } ACCESS_ALLOWED_ACE,*PACCESS_ALLOWED_ACE;
843
844 typedef struct _ACCESS_DENIED_ACE {
845         ACE_HEADER      Header;
846         DWORD           Mask;
847         DWORD           SidStart;
848 } ACCESS_DENIED_ACE,*PACCESS_DENIED_ACE;
849
850 typedef struct _SYSTEM_AUDIT_ACE {
851         ACE_HEADER      Header;
852         DWORD           Mask;
853         DWORD           SidStart;
854 } SYSTEM_AUDIT_ACE,*PSYSTEM_AUDIT_ACE;
855
856 typedef struct _SYSTEM_ALARM_ACE {
857         ACE_HEADER      Header;
858         DWORD           Mask;
859         DWORD           SidStart;
860 } SYSTEM_ALARM_ACE,*PSYSTEM_ALARM_ACE;
861
862 typedef enum tagSID_NAME_USE {
863         SidTypeUser = 1,
864         SidTypeGroup,
865         SidTypeDomain,
866         SidTypeAlias,
867         SidTypeWellKnownGroup,
868         SidTypeDeletedAccount,
869         SidTypeInvalid,
870         SidTypeUnknown
871 } SID_NAME_USE,*PSID_NAME_USE;
872
873 /* Access rights */
874
875 #define DELETE                     0x00010000
876 #define READ_CONTROL               0x00020000
877 #define WRITE_DAC                  0x00040000
878 #define WRITE_OWNER                0x00080000
879 #define SYNCHRONIZE                0x00100000
880 #define STANDARD_RIGHTS_REQUIRED   0x000f0000
881
882 #define STANDARD_RIGHTS_READ       READ_CONTROL
883 #define STANDARD_RIGHTS_WRITE      READ_CONTROL
884 #define STANDARD_RIGHTS_EXECUTE    READ_CONTROL
885
886 #define STANDARD_RIGHTS_ALL        0x001f0000
887
888 #define SPECIFIC_RIGHTS_ALL        0x0000ffff
889
890 #define GENERIC_READ               0x80000000
891 #define GENERIC_WRITE              0x40000000
892 #define GENERIC_EXECUTE            0x20000000
893 #define GENERIC_ALL                0x10000000
894
895 #define EVENT_MODIFY_STATE         0x0002
896 #define EVENT_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
897
898 #define SEMAPHORE_MODIFY_STATE     0x0002
899 #define SEMAPHORE_ALL_ACCESS       (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
900
901 #define MUTEX_MODIFY_STATE         0x0001
902 #define MUTEX_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1)
903
904 #define PROCESS_TERMINATE          0x0001
905 #define PROCESS_CREATE_THREAD      0x0002
906 #define PROCESS_VM_OPERATION       0x0008
907 #define PROCESS_VM_READ            0x0010
908 #define PROCESS_VM_WRITE           0x0020
909 #define PROCESS_DUP_HANDLE         0x0040
910 #define PROCESS_CREATE_PROCESS     0x0080
911 #define PROCESS_SET_QUOTA          0x0100
912 #define PROCESS_SET_INFORMATION    0x0200
913 #define PROCESS_QUERY_INFORMATION  0x0400
914 #define PROCESS_ALL_ACCESS         (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xfff)
915
916 #define THREAD_TERMINATE           0x0001
917 #define THREAD_SUSPEND_RESUME      0x0002
918 #define THREAD_GET_CONTEXT         0x0008
919 #define THREAD_SET_CONTEXT         0x0010
920 #define THREAD_SET_INFORMATION     0x0020
921 #define THREAD_QUERY_INFORMATION   0x0040
922 #define THREAD_SET_THREAD_TOKEN    0x0080
923 #define THREAD_IMPERSONATE         0x0100
924 #define THREAD_DIRECT_IMPERSONATION 0x0200
925 #define THREAD_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3ff)
926
927 #define THREAD_BASE_PRIORITY_LOWRT  15 
928 #define THREAD_BASE_PRIORITY_MAX    2 
929 #define THREAD_BASE_PRIORITY_MIN   -2
930 #define THREAD_BASE_PRIORITY_IDLE  -15
931
932 #define FILE_READ_DATA            0x0001    /* file & pipe */
933 #define FILE_LIST_DIRECTORY       0x0001    /* directory */
934 #define FILE_WRITE_DATA           0x0002    /* file & pipe */
935 #define FILE_ADD_FILE             0x0002    /* directory */
936 #define FILE_APPEND_DATA          0x0004    /* file */
937 #define FILE_ADD_SUBDIRECTORY     0x0004    /* directory */
938 #define FILE_CREATE_PIPE_INSTANCE 0x0004    /* named pipe */
939 #define FILE_READ_EA              0x0008    /* file & directory */
940 #define FILE_READ_PROPERTIES      FILE_READ_EA
941 #define FILE_WRITE_EA             0x0010    /* file & directory */
942 #define FILE_WRITE_PROPERTIES     FILE_WRITE_EA
943 #define FILE_EXECUTE              0x0020    /* file */
944 #define FILE_TRAVERSE             0x0020    /* directory */
945 #define FILE_DELETE_CHILD         0x0040    /* directory */
946 #define FILE_READ_ATTRIBUTES      0x0080    /* all */
947 #define FILE_WRITE_ATTRIBUTES     0x0100    /* all */
948 #define FILE_ALL_ACCESS           (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1ff)
949
950 #define FILE_GENERIC_READ         (STANDARD_RIGHTS_READ | FILE_READ_DATA | \
951                                    FILE_READ_ATTRIBUTES | FILE_READ_EA | \
952                                    SYNCHRONIZE)
953 #define FILE_GENERIC_WRITE        (STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | \
954                                    FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | \
955                                    FILE_APPEND_DATA | SYNCHRONIZE)
956 #define FILE_GENERIC_EXECUTE      (STANDARD_RIGHTS_EXECUTE | FILE_EXECUTE | \
957                                    FILE_READ_ATTRIBUTES | SYNCHRONIZE)
958
959
960 /* File attribute flags
961  */
962 #define FILE_SHARE_READ                 0x00000001L
963 #define FILE_SHARE_WRITE                0x00000002L
964 #define FILE_SHARE_DELETE               0x00000004L
965 #define FILE_ATTRIBUTE_READONLY         0x00000001L
966 #define FILE_ATTRIBUTE_HIDDEN           0x00000002L
967 #define FILE_ATTRIBUTE_SYSTEM           0x00000004L
968 #define FILE_ATTRIBUTE_LABEL            0x00000008L  /* Not in Windows API */
969 #define FILE_ATTRIBUTE_DIRECTORY        0x00000010L
970 #define FILE_ATTRIBUTE_ARCHIVE          0x00000020L
971 #define FILE_ATTRIBUTE_NORMAL           0x00000080L
972 #define FILE_ATTRIBUTE_TEMPORARY        0x00000100L
973 #define FILE_ATTRIBUTE_ATOMIC_WRITE     0x00000200L
974 #define FILE_ATTRIBUTE_XACTION_WRITE    0x00000400L
975 #define FILE_ATTRIBUTE_COMPRESSED       0x00000800L
976 #define FILE_ATTRIBUTE_OFFLINE          0x00001000L
977
978 /* File alignments (NT) */
979 #define FILE_BYTE_ALIGNMENT             0x00000000
980 #define FILE_WORD_ALIGNMENT             0x00000001
981 #define FILE_LONG_ALIGNMENT             0x00000003
982 #define FILE_QUAD_ALIGNMENT             0x00000007
983 #define FILE_OCTA_ALIGNMENT             0x0000000f
984 #define FILE_32_BYTE_ALIGNMENT          0x0000001f
985 #define FILE_64_BYTE_ALIGNMENT          0x0000003f
986 #define FILE_128_BYTE_ALIGNMENT         0x0000007f
987 #define FILE_256_BYTE_ALIGNMENT         0x000000ff
988 #define FILE_512_BYTE_ALIGNMENT         0x000001ff
989
990 /* Registry security values */
991 #define OWNER_SECURITY_INFORMATION  0x00000001
992 #define GROUP_SECURITY_INFORMATION  0x00000002
993 #define DACL_SECURITY_INFORMATION   0x00000004
994 #define SACL_SECURITY_INFORMATION   0x00000008
995
996 #include "poppack.h"
997
998 #endif  /* __WINE_WINNT_H */