blob: ec1e70d1dfef0ae786e7a94e20846527092dbd32 [file] [log] [blame]
Alexandre Julliard329f0681996-04-14 13:21:20 +00001/*
2 * Win32 definitions for Windows NT
3 *
4 * Copyright 1996 Alexandre Julliard
Alexandre Julliard0799c1a2002-03-09 23:29:33 +00005 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Alexandre Julliard329f0681996-04-14 13:21:20 +000019 */
20
21#ifndef __WINE_WINNT_H
22#define __WINE_WINNT_H
23
Dimitrie O. Paun53f9c212003-08-28 21:43:34 +000024#include <basetsd.h>
Alexandre Julliard9ea19e51997-01-01 17:29:55 +000025
Francois Gougetb42ed542000-04-24 18:02:02 +000026#ifndef RC_INVOKED
Francois Gouget7a384522000-11-08 05:03:15 +000027#include <ctype.h>
François Gouget50510202000-12-19 04:50:49 +000028#include <stddef.h>
Francois Gouget7a2da172001-04-10 23:23:31 +000029#include <string.h>
Francois Gougetb42ed542000-04-24 18:02:02 +000030#endif
31
Alexandre Julliard435e2e62002-12-10 22:56:43 +000032#define NTAPI __stdcall
François Gouget7d646762000-12-15 21:31:03 +000033
34/* Macro for structure packing and more. */
35
36#ifdef __GNUC__
François Gouget7d646762000-12-15 21:31:03 +000037#define WINE_UNUSED __attribute__((unused))
François Gouget7d646762000-12-15 21:31:03 +000038#else
François Gouget7d646762000-12-15 21:31:03 +000039#define WINE_UNUSED /* nothing */
François Gouget7d646762000-12-15 21:31:03 +000040#endif
41
Ge van Geldorp6ba22262003-12-13 00:02:31 +000042#if (defined(_M_IX86) || defined(_M_IA64) || defined(_M_AMD64) || defined(__MINGW32__)) && !defined(MIDL_PASS)
43# if defined(_MSC_VER)
44# define DECLSPEC_IMPORT __declspec(dllimport)
45# elif defined(__MINGW32__)
46# define DECLSPEC_IMPORT __attribute__((dllimport))
47# else
48# define DECLSPEC_IMPORT
49# endif
Patrik Stridvall57584842002-09-10 00:21:01 +000050#else
51# define DECLSPEC_IMPORT
52#endif
53
Patrik Stridvall441a7dc2002-04-29 18:37:36 +000054#ifndef DECLSPEC_NORETURN
Daniel Marmiera613de22003-09-30 00:33:47 +000055# if defined(_MSC_VER) && (_MSC_VER >= 1200) && !defined(MIDL_PASS)
Patrik Stridvall441a7dc2002-04-29 18:37:36 +000056# define DECLSPEC_NORETURN __declspec(noreturn)
Patrik Stridvalle29345c2002-10-01 18:07:37 +000057# elif defined(__GNUC__)
58# define DECLSPEC_NORETURN __attribute__((noreturn))
Patrik Stridvall441a7dc2002-04-29 18:37:36 +000059# else
60# define DECLSPEC_NORETURN
61# endif
62#endif
63
Patrik Stridvall57584842002-09-10 00:21:01 +000064#ifndef DECLSPEC_ALIGN
Daniel Marmiera613de22003-09-30 00:33:47 +000065# if defined(_MSC_VER) && (_MSC_VER >= 1300) && !defined(MIDL_PASS)
Patrik Stridvalle29345c2002-10-01 18:07:37 +000066# define DECLSPEC_ALIGN(x) __declspec(align(x))
67# elif defined(__GNUC__)
68# define DECLSPEC_ALIGN(x) __attribute__((aligned(x)))
Patrik Stridvall57584842002-09-10 00:21:01 +000069# else
70# define DECLSPEC_ALIGN(x)
71# endif
72#endif
73
74#ifndef DECLSPEC_CACHEALIGN
75# define DECLSPEC_CACHEALIGN DECLSPEC_ALIGN(128)
76#endif
77
78#ifndef DECLSPEC_UUID
Daniel Marmiera613de22003-09-30 00:33:47 +000079# if defined(_MSC_VER) && (_MSC_VER >= 1100) && defined (__cplusplus)
Patrik Stridvalle29345c2002-10-01 18:07:37 +000080# define DECLSPEC_UUID(x) __declspec(uuid(x))
Patrik Stridvall57584842002-09-10 00:21:01 +000081# else
82# define DECLSPEC_UUID(x)
83# endif
84#endif
85
86#ifndef DECLSPEC_NOVTABLE
Daniel Marmiera613de22003-09-30 00:33:47 +000087# if defined(_MSC_VER) && (_MSC_VER >= 1100) && defined(__cplusplus)
Patrik Stridvalle29345c2002-10-01 18:07:37 +000088# define DECLSPEC_NOVTABLE __declspec(novtable)
Patrik Stridvall57584842002-09-10 00:21:01 +000089# else
90# define DECLSPEC_NOVTABLE
91# endif
92#endif
93
94#ifndef DECLSPEC_SELECTANY
Daniel Marmiera613de22003-09-30 00:33:47 +000095#if defined(_MSC_VER) && (_MSC_VER >= 1100)
Patrik Stridvalle29345c2002-10-01 18:07:37 +000096#define DECLSPEC_SELECTANY __declspec(selectany)
Patrik Stridvall57584842002-09-10 00:21:01 +000097#else
98#define DECLSPEC_SELECTANY
99#endif
100#endif
101
102#ifndef NOP_FUNCTION
Daniel Marmiera613de22003-09-30 00:33:47 +0000103# if defined(_MSC_VER) && (_MSC_VER >= 1210)
Patrik Stridvall57584842002-09-10 00:21:01 +0000104# define NOP_FUNCTION __noop
105# else
106# define NOP_FUNCTION (void)0
107# endif
108#endif
109
110#ifndef DECLSPEC_ADDRSAFE
Daniel Marmiera613de22003-09-30 00:33:47 +0000111# if defined(_MSC_VER) && (_MSC_VER >= 1200) && (defined(_M_ALPHA) || defined(_M_AXP64))
Patrik Stridvalle29345c2002-10-01 18:07:37 +0000112# define DECLSPEC_ADDRSAFE __declspec(address_safe)
Patrik Stridvall57584842002-09-10 00:21:01 +0000113# else
114# define DECLSPEC_ADDRSAFE
115# endif
116#endif
117
118#ifndef FORCEINLINE
Daniel Marmiera613de22003-09-30 00:33:47 +0000119# if defined(_MSC_VER) && (_MSC_VER >= 1200)
Patrik Stridvall57584842002-09-10 00:21:01 +0000120# define FORCEINLINE __forceinline
Patrik Stridvalle29345c2002-10-01 18:07:37 +0000121# elif defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 2)))
122# define FORCEINLINE __attribute__((always_inline))
Patrik Stridvall57584842002-09-10 00:21:01 +0000123# else
Patrik Stridvalle29345c2002-10-01 18:07:37 +0000124# define FORCEINLINE inline
Patrik Stridvall57584842002-09-10 00:21:01 +0000125# endif
126#endif
127
128#ifndef DECLSPEC_DEPRECATED
Daniel Marmiera613de22003-09-30 00:33:47 +0000129# if defined(_MSC_VER) && (_MSC_VER >= 1300) && !defined(MIDL_PASS)
Patrik Stridvalle29345c2002-10-01 18:07:37 +0000130# define DECLSPEC_DEPRECATED __declspec(deprecated)
131# define DEPRECATE_SUPPORTED
132# elif defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 2)))
133# define DECLSPEC_DEPRECATED __attribute__((deprecated))
Patrik Stridvall57584842002-09-10 00:21:01 +0000134# define DEPRECATE_SUPPORTED
135# else
136# define DECLSPEC_DEPRECATED
137# undef DEPRECATE_SUPPORTED
138# endif
139#endif
140
François Gouget7d646762000-12-15 21:31:03 +0000141/* Anonymous union/struct handling */
142
Dimitrie O. Paun297f3d82003-01-07 20:36:20 +0000143#ifndef NONAMELESSSTRUCT
144# ifdef __GNUC__
145 /* Anonymous struct support starts with gcc 2.96 or gcc/g++ 3.x */
146# if (__GNUC__ < 2) || ((__GNUC__ == 2) && (defined(__cplusplus) || (__GNUC_MINOR__ < 96)))
147# define NONAMELESSSTRUCT
148# endif
149# elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
François Gouget7d646762000-12-15 21:31:03 +0000150# define NONAMELESSSTRUCT
151# endif
Dimitrie O. Paun297f3d82003-01-07 20:36:20 +0000152#endif /* NONAMELESSSTRUCT */
153
154#ifndef NONAMELESSUNION
155# ifdef __GNUC__
156 /* Anonymous unions support starts with gcc 2.96/g++ 2.95 */
157# if (__GNUC__ < 2) || ((__GNUC__ == 2) && ((__GNUC_MINOR__ < 95) || ((__GNUC_MINOR__ == 95) && !defined(__cplusplus))))
158# define NONAMELESSUNION
159# endif
160# elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
François Gouget7d646762000-12-15 21:31:03 +0000161# define NONAMELESSUNION
162# endif
Dimitrie O. Paun297f3d82003-01-07 20:36:20 +0000163#endif /* NONAMELESSUNION */
François Gouget7d646762000-12-15 21:31:03 +0000164
165#ifndef NONAMELESSSTRUCT
166#define DUMMYSTRUCTNAME
167#define DUMMYSTRUCTNAME1
168#define DUMMYSTRUCTNAME2
169#define DUMMYSTRUCTNAME3
170#define DUMMYSTRUCTNAME4
171#define DUMMYSTRUCTNAME5
172#else /* !defined(NONAMELESSSTRUCT) */
173#define DUMMYSTRUCTNAME s
174#define DUMMYSTRUCTNAME1 s1
175#define DUMMYSTRUCTNAME2 s2
176#define DUMMYSTRUCTNAME3 s3
177#define DUMMYSTRUCTNAME4 s4
178#define DUMMYSTRUCTNAME5 s5
179#endif /* !defined(NONAMELESSSTRUCT) */
180
181#ifndef NONAMELESSUNION
182#define DUMMYUNIONNAME
183#define DUMMYUNIONNAME1
184#define DUMMYUNIONNAME2
185#define DUMMYUNIONNAME3
186#define DUMMYUNIONNAME4
187#define DUMMYUNIONNAME5
188#define DUMMYUNIONNAME6
189#define DUMMYUNIONNAME7
190#define DUMMYUNIONNAME8
191#else /* !defined(NONAMELESSUNION) */
192#define DUMMYUNIONNAME u
193#define DUMMYUNIONNAME1 u1
194#define DUMMYUNIONNAME2 u2
195#define DUMMYUNIONNAME3 u3
196#define DUMMYUNIONNAME4 u4
197#define DUMMYUNIONNAME5 u5
198#define DUMMYUNIONNAME6 u6
199#define DUMMYUNIONNAME7 u7
200#define DUMMYUNIONNAME8 u8
201#endif /* !defined(NONAMELESSUNION) */
202
Patrik Stridvallb3c989e2002-10-02 01:23:33 +0000203/* C99 restrict support */
204
205#if defined(ENABLE_RESTRICTED) && !defined(MIDL_PASS) && !defined(RC_INVOKED)
206# if defined(_MSC_VER) && defined(_M_MRX000)
207# define RESTRICTED_POINTER __restrict
208# elif defined(__GNUC__) && ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 95)))
209# define RESTRICTED_POINTER __restrict
210# else
211# define RESTRICTED_POINTER
212# endif
213#else
214# define RESTRICTED_POINTER
215#endif
216
217/* C99 unaligned support */
218
219#if defined(_MSC_VER) && (defined(_M_MRX000) || defined(_M_ALPHA) || defined(_M_PPC) || defined(_M_IA64) || defined(_M_AMD64))
220# define UNALIGNED __unaligned
221# ifdef _WIN64
222# define UNALIGNED64 __unaligned
223# else
224# define UNALIGNED64
225# endif
226#else
227# define UNALIGNED
228# define UNALIGNED64
229#endif
230
231/* Alignment macros */
232
233#if defined(_WIN64) || (defined(_MSC_VER) && defined(_M_ALPHA)) || defined(__alpha__)
234#define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)
235#define MEMORY_ALLOCATION_ALIGNMENT 16
236#else
237#define MAX_NATURAL_ALIGNMENT sizeof(DWORD)
238#define MEMORY_ALLOCATION_ALIGNMENT 8
239#endif
240
Daniel Marmiera613de22003-09-30 00:33:47 +0000241#if defined(_MSC_VER) && (_MSC_VER >= 1300) && defined(__cplusplus)
Patrik Stridvallb3c989e2002-10-02 01:23:33 +0000242# define TYPE_ALIGNMENT(t) __alignof(t)
243#elif defined(__GNUC__)
244# define TYPE_ALIGNMENT(t) __alignof__(t)
245#else
246# define TYPE_ALIGNMENT(t) FIELD_OFFSET(struct { char x; t test; }, test)
247#endif
248
249#ifdef _WIN64
250# define PROBE_ALIGNMENT(_s) \
251 (TYPE_ALIGNMENT(_s) > TYPE_ALIGNMENT(DWORD) ? \
252 TYPE_ALIGNMENT(_s) : TYPE_ALIGNMENT(DWORD))
253# define PROBE_ALIGNMENT32(_s) TYPE_ALIGNMENT(DWORD)
254#else
255# define PROBE_ALIGNMENT(_s) TYPE_ALIGNMENT(DWORD)
256#endif
257
258/* Compile time assertion */
259
260#if defined(_MSC_VER)
261# define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
262#elif defined(__GNUC__)
263# define C_ASSERT(e) extern char __C_ASSERT__[(e)?1:-1]
264#endif
François Gouget7d646762000-12-15 21:31:03 +0000265
Alexandre Julliard50683472002-04-02 02:57:50 +0000266/* Error Masks */
267#define APPLICATION_ERROR_MASK 0x20000000
268#define ERROR_SEVERITY_SUCCESS 0x00000000
269#define ERROR_SEVERITY_INFORMATIONAL 0x40000000
270#define ERROR_SEVERITY_WARNING 0x80000000
271#define ERROR_SEVERITY_ERROR 0xC0000000
272
François Gouget42b3ee72000-12-19 02:09:52 +0000273/* Microsoft's macros for declaring functions */
274
275#ifdef __cplusplus
276# define EXTERN_C extern "C"
277#else
278# define EXTERN_C extern
279#endif
280
François Gouget42b3ee72000-12-19 02:09:52 +0000281#define STDMETHODCALLTYPE __stdcall
282#define STDMETHODVCALLTYPE __cdecl
283#define STDAPICALLTYPE __stdcall
284#define STDAPIVCALLTYPE __cdecl
285
286#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
287#define STDAPI_(type) EXTERN_C type STDAPICALLTYPE
288#define STDMETHODIMP HRESULT STDMETHODCALLTYPE
289#define STDMETHODIMP_(type) type STDMETHODCALLTYPE
290#define STDAPIV EXTERN_C HRESULT STDAPIVCALLTYPE
291#define STDAPIV_(type) EXTERN_C type STDAPIVCALLTYPE
292#define STDMETHODIMPV HRESULT STDMETHODVCALLTYPE
293#define STDMETHODIMPV_(type) type STDMETHODVCALLTYPE
François Gouget42b3ee72000-12-19 02:09:52 +0000294
François Gouget7d646762000-12-15 21:31:03 +0000295/* Define the basic types */
296#ifndef VOID
297#define VOID void
298#endif
Alexandre Julliard435e2e62002-12-10 22:56:43 +0000299typedef VOID *PVOID;
François Gouget7d646762000-12-15 21:31:03 +0000300typedef BYTE BOOLEAN, *PBOOLEAN;
301typedef char CHAR, *PCHAR;
François Gouget7d646762000-12-15 21:31:03 +0000302typedef short SHORT, *PSHORT;
Alexandre Julliard435e2e62002-12-10 22:56:43 +0000303typedef long LONG, *PLONG;
François Gouget7d646762000-12-15 21:31:03 +0000304
François Gouget50510202000-12-19 04:50:49 +0000305/* Some systems might have wchar_t, but we really need 16 bit characters */
306#ifdef WINE_UNICODE_NATIVE
307typedef wchar_t WCHAR, *PWCHAR;
308#else
309typedef unsigned short WCHAR, *PWCHAR;
310#endif
311
François Gouget7d646762000-12-15 21:31:03 +0000312/* 'Extended/Wide' numerical types */
313#ifndef _ULONGLONG_
314#define _ULONGLONG_
Alexandre Julliarddd0bdbe2002-09-12 17:29:12 +0000315typedef signed __int64 LONGLONG, *PLONGLONG;
316typedef unsigned __int64 ULONGLONG, *PULONGLONG;
François Gouget7d646762000-12-15 21:31:03 +0000317#endif
318
319#ifndef _DWORDLONG_
320#define _DWORDLONG_
321typedef ULONGLONG DWORDLONG, *PDWORDLONG;
322#endif
323
324/* ANSI string types */
325typedef CHAR *PCH, *LPCH;
326typedef const CHAR *PCCH, *LPCCH;
Dimitrie O. Pauna5246c62002-12-19 21:12:35 +0000327typedef CHAR *PSTR, *LPSTR, *NPSTR;
François Gouget7d646762000-12-15 21:31:03 +0000328typedef const CHAR *PCSTR, *LPCSTR;
329
330/* Unicode string types */
331typedef WCHAR *PWCH, *LPWCH;
332typedef const WCHAR *PCWCH, *LPCWCH;
Dimitrie O. Pauna5246c62002-12-19 21:12:35 +0000333typedef WCHAR *PWSTR, *LPWSTR, *NWPSTR;
François Gouget7d646762000-12-15 21:31:03 +0000334typedef const WCHAR *PCWSTR, *LPCWSTR;
335
336/* Neutral character and string types */
Vincent Béron9a624912002-05-31 23:06:46 +0000337/* These are only defined for Winelib, i.e. _not_ defined for
338 * the emulator. The reason is they depend on the UNICODE
François Gouget7d646762000-12-15 21:31:03 +0000339 * macro which only exists in the user's code.
340 */
Dimitrie O. Paun8b366812003-01-04 00:52:18 +0000341#ifndef __WINESRC__
François Gouget7d646762000-12-15 21:31:03 +0000342# ifdef UNICODE
343typedef WCHAR TCHAR, *PTCHAR;
344typedef LPWSTR PTSTR, LPTSTR;
345typedef LPCWSTR PCTSTR, LPCTSTR;
Dimitrie O. Paund61e43c2003-01-30 00:19:14 +0000346# define __TEXT(string) L##string
François Gouget7d646762000-12-15 21:31:03 +0000347# else /* UNICODE */
348typedef CHAR TCHAR, *PTCHAR;
349typedef LPSTR PTSTR, LPTSTR;
350typedef LPCSTR PCTSTR, LPCTSTR;
351# define __TEXT(string) string
352# endif /* UNICODE */
François Gouget50510202000-12-19 04:50:49 +0000353# define TEXT(quote) __TEXT(quote)
Dimitrie O. Paun8b366812003-01-04 00:52:18 +0000354#endif /* __WINESRC__ */
François Gouget7d646762000-12-15 21:31:03 +0000355
356/* Misc common WIN32 types */
Alexandre Julliardf22ba052002-08-15 21:57:36 +0000357typedef char CCHAR;
François Gouget7d646762000-12-15 21:31:03 +0000358typedef LONG HRESULT;
359typedef DWORD LCID, *PLCID;
360typedef WORD LANGID;
James Juran7313b782001-03-13 23:33:26 +0000361typedef DWORD EXECUTION_STATE;
François Gouget7d646762000-12-15 21:31:03 +0000362
363/* Handle type */
364
Alexandre Julliard6fa2ac62002-10-19 17:20:02 +0000365typedef void *HANDLE;
Alexandre Julliard6fa2ac62002-10-19 17:20:02 +0000366typedef HANDLE *PHANDLE, *LPHANDLE;
François Gouget7d646762000-12-15 21:31:03 +0000367
Alexandre Julliard435e2e62002-12-10 22:56:43 +0000368#ifdef STRICT
Alexandre Julliard29419b12003-01-24 00:49:32 +0000369#define DECLARE_HANDLE(a) typedef struct a##__ { int unused; } *a
François Gouget7d646762000-12-15 21:31:03 +0000370#else /*STRICT*/
Alexandre Julliard29419b12003-01-24 00:49:32 +0000371#define DECLARE_HANDLE(a) typedef HANDLE a
François Gouget7d646762000-12-15 21:31:03 +0000372#endif /*STRICT*/
373
Patrik Stridvall56d52aa1998-11-14 18:24:37 +0000374/* Defines */
375
Alexandre Julliardcc392b92003-09-09 19:26:40 +0000376#ifndef WIN32_NO_STATUS
377
378#define STATUS_WAIT_0 0x00000000
379#define STATUS_ABANDONED_WAIT_0 0x00000080
380#define STATUS_USER_APC 0x000000C0
381#define STATUS_TIMEOUT 0x00000102
382#define STATUS_PENDING 0x00000103
383#define STATUS_SEGMENT_NOTIFICATION 0x40000005
384#define STATUS_GUARD_PAGE_VIOLATION 0x80000001
385#define STATUS_DATATYPE_MISALIGNMENT 0x80000002
386#define STATUS_BREAKPOINT 0x80000003
387#define STATUS_SINGLE_STEP 0x80000004
388#define STATUS_ACCESS_VIOLATION 0xC0000005
389#define STATUS_IN_PAGE_ERROR 0xC0000006
390#define STATUS_INVALID_HANDLE 0xC0000008
391#define STATUS_NO_MEMORY 0xC0000017
392#define STATUS_ILLEGAL_INSTRUCTION 0xC000001D
393#define STATUS_NONCONTINUABLE_EXCEPTION 0xC0000025
394#define STATUS_INVALID_DISPOSITION 0xC0000026
395#define STATUS_ARRAY_BOUNDS_EXCEEDED 0xC000008C
396#define STATUS_FLOAT_DENORMAL_OPERAND 0xC000008D
397#define STATUS_FLOAT_DIVIDE_BY_ZERO 0xC000008E
398#define STATUS_FLOAT_INEXACT_RESULT 0xC000008F
399#define STATUS_FLOAT_INVALID_OPERATION 0xC0000090
400#define STATUS_FLOAT_OVERFLOW 0xC0000091
401#define STATUS_FLOAT_STACK_CHECK 0xC0000092
402#define STATUS_FLOAT_UNDERFLOW 0xC0000093
403#define STATUS_INTEGER_DIVIDE_BY_ZERO 0xC0000094
404#define STATUS_INTEGER_OVERFLOW 0xC0000095
405#define STATUS_PRIVILEGED_INSTRUCTION 0xC0000096
406#define STATUS_STACK_OVERFLOW 0xC00000FD
407#define STATUS_CONTROL_C_EXIT 0xC000013A
408#define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4
409#define STATUS_FLOAT_MULTIPLE_TRAPS 0xC00002B5
410#define STATUS_REG_NAT_CONSUMPTION 0xC00002C9
411#define STATUS_SXS_EARLY_DEACTIVATION 0xC015000F
412#define STATUS_SXS_INVALID_DEACTIVATION 0xC0150010
413
414/* status values for ContinueDebugEvent */
415#define DBG_EXCEPTION_HANDLED 0x00010001
416#define DBG_CONTINUE 0x00010002
417#define DBG_TERMINATE_THREAD 0x40010003
418#define DBG_TERMINATE_PROCESS 0x40010004
419#define DBG_CONTROL_C 0x40010005
420#define DBG_CONTROL_BREAK 0x40010008
421#define DBG_COMMAND_EXCEPTION 0x40010009
422#define DBG_EXCEPTION_NOT_HANDLED 0x80010001
423
424#endif /* WIN32_NO_STATUS */
425
Michael Veksler17822f41999-02-09 15:46:25 +0000426/* Argument 1 passed to the DllEntryProc. */
427#define DLL_PROCESS_DETACH 0 /* detach process (unload library) */
428#define DLL_PROCESS_ATTACH 1 /* attach process (load library) */
429#define DLL_THREAD_ATTACH 2 /* attach new thread */
430#define DLL_THREAD_DETACH 3 /* detach thread */
431
432
433/* u.x.wProcessorArchitecture (NT) */
Marcus Meissner4a0af421999-07-31 19:22:25 +0000434#define PROCESSOR_ARCHITECTURE_INTEL 0
435#define PROCESSOR_ARCHITECTURE_MIPS 1
436#define PROCESSOR_ARCHITECTURE_ALPHA 2
437#define PROCESSOR_ARCHITECTURE_PPC 3
438#define PROCESSOR_ARCHITECTURE_SHX 4
439#define PROCESSOR_ARCHITECTURE_ARM 5
440#define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
Michael Veksler17822f41999-02-09 15:46:25 +0000441
442/* dwProcessorType */
Marcus Meissner4a0af421999-07-31 19:22:25 +0000443#define PROCESSOR_INTEL_386 386
444#define PROCESSOR_INTEL_486 486
445#define PROCESSOR_INTEL_PENTIUM 586
446#define PROCESSOR_INTEL_860 860
447#define PROCESSOR_MIPS_R2000 2000
448#define PROCESSOR_MIPS_R3000 3000
449#define PROCESSOR_MIPS_R4000 4000
450#define PROCESSOR_ALPHA_21064 21064
451#define PROCESSOR_PPC_601 601
452#define PROCESSOR_PPC_603 603
453#define PROCESSOR_PPC_604 604
454#define PROCESSOR_PPC_620 620
455#define PROCESSOR_HITACHI_SH3 10003
456#define PROCESSOR_HITACHI_SH3E 10004
457#define PROCESSOR_HITACHI_SH4 10005
458#define PROCESSOR_MOTOROLA_821 821
459#define PROCESSOR_SHx_SH3 103
460#define PROCESSOR_SHx_SH4 104
461#define PROCESSOR_STRONGARM 2577
462#define PROCESSOR_ARM720 1824 /* 0x720 */
463#define PROCESSOR_ARM820 2080 /* 0x820 */
464#define PROCESSOR_ARM920 2336 /* 0x920 */
465#define PROCESSOR_ARM_7TDMI 70001
Michael Veksler17822f41999-02-09 15:46:25 +0000466
Geoffrey Hausheer03f4e222002-04-02 19:37:15 +0000467#define MAXIMUM_PROCESSORS 32
Francois Gouget53532242000-05-24 21:03:48 +0000468typedef struct _MEMORY_BASIC_INFORMATION
469{
470 LPVOID BaseAddress;
471 LPVOID AllocationBase;
472 DWORD AllocationProtect;
473 DWORD RegionSize;
474 DWORD State;
475 DWORD Protect;
476 DWORD Type;
Patrik Stridvallba9dc782002-11-04 22:43:24 +0000477} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
Francois Gouget53532242000-05-24 21:03:48 +0000478
479#define PAGE_NOACCESS 0x01
480#define PAGE_READONLY 0x02
481#define PAGE_READWRITE 0x04
482#define PAGE_WRITECOPY 0x08
483#define PAGE_EXECUTE 0x10
484#define PAGE_EXECUTE_READ 0x20
485#define PAGE_EXECUTE_READWRITE 0x40
486#define PAGE_EXECUTE_WRITECOPY 0x80
487#define PAGE_GUARD 0x100
488#define PAGE_NOCACHE 0x200
489
490#define MEM_COMMIT 0x00001000
491#define MEM_RESERVE 0x00002000
492#define MEM_DECOMMIT 0x00004000
493#define MEM_RELEASE 0x00008000
494#define MEM_FREE 0x00010000
495#define MEM_PRIVATE 0x00020000
496#define MEM_MAPPED 0x00040000
497#define MEM_RESET 0x00080000
498#define MEM_TOP_DOWN 0x00100000
Dimitrie O. Paun8b366812003-01-04 00:52:18 +0000499#ifdef __WINESRC__
Francois Gouget53532242000-05-24 21:03:48 +0000500#define MEM_SYSTEM 0x80000000
501#endif
502
503#define SEC_FILE 0x00800000
504#define SEC_IMAGE 0x01000000
505#define SEC_RESERVE 0x04000000
506#define SEC_COMMIT 0x08000000
507#define SEC_NOCACHE 0x10000000
508#define MEM_IMAGE SEC_IMAGE
509
510
Paul Quinnea1640f1999-03-10 18:03:53 +0000511#define MINCHAR 0x80
512#define MAXCHAR 0x7f
513#define MINSHORT 0x8000
514#define MAXSHORT 0x7fff
515#define MINLONG 0x80000000
516#define MAXLONG 0x7fffffff
517#define MAXBYTE 0xff
518#define MAXWORD 0xffff
519#define MAXDWORD 0xffffffff
520
Patrik Stridvall56d52aa1998-11-14 18:24:37 +0000521#define FIELD_OFFSET(type, field) \
Alexandre Julliarda3960291999-02-26 11:11:13 +0000522 ((LONG)(INT)&(((type *)0)->field))
Patrik Stridvall56d52aa1998-11-14 18:24:37 +0000523
524#define CONTAINING_RECORD(address, type, field) \
525 ((type *)((PCHAR)(address) - (PCHAR)(&((type *)0)->field)))
526
527/* Types */
528
Alexandre Julliarda3960291999-02-26 11:11:13 +0000529typedef struct _LIST_ENTRY {
530 struct _LIST_ENTRY *Flink;
531 struct _LIST_ENTRY *Blink;
Patrik Stridvallb3c989e2002-10-02 01:23:33 +0000532} LIST_ENTRY, *PLIST_ENTRY, * RESTRICTED_POINTER PRLIST_ENTRY;
Patrik Stridvall56d52aa1998-11-14 18:24:37 +0000533
Alexandre Julliarda3960291999-02-26 11:11:13 +0000534typedef struct _SINGLE_LIST_ENTRY {
535 struct _SINGLE_LIST_ENTRY *Next;
536} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
Patrik Stridvall56d52aa1998-11-14 18:24:37 +0000537
Alexandre Julliard329f0681996-04-14 13:21:20 +0000538/* Heap flags */
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000539
Alexandre Julliard329f0681996-04-14 13:21:20 +0000540#define HEAP_NO_SERIALIZE 0x00000001
541#define HEAP_GROWABLE 0x00000002
542#define HEAP_GENERATE_EXCEPTIONS 0x00000004
543#define HEAP_ZERO_MEMORY 0x00000008
544#define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010
545#define HEAP_TAIL_CHECKING_ENABLED 0x00000020
546#define HEAP_FREE_CHECKING_ENABLED 0x00000040
547#define HEAP_DISABLE_COALESCE_ON_FREE 0x00000080
548#define HEAP_CREATE_ALIGN_16 0x00010000
549#define HEAP_CREATE_ENABLE_TRACING 0x00020000
Peter Ganten9f7907e2000-08-01 23:38:02 +0000550
551/* This flag allows it to create heaps shared by all processes under win95,
552 FIXME: correct name */
Alexandre Julliardb0f58612001-12-19 19:16:27 +0000553#define HEAP_SHARED 0x04000000
Alexandre Julliard329f0681996-04-14 13:21:20 +0000554
Alexandre Julliard44ed71f1997-12-21 19:17:50 +0000555/* Processor feature flags. */
Alexandre Julliard60ce85c1998-02-01 18:33:27 +0000556#define PF_FLOATING_POINT_PRECISION_ERRATA 0
557#define PF_FLOATING_POINT_EMULATED 1
558#define PF_COMPARE_EXCHANGE_DOUBLE 2
559#define PF_MMX_INSTRUCTIONS_AVAILABLE 3
560#define PF_PPC_MOVEMEM_64BIT_OK 4
561#define PF_ALPHA_BYTE_INSTRUCTIONS 5
James Abbatiello45704782001-02-13 20:20:27 +0000562#define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
Marcus Meissner85147ee2003-06-30 18:28:08 +0000563#define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
James Abbatiello45704782001-02-13 20:20:27 +0000564#define PF_RDTSC_INSTRUCTION_AVAILABLE 8
Marcus Meissner85147ee2003-06-30 18:28:08 +0000565#define PF_PAE_ENABLED 9
566#define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
Alexandre Julliard60ce85c1998-02-01 18:33:27 +0000567
Alexandre Julliard44ed71f1997-12-21 19:17:50 +0000568
Marcus Meissnerf6eb06b2001-05-18 20:58:43 +0000569/* Execution state flags */
570#define ES_SYSTEM_REQUIRED 0x00000001
571#define ES_DISPLAY_REQUIRED 0x00000002
572#define ES_USER_PRESENT 0x00000004
573#define ES_CONTINUOUS 0x80000000
574
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000575/* The Win32 register context */
576
Alexandre Julliardf6b08dd1999-06-26 18:35:34 +0000577/* CONTEXT is the CPU-dependent context; it should be used */
578/* wherever a platform-specific context is needed (e.g. exception */
579/* handling, Win32 register functions). */
580
581/* CONTEXT86 is the i386-specific context; it should be used */
582/* wherever only a 386 context makes sense (e.g. DOS interrupts, */
583/* Win16 register functions), so that this code can be compiled */
584/* on all platforms. */
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000585
586#define SIZE_OF_80387_REGISTERS 80
587
Alexandre Julliardf6b08dd1999-06-26 18:35:34 +0000588typedef struct _FLOATING_SAVE_AREA
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000589{
590 DWORD ControlWord;
591 DWORD StatusWord;
Vincent Béron9a624912002-05-31 23:06:46 +0000592 DWORD TagWord;
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000593 DWORD ErrorOffset;
594 DWORD ErrorSelector;
595 DWORD DataOffset;
Vincent Béron9a624912002-05-31 23:06:46 +0000596 DWORD DataSelector;
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000597 BYTE RegisterArea[SIZE_OF_80387_REGISTERS];
598 DWORD Cr0NpxState;
Alexandre Julliardf6b08dd1999-06-26 18:35:34 +0000599} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000600
Dmitry Timoshkov6b6596a2001-11-23 18:44:43 +0000601#define MAXIMUM_SUPPORTED_EXTENSION 512
602
Alexandre Julliardf6b08dd1999-06-26 18:35:34 +0000603typedef struct _CONTEXT86
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000604{
605 DWORD ContextFlags;
606
607 /* These are selected by CONTEXT_DEBUG_REGISTERS */
608 DWORD Dr0;
609 DWORD Dr1;
610 DWORD Dr2;
611 DWORD Dr3;
612 DWORD Dr6;
613 DWORD Dr7;
614
615 /* These are selected by CONTEXT_FLOATING_POINT */
616 FLOATING_SAVE_AREA FloatSave;
617
618 /* These are selected by CONTEXT_SEGMENTS */
619 DWORD SegGs;
620 DWORD SegFs;
621 DWORD SegEs;
Vincent Béron9a624912002-05-31 23:06:46 +0000622 DWORD SegDs;
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000623
624 /* These are selected by CONTEXT_INTEGER */
625 DWORD Edi;
626 DWORD Esi;
627 DWORD Ebx;
Vincent Béron9a624912002-05-31 23:06:46 +0000628 DWORD Edx;
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000629 DWORD Ecx;
630 DWORD Eax;
631
632 /* These are selected by CONTEXT_CONTROL */
Vincent Béron9a624912002-05-31 23:06:46 +0000633 DWORD Ebp;
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000634 DWORD Eip;
635 DWORD SegCs;
636 DWORD EFlags;
637 DWORD Esp;
638 DWORD SegSs;
Dmitry Timoshkov6b6596a2001-11-23 18:44:43 +0000639
640 BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
Alexandre Julliardf6b08dd1999-06-26 18:35:34 +0000641} CONTEXT86;
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000642
Ulrich Weigand0fa6dad1999-07-15 14:32:20 +0000643#define CONTEXT_X86 0x00010000
644#define CONTEXT_i386 CONTEXT_X86
645#define CONTEXT_i486 CONTEXT_X86
646
Alexandre Julliardf6b08dd1999-06-26 18:35:34 +0000647#define CONTEXT86_CONTROL (CONTEXT_i386 | 0x0001) /* SS:SP, CS:IP, FLAGS, BP */
648#define CONTEXT86_INTEGER (CONTEXT_i386 | 0x0002) /* AX, BX, CX, DX, SI, DI */
649#define CONTEXT86_SEGMENTS (CONTEXT_i386 | 0x0004) /* DS, ES, FS, GS */
650#define CONTEXT86_FLOATING_POINT (CONTEXT_i386 | 0x0008L) /* 387 state */
651#define CONTEXT86_DEBUG_REGISTERS (CONTEXT_i386 | 0x0010L) /* DB 0-3,6,7 */
Ulrich Weigand0fa6dad1999-07-15 14:32:20 +0000652#define CONTEXT86_FULL (CONTEXT86_CONTROL | CONTEXT86_INTEGER | CONTEXT86_SEGMENTS)
Alexandre Julliardf6b08dd1999-06-26 18:35:34 +0000653
654/* i386 context definitions */
655#ifdef __i386__
656
Alexandre Julliardf6b08dd1999-06-26 18:35:34 +0000657#define CONTEXT_CONTROL CONTEXT86_CONTROL
658#define CONTEXT_INTEGER CONTEXT86_INTEGER
659#define CONTEXT_SEGMENTS CONTEXT86_SEGMENTS
660#define CONTEXT_FLOATING_POINT CONTEXT86_FLOATING_POINT
661#define CONTEXT_DEBUG_REGISTERS CONTEXT86_DEBUG_REGISTERS
662#define CONTEXT_FULL CONTEXT86_FULL
663
664typedef CONTEXT86 CONTEXT;
665
666#endif /* __i386__ */
667
Marcus Meissner4a0af421999-07-31 19:22:25 +0000668/* Alpha context definitions */
669#ifdef _ALPHA_
670
671#define CONTEXT_ALPHA 0x00020000
Vincent Béron9a624912002-05-31 23:06:46 +0000672
Marcus Meissner4a0af421999-07-31 19:22:25 +0000673#define CONTEXT_CONTROL (CONTEXT_ALPHA | 0x00000001L)
674#define CONTEXT_FLOATING_POINT (CONTEXT_ALPHA | 0x00000002L)
675#define CONTEXT_INTEGER (CONTEXT_ALPHA | 0x00000004L)
676#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
677
678typedef struct _CONTEXT
679{
680 /* selected by CONTEXT_FLOATING_POINT */
681 ULONGLONG FltF0;
682 ULONGLONG FltF1;
683 ULONGLONG FltF2;
684 ULONGLONG FltF3;
685 ULONGLONG FltF4;
686 ULONGLONG FltF5;
687 ULONGLONG FltF6;
688 ULONGLONG FltF7;
689 ULONGLONG FltF8;
690 ULONGLONG FltF9;
691 ULONGLONG FltF10;
692 ULONGLONG FltF11;
693 ULONGLONG FltF12;
694 ULONGLONG FltF13;
695 ULONGLONG FltF14;
696 ULONGLONG FltF15;
697 ULONGLONG FltF16;
698 ULONGLONG FltF17;
699 ULONGLONG FltF18;
700 ULONGLONG FltF19;
701 ULONGLONG FltF20;
702 ULONGLONG FltF21;
703 ULONGLONG FltF22;
704 ULONGLONG FltF23;
705 ULONGLONG FltF24;
706 ULONGLONG FltF25;
707 ULONGLONG FltF26;
708 ULONGLONG FltF27;
709 ULONGLONG FltF28;
710 ULONGLONG FltF29;
711 ULONGLONG FltF30;
712 ULONGLONG FltF31;
713
714 /* selected by CONTEXT_INTEGER */
715 ULONGLONG IntV0;
716 ULONGLONG IntT0;
717 ULONGLONG IntT1;
718 ULONGLONG IntT2;
719 ULONGLONG IntT3;
720 ULONGLONG IntT4;
721 ULONGLONG IntT5;
722 ULONGLONG IntT6;
723 ULONGLONG IntT7;
724 ULONGLONG IntS0;
725 ULONGLONG IntS1;
726 ULONGLONG IntS2;
727 ULONGLONG IntS3;
728 ULONGLONG IntS4;
729 ULONGLONG IntS5;
730 ULONGLONG IntFp;
731 ULONGLONG IntA0;
732 ULONGLONG IntA1;
733 ULONGLONG IntA2;
734 ULONGLONG IntA3;
735 ULONGLONG IntA4;
736 ULONGLONG IntA5;
737 ULONGLONG IntT8;
738 ULONGLONG IntT9;
739 ULONGLONG IntT10;
740 ULONGLONG IntT11;
741 ULONGLONG IntRa;
742 ULONGLONG IntT12;
743 ULONGLONG IntAt;
744 ULONGLONG IntGp;
745 ULONGLONG IntSp;
746 ULONGLONG IntZero;
747
748 /* selected by CONTEXT_FLOATING_POINT */
749 ULONGLONG Fpcr;
750 ULONGLONG SoftFpcr;
751
752 /* selected by CONTEXT_CONTROL */
753 ULONGLONG Fir;
754 DWORD Psr;
755 DWORD ContextFlags;
756 DWORD Fill[4];
757} CONTEXT;
758
759#define _QUAD_PSR_OFFSET HighSoftFpcr
760#define _QUAD_FLAGS_OFFSET HighFir
761
762#endif /* _ALPHA_ */
763
764/* Mips context definitions */
765#ifdef _MIPS_
766
767#define CONTEXT_R4000 0x00010000
768
769#define CONTEXT_CONTROL (CONTEXT_R4000 | 0x00000001)
770#define CONTEXT_FLOATING_POINT (CONTEXT_R4000 | 0x00000002)
771#define CONTEXT_INTEGER (CONTEXT_R4000 | 0x00000004)
772
773#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
774
775typedef struct _CONTEXT
776{
777 DWORD Argument[4];
778 /* These are selected by CONTEXT_FLOATING_POINT */
779 DWORD FltF0;
780 DWORD FltF1;
781 DWORD FltF2;
782 DWORD FltF3;
783 DWORD FltF4;
784 DWORD FltF5;
785 DWORD FltF6;
786 DWORD FltF7;
787 DWORD FltF8;
788 DWORD FltF9;
789 DWORD FltF10;
790 DWORD FltF11;
791 DWORD FltF12;
792 DWORD FltF13;
793 DWORD FltF14;
794 DWORD FltF15;
795 DWORD FltF16;
796 DWORD FltF17;
797 DWORD FltF18;
798 DWORD FltF19;
799 DWORD FltF20;
800 DWORD FltF21;
801 DWORD FltF22;
802 DWORD FltF23;
803 DWORD FltF24;
804 DWORD FltF25;
805 DWORD FltF26;
806 DWORD FltF27;
807 DWORD FltF28;
808 DWORD FltF29;
809 DWORD FltF30;
810 DWORD FltF31;
811
812 /* These are selected by CONTEXT_INTEGER */
813 DWORD IntZero;
814 DWORD IntAt;
815 DWORD IntV0;
816 DWORD IntV1;
817 DWORD IntA0;
818 DWORD IntA1;
819 DWORD IntA2;
820 DWORD IntA3;
821 DWORD IntT0;
822 DWORD IntT1;
823 DWORD IntT2;
824 DWORD IntT3;
825 DWORD IntT4;
826 DWORD IntT5;
827 DWORD IntT6;
828 DWORD IntT7;
829 DWORD IntS0;
830 DWORD IntS1;
831 DWORD IntS2;
832 DWORD IntS3;
833 DWORD IntS4;
834 DWORD IntS5;
835 DWORD IntS6;
836 DWORD IntS7;
837 DWORD IntT8;
838 DWORD IntT9;
839 DWORD IntK0;
840 DWORD IntK1;
841 DWORD IntGp;
842 DWORD IntSp;
843 DWORD IntS8;
844 DWORD IntRa;
845 DWORD IntLo;
846 DWORD IntHi;
847
848 /* These are selected by CONTEXT_FLOATING_POINT */
849 DWORD Fsr;
850
851 /* These are selected by CONTEXT_CONTROL */
852 DWORD Fir;
853 DWORD Psr;
854
855 DWORD ContextFlags;
856 DWORD Fill[2];
857} CONTEXT;
858
859#endif /* _MIPS_ */
860
861/* PowerPC context definitions */
Pierre d'Herbemont7f3074d2003-07-15 20:46:40 +0000862#ifdef __powerpc__
Alexandre Julliardf6b08dd1999-06-26 18:35:34 +0000863
864#define CONTEXT_CONTROL 0x0001
865#define CONTEXT_FLOATING_POINT 0x0002
866#define CONTEXT_INTEGER 0x0004
867#define CONTEXT_DEBUG_REGISTERS 0x0008
868#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
869
870typedef struct
871{
872 /* These are selected by CONTEXT_FLOATING_POINT */
873 double Fpr0;
874 double Fpr1;
875 double Fpr2;
876 double Fpr3;
877 double Fpr4;
878 double Fpr5;
879 double Fpr6;
880 double Fpr7;
881 double Fpr8;
882 double Fpr9;
883 double Fpr10;
884 double Fpr11;
885 double Fpr12;
886 double Fpr13;
887 double Fpr14;
888 double Fpr15;
889 double Fpr16;
890 double Fpr17;
891 double Fpr18;
892 double Fpr19;
893 double Fpr20;
894 double Fpr21;
895 double Fpr22;
896 double Fpr23;
897 double Fpr24;
898 double Fpr25;
899 double Fpr26;
900 double Fpr27;
901 double Fpr28;
902 double Fpr29;
903 double Fpr30;
904 double Fpr31;
905 double Fpscr;
906
907 /* These are selected by CONTEXT_INTEGER */
908 DWORD Gpr0;
909 DWORD Gpr1;
910 DWORD Gpr2;
911 DWORD Gpr3;
912 DWORD Gpr4;
913 DWORD Gpr5;
914 DWORD Gpr6;
915 DWORD Gpr7;
916 DWORD Gpr8;
917 DWORD Gpr9;
918 DWORD Gpr10;
919 DWORD Gpr11;
920 DWORD Gpr12;
921 DWORD Gpr13;
922 DWORD Gpr14;
923 DWORD Gpr15;
924 DWORD Gpr16;
925 DWORD Gpr17;
926 DWORD Gpr18;
927 DWORD Gpr19;
928 DWORD Gpr20;
929 DWORD Gpr21;
930 DWORD Gpr22;
931 DWORD Gpr23;
932 DWORD Gpr24;
933 DWORD Gpr25;
934 DWORD Gpr26;
935 DWORD Gpr27;
936 DWORD Gpr28;
937 DWORD Gpr29;
938 DWORD Gpr30;
939 DWORD Gpr31;
940
941 DWORD Cr;
942 DWORD Xer;
943
944 /* These are selected by CONTEXT_CONTROL */
945 DWORD Msr;
Marcus Meissnerc87c2c42002-08-30 00:00:57 +0000946 DWORD Iar; /* Instruction Address Register , aka PC ... */
Alexandre Julliardf6b08dd1999-06-26 18:35:34 +0000947 DWORD Lr;
948 DWORD Ctr;
949
950 DWORD ContextFlags;
Pierre d'Herbemontbf01f052003-05-08 03:48:08 +0000951
952 DWORD Dar; /* Fault registers for coredump */
953 DWORD Dsisr;
954 DWORD Trap; /* number of powerpc exception taken */
Alexandre Julliardf6b08dd1999-06-26 18:35:34 +0000955
956 /* These are selected by CONTEXT_DEBUG_REGISTERS */
957 DWORD Dr0;
958 DWORD Dr1;
959 DWORD Dr2;
960 DWORD Dr3;
961 DWORD Dr4;
962 DWORD Dr5;
963 DWORD Dr6;
964 DWORD Dr7;
965} CONTEXT;
966
Marcus Meissner4a0af421999-07-31 19:22:25 +0000967typedef struct _STACK_FRAME_HEADER
968{
969 DWORD BackChain;
970 DWORD GlueSaved1;
971 DWORD GlueSaved2;
972 DWORD Reserved1;
973 DWORD Spare1;
974 DWORD Spare2;
975
976 DWORD Parameter0;
977 DWORD Parameter1;
978 DWORD Parameter2;
979 DWORD Parameter3;
980 DWORD Parameter4;
981 DWORD Parameter5;
982 DWORD Parameter6;
983 DWORD Parameter7;
984} STACK_FRAME_HEADER,*PSTACK_FRAME_HEADER;
985
Pierre d'Herbemont7f3074d2003-07-15 20:46:40 +0000986#endif /* __powerpc__ */
Alexandre Julliardf6b08dd1999-06-26 18:35:34 +0000987
Steven Edwards31e46292002-12-10 19:04:45 +0000988#ifdef __ALPHA__
989
990/*
991 * FIXME:
992 *
993 * I have no idea if any of this is right as I just ripped
994 * it from mingw-win32api.
995 *
996 */
997
998#define CONTEXT_ALPHA 0x20000
999#define CONTEXT_CONTROL (CONTEXT_ALPHA|1L)
1000#define CONTEXT_FLOATING_POINT (CONTEXT_ALPHA|2L)
1001#define CONTEXT_INTEGER (CONTEXT_ALPHA|4L)
1002#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_FLOATING_POINT|CONTEXT_INTEGER)
1003typedef struct _CONTEXT {
1004 ULONGLONG FltF0;
1005 ULONGLONG FltF1;
1006 ULONGLONG FltF2;
1007 ULONGLONG FltF3;
1008 ULONGLONG FltF4;
1009 ULONGLONG FltF5;
1010 ULONGLONG FltF6;
1011 ULONGLONG FltF7;
1012 ULONGLONG FltF8;
1013 ULONGLONG FltF9;
1014 ULONGLONG FltF10;
1015 ULONGLONG FltF11;
1016 ULONGLONG FltF12;
1017 ULONGLONG FltF13;
1018 ULONGLONG FltF14;
1019 ULONGLONG FltF15;
1020 ULONGLONG FltF16;
1021 ULONGLONG FltF17;
1022 ULONGLONG FltF18;
1023 ULONGLONG FltF19;
1024 ULONGLONG FltF20;
1025 ULONGLONG FltF21;
1026 ULONGLONG FltF22;
1027 ULONGLONG FltF23;
1028 ULONGLONG FltF24;
1029 ULONGLONG FltF25;
1030 ULONGLONG FltF26;
1031 ULONGLONG FltF27;
1032 ULONGLONG FltF28;
1033 ULONGLONG FltF29;
1034 ULONGLONG FltF30;
1035 ULONGLONG FltF31;
1036 ULONGLONG IntV0;
1037 ULONGLONG IntT0;
1038 ULONGLONG IntT1;
1039 ULONGLONG IntT2;
1040 ULONGLONG IntT3;
1041 ULONGLONG IntT4;
1042 ULONGLONG IntT5;
1043 ULONGLONG IntT6;
1044 ULONGLONG IntT7;
1045 ULONGLONG IntS0;
1046 ULONGLONG IntS1;
1047 ULONGLONG IntS2;
1048 ULONGLONG IntS3;
1049 ULONGLONG IntS4;
1050 ULONGLONG IntS5;
1051 ULONGLONG IntFp;
1052 ULONGLONG IntA0;
1053 ULONGLONG IntA1;
1054 ULONGLONG IntA2;
1055 ULONGLONG IntA3;
1056 ULONGLONG IntA4;
1057 ULONGLONG IntA5;
1058 ULONGLONG IntT8;
1059 ULONGLONG IntT9;
1060 ULONGLONG IntT10;
1061 ULONGLONG IntT11;
1062 ULONGLONG IntRa;
1063 ULONGLONG IntT12;
1064 ULONGLONG IntAt;
1065 ULONGLONG IntGp;
1066 ULONGLONG IntSp;
1067 ULONGLONG IntZero;
1068 ULONGLONG Fpcr;
1069 ULONGLONG SoftFpcr;
1070 ULONGLONG Fir;
1071 DWORD Psr;
1072 DWORD ContextFlags;
1073 DWORD Fill[4];
1074} CONTEXT;
1075
1076#endif /* __ALPHA__ */
1077
Ulrich Weigand248c75e1999-11-10 20:18:53 +00001078#ifdef __sparc__
1079
Vincent Béron9a624912002-05-31 23:06:46 +00001080/*
1081 * FIXME:
Ulrich Weigand248c75e1999-11-10 20:18:53 +00001082 *
Vincent Béron9a624912002-05-31 23:06:46 +00001083 * There is no official CONTEXT structure defined for the SPARC
Ulrich Weigand248c75e1999-11-10 20:18:53 +00001084 * architecture, so I just made one up.
1085 *
1086 * This structure is valid only for 32-bit SPARC architectures,
1087 * not for 64-bit SPARC.
1088 *
1089 * Note that this structure contains only the 'top-level' registers;
1090 * the rest of the register window chain is not visible.
1091 *
1092 * The layout follows the Solaris 'prgregset_t' structure.
Vincent Béron9a624912002-05-31 23:06:46 +00001093 *
1094 */
Ulrich Weigand248c75e1999-11-10 20:18:53 +00001095
1096#define CONTEXT_SPARC 0x10000000
1097
1098#define CONTEXT_CONTROL (CONTEXT_SPARC | 0x00000001)
1099#define CONTEXT_FLOATING_POINT (CONTEXT_SPARC | 0x00000002)
1100#define CONTEXT_INTEGER (CONTEXT_SPARC | 0x00000004)
1101
1102#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
1103
1104typedef struct _CONTEXT
1105{
Ulrich Weigand9b233bd1999-11-13 23:51:13 +00001106 DWORD ContextFlags;
1107
Ulrich Weigand248c75e1999-11-10 20:18:53 +00001108 /* These are selected by CONTEXT_INTEGER */
1109 DWORD g0;
1110 DWORD g1;
1111 DWORD g2;
1112 DWORD g3;
1113 DWORD g4;
1114 DWORD g5;
1115 DWORD g6;
1116 DWORD g7;
1117 DWORD o0;
1118 DWORD o1;
1119 DWORD o2;
1120 DWORD o3;
1121 DWORD o4;
1122 DWORD o5;
1123 DWORD o6;
1124 DWORD o7;
1125 DWORD l0;
1126 DWORD l1;
1127 DWORD l2;
1128 DWORD l3;
1129 DWORD l4;
1130 DWORD l5;
1131 DWORD l6;
1132 DWORD l7;
1133 DWORD i0;
1134 DWORD i1;
1135 DWORD i2;
1136 DWORD i3;
1137 DWORD i4;
1138 DWORD i5;
1139 DWORD i6;
1140 DWORD i7;
1141
1142 /* These are selected by CONTEXT_CONTROL */
1143 DWORD psr;
1144 DWORD pc;
1145 DWORD npc;
1146 DWORD y;
1147 DWORD wim;
1148 DWORD tbr;
1149
1150 /* FIXME: floating point registers missing */
1151
1152} CONTEXT;
1153
Andreas Mohr32a5b632000-03-26 14:41:10 +00001154#endif /* __sparc__ */
Ulrich Weigand248c75e1999-11-10 20:18:53 +00001155
Alexandre Julliardf6b08dd1999-06-26 18:35:34 +00001156#if !defined(CONTEXT_FULL) && !defined(RC_INVOKED)
1157#error You need to define a CONTEXT for your CPU
1158#endif
1159
1160typedef CONTEXT *PCONTEXT;
Alexandre Julliard9ea19e51997-01-01 17:29:55 +00001161
Francois Gouget48fc4aa2000-10-12 23:20:29 +00001162/*
1163 * Language IDs
1164 */
1165
1166#define MAKELCID(l, s) (MAKELONG(l, s))
1167
1168#define MAKELANGID(p, s) ((((WORD)(s))<<10) | (WORD)(p))
1169#define PRIMARYLANGID(l) ((WORD)(l) & 0x3ff)
1170#define SUBLANGID(l) ((WORD)(l) >> 10)
1171
1172#define LANGIDFROMLCID(lcid) ((WORD)(lcid))
1173#define SORTIDFROMLCID(lcid) ((WORD)((((DWORD)(lcid)) >> 16) & 0x0f))
1174
1175#define LANG_SYSTEM_DEFAULT (MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT))
1176#define LANG_USER_DEFAULT (MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT))
1177#define LOCALE_SYSTEM_DEFAULT (MAKELCID(LANG_SYSTEM_DEFAULT, SORT_DEFAULT))
Vincent Béron9a624912002-05-31 23:06:46 +00001178#define LOCALE_USER_DEFAULT (MAKELCID(LANG_USER_DEFAULT, SORT_DEFAULT))
Francois Gouget48fc4aa2000-10-12 23:20:29 +00001179#define LOCALE_NEUTRAL (MAKELCID(MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),SORT_DEFAULT))
1180
György 'Nog' Jeneyd3130732002-10-02 19:46:45 +00001181#define UNREFERENCED_PARAMETER(u) (u)
1182#define DBG_UNREFERENCED_PARAMETER(u) (u)
1183#define DBG_UNREFERENCED_LOCAL_VARIABLE(u) (u)
1184
Alexandre Julliardf22ba052002-08-15 21:57:36 +00001185/* FIXME: are the symbolic names correct for LIDs: 0x17, 0x28,
1186 * 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x3a, 0x3b, 0x3c
Francois Gouget48fc4aa2000-10-12 23:20:29 +00001187 */
Alexandre Julliardf22ba052002-08-15 21:57:36 +00001188#define LANG_NEUTRAL 0x00
1189#define LANG_INVARIANT 0x7f
1190
1191#define LANG_AFRIKAANS 0x36
1192#define LANG_ALBANIAN 0x1c
1193#define LANG_ARABIC 0x01
1194#define LANG_ARMENIAN 0x2b
1195#define LANG_ASSAMESE 0x4d
1196#define LANG_AZERI 0x2c
1197#define LANG_BASQUE 0x2d
1198#define LANG_BELARUSIAN 0x23
1199#define LANG_BENGALI 0x45
1200#define LANG_BULGARIAN 0x02
1201#define LANG_CATALAN 0x03
1202#define LANG_CHINESE 0x04
1203#define LANG_CROATIAN 0x1a
1204#define LANG_CZECH 0x05
1205#define LANG_DANISH 0x06
1206#define LANG_DIVEHI 0x65
1207#define LANG_DUTCH 0x13
1208#define LANG_ENGLISH 0x09
1209#define LANG_ESTONIAN 0x25
1210#define LANG_FAEROESE 0x38
1211#define LANG_FARSI 0x29
1212#define LANG_FINNISH 0x0b
1213#define LANG_FRENCH 0x0c
1214#define LANG_GALICIAN 0x56
1215#define LANG_GEORGIAN 0x37
1216#define LANG_GERMAN 0x07
1217#define LANG_GREEK 0x08
1218#define LANG_GUJARATI 0x47
1219#define LANG_HEBREW 0x0d
1220#define LANG_HINDI 0x39
1221#define LANG_HUNGARIAN 0x0e
1222#define LANG_ICELANDIC 0x0f
1223#define LANG_INDONESIAN 0x21
1224#define LANG_ITALIAN 0x10
1225#define LANG_JAPANESE 0x11
1226#define LANG_KANNADA 0x4b
1227#define LANG_KASHMIRI 0x60
1228#define LANG_KAZAK 0x3f
1229#define LANG_KONKANI 0x57
1230#define LANG_KOREAN 0x12
1231#define LANG_KYRGYZ 0x40
1232#define LANG_LATVIAN 0x26
1233#define LANG_LITHUANIAN 0x27
1234#define LANG_MACEDONIAN 0x2f
1235#define LANG_MALAY 0x3e
1236#define LANG_MALAYALAM 0x4c
1237#define LANG_MANIPURI 0x58
1238#define LANG_MARATHI 0x4e
1239#define LANG_MONGOLIAN 0x50
1240#define LANG_NEPALI 0x61
1241#define LANG_NORWEGIAN 0x14
1242#define LANG_ORIYA 0x48
1243#define LANG_POLISH 0x15
1244#define LANG_PORTUGUESE 0x16
1245#define LANG_PUNJABI 0x46
1246#define LANG_ROMANIAN 0x18
1247#define LANG_RUSSIAN 0x19
1248#define LANG_SANSKRIT 0x4f
1249#define LANG_SERBIAN 0x1a
1250#define LANG_SINDHI 0x59
1251#define LANG_SLOVAK 0x1b
1252#define LANG_SLOVENIAN 0x24
1253#define LANG_SPANISH 0x0a
1254#define LANG_SWAHILI 0x41
1255#define LANG_SWEDISH 0x1d
1256#define LANG_SYRIAC 0x5a
1257#define LANG_TAMIL 0x49
1258#define LANG_TATAR 0x44
1259#define LANG_TELUGU 0x4a
1260#define LANG_THAI 0x1e
1261#define LANG_TURKISH 0x1f
1262#define LANG_UKRAINIAN 0x22
1263#define LANG_URDU 0x20
1264#define LANG_UZBEK 0x43
1265#define LANG_VIETNAMESE 0x2a
1266
1267/* FIXME: these are not in the Windows header */
1268#define LANG_GAELIC 0x3c
1269#define LANG_MALTESE 0x3a
1270#define LANG_MAORI 0x28
1271#define LANG_RHAETO_ROMANCE 0x17
1272#define LANG_SAAMI 0x3b
1273#define LANG_SORBIAN 0x2e
1274#define LANG_SUTU 0x30
1275#define LANG_TSONGA 0x31
1276#define LANG_TSWANA 0x32
1277#define LANG_VENDA 0x33
1278#define LANG_XHOSA 0x34
1279#define LANG_ZULU 0x35
1280
Francois Gouget48fc4aa2000-10-12 23:20:29 +00001281/* non standard; keep the number high enough (but < 0xff) */
1282#define LANG_ESPERANTO 0x8f
1283#define LANG_WALON 0x90
1284#define LANG_CORNISH 0x91
1285#define LANG_WELSH 0x92
1286#define LANG_BRETON 0x93
1287
1288/* Sublanguage definitions */
1289#define SUBLANG_NEUTRAL 0x00 /* language neutral */
1290#define SUBLANG_DEFAULT 0x01 /* user default */
1291#define SUBLANG_SYS_DEFAULT 0x02 /* system default */
1292
Alexandre Julliardf22ba052002-08-15 21:57:36 +00001293#define SUBLANG_ARABIC_SAUDI_ARABIA 0x01
1294#define SUBLANG_ARABIC_IRAQ 0x02
1295#define SUBLANG_ARABIC_EGYPT 0x03
1296#define SUBLANG_ARABIC_LIBYA 0x04
1297#define SUBLANG_ARABIC_ALGERIA 0x05
1298#define SUBLANG_ARABIC_MOROCCO 0x06
1299#define SUBLANG_ARABIC_TUNISIA 0x07
1300#define SUBLANG_ARABIC_OMAN 0x08
1301#define SUBLANG_ARABIC_YEMEN 0x09
1302#define SUBLANG_ARABIC_SYRIA 0x0a
1303#define SUBLANG_ARABIC_JORDAN 0x0b
1304#define SUBLANG_ARABIC_LEBANON 0x0c
1305#define SUBLANG_ARABIC_KUWAIT 0x0d
1306#define SUBLANG_ARABIC_UAE 0x0e
1307#define SUBLANG_ARABIC_BAHRAIN 0x0f
1308#define SUBLANG_ARABIC_QATAR 0x10
1309#define SUBLANG_AZERI_LATIN 0x01
1310#define SUBLANG_AZERI_CYRILLIC 0x02
1311#define SUBLANG_CHINESE_TRADITIONAL 0x01
1312#define SUBLANG_CHINESE_SIMPLIFIED 0x02
1313#define SUBLANG_CHINESE_HONGKONG 0x03
1314#define SUBLANG_CHINESE_SINGAPORE 0x04
1315#define SUBLANG_CHINESE_MACAU 0x05
1316#define SUBLANG_DUTCH 0x01
1317#define SUBLANG_DUTCH_BELGIAN 0x02
1318#define SUBLANG_ENGLISH_US 0x01
1319#define SUBLANG_ENGLISH_UK 0x02
1320#define SUBLANG_ENGLISH_AUS 0x03
1321#define SUBLANG_ENGLISH_CAN 0x04
1322#define SUBLANG_ENGLISH_NZ 0x05
1323#define SUBLANG_ENGLISH_EIRE 0x06
1324#define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07
1325#define SUBLANG_ENGLISH_JAMAICA 0x08
1326#define SUBLANG_ENGLISH_CARIBBEAN 0x09
1327#define SUBLANG_ENGLISH_BELIZE 0x0a
1328#define SUBLANG_ENGLISH_TRINIDAD 0x0b
1329#define SUBLANG_ENGLISH_ZIMBABWE 0x0c
1330#define SUBLANG_ENGLISH_PHILIPPINES 0x0d
1331#define SUBLANG_FRENCH 0x01
1332#define SUBLANG_FRENCH_BELGIAN 0x02
1333#define SUBLANG_FRENCH_CANADIAN 0x03
1334#define SUBLANG_FRENCH_SWISS 0x04
1335#define SUBLANG_FRENCH_LUXEMBOURG 0x05
1336#define SUBLANG_FRENCH_MONACO 0x06
1337#define SUBLANG_GERMAN 0x01
1338#define SUBLANG_GERMAN_SWISS 0x02
1339#define SUBLANG_GERMAN_AUSTRIAN 0x03
1340#define SUBLANG_GERMAN_LUXEMBOURG 0x04
1341#define SUBLANG_GERMAN_LIECHTENSTEIN 0x05
1342#define SUBLANG_ITALIAN 0x01
1343#define SUBLANG_ITALIAN_SWISS 0x02
1344#define SUBLANG_KASHMIRI_SASIA 0x02
1345#define SUBLANG_KASHMIRI_INDIA 0x02
1346#define SUBLANG_KOREAN 0x01
1347#define SUBLANG_LITHUANIAN 0x01
1348#define SUBLANG_MALAY_MALAYSIA 0x01
1349#define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02
1350#define SUBLANG_NEPALI_INDIA 0x02
1351#define SUBLANG_NORWEGIAN_BOKMAL 0x01
1352#define SUBLANG_NORWEGIAN_NYNORSK 0x02
1353#define SUBLANG_PORTUGUESE 0x02
1354#define SUBLANG_PORTUGUESE_BRAZILIAN 0x01
1355#define SUBLANG_SERBIAN_LATIN 0x02
1356#define SUBLANG_SERBIAN_CYRILLIC 0x03
1357#define SUBLANG_SPANISH 0x01
1358#define SUBLANG_SPANISH_MEXICAN 0x02
1359#define SUBLANG_SPANISH_MODERN 0x03
1360#define SUBLANG_SPANISH_GUATEMALA 0x04
1361#define SUBLANG_SPANISH_COSTA_RICA 0x05
1362#define SUBLANG_SPANISH_PANAMA 0x06
1363#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07
1364#define SUBLANG_SPANISH_VENEZUELA 0x08
1365#define SUBLANG_SPANISH_COLOMBIA 0x09
1366#define SUBLANG_SPANISH_PERU 0x0a
1367#define SUBLANG_SPANISH_ARGENTINA 0x0b
1368#define SUBLANG_SPANISH_ECUADOR 0x0c
1369#define SUBLANG_SPANISH_CHILE 0x0d
1370#define SUBLANG_SPANISH_URUGUAY 0x0e
1371#define SUBLANG_SPANISH_PARAGUAY 0x0f
1372#define SUBLANG_SPANISH_BOLIVIA 0x10
1373#define SUBLANG_SPANISH_EL_SALVADOR 0x11
1374#define SUBLANG_SPANISH_HONDURAS 0x12
1375#define SUBLANG_SPANISH_NICARAGUA 0x13
1376#define SUBLANG_SPANISH_PUERTO_RICO 0x14
1377#define SUBLANG_SWEDISH 0x01
1378#define SUBLANG_SWEDISH_FINLAND 0x02
1379#define SUBLANG_URDU_PAKISTAN 0x01
1380#define SUBLANG_URDU_INDIA 0x02
1381#define SUBLANG_UZBEK_LATIN 0x01
1382#define SUBLANG_UZBEK_CYRILLIC 0x02
Francois Gouget48fc4aa2000-10-12 23:20:29 +00001383
Alexandre Julliardf22ba052002-08-15 21:57:36 +00001384/* FIXME: these are not in the Windows header */
1385#define SUBLANG_DUTCH_SURINAM 0x03
1386#define SUBLANG_ROMANIAN 0x01
1387#define SUBLANG_ROMANIAN_MOLDAVIA 0x02
1388#define SUBLANG_RUSSIAN 0x01
1389#define SUBLANG_RUSSIAN_MOLDAVIA 0x02
1390#define SUBLANG_CROATIAN 0x01
1391#define SUBLANG_LITHUANIAN_CLASSIC 0x02
1392#define SUBLANG_GAELIC 0x01
1393#define SUBLANG_GAELIC_SCOTTISH 0x02
1394#define SUBLANG_GAELIC_MANX 0x03
Francois Gouget48fc4aa2000-10-12 23:20:29 +00001395
1396
1397/*
1398 * Sort definitions
1399 */
1400
1401#define SORT_DEFAULT 0x0
1402#define SORT_JAPANESE_XJIS 0x0
1403#define SORT_JAPANESE_UNICODE 0x1
1404#define SORT_CHINESE_BIG5 0x0
1405#define SORT_CHINESE_UNICODE 0x1
1406#define SORT_KOREAN_KSC 0x0
1407#define SORT_KOREAN_UNICODE 0x1
1408
1409
1410
1411/*
1412 * Definitions for IsTextUnicode()
1413 */
1414
1415#define IS_TEXT_UNICODE_ASCII16 0x0001
1416#define IS_TEXT_UNICODE_STATISTICS 0x0002
1417#define IS_TEXT_UNICODE_CONTROLS 0x0004
1418#define IS_TEXT_UNICODE_SIGNATURE 0x0008
1419#define IS_TEXT_UNICODE_UNICODE_MASK 0x000F
1420#define IS_TEXT_UNICODE_REVERSE_ASCII16 0x0010
1421#define IS_TEXT_UNICODE_REVERSE_STATISTICS 0x0020
1422#define IS_TEXT_UNICODE_REVERSE_CONTROLS 0x0040
1423#define IS_TEXT_UNICODE_REVERSE_SIGNATURE 0x0080
1424#define IS_TEXT_UNICODE_REVERSE_MASK 0x00F0
1425#define IS_TEXT_UNICODE_ILLEGAL_CHARS 0x0100
1426#define IS_TEXT_UNICODE_ODD_LENGTH 0x0200
1427#define IS_TEXT_UNICODE_DBCS_LEADBYTE 0x0400
1428#define IS_TEXT_UNICODE_NOT_UNICODE_MASK 0x0F00
1429#define IS_TEXT_UNICODE_NULL_BYTES 0x1000
1430#define IS_TEXT_UNICODE_NOT_ASCII_MASK 0xF000
1431
Alexandre Julliard02e90081998-01-04 17:49:09 +00001432#define MAXIMUM_WAIT_OBJECTS 64
1433#define MAXIMUM_SUSPEND_COUNT 127
1434
1435
Alexandre Julliard349a9531997-02-02 19:01:52 +00001436/*
Alexandre Julliard349a9531997-02-02 19:01:52 +00001437 * From OS/2 2.0 exception handling
1438 * Win32 seems to use the same flags as ExceptionFlags in an EXCEPTION_RECORD
1439 */
1440
1441#define EH_NONCONTINUABLE 0x01
1442#define EH_UNWINDING 0x02
1443#define EH_EXIT_UNWIND 0x04
1444#define EH_STACK_INVALID 0x08
1445#define EH_NESTED_CALL 0x10
1446
1447#define EXCEPTION_CONTINUABLE 0
1448#define EXCEPTION_NONCONTINUABLE EH_NONCONTINUABLE
Vincent Béron9a624912002-05-31 23:06:46 +00001449
Alexandre Julliard349a9531997-02-02 19:01:52 +00001450/*
Vincent Béron9a624912002-05-31 23:06:46 +00001451 * The exception record used by Win32 to give additional information
Alexandre Julliard349a9531997-02-02 19:01:52 +00001452 * about exception to exception handlers.
1453 */
1454
1455#define EXCEPTION_MAXIMUM_PARAMETERS 15
1456
1457typedef struct __EXCEPTION_RECORD
1458{
1459 DWORD ExceptionCode;
1460 DWORD ExceptionFlags;
1461 struct __EXCEPTION_RECORD *ExceptionRecord;
1462
1463 LPVOID ExceptionAddress;
1464 DWORD NumberParameters;
1465 DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
1466} EXCEPTION_RECORD, *PEXCEPTION_RECORD;
1467
1468/*
1469 * The exception pointers structure passed to exception filters
1470 * in except() and the UnhandledExceptionFilter().
1471 */
Vincent Béron9a624912002-05-31 23:06:46 +00001472
1473typedef struct _EXCEPTION_POINTERS
Alexandre Julliard349a9531997-02-02 19:01:52 +00001474{
1475 PEXCEPTION_RECORD ExceptionRecord;
1476 PCONTEXT ContextRecord;
1477} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
1478
Alexandre Julliard89fae7e1999-05-12 12:47:01 +00001479
1480/*
Vincent Béron9a624912002-05-31 23:06:46 +00001481 * The exception frame, used for registering exception handlers
1482 * Win32 cares only about this, but compilers generally emit
Alexandre Julliard89fae7e1999-05-12 12:47:01 +00001483 * larger exception frames for their own use.
1484 */
1485
Alexandre Julliardee106782003-08-28 03:07:56 +00001486struct _EXCEPTION_REGISTRATION_RECORD;
Alexandre Julliard89fae7e1999-05-12 12:47:01 +00001487
Alexandre Julliardee106782003-08-28 03:07:56 +00001488typedef DWORD (*PEXCEPTION_HANDLER)(PEXCEPTION_RECORD,struct _EXCEPTION_REGISTRATION_RECORD*,
1489 PCONTEXT,struct _EXCEPTION_REGISTRATION_RECORD **);
Alexandre Julliard89fae7e1999-05-12 12:47:01 +00001490
Alexandre Julliardee106782003-08-28 03:07:56 +00001491typedef struct _EXCEPTION_REGISTRATION_RECORD
Alexandre Julliard89fae7e1999-05-12 12:47:01 +00001492{
Alexandre Julliardee106782003-08-28 03:07:56 +00001493 struct _EXCEPTION_REGISTRATION_RECORD *Prev;
Alexandre Julliard89fae7e1999-05-12 12:47:01 +00001494 PEXCEPTION_HANDLER Handler;
Alexandre Julliardee106782003-08-28 03:07:56 +00001495} EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD;
Alexandre Julliard89fae7e1999-05-12 12:47:01 +00001496
Alexandre Julliard349a9531997-02-02 19:01:52 +00001497/*
1498 * function pointer to a exception filter
1499 */
1500
Alexandre Julliard54b1d872003-10-28 21:22:50 +00001501typedef LONG (CALLBACK *PVECTORED_EXCEPTION_HANDLER)(PEXCEPTION_POINTERS ExceptionInfo);
Patrik Stridvallf94462f2002-01-31 23:22:07 +00001502typedef LONG (CALLBACK *PTOP_LEVEL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS ExceptionInfo);
Alexandre Julliard349a9531997-02-02 19:01:52 +00001503typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
1504
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001505DWORD WINAPI UnhandledExceptionFilter( PEXCEPTION_POINTERS epointers );
Alexandre Julliard349a9531997-02-02 19:01:52 +00001506LPTOP_LEVEL_EXCEPTION_FILTER
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001507WINAPI SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER filter );
Alexandre Julliard349a9531997-02-02 19:01:52 +00001508
Vincent Béron9a624912002-05-31 23:06:46 +00001509typedef struct _NT_TIB
Juergen Schmiedbc3c4d42000-01-12 04:59:42 +00001510{
1511 struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
1512 PVOID StackBase;
1513 PVOID StackLimit;
1514 PVOID SubSystemTib;
1515 union {
1516 PVOID FiberData;
1517 DWORD Version;
1518 } DUMMYUNIONNAME;
1519 PVOID ArbitraryUserPointer;
1520 struct _NT_TIB *Self;
1521} NT_TIB, *PNT_TIB;
1522
Alexandre Julliard0a860a01999-06-22 11:43:42 +00001523struct _TEB;
Ulrich Weigandcebd60b1999-09-03 16:45:44 +00001524
Alexandre Julliard916f9752000-02-26 16:51:13 +00001525#if defined(__i386__) && defined(__GNUC__)
Patrik Stridvall441a7dc2002-04-29 18:37:36 +00001526extern inline struct _TEB * WINAPI NtCurrentTeb(void);
1527extern inline struct _TEB * WINAPI NtCurrentTeb(void)
Alexandre Julliard0a860a01999-06-22 11:43:42 +00001528{
1529 struct _TEB *teb;
1530 __asm__(".byte 0x64\n\tmovl (0x18),%0" : "=r" (teb));
1531 return teb;
1532}
Patrik Stridvall3751ff02002-05-04 18:37:08 +00001533#elif defined(__i386__) && defined(_MSC_VER)
1534extern inline struct _TEB * WINAPI NtCurrentTeb(void)
1535{
1536 struct _TEB *teb;
1537 __asm mov eax, fs:[0x18];
1538 __asm mov teb, eax;
1539 return teb;
1540}
Alexandre Julliardc1dec292002-08-06 23:51:25 +00001541#elif defined(__powerpc__)
1542extern inline struct _TEB * WINAPI NtCurrentTeb(void);
1543extern inline struct _TEB * WINAPI NtCurrentTeb(void)
1544{
1545 struct _TEB *teb;
Pierre d'Herbemont7f3074d2003-07-15 20:46:40 +00001546# ifdef __APPLE__
Pierre d'Herbemontbf01f052003-05-08 03:48:08 +00001547 __asm__("\tmr %0, r13" : "=r" (teb));
1548# else
Marcus Meissner24561492002-08-20 00:00:35 +00001549 __asm__("\tmr %0, 2" : "=r" (teb));
Pierre d'Herbemontbf01f052003-05-08 03:48:08 +00001550# endif
Alexandre Julliardc1dec292002-08-06 23:51:25 +00001551 return teb;
1552}
Alexandre Julliard0a860a01999-06-22 11:43:42 +00001553#else
Patrik Stridvall441a7dc2002-04-29 18:37:36 +00001554extern struct _TEB * WINAPI NtCurrentTeb(void);
Alexandre Julliard0a860a01999-06-22 11:43:42 +00001555#endif
1556
Alexandre Julliard9e8e5ff2002-12-17 21:06:25 +00001557#ifdef NONAMELESSUNION
1558#define GetCurrentFiber() (((NT_TIB *)NtCurrentTeb())->u.FiberData)
1559#else
1560#define GetCurrentFiber() (((NT_TIB *)NtCurrentTeb())->FiberData)
1561#endif
1562#define GetFiberData() (*(void **)GetCurrentFiber())
Alexandre Julliard180a0882000-04-18 11:58:24 +00001563
1564/*
1565 * File formats definitions
1566 */
1567
Dimitrie O. Paun53f9c212003-08-28 21:43:34 +00001568#include <pshpack2.h>
Alexandre Julliard180a0882000-04-18 11:58:24 +00001569typedef struct _IMAGE_DOS_HEADER {
1570 WORD e_magic; /* 00: MZ Header signature */
1571 WORD e_cblp; /* 02: Bytes on last page of file */
1572 WORD e_cp; /* 04: Pages in file */
1573 WORD e_crlc; /* 06: Relocations */
1574 WORD e_cparhdr; /* 08: Size of header in paragraphs */
1575 WORD e_minalloc; /* 0a: Minimum extra paragraphs needed */
1576 WORD e_maxalloc; /* 0c: Maximum extra paragraphs needed */
1577 WORD e_ss; /* 0e: Initial (relative) SS value */
1578 WORD e_sp; /* 10: Initial SP value */
1579 WORD e_csum; /* 12: Checksum */
1580 WORD e_ip; /* 14: Initial IP value */
1581 WORD e_cs; /* 16: Initial (relative) CS value */
1582 WORD e_lfarlc; /* 18: File address of relocation table */
1583 WORD e_ovno; /* 1a: Overlay number */
1584 WORD e_res[4]; /* 1c: Reserved words */
1585 WORD e_oemid; /* 24: OEM identifier (for e_oeminfo) */
1586 WORD e_oeminfo; /* 26: OEM information; e_oemid specific */
1587 WORD e_res2[10]; /* 28: Reserved words */
1588 DWORD e_lfanew; /* 3c: Offset to extended header */
1589} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
Dimitrie O. Paun53f9c212003-08-28 21:43:34 +00001590#include <poppack.h>
Alexandre Julliard180a0882000-04-18 11:58:24 +00001591
1592#define IMAGE_DOS_SIGNATURE 0x5A4D /* MZ */
1593#define IMAGE_OS2_SIGNATURE 0x454E /* NE */
1594#define IMAGE_OS2_SIGNATURE_LE 0x454C /* LE */
1595#define IMAGE_OS2_SIGNATURE_LX 0x584C /* LX */
1596#define IMAGE_VXD_SIGNATURE 0x454C /* LE */
1597#define IMAGE_NT_SIGNATURE 0x00004550 /* PE00 */
1598
1599/*
1600 * This is the Windows executable (NE) header.
1601 * the name IMAGE_OS2_HEADER is misleading, but in the SDK this way.
1602 */
Dimitrie O. Paun53f9c212003-08-28 21:43:34 +00001603#include <pshpack2.h>
Vincent Béron9a624912002-05-31 23:06:46 +00001604typedef struct
Alexandre Julliard180a0882000-04-18 11:58:24 +00001605{
1606 WORD ne_magic; /* 00 NE signature 'NE' */
1607 BYTE ne_ver; /* 02 Linker version number */
1608 BYTE ne_rev; /* 03 Linker revision number */
1609 WORD ne_enttab; /* 04 Offset to entry table relative to NE */
1610 WORD ne_cbenttab; /* 06 Length of entry table in bytes */
1611 LONG ne_crc; /* 08 Checksum */
1612 WORD ne_flags; /* 0c Flags about segments in this file */
1613 WORD ne_autodata; /* 0e Automatic data segment number */
1614 WORD ne_heap; /* 10 Initial size of local heap */
1615 WORD ne_stack; /* 12 Initial size of stack */
1616 DWORD ne_csip; /* 14 Initial CS:IP */
1617 DWORD ne_sssp; /* 18 Initial SS:SP */
1618 WORD ne_cseg; /* 1c # of entries in segment table */
1619 WORD ne_cmod; /* 1e # of entries in module reference tab. */
1620 WORD ne_cbnrestab; /* 20 Length of nonresident-name table */
1621 WORD ne_segtab; /* 22 Offset to segment table */
1622 WORD ne_rsrctab; /* 24 Offset to resource table */
1623 WORD ne_restab; /* 26 Offset to resident-name table */
1624 WORD ne_modtab; /* 28 Offset to module reference table */
1625 WORD ne_imptab; /* 2a Offset to imported name table */
1626 DWORD ne_nrestab; /* 2c Offset to nonresident-name table */
1627 WORD ne_cmovent; /* 30 # of movable entry points */
1628 WORD ne_align; /* 32 Logical sector alignment shift count */
1629 WORD ne_cres; /* 34 # of resource segments */
1630 BYTE ne_exetyp; /* 36 Flags indicating target OS */
1631 BYTE ne_flagsothers; /* 37 Additional information flags */
Patrik Stridvall1298eb42002-10-23 18:50:10 +00001632 WORD ne_pretthunks; /* 38 Offset to return thunks */
1633 WORD ne_psegrefbytes; /* 3a Offset to segment ref. bytes */
Alexandre Julliard180a0882000-04-18 11:58:24 +00001634 WORD ne_swaparea; /* 3c Reserved by Microsoft */
1635 WORD ne_expver; /* 3e Expected Windows version number */
Patrik Stridvall1298eb42002-10-23 18:50:10 +00001636} IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;
Dimitrie O. Paun53f9c212003-08-28 21:43:34 +00001637#include <poppack.h>
Alexandre Julliard180a0882000-04-18 11:58:24 +00001638
Dimitrie O. Paun53f9c212003-08-28 21:43:34 +00001639#include <pshpack2.h>
Alexandre Julliard180a0882000-04-18 11:58:24 +00001640typedef struct _IMAGE_VXD_HEADER {
1641 WORD e32_magic;
1642 BYTE e32_border;
1643 BYTE e32_worder;
1644 DWORD e32_level;
1645 WORD e32_cpu;
1646 WORD e32_os;
1647 DWORD e32_ver;
1648 DWORD e32_mflags;
1649 DWORD e32_mpages;
1650 DWORD e32_startobj;
1651 DWORD e32_eip;
1652 DWORD e32_stackobj;
1653 DWORD e32_esp;
1654 DWORD e32_pagesize;
1655 DWORD e32_lastpagesize;
1656 DWORD e32_fixupsize;
1657 DWORD e32_fixupsum;
1658 DWORD e32_ldrsize;
1659 DWORD e32_ldrsum;
1660 DWORD e32_objtab;
1661 DWORD e32_objcnt;
1662 DWORD e32_objmap;
1663 DWORD e32_itermap;
1664 DWORD e32_rsrctab;
1665 DWORD e32_rsrccnt;
1666 DWORD e32_restab;
1667 DWORD e32_enttab;
1668 DWORD e32_dirtab;
1669 DWORD e32_dircnt;
1670 DWORD e32_fpagetab;
1671 DWORD e32_frectab;
1672 DWORD e32_impmod;
1673 DWORD e32_impmodcnt;
1674 DWORD e32_impproc;
1675 DWORD e32_pagesum;
1676 DWORD e32_datapage;
1677 DWORD e32_preload;
1678 DWORD e32_nrestab;
1679 DWORD e32_cbnrestab;
1680 DWORD e32_nressum;
1681 DWORD e32_autodata;
1682 DWORD e32_debuginfo;
1683 DWORD e32_debuglen;
1684 DWORD e32_instpreload;
1685 DWORD e32_instdemand;
1686 DWORD e32_heapsize;
Patrik Stridvall1298eb42002-10-23 18:50:10 +00001687 BYTE e32_res3[12];
Alexandre Julliard180a0882000-04-18 11:58:24 +00001688 DWORD e32_winresoff;
1689 DWORD e32_winreslen;
1690 WORD e32_devid;
1691 WORD e32_ddkver;
1692} IMAGE_VXD_HEADER, *PIMAGE_VXD_HEADER;
Dimitrie O. Paun53f9c212003-08-28 21:43:34 +00001693#include <poppack.h>
Alexandre Julliard180a0882000-04-18 11:58:24 +00001694
1695/* These defines describe the meanings of the bits in the Characteristics
1696 field */
1697
1698#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 /* No relocation info */
1699#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
1700#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
1701#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
Andreas Mohr9a29b0c2002-02-27 21:35:36 +00001702#define IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010
1703#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020
Alexandre Julliard180a0882000-04-18 11:58:24 +00001704#define IMAGE_FILE_16BIT_MACHINE 0x0040
1705#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
1706#define IMAGE_FILE_32BIT_MACHINE 0x0100
1707#define IMAGE_FILE_DEBUG_STRIPPED 0x0200
Andreas Mohr9a29b0c2002-02-27 21:35:36 +00001708#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400
Jeff Muizelaar0a002212003-07-19 03:01:04 +00001709#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800
Alexandre Julliard180a0882000-04-18 11:58:24 +00001710#define IMAGE_FILE_SYSTEM 0x1000
1711#define IMAGE_FILE_DLL 0x2000
Andreas Mohr9a29b0c2002-02-27 21:35:36 +00001712#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000
Alexandre Julliard180a0882000-04-18 11:58:24 +00001713#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
1714
1715/* These are the settings of the Machine field. */
1716#define IMAGE_FILE_MACHINE_UNKNOWN 0
Jeff Muizelaar0a002212003-07-19 03:01:04 +00001717#define IMAGE_FILE_MACHINE_I860 0x014d
1718#define IMAGE_FILE_MACHINE_I386 0x014c
1719#define IMAGE_FILE_MACHINE_R3000 0x0162
1720#define IMAGE_FILE_MACHINE_R4000 0x0166
1721#define IMAGE_FILE_MACHINE_R10000 0x0168
1722#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169
1723#define IMAGE_FILE_MACHINE_ALPHA 0x0184
1724#define IMAGE_FILE_MACHINE_SH3 0x01a2
1725#define IMAGE_FILE_MACHINE_SH3DSP 0x01a3
1726#define IMAGE_FILE_MACHINE_SH3E 0x01a4
1727#define IMAGE_FILE_MACHINE_SH4 0x01a6
1728#define IMAGE_FILE_MACHINE_SH5 0x01a8
1729#define IMAGE_FILE_MACHINE_ARM 0x01c0
1730#define IMAGE_FILE_MACHINE_THUMB 0x01c2
1731#define IMAGE_FILE_MACHINE_AM33 0x01d3
1732#define IMAGE_FILE_MACHINE_POWERPC 0x01f0
1733#define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1
1734#define IMAGE_FILE_MACHINE_IA64 0x0200
1735#define IMAGE_FILE_MACHINE_MIPS16 0x0266
1736#define IMAGE_FILE_MACHINE_ALPHA64 0x0284
1737#define IMAGE_FILE_MACHINE_MIPSFPU 0x0366
1738#define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466
1739#define IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64
1740#define IMAGE_FILE_MACHINE_TRICORE 0x0520
1741#define IMAGE_FILE_MACHINE_CEF 0x0cef
1742#define IMAGE_FILE_MACHINE_EBC 0x0ebc
1743#define IMAGE_FILE_MACHINE_AMD64 0x8664
1744#define IMAGE_FILE_MACHINE_M32R 0x9041
1745#define IMAGE_FILE_MACHINE_CEE 0xc0ee
Alexandre Julliard180a0882000-04-18 11:58:24 +00001746
Dimitrie O. Paun1fa4a1a2003-08-13 19:35:22 +00001747#define IMAGE_SIZEOF_FILE_HEADER 20
1748#define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56
1749#define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28
1750#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER 224
1751#define IMAGE_SIZEOF_SHORT_NAME 8
1752#define IMAGE_SIZEOF_SECTION_HEADER 40
1753#define IMAGE_SIZEOF_SYMBOL 18
1754#define IMAGE_SIZEOF_AUX_SYMBOL 18
1755#define IMAGE_SIZEOF_RELOCATION 10
1756#define IMAGE_SIZEOF_BASE_RELOCATION 8
1757#define IMAGE_SIZEOF_LINENUMBER 6
1758#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60
Alexandre Julliard180a0882000-04-18 11:58:24 +00001759
1760/* Possible Magic values */
1761#define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b
1762#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107
1763
1764/* These are indexes into the DataDirectory array */
1765#define IMAGE_FILE_EXPORT_DIRECTORY 0
1766#define IMAGE_FILE_IMPORT_DIRECTORY 1
1767#define IMAGE_FILE_RESOURCE_DIRECTORY 2
1768#define IMAGE_FILE_EXCEPTION_DIRECTORY 3
1769#define IMAGE_FILE_SECURITY_DIRECTORY 4
1770#define IMAGE_FILE_BASE_RELOCATION_TABLE 5
1771#define IMAGE_FILE_DEBUG_DIRECTORY 6
1772#define IMAGE_FILE_DESCRIPTION_STRING 7
1773#define IMAGE_FILE_MACHINE_VALUE 8 /* Mips */
1774#define IMAGE_FILE_THREAD_LOCAL_STORAGE 9
1775#define IMAGE_FILE_CALLBACK_DIRECTORY 10
1776
1777/* Directory Entries, indices into the DataDirectory array */
1778
1779#define IMAGE_DIRECTORY_ENTRY_EXPORT 0
1780#define IMAGE_DIRECTORY_ENTRY_IMPORT 1
1781#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
1782#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3
1783#define IMAGE_DIRECTORY_ENTRY_SECURITY 4
1784#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5
1785#define IMAGE_DIRECTORY_ENTRY_DEBUG 6
1786#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7
1787#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 /* (MIPS GP) */
1788#define IMAGE_DIRECTORY_ENTRY_TLS 9
1789#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10
1790#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11
1791#define IMAGE_DIRECTORY_ENTRY_IAT 12 /* Import Address Table */
1792#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13
1793#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14
1794
1795/* Subsystem Values */
1796
Jeff Muizelaar0a002212003-07-19 03:01:04 +00001797#define IMAGE_SUBSYSTEM_UNKNOWN 0
1798#define IMAGE_SUBSYSTEM_NATIVE 1
1799#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 /* Windows GUI subsystem */
1800#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 /* Windows character subsystem */
1801#define IMAGE_SUBSYSTEM_OS2_CUI 5
1802#define IMAGE_SUBSYSTEM_POSIX_CUI 7
1803#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8 /* native Win9x driver */
1804#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 /* Windows CE subsystem */
1805#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10
1806#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11
1807#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12
1808#define IMAGE_SUBSYSTEM_EFI_ROM 13
1809#define IMAGE_SUBSYSTEM_XBOX 14
Alexandre Julliard180a0882000-04-18 11:58:24 +00001810
1811typedef struct _IMAGE_FILE_HEADER {
1812 WORD Machine;
1813 WORD NumberOfSections;
1814 DWORD TimeDateStamp;
1815 DWORD PointerToSymbolTable;
1816 DWORD NumberOfSymbols;
1817 WORD SizeOfOptionalHeader;
1818 WORD Characteristics;
1819} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
1820
1821typedef struct _IMAGE_DATA_DIRECTORY {
1822 DWORD VirtualAddress;
1823 DWORD Size;
1824} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
1825
1826#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
1827
1828typedef struct _IMAGE_OPTIONAL_HEADER {
1829
1830 /* Standard fields */
1831
Andreas Mohr1426c8c2001-06-06 21:06:27 +00001832 WORD Magic; /* 0x10b or 0x107 */ /* 0x00 */
Alexandre Julliard180a0882000-04-18 11:58:24 +00001833 BYTE MajorLinkerVersion;
1834 BYTE MinorLinkerVersion;
1835 DWORD SizeOfCode;
1836 DWORD SizeOfInitializedData;
1837 DWORD SizeOfUninitializedData;
Andreas Mohr1426c8c2001-06-06 21:06:27 +00001838 DWORD AddressOfEntryPoint; /* 0x10 */
Alexandre Julliard180a0882000-04-18 11:58:24 +00001839 DWORD BaseOfCode;
1840 DWORD BaseOfData;
1841
1842 /* NT additional fields */
1843
1844 DWORD ImageBase;
Andreas Mohr1426c8c2001-06-06 21:06:27 +00001845 DWORD SectionAlignment; /* 0x20 */
Alexandre Julliard180a0882000-04-18 11:58:24 +00001846 DWORD FileAlignment;
1847 WORD MajorOperatingSystemVersion;
1848 WORD MinorOperatingSystemVersion;
1849 WORD MajorImageVersion;
1850 WORD MinorImageVersion;
Andreas Mohr1426c8c2001-06-06 21:06:27 +00001851 WORD MajorSubsystemVersion; /* 0x30 */
Alexandre Julliard180a0882000-04-18 11:58:24 +00001852 WORD MinorSubsystemVersion;
1853 DWORD Win32VersionValue;
1854 DWORD SizeOfImage;
1855 DWORD SizeOfHeaders;
Andreas Mohr1426c8c2001-06-06 21:06:27 +00001856 DWORD CheckSum; /* 0x40 */
Alexandre Julliard180a0882000-04-18 11:58:24 +00001857 WORD Subsystem;
1858 WORD DllCharacteristics;
1859 DWORD SizeOfStackReserve;
1860 DWORD SizeOfStackCommit;
Andreas Mohr1426c8c2001-06-06 21:06:27 +00001861 DWORD SizeOfHeapReserve; /* 0x50 */
Alexandre Julliard180a0882000-04-18 11:58:24 +00001862 DWORD SizeOfHeapCommit;
1863 DWORD LoaderFlags;
1864 DWORD NumberOfRvaAndSizes;
Andreas Mohr1426c8c2001-06-06 21:06:27 +00001865 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; /* 0x60 */
Andreas Mohr9a29b0c2002-02-27 21:35:36 +00001866 /* 0xE0 */
Alexandre Julliard180a0882000-04-18 11:58:24 +00001867} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
1868
1869typedef struct _IMAGE_NT_HEADERS {
Andreas Mohr9a29b0c2002-02-27 21:35:36 +00001870 DWORD Signature; /* "PE"\0\0 */ /* 0x00 */
1871 IMAGE_FILE_HEADER FileHeader; /* 0x04 */
1872 IMAGE_OPTIONAL_HEADER OptionalHeader; /* 0x18 */
Alexandre Julliard180a0882000-04-18 11:58:24 +00001873} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
1874
1875#define IMAGE_SIZEOF_SHORT_NAME 8
1876
1877typedef struct _IMAGE_SECTION_HEADER {
1878 BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
1879 union {
1880 DWORD PhysicalAddress;
1881 DWORD VirtualSize;
1882 } Misc;
1883 DWORD VirtualAddress;
1884 DWORD SizeOfRawData;
1885 DWORD PointerToRawData;
1886 DWORD PointerToRelocations;
1887 DWORD PointerToLinenumbers;
1888 WORD NumberOfRelocations;
1889 WORD NumberOfLinenumbers;
1890 DWORD Characteristics;
1891} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
1892
1893#define IMAGE_SIZEOF_SECTION_HEADER 40
1894
1895#define IMAGE_FIRST_SECTION(ntheader) \
1896 ((PIMAGE_SECTION_HEADER)((LPBYTE)&((PIMAGE_NT_HEADERS)(ntheader))->OptionalHeader + \
1897 ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader))
1898
1899/* These defines are for the Characteristics bitfield. */
1900/* #define IMAGE_SCN_TYPE_REG 0x00000000 - Reserved */
1901/* #define IMAGE_SCN_TYPE_DSECT 0x00000001 - Reserved */
1902/* #define IMAGE_SCN_TYPE_NOLOAD 0x00000002 - Reserved */
1903/* #define IMAGE_SCN_TYPE_GROUP 0x00000004 - Reserved */
Jeff Muizelaar0a002212003-07-19 03:01:04 +00001904#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 /* Reserved */
Alexandre Julliard180a0882000-04-18 11:58:24 +00001905/* #define IMAGE_SCN_TYPE_COPY 0x00000010 - Reserved */
1906
1907#define IMAGE_SCN_CNT_CODE 0x00000020
1908#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
1909#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
1910
Vincent Béron9a624912002-05-31 23:06:46 +00001911#define IMAGE_SCN_LNK_OTHER 0x00000100
1912#define IMAGE_SCN_LNK_INFO 0x00000200
Alexandre Julliard180a0882000-04-18 11:58:24 +00001913/* #define IMAGE_SCN_TYPE_OVER 0x00000400 - Reserved */
1914#define IMAGE_SCN_LNK_REMOVE 0x00000800
1915#define IMAGE_SCN_LNK_COMDAT 0x00001000
1916
1917/* 0x00002000 - Reserved */
1918/* #define IMAGE_SCN_MEM_PROTECTED 0x00004000 - Obsolete */
1919#define IMAGE_SCN_MEM_FARDATA 0x00008000
1920
1921/* #define IMAGE_SCN_MEM_SYSHEAP 0x00010000 - Obsolete */
1922#define IMAGE_SCN_MEM_PURGEABLE 0x00020000
1923#define IMAGE_SCN_MEM_16BIT 0x00020000
1924#define IMAGE_SCN_MEM_LOCKED 0x00040000
1925#define IMAGE_SCN_MEM_PRELOAD 0x00080000
1926
1927#define IMAGE_SCN_ALIGN_1BYTES 0x00100000
1928#define IMAGE_SCN_ALIGN_2BYTES 0x00200000
1929#define IMAGE_SCN_ALIGN_4BYTES 0x00300000
1930#define IMAGE_SCN_ALIGN_8BYTES 0x00400000
1931#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 /* Default */
Jeff Muizelaar0a002212003-07-19 03:01:04 +00001932#define IMAGE_SCN_ALIGN_32BYTES 0x00600000
1933#define IMAGE_SCN_ALIGN_64BYTES 0x00700000
1934#define IMAGE_SCN_ALIGN_128BYTES 0x00800000
1935#define IMAGE_SCN_ALIGN_256BYTES 0x00900000
1936#define IMAGE_SCN_ALIGN_512BYTES 0x00A00000
1937#define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000
1938#define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000
1939#define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000
1940#define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000
1941/* 0x00F00000 - Unused */
1942#define IMAGE_SCN_ALIGN_MASK 0x00F00000
Alexandre Julliard180a0882000-04-18 11:58:24 +00001943
1944#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
1945
1946
1947#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
1948#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000
1949#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000
1950#define IMAGE_SCN_MEM_SHARED 0x10000000
1951#define IMAGE_SCN_MEM_EXECUTE 0x20000000
1952#define IMAGE_SCN_MEM_READ 0x40000000
1953#define IMAGE_SCN_MEM_WRITE 0x80000000
1954
Dimitrie O. Paun53f9c212003-08-28 21:43:34 +00001955#include <pshpack2.h>
Alexandre Julliard180a0882000-04-18 11:58:24 +00001956
1957typedef struct _IMAGE_SYMBOL {
1958 union {
1959 BYTE ShortName[8];
1960 struct {
1961 DWORD Short;
1962 DWORD Long;
1963 } Name;
1964 DWORD LongName[2];
1965 } N;
1966 DWORD Value;
1967 SHORT SectionNumber;
1968 WORD Type;
1969 BYTE StorageClass;
1970 BYTE NumberOfAuxSymbols;
1971} IMAGE_SYMBOL;
1972typedef IMAGE_SYMBOL *PIMAGE_SYMBOL;
1973
1974#define IMAGE_SIZEOF_SYMBOL 18
1975
1976typedef struct _IMAGE_LINENUMBER {
1977 union {
1978 DWORD SymbolTableIndex;
1979 DWORD VirtualAddress;
1980 } Type;
1981 WORD Linenumber;
1982} IMAGE_LINENUMBER;
1983typedef IMAGE_LINENUMBER *PIMAGE_LINENUMBER;
1984
1985#define IMAGE_SIZEOF_LINENUMBER 6
1986
1987typedef union _IMAGE_AUX_SYMBOL {
1988 struct {
1989 DWORD TagIndex;
1990 union {
1991 struct {
1992 WORD Linenumber;
1993 WORD Size;
1994 } LnSz;
1995 DWORD TotalSize;
1996 } Misc;
1997 union {
1998 struct {
1999 DWORD PointerToLinenumber;
2000 DWORD PointerToNextFunction;
2001 } Function;
2002 struct {
2003 WORD Dimension[4];
2004 } Array;
2005 } FcnAry;
2006 WORD TvIndex;
2007 } Sym;
2008 struct {
2009 BYTE Name[IMAGE_SIZEOF_SYMBOL];
2010 } File;
2011 struct {
2012 DWORD Length;
2013 WORD NumberOfRelocations;
2014 WORD NumberOfLinenumbers;
2015 DWORD CheckSum;
2016 SHORT Number;
2017 BYTE Selection;
2018 } Section;
2019} IMAGE_AUX_SYMBOL;
2020typedef IMAGE_AUX_SYMBOL *PIMAGE_AUX_SYMBOL;
2021
2022#define IMAGE_SIZEOF_AUX_SYMBOL 18
2023
Dimitrie O. Paun53f9c212003-08-28 21:43:34 +00002024#include <poppack.h>
Alexandre Julliard180a0882000-04-18 11:58:24 +00002025
2026#define IMAGE_SYM_UNDEFINED (SHORT)0
2027#define IMAGE_SYM_ABSOLUTE (SHORT)-1
2028#define IMAGE_SYM_DEBUG (SHORT)-2
2029
2030#define IMAGE_SYM_TYPE_NULL 0x0000
2031#define IMAGE_SYM_TYPE_VOID 0x0001
2032#define IMAGE_SYM_TYPE_CHAR 0x0002
2033#define IMAGE_SYM_TYPE_SHORT 0x0003
2034#define IMAGE_SYM_TYPE_INT 0x0004
2035#define IMAGE_SYM_TYPE_LONG 0x0005
2036#define IMAGE_SYM_TYPE_FLOAT 0x0006
2037#define IMAGE_SYM_TYPE_DOUBLE 0x0007
2038#define IMAGE_SYM_TYPE_STRUCT 0x0008
2039#define IMAGE_SYM_TYPE_UNION 0x0009
2040#define IMAGE_SYM_TYPE_ENUM 0x000A
2041#define IMAGE_SYM_TYPE_MOE 0x000B
2042#define IMAGE_SYM_TYPE_BYTE 0x000C
2043#define IMAGE_SYM_TYPE_WORD 0x000D
2044#define IMAGE_SYM_TYPE_UINT 0x000E
2045#define IMAGE_SYM_TYPE_DWORD 0x000F
2046#define IMAGE_SYM_TYPE_PCODE 0x8000
2047
2048#define IMAGE_SYM_DTYPE_NULL 0
2049#define IMAGE_SYM_DTYPE_POINTER 1
2050#define IMAGE_SYM_DTYPE_FUNCTION 2
2051#define IMAGE_SYM_DTYPE_ARRAY 3
2052
2053#define IMAGE_SYM_CLASS_END_OF_FUNCTION (BYTE )-1
2054#define IMAGE_SYM_CLASS_NULL 0x0000
2055#define IMAGE_SYM_CLASS_AUTOMATIC 0x0001
2056#define IMAGE_SYM_CLASS_EXTERNAL 0x0002
2057#define IMAGE_SYM_CLASS_STATIC 0x0003
2058#define IMAGE_SYM_CLASS_REGISTER 0x0004
2059#define IMAGE_SYM_CLASS_EXTERNAL_DEF 0x0005
2060#define IMAGE_SYM_CLASS_LABEL 0x0006
2061#define IMAGE_SYM_CLASS_UNDEFINED_LABEL 0x0007
2062#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 0x0008
2063#define IMAGE_SYM_CLASS_ARGUMENT 0x0009
2064#define IMAGE_SYM_CLASS_STRUCT_TAG 0x000A
2065#define IMAGE_SYM_CLASS_MEMBER_OF_UNION 0x000B
2066#define IMAGE_SYM_CLASS_UNION_TAG 0x000C
2067#define IMAGE_SYM_CLASS_TYPE_DEFINITION 0x000D
2068#define IMAGE_SYM_CLASS_UNDEFINED_STATIC 0x000E
2069#define IMAGE_SYM_CLASS_ENUM_TAG 0x000F
2070#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 0x0010
2071#define IMAGE_SYM_CLASS_REGISTER_PARAM 0x0011
2072#define IMAGE_SYM_CLASS_BIT_FIELD 0x0012
2073
2074#define IMAGE_SYM_CLASS_FAR_EXTERNAL 0x0044
2075#define IMAGE_SYM_CLASS_BLOCK 0x0064
2076#define IMAGE_SYM_CLASS_FUNCTION 0x0065
2077#define IMAGE_SYM_CLASS_END_OF_STRUCT 0x0066
2078#define IMAGE_SYM_CLASS_FILE 0x0067
2079#define IMAGE_SYM_CLASS_SECTION 0x0068
2080#define IMAGE_SYM_CLASS_WEAK_EXTERNAL 0x0069
2081
2082#define N_BTMASK 0x000F
2083#define N_TMASK 0x0030
2084#define N_TMASK1 0x00C0
2085#define N_TMASK2 0x00F0
2086#define N_BTSHFT 4
2087#define N_TSHIFT 2
2088
2089#define BTYPE(x) ((x) & N_BTMASK)
2090
2091#ifndef ISPTR
2092#define ISPTR(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT))
2093#endif
2094
2095#ifndef ISFCN
2096#define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))
2097#endif
2098
2099#ifndef ISARY
2100#define ISARY(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT))
2101#endif
2102
2103#ifndef ISTAG
2104#define ISTAG(x) ((x)==IMAGE_SYM_CLASS_STRUCT_TAG || (x)==IMAGE_SYM_CLASS_UNION_TAG || (x)==IMAGE_SYM_CLASS_ENUM_TAG)
2105#endif
2106
2107#ifndef INCREF
2108#define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK))
2109#endif
2110#ifndef DECREF
2111#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
2112#endif
2113
2114#define IMAGE_COMDAT_SELECT_NODUPLICATES 1
2115#define IMAGE_COMDAT_SELECT_ANY 2
2116#define IMAGE_COMDAT_SELECT_SAME_SIZE 3
2117#define IMAGE_COMDAT_SELECT_EXACT_MATCH 4
2118#define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5
2119#define IMAGE_COMDAT_SELECT_LARGEST 6
2120#define IMAGE_COMDAT_SELECT_NEWEST 7
2121
2122#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1
2123#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2
2124#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3
2125
2126/* Export module directory */
2127
2128typedef struct _IMAGE_EXPORT_DIRECTORY {
2129 DWORD Characteristics;
2130 DWORD TimeDateStamp;
2131 WORD MajorVersion;
2132 WORD MinorVersion;
2133 DWORD Name;
2134 DWORD Base;
2135 DWORD NumberOfFunctions;
2136 DWORD NumberOfNames;
Alexandre Julliard246c3602000-05-10 03:48:00 +00002137 DWORD AddressOfFunctions;
2138 DWORD AddressOfNames;
2139 DWORD AddressOfNameOrdinals;
Alexandre Julliard180a0882000-04-18 11:58:24 +00002140} IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY;
2141
2142/* Import name entry */
2143typedef struct _IMAGE_IMPORT_BY_NAME {
2144 WORD Hint;
2145 BYTE Name[1];
2146} IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME;
2147
2148/* Import thunk */
2149typedef struct _IMAGE_THUNK_DATA {
2150 union {
2151 LPBYTE ForwarderString;
François Gouget807b0452000-12-15 20:53:39 +00002152 PDWORD Function;
Alexandre Julliard180a0882000-04-18 11:58:24 +00002153 DWORD Ordinal;
2154 PIMAGE_IMPORT_BY_NAME AddressOfData;
2155 } u1;
2156} IMAGE_THUNK_DATA,*PIMAGE_THUNK_DATA;
2157
2158/* Import module directory */
2159
2160typedef struct _IMAGE_IMPORT_DESCRIPTOR {
2161 union {
2162 DWORD Characteristics; /* 0 for terminating null import descriptor */
2163 PIMAGE_THUNK_DATA OriginalFirstThunk; /* RVA to original unbound IAT */
2164 } u;
2165 DWORD TimeDateStamp; /* 0 if not bound,
2166 * -1 if bound, and real date\time stamp
2167 * in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
2168 * (new BIND)
2169 * otherwise date/time stamp of DLL bound to
2170 * (Old BIND)
2171 */
2172 DWORD ForwarderChain; /* -1 if no forwarders */
2173 DWORD Name;
2174 /* RVA to IAT (if bound this IAT has actual addresses) */
Vincent Béron9a624912002-05-31 23:06:46 +00002175 PIMAGE_THUNK_DATA FirstThunk;
Alexandre Julliard180a0882000-04-18 11:58:24 +00002176} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
2177
2178#define IMAGE_ORDINAL_FLAG 0x80000000
2179#define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0)
2180#define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff)
2181
2182typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR
2183{
2184 DWORD TimeDateStamp;
2185 WORD OffsetModuleName;
2186 WORD NumberOfModuleForwarderRefs;
2187/* Array of zero or more IMAGE_BOUND_FORWARDER_REF follows */
2188} IMAGE_BOUND_IMPORT_DESCRIPTOR, *PIMAGE_BOUND_IMPORT_DESCRIPTOR;
2189
2190typedef struct _IMAGE_BOUND_FORWARDER_REF
2191{
2192 DWORD TimeDateStamp;
2193 WORD OffsetModuleName;
2194 WORD Reserved;
2195} IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;
2196
2197typedef struct _IMAGE_BASE_RELOCATION
2198{
2199 DWORD VirtualAddress;
2200 DWORD SizeOfBlock;
Dmitry Timoshkov6b6596a2001-11-23 18:44:43 +00002201 /* WORD TypeOffset[1]; */
Alexandre Julliard180a0882000-04-18 11:58:24 +00002202} IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION;
2203
Dimitrie O. Paun53f9c212003-08-28 21:43:34 +00002204#include <pshpack2.h>
Patrik Stridvallba9dc782002-11-04 22:43:24 +00002205
Alexandre Julliard180a0882000-04-18 11:58:24 +00002206typedef struct _IMAGE_RELOCATION
2207{
2208 union {
2209 DWORD VirtualAddress;
2210 DWORD RelocCount;
Patrik Stridvall1298eb42002-10-23 18:50:10 +00002211 } DUMMYUNIONNAME;
Alexandre Julliard180a0882000-04-18 11:58:24 +00002212 DWORD SymbolTableIndex;
2213 WORD Type;
Patrik Stridvall1298eb42002-10-23 18:50:10 +00002214} IMAGE_RELOCATION, *PIMAGE_RELOCATION;
Alexandre Julliard180a0882000-04-18 11:58:24 +00002215
Dimitrie O. Paun53f9c212003-08-28 21:43:34 +00002216#include <poppack.h>
Dmitry Timoshkov6b6596a2001-11-23 18:44:43 +00002217
Alexandre Julliard180a0882000-04-18 11:58:24 +00002218#define IMAGE_SIZEOF_RELOCATION 10
2219
2220/* generic relocation types */
2221#define IMAGE_REL_BASED_ABSOLUTE 0
2222#define IMAGE_REL_BASED_HIGH 1
2223#define IMAGE_REL_BASED_LOW 2
2224#define IMAGE_REL_BASED_HIGHLOW 3
2225#define IMAGE_REL_BASED_HIGHADJ 4
2226#define IMAGE_REL_BASED_MIPS_JMPADDR 5
2227#define IMAGE_REL_BASED_SECTION 6
2228#define IMAGE_REL_BASED_REL 7
2229#define IMAGE_REL_BASED_MIPS_JMPADDR16 9
2230#define IMAGE_REL_BASED_IA64_IMM64 9 /* yes, 9 too */
2231#define IMAGE_REL_BASED_DIR64 10
2232#define IMAGE_REL_BASED_HIGH3ADJ 11
2233
2234/* I386 relocation types */
2235#define IMAGE_REL_I386_ABSOLUTE 0
2236#define IMAGE_REL_I386_DIR16 1
2237#define IMAGE_REL_I386_REL16 2
2238#define IMAGE_REL_I386_DIR32 6
2239#define IMAGE_REL_I386_DIR32NB 7
2240#define IMAGE_REL_I386_SEG12 9
2241#define IMAGE_REL_I386_SECTION 10
2242#define IMAGE_REL_I386_SECREL 11
2243#define IMAGE_REL_I386_REL32 20
2244
2245/* MIPS relocation types */
2246#define IMAGE_REL_MIPS_ABSOLUTE 0x0000
2247#define IMAGE_REL_MIPS_REFHALF 0x0001
2248#define IMAGE_REL_MIPS_REFWORD 0x0002
2249#define IMAGE_REL_MIPS_JMPADDR 0x0003
2250#define IMAGE_REL_MIPS_REFHI 0x0004
2251#define IMAGE_REL_MIPS_REFLO 0x0005
2252#define IMAGE_REL_MIPS_GPREL 0x0006
2253#define IMAGE_REL_MIPS_LITERAL 0x0007
2254#define IMAGE_REL_MIPS_SECTION 0x000A
2255#define IMAGE_REL_MIPS_SECREL 0x000B
2256#define IMAGE_REL_MIPS_SECRELLO 0x000C
2257#define IMAGE_REL_MIPS_SECRELHI 0x000D
2258#define IMAGE_REL_MIPS_JMPADDR16 0x0010
2259#define IMAGE_REL_MIPS_REFWORDNB 0x0022
2260#define IMAGE_REL_MIPS_PAIR 0x0025
2261
2262/* ALPHA relocation types */
2263#define IMAGE_REL_ALPHA_ABSOLUTE 0x0000
2264#define IMAGE_REL_ALPHA_REFLONG 0x0001
2265#define IMAGE_REL_ALPHA_REFQUAD 0x0002
2266#define IMAGE_REL_ALPHA_GPREL 0x0003
2267#define IMAGE_REL_ALPHA_LITERAL 0x0004
2268#define IMAGE_REL_ALPHA_LITUSE 0x0005
2269#define IMAGE_REL_ALPHA_GPDISP 0x0006
2270#define IMAGE_REL_ALPHA_BRADDR 0x0007
2271#define IMAGE_REL_ALPHA_HINT 0x0008
2272#define IMAGE_REL_ALPHA_INLINE_REFLONG 0x0009
2273#define IMAGE_REL_ALPHA_REFHI 0x000A
2274#define IMAGE_REL_ALPHA_REFLO 0x000B
2275#define IMAGE_REL_ALPHA_PAIR 0x000C
2276#define IMAGE_REL_ALPHA_MATCH 0x000D
2277#define IMAGE_REL_ALPHA_SECTION 0x000E
2278#define IMAGE_REL_ALPHA_SECREL 0x000F
2279#define IMAGE_REL_ALPHA_REFLONGNB 0x0010
2280#define IMAGE_REL_ALPHA_SECRELLO 0x0011
2281#define IMAGE_REL_ALPHA_SECRELHI 0x0012
2282#define IMAGE_REL_ALPHA_REFQ3 0x0013
2283#define IMAGE_REL_ALPHA_REFQ2 0x0014
2284#define IMAGE_REL_ALPHA_REFQ1 0x0015
2285#define IMAGE_REL_ALPHA_GPRELLO 0x0016
2286#define IMAGE_REL_ALPHA_GPRELHI 0x0017
2287
2288/* PowerPC relocation types */
2289#define IMAGE_REL_PPC_ABSOLUTE 0x0000
2290#define IMAGE_REL_PPC_ADDR64 0x0001
2291#define IMAGE_REL_PPC_ADDR 0x0002
2292#define IMAGE_REL_PPC_ADDR24 0x0003
2293#define IMAGE_REL_PPC_ADDR16 0x0004
2294#define IMAGE_REL_PPC_ADDR14 0x0005
2295#define IMAGE_REL_PPC_REL24 0x0006
2296#define IMAGE_REL_PPC_REL14 0x0007
2297#define IMAGE_REL_PPC_TOCREL16 0x0008
2298#define IMAGE_REL_PPC_TOCREL14 0x0009
2299#define IMAGE_REL_PPC_ADDR32NB 0x000A
2300#define IMAGE_REL_PPC_SECREL 0x000B
2301#define IMAGE_REL_PPC_SECTION 0x000C
2302#define IMAGE_REL_PPC_IFGLUE 0x000D
2303#define IMAGE_REL_PPC_IMGLUE 0x000E
2304#define IMAGE_REL_PPC_SECREL16 0x000F
2305#define IMAGE_REL_PPC_REFHI 0x0010
2306#define IMAGE_REL_PPC_REFLO 0x0011
2307#define IMAGE_REL_PPC_PAIR 0x0012
2308#define IMAGE_REL_PPC_SECRELLO 0x0013
2309#define IMAGE_REL_PPC_SECRELHI 0x0014
2310#define IMAGE_REL_PPC_GPREL 0x0015
2311#define IMAGE_REL_PPC_TYPEMASK 0x00FF
2312/* modifier bits */
2313#define IMAGE_REL_PPC_NEG 0x0100
2314#define IMAGE_REL_PPC_BRTAKEN 0x0200
2315#define IMAGE_REL_PPC_BRNTAKEN 0x0400
2316#define IMAGE_REL_PPC_TOCDEFN 0x0800
2317
2318/* SH3 ? relocation type */
2319#define IMAGE_REL_SH3_ABSOLUTE 0x0000
2320#define IMAGE_REL_SH3_DIRECT16 0x0001
2321#define IMAGE_REL_SH3_DIRECT 0x0002
2322#define IMAGE_REL_SH3_DIRECT8 0x0003
2323#define IMAGE_REL_SH3_DIRECT8_WORD 0x0004
2324#define IMAGE_REL_SH3_DIRECT8_LONG 0x0005
2325#define IMAGE_REL_SH3_DIRECT4 0x0006
2326#define IMAGE_REL_SH3_DIRECT4_WORD 0x0007
2327#define IMAGE_REL_SH3_DIRECT4_LONG 0x0008
2328#define IMAGE_REL_SH3_PCREL8_WORD 0x0009
2329#define IMAGE_REL_SH3_PCREL8_LONG 0x000A
2330#define IMAGE_REL_SH3_PCREL12_WORD 0x000B
2331#define IMAGE_REL_SH3_STARTOF_SECTION 0x000C
2332#define IMAGE_REL_SH3_SIZEOF_SECTION 0x000D
2333#define IMAGE_REL_SH3_SECTION 0x000E
2334#define IMAGE_REL_SH3_SECREL 0x000F
2335#define IMAGE_REL_SH3_DIRECT32_NB 0x0010
2336
2337/* ARM (Archimedes?) relocation types */
2338#define IMAGE_REL_ARM_ABSOLUTE 0x0000
2339#define IMAGE_REL_ARM_ADDR 0x0001
2340#define IMAGE_REL_ARM_ADDR32NB 0x0002
2341#define IMAGE_REL_ARM_BRANCH24 0x0003
2342#define IMAGE_REL_ARM_BRANCH11 0x0004
2343#define IMAGE_REL_ARM_SECTION 0x000E
2344#define IMAGE_REL_ARM_SECREL 0x000F
2345
2346/* IA64 relocation types */
2347#define IMAGE_REL_IA64_ABSOLUTE 0x0000
2348#define IMAGE_REL_IA64_IMM14 0x0001
2349#define IMAGE_REL_IA64_IMM22 0x0002
2350#define IMAGE_REL_IA64_IMM64 0x0003
2351#define IMAGE_REL_IA64_DIR 0x0004
2352#define IMAGE_REL_IA64_DIR64 0x0005
2353#define IMAGE_REL_IA64_PCREL21B 0x0006
2354#define IMAGE_REL_IA64_PCREL21M 0x0007
2355#define IMAGE_REL_IA64_PCREL21F 0x0008
2356#define IMAGE_REL_IA64_GPREL22 0x0009
2357#define IMAGE_REL_IA64_LTOFF22 0x000A
2358#define IMAGE_REL_IA64_SECTION 0x000B
2359#define IMAGE_REL_IA64_SECREL22 0x000C
2360#define IMAGE_REL_IA64_SECREL64I 0x000D
2361#define IMAGE_REL_IA64_SECREL 0x000E
2362#define IMAGE_REL_IA64_LTOFF64 0x000F
2363#define IMAGE_REL_IA64_DIR32NB 0x0010
2364#define IMAGE_REL_IA64_RESERVED_11 0x0011
2365#define IMAGE_REL_IA64_RESERVED_12 0x0012
2366#define IMAGE_REL_IA64_RESERVED_13 0x0013
2367#define IMAGE_REL_IA64_RESERVED_14 0x0014
2368#define IMAGE_REL_IA64_RESERVED_15 0x0015
2369#define IMAGE_REL_IA64_RESERVED_16 0x0016
2370#define IMAGE_REL_IA64_ADDEND 0x001F
2371
2372/* archive format */
2373
2374#define IMAGE_ARCHIVE_START_SIZE 8
2375#define IMAGE_ARCHIVE_START "!<arch>\n"
2376#define IMAGE_ARCHIVE_END "`\n"
2377#define IMAGE_ARCHIVE_PAD "\n"
2378#define IMAGE_ARCHIVE_LINKER_MEMBER "/ "
2379#define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// "
2380
2381typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER
2382{
2383 BYTE Name[16];
2384 BYTE Date[12];
2385 BYTE UserID[6];
2386 BYTE GroupID[6];
2387 BYTE Mode[8];
2388 BYTE Size[10];
2389 BYTE EndHeader[2];
2390} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;
2391
2392#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60
2393
2394/*
2395 * Resource directory stuff
2396 */
2397typedef struct _IMAGE_RESOURCE_DIRECTORY {
2398 DWORD Characteristics;
2399 DWORD TimeDateStamp;
2400 WORD MajorVersion;
2401 WORD MinorVersion;
2402 WORD NumberOfNamedEntries;
2403 WORD NumberOfIdEntries;
2404 /* IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[]; */
2405} IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY;
2406
2407#define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000
2408#define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000
2409
2410typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
2411 union {
2412 struct {
Ulrich Weigand97591402000-12-19 03:38:53 +00002413#ifdef BITFIELDS_BIGENDIAN
2414 unsigned NameIsString:1;
2415 unsigned NameOffset:31;
2416#else
Alexandre Julliard180a0882000-04-18 11:58:24 +00002417 unsigned NameOffset:31;
2418 unsigned NameIsString:1;
Ulrich Weigand97591402000-12-19 03:38:53 +00002419#endif
Francois Gougetda0acca2000-11-10 22:34:39 +00002420 } DUMMYSTRUCTNAME1;
Alexandre Julliard180a0882000-04-18 11:58:24 +00002421 DWORD Name;
Ulrich Weigand97591402000-12-19 03:38:53 +00002422 struct {
2423#ifdef WORDS_BIGENDIAN
2424 WORD __pad;
2425 WORD Id;
2426#else
2427 WORD Id;
2428 WORD __pad;
2429#endif
2430 } DUMMYSTRUCTNAME2;
Francois Gougetda0acca2000-11-10 22:34:39 +00002431 } DUMMYUNIONNAME1;
Alexandre Julliard180a0882000-04-18 11:58:24 +00002432 union {
2433 DWORD OffsetToData;
2434 struct {
Ulrich Weigand97591402000-12-19 03:38:53 +00002435#ifdef BITFIELDS_BIGENDIAN
2436 unsigned DataIsDirectory:1;
2437 unsigned OffsetToDirectory:31;
2438#else
Alexandre Julliard180a0882000-04-18 11:58:24 +00002439 unsigned OffsetToDirectory:31;
2440 unsigned DataIsDirectory:1;
Ulrich Weigand97591402000-12-19 03:38:53 +00002441#endif
François Gouget5e5c52d2000-12-19 23:31:52 +00002442 } DUMMYSTRUCTNAME3;
Francois Gougetda0acca2000-11-10 22:34:39 +00002443 } DUMMYUNIONNAME2;
Alexandre Julliard180a0882000-04-18 11:58:24 +00002444} IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY;
2445
2446
2447typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
2448 WORD Length;
2449 CHAR NameString[ 1 ];
2450} IMAGE_RESOURCE_DIRECTORY_STRING,*PIMAGE_RESOURCE_DIRECTORY_STRING;
2451
2452typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
2453 WORD Length;
2454 WCHAR NameString[ 1 ];
2455} IMAGE_RESOURCE_DIR_STRING_U,*PIMAGE_RESOURCE_DIR_STRING_U;
2456
2457typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
2458 DWORD OffsetToData;
2459 DWORD Size;
2460 DWORD CodePage;
2461 DWORD ResourceHandle;
2462} IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY;
2463
2464
Patrik Stridvallf94462f2002-01-31 23:22:07 +00002465typedef VOID (CALLBACK *PIMAGE_TLS_CALLBACK)(
Alexandre Julliard180a0882000-04-18 11:58:24 +00002466 LPVOID DllHandle,DWORD Reason,LPVOID Reserved
2467);
2468
2469typedef struct _IMAGE_TLS_DIRECTORY {
2470 DWORD StartAddressOfRawData;
2471 DWORD EndAddressOfRawData;
2472 LPDWORD AddressOfIndex;
2473 PIMAGE_TLS_CALLBACK *AddressOfCallBacks;
2474 DWORD SizeOfZeroFill;
2475 DWORD Characteristics;
2476} IMAGE_TLS_DIRECTORY,*PIMAGE_TLS_DIRECTORY;
2477
2478typedef struct _IMAGE_DEBUG_DIRECTORY {
2479 DWORD Characteristics;
2480 DWORD TimeDateStamp;
2481 WORD MajorVersion;
2482 WORD MinorVersion;
2483 DWORD Type;
2484 DWORD SizeOfData;
2485 DWORD AddressOfRawData;
2486 DWORD PointerToRawData;
2487} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
2488
2489#define IMAGE_DEBUG_TYPE_UNKNOWN 0
2490#define IMAGE_DEBUG_TYPE_COFF 1
2491#define IMAGE_DEBUG_TYPE_CODEVIEW 2
2492#define IMAGE_DEBUG_TYPE_FPO 3
2493#define IMAGE_DEBUG_TYPE_MISC 4
2494#define IMAGE_DEBUG_TYPE_EXCEPTION 5
2495#define IMAGE_DEBUG_TYPE_FIXUP 6
2496#define IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7
2497#define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8
2498#define IMAGE_DEBUG_TYPE_BORLAND 9
2499#define IMAGE_DEBUG_TYPE_RESERVED10 10
2500
2501typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
2502 DWORD NumberOfSymbols;
2503 DWORD LvaToFirstSymbol;
2504 DWORD NumberOfLinenumbers;
2505 DWORD LvaToFirstLinenumber;
2506 DWORD RvaToFirstByteOfCode;
2507 DWORD RvaToLastByteOfCode;
2508 DWORD RvaToFirstByteOfData;
2509 DWORD RvaToLastByteOfData;
2510} IMAGE_COFF_SYMBOLS_HEADER, *PIMAGE_COFF_SYMBOLS_HEADER;
2511
2512#define FRAME_FPO 0
2513#define FRAME_TRAP 1
2514#define FRAME_TSS 2
2515#define FRAME_NONFPO 3
2516
2517typedef struct _FPO_DATA {
2518 DWORD ulOffStart;
2519 DWORD cbProcSize;
2520 DWORD cdwLocals;
2521 WORD cdwParams;
2522 unsigned cbProlog : 8;
2523 unsigned cbRegs : 3;
2524 unsigned fHasSEH : 1;
2525 unsigned fUseBP : 1;
2526 unsigned reserved : 1;
2527 unsigned cbFrame : 2;
2528} FPO_DATA, *PFPO_DATA;
2529
2530typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY {
2531 DWORD Characteristics;
2532 DWORD TimeDateStamp;
2533 WORD MajorVersion;
2534 WORD MinorVersion;
2535 DWORD GlobalFlagsClear;
2536 DWORD GlobalFlagsSet;
2537 DWORD CriticalSectionDefaultTimeout;
2538 DWORD DeCommitFreeBlockThreshold;
2539 DWORD DeCommitTotalFreeThreshold;
2540 PVOID LockPrefixTable;
2541 DWORD MaximumAllocationSize;
2542 DWORD VirtualMemoryThreshold;
2543 DWORD ProcessHeapFlags;
2544 DWORD ProcessAffinityMask;
2545 WORD CSDVersion;
2546 WORD Reserved1;
2547 PVOID EditList;
2548 DWORD Reserved[1];
2549} IMAGE_LOAD_CONFIG_DIRECTORY, *PIMAGE_LOAD_CONFIG_DIRECTORY;
2550
2551typedef struct _IMAGE_FUNCTION_ENTRY {
2552 DWORD StartingAddress;
2553 DWORD EndingAddress;
2554 DWORD EndOfPrologue;
2555} IMAGE_FUNCTION_ENTRY, *PIMAGE_FUNCTION_ENTRY;
2556
Ulrich Weigand1b4c7792000-11-07 20:29:00 +00002557#define IMAGE_DEBUG_MISC_EXENAME 1
Vincent Béron9a624912002-05-31 23:06:46 +00002558
Ulrich Weigand1b4c7792000-11-07 20:29:00 +00002559typedef struct _IMAGE_DEBUG_MISC {
2560 DWORD DataType;
2561 DWORD Length;
2562 BYTE Unicode;
2563 BYTE Reserved[ 3 ];
2564 BYTE Data[ 1 ];
2565} IMAGE_DEBUG_MISC, *PIMAGE_DEBUG_MISC;
2566
Alexandre Julliard180a0882000-04-18 11:58:24 +00002567/* This is the structure that appears at the very start of a .DBG file. */
2568
2569typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
2570 WORD Signature;
2571 WORD Flags;
2572 WORD Machine;
2573 WORD Characteristics;
2574 DWORD TimeDateStamp;
2575 DWORD CheckSum;
2576 DWORD ImageBase;
2577 DWORD SizeOfImage;
2578 DWORD NumberOfSections;
2579 DWORD ExportedNamesSize;
2580 DWORD DebugDirectorySize;
2581 DWORD SectionAlignment;
2582 DWORD Reserved[ 2 ];
2583} IMAGE_SEPARATE_DEBUG_HEADER,*PIMAGE_SEPARATE_DEBUG_HEADER;
2584
2585#define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944
2586
2587
2588typedef struct tagMESSAGE_RESOURCE_ENTRY {
2589 WORD Length;
2590 WORD Flags;
2591 BYTE Text[1];
2592} MESSAGE_RESOURCE_ENTRY,*PMESSAGE_RESOURCE_ENTRY;
2593#define MESSAGE_RESOURCE_UNICODE 0x0001
2594
2595typedef struct tagMESSAGE_RESOURCE_BLOCK {
2596 DWORD LowId;
2597 DWORD HighId;
2598 DWORD OffsetToEntries;
2599} MESSAGE_RESOURCE_BLOCK,*PMESSAGE_RESOURCE_BLOCK;
2600
2601typedef struct tagMESSAGE_RESOURCE_DATA {
2602 DWORD NumberOfBlocks;
2603 MESSAGE_RESOURCE_BLOCK Blocks[ 1 ];
2604} MESSAGE_RESOURCE_DATA,*PMESSAGE_RESOURCE_DATA;
2605
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002606/*
2607 * Here follows typedefs for security and tokens.
Vincent Béron9a624912002-05-31 23:06:46 +00002608 */
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002609
2610/*
2611 * First a constant for the following typdefs.
2612 */
2613
2614#define ANYSIZE_ARRAY 1
2615
Paul Quinnea1640f1999-03-10 18:03:53 +00002616/* FIXME: Orphan. What does it point to? */
2617typedef PVOID PACCESS_TOKEN;
2618
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002619/*
2620 * TOKEN_INFORMATION_CLASS
2621 */
2622
2623typedef enum _TOKEN_INFORMATION_CLASS {
Vincent Béron9a624912002-05-31 23:06:46 +00002624 TokenUser = 1,
2625 TokenGroups,
2626 TokenPrivileges,
2627 TokenOwner,
2628 TokenPrimaryGroup,
2629 TokenDefaultDacl,
2630 TokenSource,
2631 TokenType,
2632 TokenImpersonationLevel,
Andriy Palamarchukd86393f2002-08-26 21:39:17 +00002633 TokenStatistics,
2634 TokenRestrictedSids,
2635 TokenSessionId,
2636 TokenGroupsAndPrivileges,
2637 TokenSessionReference,
2638 TokenSandBoxInert
Vincent Béron9a624912002-05-31 23:06:46 +00002639} TOKEN_INFORMATION_CLASS;
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002640
Mike McCormack45a59962001-06-22 23:43:09 +00002641#define TOKEN_TOKEN_ADJUST_DEFAULT 0x0080
2642#define TOKEN_ADJUST_GROUPS 0x0040
2643#define TOKEN_ADJUST_PRIVILEGES 0x0020
2644#define TOKEN_ADJUST_SESSIONID 0x0100
2645#define TOKEN_ASSIGN_PRIMARY 0x0001
2646#define TOKEN_DUPLICATE 0x0002
2647#define TOKEN_EXECUTE STANDARD_RIGHTS_EXECUTE
2648#define TOKEN_IMPERSONATE 0x0004
2649#define TOKEN_QUERY 0x0008
2650#define TOKEN_QUERY_SOURCE 0x0010
2651#define TOKEN_ADJUST_DEFAULT 0x0080
2652#define TOKEN_READ (STANDARD_RIGHTS_READ|TOKEN_QUERY)
2653#define TOKEN_WRITE (STANDARD_RIGHTS_WRITE | \
2654 TOKEN_ADJUST_PRIVILEGES | \
2655 TOKEN_ADJUST_GROUPS | \
2656 TOKEN_ADJUST_DEFAULT )
2657#define TOKEN_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
2658 TOKEN_ASSIGN_PRIMARY | \
2659 TOKEN_DUPLICATE | \
2660 TOKEN_IMPERSONATE | \
2661 TOKEN_QUERY | \
2662 TOKEN_QUERY_SOURCE | \
2663 TOKEN_ADJUST_PRIVILEGES | \
2664 TOKEN_ADJUST_GROUPS | \
2665 TOKEN_ADJUST_SESSIONID | \
2666 TOKEN_ADJUST_DEFAULT )
2667
Francois Gouget87e385f1999-02-17 17:45:54 +00002668#ifndef _SECURITY_DEFINED
2669#define _SECURITY_DEFINED
2670
Juergen Schmied3426d851999-02-19 16:29:05 +00002671
Patrik Stridvall4a739731999-07-04 11:01:21 +00002672typedef DWORD ACCESS_MASK, *PACCESS_MASK;
2673
2674typedef struct _GENERIC_MAPPING {
2675 ACCESS_MASK GenericRead;
2676 ACCESS_MASK GenericWrite;
2677 ACCESS_MASK GenericExecute;
2678 ACCESS_MASK GenericAll;
2679} GENERIC_MAPPING, *PGENERIC_MAPPING;
2680
2681#ifndef SID_IDENTIFIER_AUTHORITY_DEFINED
2682#define SID_IDENTIFIER_AUTHORITY_DEFINED
Francois Gouget87e385f1999-02-17 17:45:54 +00002683typedef struct {
2684 BYTE Value[6];
Patrik Stridvallba9dc782002-11-04 22:43:24 +00002685} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;
Patrik Stridvall4a739731999-07-04 11:01:21 +00002686#endif /* !defined(SID_IDENTIFIER_AUTHORITY_DEFINED) */
Francois Gouget87e385f1999-02-17 17:45:54 +00002687
Patrik Stridvall4a739731999-07-04 11:01:21 +00002688#ifndef SID_DEFINED
2689#define SID_DEFINED
Francois Gouget87e385f1999-02-17 17:45:54 +00002690typedef struct _SID {
2691 BYTE Revision;
2692 BYTE SubAuthorityCount;
2693 SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
2694 DWORD SubAuthority[1];
2695} SID,*PSID;
Patrik Stridvall4a739731999-07-04 11:01:21 +00002696#endif /* !defined(SID_DEFINED) */
Francois Gouget87e385f1999-02-17 17:45:54 +00002697
Juergen Schmied7f0c5f31999-03-09 17:46:10 +00002698#define SID_REVISION (1) /* Current revision */
2699#define SID_MAX_SUB_AUTHORITIES (15) /* current max subauths */
2700#define SID_RECOMMENDED_SUB_AUTHORITIES (1) /* recommended subauths */
2701
2702
Vincent Béron9a624912002-05-31 23:06:46 +00002703/*
2704 * ACL
Francois Gouget87e385f1999-02-17 17:45:54 +00002705 */
2706
Juergen Schmiedbc3c4d42000-01-12 04:59:42 +00002707#define ACL_REVISION1 1
2708#define ACL_REVISION2 2
2709#define ACL_REVISION3 3
2710#define ACL_REVISION4 4
2711
2712#define MIN_ACL_REVISION ACL_REVISION2
2713#define MAX_ACL_REVISION ACL_REVISION4
2714
Francois Gouget87e385f1999-02-17 17:45:54 +00002715typedef struct _ACL {
2716 BYTE AclRevision;
2717 BYTE Sbz1;
2718 WORD AclSize;
2719 WORD AceCount;
2720 WORD Sbz2;
2721} ACL, *PACL;
2722
736ff982003-06-16 19:44:06 +00002723typedef enum _ACL_INFORMATION_CLASS
2724{
2725 AclRevisionInformation = 1,
2726 AclSizeInformation
2727} ACL_INFORMATION_CLASS;
2728
Ulrich Czekallafd5e8112003-11-11 22:03:24 +00002729typedef struct _ACL_REVISION_INFORMATION
2730{
2731 DWORD AclRevision;
2732} ACL_REVISION_INFORMATION, *PACL_REVISION_INFORMATION;
2733
2734typedef struct _ACL_SIZE_INFORMATION
2735{
2736 DWORD AceCount;
2737 DWORD AclBytesInUse;
2738 DWORD AclBytesFree;
2739} ACL_SIZE_INFORMATION, *PACL_SIZE_INFORMATION;
2740
Juergen Schmied3426d851999-02-19 16:29:05 +00002741/* SECURITY_DESCRIPTOR */
2742#define SECURITY_DESCRIPTOR_REVISION 1
2743#define SECURITY_DESCRIPTOR_REVISION1 1
2744
2745
Dimitrie O. Pauna5246c62002-12-19 21:12:35 +00002746/*
2747 * Privilege Names
2748 */
2749#define SE_CREATE_TOKEN_NAME TEXT("SeCreateTokenPrivilege")
2750#define SE_ASSIGNPRIMARYTOKEN_NAME TEXT("SeAssignPrimaryTokenPrivilege")
2751#define SE_LOCK_MEMORY_NAME TEXT("SeLockMemoryPrivilege")
2752#define SE_INCREASE_QUOTA_NAME TEXT("SeIncreaseQuotaPrivilege")
2753#define SE_UNSOLICITED_INPUT_NAME TEXT("SeUnsolicitedInputPrivilege")
2754#define SE_MACHINE_ACCOUNT_NAME TEXT("SeMachineAccountPrivilege")
2755#define SE_TCB_NAME TEXT("SeTcbPrivilege")
2756#define SE_SECURITY_NAME TEXT("SeSecurityPrivilege")
2757#define SE_TAKE_OWNERSHIP_NAME TEXT("SeTakeOwnershipPrivilege")
2758#define SE_LOAD_DRIVER_NAME TEXT("SeLoadDriverPrivilege")
2759#define SE_SYSTEM_PROFILE_NAME TEXT("SeSystemProfilePrivilege")
2760#define SE_SYSTEMTIME_NAME TEXT("SeSystemtimePrivilege")
2761#define SE_PROF_SINGLE_PROCESS_NAME TEXT("SeProfileSingleProcessPrivilege")
2762#define SE_INC_BASE_PRIORITY_NAME TEXT("SeIncreaseBasePriorityPrivilege")
2763#define SE_CREATE_PAGEFILE_NAME TEXT("SeCreatePagefilePrivilege")
2764#define SE_CREATE_PERMANENT_NAME TEXT("SeCreatePermanentPrivilege")
2765#define SE_BACKUP_NAME TEXT("SeBackupPrivilege")
2766#define SE_RESTORE_NAME TEXT("SeRestorePrivilege")
2767#define SE_SHUTDOWN_NAME TEXT("SeShutdownPrivilege")
2768#define SE_DEBUG_NAME TEXT("SeDebugPrivilege")
2769#define SE_AUDIT_NAME TEXT("SeAuditPrivilege")
2770#define SE_SYSTEM_ENVIRONMENT_NAME TEXT("SeSystemEnvironmentPrivilege")
2771#define SE_CHANGE_NOTIFY_NAME TEXT("SeChangeNotifyPrivilege")
2772#define SE_REMOTE_SHUTDOWN_NAME TEXT("SeRemoteShutdownPrivilege")
2773
2774#define SE_GROUP_MANDATORY 0x00000001
2775#define SE_GROUP_ENABLED_BY_DEFAULT 0x00000002
2776#define SE_GROUP_ENABLED 0x00000004
2777#define SE_GROUP_OWNER 0x00000008
2778#define SE_GROUP_USE_FOR_DENY_ONLY 0x00000010
2779#define SE_GROUP_LOGON_ID 0xC0000000
2780#define SE_GROUP_RESOURCE 0x20000000
2781
2782#define SE_PRIVILEGE_ENABLED_BY_DEFAULT 0x00000001
2783#define SE_PRIVILEGE_ENABLED 0x00000002
2784#define SE_PRIVILEGE_USED_FOR_ACCESS 0x80000000
2785
2786#define SE_OWNER_DEFAULTED 0x00000001
2787#define SE_GROUP_DEFAULTED 0x00000002
2788#define SE_DACL_PRESENT 0x00000004
2789#define SE_DACL_DEFAULTED 0x00000008
2790#define SE_SACL_PRESENT 0x00000010
2791#define SE_SACL_DEFAULTED 0x00000020
2792#define SE_DACL_AUTO_INHERIT_REQ 0x00000100
2793#define SE_SACL_AUTO_INHERIT_REQ 0x00000200
2794#define SE_DACL_AUTO_INHERITED 0x00000400
2795#define SE_SACL_AUTO_INHERITED 0x00000800
2796#define SE_DACL_PROTECTED 0x00001000
2797#define SE_SACL_PROTECTED 0x00002000
2798#define SE_SELF_RELATIVE 0x00008000
Juergen Schmied3426d851999-02-19 16:29:05 +00002799
Patrik Stridvall4a739731999-07-04 11:01:21 +00002800typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;
2801typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
Francois Gouget87e385f1999-02-17 17:45:54 +00002802
2803/* The security descriptor structure */
2804typedef struct {
2805 BYTE Revision;
2806 BYTE Sbz1;
2807 SECURITY_DESCRIPTOR_CONTROL Control;
Juergen Schmiedbc3c4d42000-01-12 04:59:42 +00002808 DWORD Owner;
2809 DWORD Group;
2810 DWORD Sacl;
2811 DWORD Dacl;
2812} SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
2813
2814typedef struct {
2815 BYTE Revision;
2816 BYTE Sbz1;
2817 SECURITY_DESCRIPTOR_CONTROL Control;
Francois Gouget87e385f1999-02-17 17:45:54 +00002818 PSID Owner;
2819 PSID Group;
2820 PACL Sacl;
2821 PACL Dacl;
2822} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;
2823
Vincent Béron9a624912002-05-31 23:06:46 +00002824#define SECURITY_DESCRIPTOR_MIN_LENGTH (sizeof(SECURITY_DESCRIPTOR))
Juergen Schmied3426d851999-02-19 16:29:05 +00002825
Francois Gouget87e385f1999-02-17 17:45:54 +00002826#endif /* _SECURITY_DEFINED */
2827
Vincent Béron9a624912002-05-31 23:06:46 +00002828/*
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002829 * SID_AND_ATTRIBUTES
2830 */
2831
2832typedef struct _SID_AND_ATTRIBUTES {
Vincent Béron9a624912002-05-31 23:06:46 +00002833 PSID Sid;
2834 DWORD Attributes;
Andreas Mohr114b6672003-04-02 01:23:43 +00002835} SID_AND_ATTRIBUTES;
Vincent Béron9a624912002-05-31 23:06:46 +00002836
Juergen Schmied044db461999-12-11 23:19:54 +00002837/* security entities */
2838#define SECURITY_NULL_RID (0x00000000L)
2839#define SECURITY_WORLD_RID (0x00000000L)
2840#define SECURITY_LOCAL_RID (0X00000000L)
2841
2842#define SECURITY_NULL_SID_AUTHORITY {0,0,0,0,0,0}
2843
2844/* S-1-1 */
2845#define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1}
2846
2847/* S-1-2 */
2848#define SECURITY_LOCAL_SID_AUTHORITY {0,0,0,0,0,2}
2849
2850/* S-1-3 */
2851#define SECURITY_CREATOR_SID_AUTHORITY {0,0,0,0,0,3}
Vincent Béron9a624912002-05-31 23:06:46 +00002852#define SECURITY_CREATOR_OWNER_RID (0x00000000L)
Juergen Schmied044db461999-12-11 23:19:54 +00002853#define SECURITY_CREATOR_GROUP_RID (0x00000001L)
2854#define SECURITY_CREATOR_OWNER_SERVER_RID (0x00000002L)
2855#define SECURITY_CREATOR_GROUP_SERVER_RID (0x00000003L)
2856
2857/* S-1-4 */
2858#define SECURITY_NON_UNIQUE_AUTHORITY {0,0,0,0,0,4}
2859
2860/* S-1-5 */
Vincent Béron9a624912002-05-31 23:06:46 +00002861#define SECURITY_NT_AUTHORITY {0,0,0,0,0,5}
Juergen Schmiedbc3c4d42000-01-12 04:59:42 +00002862#define SECURITY_DIALUP_RID 0x00000001L
2863#define SECURITY_NETWORK_RID 0x00000002L
2864#define SECURITY_BATCH_RID 0x00000003L
2865#define SECURITY_INTERACTIVE_RID 0x00000004L
2866#define SECURITY_LOGON_IDS_RID 0x00000005L
2867#define SECURITY_SERVICE_RID 0x00000006L
2868#define SECURITY_ANONYMOUS_LOGON_RID 0x00000007L
2869#define SECURITY_PROXY_RID 0x00000008L
2870#define SECURITY_ENTERPRISE_CONTROLLERS_RID 0x00000009L
2871#define SECURITY_PRINCIPAL_SELF_RID 0x0000000AL
2872#define SECURITY_AUTHENTICATED_USER_RID 0x0000000BL
2873#define SECURITY_RESTRICTED_CODE_RID 0x0000000CL
2874#define SECURITY_TERMINAL_SERVER_RID 0x0000000DL
2875#define SECURITY_LOCAL_SYSTEM_RID 0x00000012L
2876#define SECURITY_NT_NON_UNIQUE 0x00000015L
2877#define SECURITY_BUILTIN_DOMAIN_RID 0x00000020L
2878
2879#define DOMAIN_GROUP_RID_ADMINS 0x00000200L
2880#define DOMAIN_GROUP_RID_USERS 0x00000201L
2881#define DOMAIN_GROUP_RID_GUESTS 0x00000202L
2882
2883#define DOMAIN_ALIAS_RID_ADMINS 0x00000220L
2884#define DOMAIN_ALIAS_RID_USERS 0x00000221L
2885#define DOMAIN_ALIAS_RID_GUESTS 0x00000222L
Juergen Schmied044db461999-12-11 23:19:54 +00002886
2887#define SECURITY_SERVER_LOGON_RID SECURITY_ENTERPRISE_CONTROLLERS_RID
2888
2889#define SECURITY_LOGON_IDS_RID_COUNT (3L)
2890
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002891/*
2892 * TOKEN_USER
2893 */
2894
2895typedef struct _TOKEN_USER {
Vincent Béron9a624912002-05-31 23:06:46 +00002896 SID_AND_ATTRIBUTES User;
2897} TOKEN_USER;
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002898
2899/*
2900 * TOKEN_GROUPS
2901 */
2902
2903typedef struct _TOKEN_GROUPS {
Vincent Béron9a624912002-05-31 23:06:46 +00002904 DWORD GroupCount;
2905 SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY];
2906} TOKEN_GROUPS;
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002907
2908/*
2909 * LUID_AND_ATTRIBUTES
2910 */
2911
Patrik Stridvall311e4561999-09-19 14:20:33 +00002912typedef union _LARGE_INTEGER {
2913 struct {
Gregg Mattinsond736e822002-05-29 00:33:07 +00002914#ifdef WORDS_BIGENDIAN
2915 LONG HighPart;
2916 DWORD LowPart;
2917#else
Patrik Stridvall311e4561999-09-19 14:20:33 +00002918 DWORD LowPart;
2919 LONG HighPart;
Gregg Mattinsond736e822002-05-29 00:33:07 +00002920#endif
Patrik Stridvall311e4561999-09-19 14:20:33 +00002921 } DUMMYSTRUCTNAME;
2922 LONGLONG QuadPart;
Patrik Stridvallba9dc782002-11-04 22:43:24 +00002923} LARGE_INTEGER, *PLARGE_INTEGER;
Michael Veksler17822f41999-02-09 15:46:25 +00002924
Patrik Stridvall311e4561999-09-19 14:20:33 +00002925typedef union _ULARGE_INTEGER {
2926 struct {
Gregg Mattinsond736e822002-05-29 00:33:07 +00002927#ifdef WORDS_BIGENDIAN
2928 DWORD HighPart;
2929 DWORD LowPart;
2930#else
Patrik Stridvall311e4561999-09-19 14:20:33 +00002931 DWORD LowPart;
Alexandre Julliardd76f9f92000-10-01 01:40:42 +00002932 DWORD HighPart;
Gregg Mattinsond736e822002-05-29 00:33:07 +00002933#endif
Patrik Stridvall311e4561999-09-19 14:20:33 +00002934 } DUMMYSTRUCTNAME;
Alexandre Julliardd76f9f92000-10-01 01:40:42 +00002935 ULONGLONG QuadPart;
Patrik Stridvallba9dc782002-11-04 22:43:24 +00002936} ULARGE_INTEGER, *PULARGE_INTEGER;
Michael Veksler17822f41999-02-09 15:46:25 +00002937
Paul Quinnea1640f1999-03-10 18:03:53 +00002938/*
2939 * Locally Unique Identifier
2940 */
2941
Francois Gougetea31cf02001-11-20 18:52:20 +00002942typedef struct _LUID {
2943 DWORD LowPart;
2944 LONG HighPart;
2945} LUID, *PLUID;
Michael Veksler17822f41999-02-09 15:46:25 +00002946
Dimitrie O. Paun53f9c212003-08-28 21:43:34 +00002947#include <pshpack4.h>
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002948typedef struct _LUID_AND_ATTRIBUTES {
Francois Gougetea31cf02001-11-20 18:52:20 +00002949 LUID Luid;
2950 DWORD Attributes;
Thomas Mertes0ce48262003-04-08 00:55:36 +00002951} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
Dimitrie O. Paun53f9c212003-08-28 21:43:34 +00002952#include <poppack.h>
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002953
2954/*
Patrik Stridvall4a739731999-07-04 11:01:21 +00002955 * PRIVILEGE_SET
2956 */
2957
2958typedef struct _PRIVILEGE_SET {
2959 DWORD PrivilegeCount;
2960 DWORD Control;
2961 LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
2962} PRIVILEGE_SET, *PPRIVILEGE_SET;
2963
2964/*
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002965 * TOKEN_PRIVILEGES
2966 */
2967
2968typedef struct _TOKEN_PRIVILEGES {
Vincent Béron9a624912002-05-31 23:06:46 +00002969 DWORD PrivilegeCount;
2970 LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
2971} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002972
2973/*
2974 * TOKEN_OWNER
2975 */
2976
2977typedef struct _TOKEN_OWNER {
Vincent Béron9a624912002-05-31 23:06:46 +00002978 PSID Owner;
2979} TOKEN_OWNER;
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002980
2981/*
2982 * TOKEN_PRIMARY_GROUP
2983 */
2984
2985typedef struct _TOKEN_PRIMARY_GROUP {
Vincent Béron9a624912002-05-31 23:06:46 +00002986 PSID PrimaryGroup;
2987} TOKEN_PRIMARY_GROUP;
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002988
Paul Quinnea1640f1999-03-10 18:03:53 +00002989
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002990/*
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002991 * TOKEN_DEFAULT_DACL
2992 */
2993
Vincent Béron9a624912002-05-31 23:06:46 +00002994typedef struct _TOKEN_DEFAULT_DACL {
2995 PACL DefaultDacl;
2996} TOKEN_DEFAULT_DACL;
Alexandre Julliardf90efa91998-06-14 15:24:15 +00002997
2998/*
2999 * TOKEN_SOURCEL
3000 */
3001
Patrik Stridvall1298eb42002-10-23 18:50:10 +00003002#define TOKEN_SOURCE_LENGTH 8
3003
Alexandre Julliardf90efa91998-06-14 15:24:15 +00003004typedef struct _TOKEN_SOURCE {
Patrik Stridvall1298eb42002-10-23 18:50:10 +00003005 char SourceName[TOKEN_SOURCE_LENGTH];
Vincent Béron9a624912002-05-31 23:06:46 +00003006 LUID SourceIdentifier;
3007} TOKEN_SOURCE;
Alexandre Julliardf90efa91998-06-14 15:24:15 +00003008
3009/*
3010 * TOKEN_TYPE
3011 */
3012
3013typedef enum tagTOKEN_TYPE {
Vincent Béron9a624912002-05-31 23:06:46 +00003014 TokenPrimary = 1,
3015 TokenImpersonation
3016} TOKEN_TYPE;
Alexandre Julliardf90efa91998-06-14 15:24:15 +00003017
3018/*
3019 * SECURITY_IMPERSONATION_LEVEL
3020 */
3021
3022typedef enum _SECURITY_IMPERSONATION_LEVEL {
Vincent Béron9a624912002-05-31 23:06:46 +00003023 SecurityAnonymous,
3024 SecurityIdentification,
3025 SecurityImpersonation,
3026 SecurityDelegation
3027} SECURITY_IMPERSONATION_LEVEL, *PSECURITY_IMPERSONATION_LEVEL;
Alexandre Julliardf90efa91998-06-14 15:24:15 +00003028
3029
Keith Matthews39796471999-03-13 12:53:39 +00003030typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,
3031 * PSECURITY_CONTEXT_TRACKING_MODE;
Patrik Stridvall0f8bc5b1999-04-22 16:27:50 +00003032/*
3033 * Quality of Service
3034 */
Keith Matthews39796471999-03-13 12:53:39 +00003035
3036typedef struct _SECURITY_QUALITY_OF_SERVICE {
3037 DWORD Length;
3038 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
3039 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
Dmitry Timoshkov6b6596a2001-11-23 18:44:43 +00003040 BOOLEAN EffectiveOnly;
Keith Matthews39796471999-03-13 12:53:39 +00003041} SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
Francois Gouget87e385f1999-02-17 17:45:54 +00003042
Alexandre Julliardf90efa91998-06-14 15:24:15 +00003043/*
3044 * TOKEN_STATISTICS
3045 */
3046
3047typedef struct _TOKEN_STATISTICS {
Vincent Béron9a624912002-05-31 23:06:46 +00003048 LUID TokenId;
3049 LUID AuthenticationId;
3050 LARGE_INTEGER ExpirationTime;
3051 TOKEN_TYPE TokenType;
3052 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
3053 DWORD DynamicCharged;
3054 DWORD DynamicAvailable;
3055 DWORD GroupCount;
3056 DWORD PrivilegeCount;
3057 LUID ModifiedId;
3058} TOKEN_STATISTICS;
Alexandre Julliardf90efa91998-06-14 15:24:15 +00003059
Vincent Béron9a624912002-05-31 23:06:46 +00003060/*
3061 * ACLs of NT
Juergen Schmied7f0c5f31999-03-09 17:46:10 +00003062 */
3063
3064#define ACL_REVISION 2
3065
3066#define ACL_REVISION1 1
3067#define ACL_REVISION2 2
3068
3069/* ACEs, directly starting after an ACL */
3070typedef struct _ACE_HEADER {
3071 BYTE AceType;
3072 BYTE AceFlags;
3073 WORD AceSize;
3074} ACE_HEADER,*PACE_HEADER;
3075
3076/* AceType */
3077#define ACCESS_ALLOWED_ACE_TYPE 0
3078#define ACCESS_DENIED_ACE_TYPE 1
3079#define SYSTEM_AUDIT_ACE_TYPE 2
3080#define SYSTEM_ALARM_ACE_TYPE 3
3081
3082/* inherit AceFlags */
3083#define OBJECT_INHERIT_ACE 0x01
3084#define CONTAINER_INHERIT_ACE 0x02
3085#define NO_PROPAGATE_INHERIT_ACE 0x04
3086#define INHERIT_ONLY_ACE 0x08
Ulrich Czekallafd5e8112003-11-11 22:03:24 +00003087#define INHERITED_ACE 0x10
Juergen Schmied7f0c5f31999-03-09 17:46:10 +00003088#define VALID_INHERIT_FLAGS 0x0F
3089
3090/* AceFlags mask for what events we (should) audit */
3091#define SUCCESSFUL_ACCESS_ACE_FLAG 0x40
3092#define FAILED_ACCESS_ACE_FLAG 0x80
3093
Vincent Béron9a624912002-05-31 23:06:46 +00003094/* different ACEs depending on AceType
Juergen Schmied7f0c5f31999-03-09 17:46:10 +00003095 * SidStart marks the begin of a SID
3096 * so the thing finally looks like this:
3097 * 0: ACE_HEADER
3098 * 4: ACCESS_MASK
3099 * 8... : SID
3100 */
3101typedef struct _ACCESS_ALLOWED_ACE {
3102 ACE_HEADER Header;
3103 DWORD Mask;
3104 DWORD SidStart;
3105} ACCESS_ALLOWED_ACE,*PACCESS_ALLOWED_ACE;
3106
3107typedef struct _ACCESS_DENIED_ACE {
3108 ACE_HEADER Header;
3109 DWORD Mask;
3110 DWORD SidStart;
3111} ACCESS_DENIED_ACE,*PACCESS_DENIED_ACE;
3112
3113typedef struct _SYSTEM_AUDIT_ACE {
3114 ACE_HEADER Header;
3115 DWORD Mask;
3116 DWORD SidStart;
3117} SYSTEM_AUDIT_ACE,*PSYSTEM_AUDIT_ACE;
3118
3119typedef struct _SYSTEM_ALARM_ACE {
3120 ACE_HEADER Header;
3121 DWORD Mask;
3122 DWORD SidStart;
3123} SYSTEM_ALARM_ACE,*PSYSTEM_ALARM_ACE;
3124
3125typedef enum tagSID_NAME_USE {
3126 SidTypeUser = 1,
3127 SidTypeGroup,
3128 SidTypeDomain,
3129 SidTypeAlias,
3130 SidTypeWellKnownGroup,
3131 SidTypeDeletedAccount,
3132 SidTypeInvalid,
3133 SidTypeUnknown
3134} SID_NAME_USE,*PSID_NAME_USE;
3135
Alexandre Julliard03468f71998-02-15 19:40:49 +00003136/* Access rights */
3137
Gerald Pfeifer43bcf402000-05-23 21:13:04 +00003138/* DELETE may be already defined via /usr/include/arpa/nameser_compat.h */
3139#undef DELETE
Alexandre Julliard03468f71998-02-15 19:40:49 +00003140#define DELETE 0x00010000
3141#define READ_CONTROL 0x00020000
3142#define WRITE_DAC 0x00040000
3143#define WRITE_OWNER 0x00080000
3144#define SYNCHRONIZE 0x00100000
3145#define STANDARD_RIGHTS_REQUIRED 0x000f0000
3146
3147#define STANDARD_RIGHTS_READ READ_CONTROL
3148#define STANDARD_RIGHTS_WRITE READ_CONTROL
3149#define STANDARD_RIGHTS_EXECUTE READ_CONTROL
3150
3151#define STANDARD_RIGHTS_ALL 0x001f0000
3152
3153#define SPECIFIC_RIGHTS_ALL 0x0000ffff
3154
3155#define GENERIC_READ 0x80000000
3156#define GENERIC_WRITE 0x40000000
3157#define GENERIC_EXECUTE 0x20000000
3158#define GENERIC_ALL 0x10000000
3159
Alexandre Julliard2fab2ef1999-11-23 19:41:34 +00003160#define MAXIMUM_ALLOWED 0x02000000
3161#define ACCESS_SYSTEM_SECURITY 0x01000000
3162
Alexandre Julliard03468f71998-02-15 19:40:49 +00003163#define EVENT_MODIFY_STATE 0x0002
3164#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
3165
3166#define SEMAPHORE_MODIFY_STATE 0x0002
3167#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
3168
3169#define MUTEX_MODIFY_STATE 0x0001
3170#define MUTEX_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1)
3171
Alexandre Julliardea1afce2000-08-22 20:08:37 +00003172#define TIMER_QUERY_STATE 0x0001
3173#define TIMER_MODIFY_STATE 0x0002
3174#define TIMER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
3175
Alexandre Julliard03468f71998-02-15 19:40:49 +00003176#define PROCESS_TERMINATE 0x0001
3177#define PROCESS_CREATE_THREAD 0x0002
3178#define PROCESS_VM_OPERATION 0x0008
3179#define PROCESS_VM_READ 0x0010
3180#define PROCESS_VM_WRITE 0x0020
3181#define PROCESS_DUP_HANDLE 0x0040
3182#define PROCESS_CREATE_PROCESS 0x0080
3183#define PROCESS_SET_QUOTA 0x0100
3184#define PROCESS_SET_INFORMATION 0x0200
3185#define PROCESS_QUERY_INFORMATION 0x0400
3186#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xfff)
3187
3188#define THREAD_TERMINATE 0x0001
3189#define THREAD_SUSPEND_RESUME 0x0002
3190#define THREAD_GET_CONTEXT 0x0008
3191#define THREAD_SET_CONTEXT 0x0010
3192#define THREAD_SET_INFORMATION 0x0020
3193#define THREAD_QUERY_INFORMATION 0x0040
3194#define THREAD_SET_THREAD_TOKEN 0x0080
3195#define THREAD_IMPERSONATE 0x0100
3196#define THREAD_DIRECT_IMPERSONATION 0x0200
3197#define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3ff)
3198
Vincent Béron9a624912002-05-31 23:06:46 +00003199#define THREAD_BASE_PRIORITY_LOWRT 15
3200#define THREAD_BASE_PRIORITY_MAX 2
Paul Quinnea1640f1999-03-10 18:03:53 +00003201#define THREAD_BASE_PRIORITY_MIN -2
3202#define THREAD_BASE_PRIORITY_IDLE -15
3203
Alexandre Julliard341b7dc2002-09-17 18:54:42 +00003204#define SECTION_QUERY 0x0001
3205#define SECTION_MAP_WRITE 0x0002
3206#define SECTION_MAP_READ 0x0004
3207#define SECTION_MAP_EXECUTE 0x0008
3208#define SECTION_EXTEND_SIZE 0x0010
3209#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|0x01f)
3210
Alexandre Julliard03468f71998-02-15 19:40:49 +00003211#define FILE_READ_DATA 0x0001 /* file & pipe */
3212#define FILE_LIST_DIRECTORY 0x0001 /* directory */
3213#define FILE_WRITE_DATA 0x0002 /* file & pipe */
3214#define FILE_ADD_FILE 0x0002 /* directory */
3215#define FILE_APPEND_DATA 0x0004 /* file */
3216#define FILE_ADD_SUBDIRECTORY 0x0004 /* directory */
3217#define FILE_CREATE_PIPE_INSTANCE 0x0004 /* named pipe */
3218#define FILE_READ_EA 0x0008 /* file & directory */
3219#define FILE_READ_PROPERTIES FILE_READ_EA
3220#define FILE_WRITE_EA 0x0010 /* file & directory */
3221#define FILE_WRITE_PROPERTIES FILE_WRITE_EA
3222#define FILE_EXECUTE 0x0020 /* file */
3223#define FILE_TRAVERSE 0x0020 /* directory */
3224#define FILE_DELETE_CHILD 0x0040 /* directory */
3225#define FILE_READ_ATTRIBUTES 0x0080 /* all */
3226#define FILE_WRITE_ATTRIBUTES 0x0100 /* all */
3227#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1ff)
3228
3229#define FILE_GENERIC_READ (STANDARD_RIGHTS_READ | FILE_READ_DATA | \
3230 FILE_READ_ATTRIBUTES | FILE_READ_EA | \
3231 SYNCHRONIZE)
3232#define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | \
3233 FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | \
3234 FILE_APPEND_DATA | SYNCHRONIZE)
3235#define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE | FILE_EXECUTE | \
3236 FILE_READ_ATTRIBUTES | SYNCHRONIZE)
3237
Alexandre Julliarda845b881998-06-01 10:44:35 +00003238
Francois Gouget53532242000-05-24 21:03:48 +00003239/* File attribute flags */
Michael Veksler17822f41999-02-09 15:46:25 +00003240#define FILE_SHARE_READ 0x00000001L
3241#define FILE_SHARE_WRITE 0x00000002L
3242#define FILE_SHARE_DELETE 0x00000004L
3243#define FILE_ATTRIBUTE_READONLY 0x00000001L
3244#define FILE_ATTRIBUTE_HIDDEN 0x00000002L
3245#define FILE_ATTRIBUTE_SYSTEM 0x00000004L
3246#define FILE_ATTRIBUTE_LABEL 0x00000008L /* Not in Windows API */
3247#define FILE_ATTRIBUTE_DIRECTORY 0x00000010L
3248#define FILE_ATTRIBUTE_ARCHIVE 0x00000020L
3249#define FILE_ATTRIBUTE_NORMAL 0x00000080L
3250#define FILE_ATTRIBUTE_TEMPORARY 0x00000100L
3251#define FILE_ATTRIBUTE_ATOMIC_WRITE 0x00000200L
3252#define FILE_ATTRIBUTE_XACTION_WRITE 0x00000400L
3253#define FILE_ATTRIBUTE_COMPRESSED 0x00000800L
3254#define FILE_ATTRIBUTE_OFFLINE 0x00001000L
3255
Francois Gouget53532242000-05-24 21:03:48 +00003256/* File notification flags */
3257#define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001
3258#define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002
3259#define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004
3260#define FILE_NOTIFY_CHANGE_SIZE 0x00000008
3261#define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010
3262#define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020
3263#define FILE_NOTIFY_CHANGE_CREATION 0x00000040
3264#define FILE_NOTIFY_CHANGE_SECURITY 0x00000100
3265
3266#define FILE_ACTION_ADDED 0x00000001
3267#define FILE_ACTION_REMOVED 0x00000002
3268#define FILE_ACTION_MODIFIED 0x00000003
3269#define FILE_ACTION_RENAMED_OLD_NAME 0x00000004
3270#define FILE_ACTION_RENAMED_NEW_NAME 0x00000005
3271
3272
3273#define FILE_CASE_SENSITIVE_SEARCH 0x00000001
3274#define FILE_CASE_PRESERVED_NAMES 0x00000002
3275#define FILE_UNICODE_ON_DISK 0x00000004
3276#define FILE_PERSISTENT_ACLS 0x00000008
3277#define FILE_FILE_COMPRESSION 0x00000010
3278#define FILE_VOLUME_IS_COMPRESSED 0x00008000
3279
Michael Veksler17822f41999-02-09 15:46:25 +00003280/* File alignments (NT) */
3281#define FILE_BYTE_ALIGNMENT 0x00000000
3282#define FILE_WORD_ALIGNMENT 0x00000001
3283#define FILE_LONG_ALIGNMENT 0x00000003
3284#define FILE_QUAD_ALIGNMENT 0x00000007
3285#define FILE_OCTA_ALIGNMENT 0x0000000f
3286#define FILE_32_BYTE_ALIGNMENT 0x0000001f
3287#define FILE_64_BYTE_ALIGNMENT 0x0000003f
3288#define FILE_128_BYTE_ALIGNMENT 0x0000007f
3289#define FILE_256_BYTE_ALIGNMENT 0x000000ff
3290#define FILE_512_BYTE_ALIGNMENT 0x000001ff
3291
Mike McCormack2b2a6f32003-09-16 20:26:28 +00003292#define MAILSLOT_NO_MESSAGE ((DWORD)-1)
3293#define MAILSLOT_WAIT_FOREVER ((DWORD)-1)
3294
Andreas Mohr32a5b632000-03-26 14:41:10 +00003295#define REG_NONE 0 /* no type */
3296#define REG_SZ 1 /* string type (ASCII) */
3297#define REG_EXPAND_SZ 2 /* string, includes %ENVVAR% (expanded by caller) (ASCII) */
3298#define REG_BINARY 3 /* binary format, callerspecific */
3299/* YES, REG_DWORD == REG_DWORD_LITTLE_ENDIAN */
3300#define REG_DWORD 4 /* DWORD in little endian format */
3301#define REG_DWORD_LITTLE_ENDIAN 4 /* DWORD in little endian format */
3302#define REG_DWORD_BIG_ENDIAN 5 /* DWORD in big endian format */
3303#define REG_LINK 6 /* symbolic link (UNICODE) */
3304#define REG_MULTI_SZ 7 /* multiple strings, delimited by \0, terminated by \0\0 (ASCII) */
3305#define REG_RESOURCE_LIST 8 /* resource list? huh? */
3306#define REG_FULL_RESOURCE_DESCRIPTOR 9 /* full resource descriptor? huh? */
3307#define REG_RESOURCE_REQUIREMENTS_LIST 10
Jeff Smith9bd21c42002-12-10 19:59:33 +00003308#define REG_QWORD 11 /* QWORD in little endian format */
3309#define REG_QWORD_LITTLE_ENDIAN 11 /* QWORD in little endian format */
Andreas Mohr32a5b632000-03-26 14:41:10 +00003310
Dimitrie O. Pauncbefdef2003-08-12 18:56:54 +00003311/* ----------------------------- begin power management --------------------- */
3312
3313typedef enum _LATENCY_TIME {
3314 LT_DONT_CARE,
3315 LT_LOWEST_LATENCY
3316} LATENCY_TIME, *PLATENCY_TIME;
3317
Andreas Mohr32a5b632000-03-26 14:41:10 +00003318/* ----------------------------- begin registry ----------------------------- */
3319
Alexandre Julliarda845b881998-06-01 10:44:35 +00003320/* Registry security values */
Andreas Mohr32a5b632000-03-26 14:41:10 +00003321#define OWNER_SECURITY_INFORMATION 0x00000001
3322#define GROUP_SECURITY_INFORMATION 0x00000002
3323#define DACL_SECURITY_INFORMATION 0x00000004
3324#define SACL_SECURITY_INFORMATION 0x00000008
3325
3326#define REG_OPTION_RESERVED 0x00000000
3327#define REG_OPTION_NON_VOLATILE 0x00000000
3328#define REG_OPTION_VOLATILE 0x00000001
3329#define REG_OPTION_CREATE_LINK 0x00000002
3330#define REG_OPTION_BACKUP_RESTORE 0x00000004 /* FIXME */
3331#define REG_OPTION_OPEN_LINK 0x00000008
3332#define REG_LEGAL_OPTION (REG_OPTION_RESERVED| \
3333 REG_OPTION_NON_VOLATILE| \
3334 REG_OPTION_VOLATILE| \
3335 REG_OPTION_CREATE_LINK| \
3336 REG_OPTION_BACKUP_RESTORE| \
3337 REG_OPTION_OPEN_LINK)
3338
3339
3340#define REG_CREATED_NEW_KEY 0x00000001
3341#define REG_OPENED_EXISTING_KEY 0x00000002
3342
3343/* For RegNotifyChangeKeyValue */
Mike McCormack11f4b442002-11-25 02:47:32 +00003344#define REG_NOTIFY_CHANGE_NAME 0x01
3345#define REG_NOTIFY_CHANGE_ATTRIBUTES 0x02
3346#define REG_NOTIFY_CHANGE_LAST_SET 0x04
3347#define REG_NOTIFY_CHANGE_SECURITY 0x08
Andreas Mohr32a5b632000-03-26 14:41:10 +00003348
3349#define KEY_QUERY_VALUE 0x00000001
3350#define KEY_SET_VALUE 0x00000002
3351#define KEY_CREATE_SUB_KEY 0x00000004
3352#define KEY_ENUMERATE_SUB_KEYS 0x00000008
3353#define KEY_NOTIFY 0x00000010
3354#define KEY_CREATE_LINK 0x00000020
3355
Tony Lambregts8cf24b72003-03-12 20:14:35 +00003356/* for RegKeyRestore flags */
3357#define REG_WHOLE_HIVE_VOLATILE 0x00000001
3358#define REG_REFRESH_HIVE 0x00000002
3359#define REG_NO_LAZY_FLUSH 0x00000004
3360#define REG_FORCE_RESTORE 0x00000008
3361
Andreas Mohr32a5b632000-03-26 14:41:10 +00003362#define KEY_READ ((STANDARD_RIGHTS_READ| \
3363 KEY_QUERY_VALUE| \
3364 KEY_ENUMERATE_SUB_KEYS| \
3365 KEY_NOTIFY) \
3366 & (~SYNCHRONIZE) \
3367 )
3368#define KEY_WRITE ((STANDARD_RIGHTS_WRITE| \
3369 KEY_SET_VALUE| \
3370 KEY_CREATE_SUB_KEY) \
3371 & (~SYNCHRONIZE) \
3372 )
Alexandre Julliard28e80292002-01-12 21:17:51 +00003373#define KEY_EXECUTE ((KEY_READ) & (~SYNCHRONIZE))
Andreas Mohr32a5b632000-03-26 14:41:10 +00003374#define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL| \
3375 KEY_QUERY_VALUE| \
3376 KEY_SET_VALUE| \
3377 KEY_CREATE_SUB_KEY| \
3378 KEY_ENUMERATE_SUB_KEYS| \
3379 KEY_NOTIFY| \
3380 KEY_CREATE_LINK) \
3381 & (~SYNCHRONIZE) \
3382 )
3383/* ------------------------------ end registry ------------------------------ */
3384
Alexandre Julliarda845b881998-06-01 10:44:35 +00003385
Peter Hunnisett565b0082000-09-19 02:43:00 +00003386#define EVENTLOG_SUCCESS 0x0000
3387#define EVENTLOG_ERROR_TYPE 0x0001
3388#define EVENTLOG_WARNING_TYPE 0x0002
3389#define EVENTLOG_INFORMATION_TYPE 0x0004
3390#define EVENTLOG_AUDIT_SUCCESS 0x0008
3391#define EVENTLOG_AUDIT_FAILURE 0x0010
3392
3393#define SERVICE_BOOT_START 0x00000000
3394#define SERVICE_SYSTEM_START 0x00000001
3395#define SERVICE_AUTO_START 0x00000002
3396#define SERVICE_DEMAND_START 0x00000003
3397#define SERVICE_DISABLED 0x00000004
3398
3399#define SERVICE_ERROR_IGNORE 0x00000000
3400#define SERVICE_ERROR_NORMAL 0x00000001
3401#define SERVICE_ERROR_SEVERE 0x00000002
3402#define SERVICE_ERROR_CRITICAL 0x00000003
3403
3404/* Service types */
3405#define SERVICE_KERNEL_DRIVER 0x00000001
3406#define SERVICE_FILE_SYSTEM_DRIVER 0x00000002
3407#define SERVICE_ADAPTER 0x00000004
3408#define SERVICE_RECOGNIZER_DRIVER 0x00000008
3409
3410#define SERVICE_DRIVER ( SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | \
3411 SERVICE_RECOGNIZER_DRIVER )
3412
3413#define SERVICE_WIN32_OWN_PROCESS 0x00000010
3414#define SERVICE_WIN32_SHARE_PROCESS 0x00000020
3415#define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS)
3416
3417#define SERVICE_INTERACTIVE_PROCESS 0x00000100
3418
3419#define SERVICE_TYPE_ALL ( SERVICE_WIN32 | SERVICE_ADAPTER | \
3420 SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS )
3421
3422
Vincent Béron9a624912002-05-31 23:06:46 +00003423typedef enum _CM_SERVICE_NODE_TYPE
Peter Hunnisett565b0082000-09-19 02:43:00 +00003424{
3425 DriverType = SERVICE_KERNEL_DRIVER,
3426 FileSystemType = SERVICE_FILE_SYSTEM_DRIVER,
3427 Win32ServiceOwnProcess = SERVICE_WIN32_OWN_PROCESS,
3428 Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,
3429 AdapterType = SERVICE_ADAPTER,
3430 RecognizerType = SERVICE_RECOGNIZER_DRIVER
3431} SERVICE_NODE_TYPE;
3432
Vincent Béron9a624912002-05-31 23:06:46 +00003433typedef enum _CM_SERVICE_LOAD_TYPE
Peter Hunnisett565b0082000-09-19 02:43:00 +00003434{
3435 BootLoad = SERVICE_BOOT_START,
3436 SystemLoad = SERVICE_SYSTEM_START,
3437 AutoLoad = SERVICE_AUTO_START,
3438 DemandLoad = SERVICE_DEMAND_START,
3439 DisableLoad = SERVICE_DISABLED
3440} SERVICE_LOAD_TYPE;
3441
Vincent Béron9a624912002-05-31 23:06:46 +00003442typedef enum _CM_ERROR_CONTROL_TYPE
Peter Hunnisett565b0082000-09-19 02:43:00 +00003443{
3444 IgnoreError = SERVICE_ERROR_IGNORE,
3445 NormalError = SERVICE_ERROR_NORMAL,
3446 SevereError = SERVICE_ERROR_SEVERE,
3447 CriticalError = SERVICE_ERROR_CRITICAL
3448} SERVICE_ERROR_TYPE;
3449
3450
3451
Juergen Schmied9f50d042000-02-26 19:35:50 +00003452#define RtlEqualMemory(Destination, Source, Length) (!memcmp((Destination),(Source),(Length)))
3453#define RtlMoveMemory(Destination, Source, Length) memmove((Destination),(Source),(Length))
3454#define RtlCopyMemory(Destination, Source, Length) memcpy((Destination),(Source),(Length))
3455#define RtlFillMemory(Destination, Length, Fill) memset((Destination),(Fill),(Length))
3456#define RtlZeroMemory(Destination, Length) memset((Destination),0,(Length))
3457
Dimitrie O. Paun53f9c212003-08-28 21:43:34 +00003458#include <guiddef.h>
Francois Gouget5e4b7de2000-10-13 23:13:01 +00003459
Ulrich Czekallafd5e8112003-11-11 22:03:24 +00003460typedef struct _OBJECT_TYPE_LIST {
3461 WORD Level;
3462 WORD Sbz;
3463 GUID *ObjectType;
3464} OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST;
3465
Vincent Béron9a624912002-05-31 23:06:46 +00003466typedef struct _RTL_CRITICAL_SECTION_DEBUG
Josh DuBois9f758cc2001-02-20 00:49:12 +00003467{
3468 WORD Type;
3469 WORD CreatorBackTraceIndex;
3470 struct _RTL_CRITICAL_SECTION *CriticalSection;
3471 LIST_ENTRY ProcessLocksList;
3472 DWORD EntryCount;
3473 DWORD ContentionCount;
3474 DWORD Spare[ 2 ];
3475} RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;
3476
3477typedef struct _RTL_CRITICAL_SECTION {
3478 PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
3479 LONG LockCount;
3480 LONG RecursionCount;
3481 HANDLE OwningThread;
3482 HANDLE LockSemaphore;
3483 ULONG_PTR SpinCount;
3484} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
3485
Steve Lustbader57951432002-10-07 21:46:02 +00003486typedef VOID (NTAPI * WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN );
3487
Eric Pouechc3e6c092003-09-19 00:06:45 +00003488typedef struct _IO_COUNTERS {
3489 ULONGLONG ReadOperationCount;
3490 ULONGLONG WriteOperationCount;
3491 ULONGLONG OtherOperationCount;
3492 ULONGLONG ReadTransferCount;
3493 ULONGLONG WriteTransferCount;
3494 ULONGLONG OtherTransferCount;
3495} IO_COUNTERS;
3496typedef IO_COUNTERS *PIO_COUNTERS;
3497
Alexandre Julliard240b0a92003-09-24 05:26:00 +00003498typedef struct {
3499 DWORD dwOSVersionInfoSize;
3500 DWORD dwMajorVersion;
3501 DWORD dwMinorVersion;
3502 DWORD dwBuildNumber;
3503 DWORD dwPlatformId;
3504 CHAR szCSDVersion[128];
3505} OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
3506
3507typedef struct {
3508 DWORD dwOSVersionInfoSize;
3509 DWORD dwMajorVersion;
3510 DWORD dwMinorVersion;
3511 DWORD dwBuildNumber;
3512 DWORD dwPlatformId;
3513 WCHAR szCSDVersion[128];
3514} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
3515
3516DECL_WINELIB_TYPE_AW(OSVERSIONINFO)
3517DECL_WINELIB_TYPE_AW(POSVERSIONINFO)
3518DECL_WINELIB_TYPE_AW(LPOSVERSIONINFO)
3519
3520typedef struct {
3521 DWORD dwOSVersionInfoSize;
3522 DWORD dwMajorVersion;
3523 DWORD dwMinorVersion;
3524 DWORD dwBuildNumber;
3525 DWORD dwPlatformId;
3526 CHAR szCSDVersion[128];
3527 WORD wServicePackMajor;
3528 WORD wServicePackMinor;
3529 WORD wSuiteMask;
3530 BYTE wProductType;
3531 BYTE wReserved;
3532} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
3533
3534typedef struct {
3535 DWORD dwOSVersionInfoSize;
3536 DWORD dwMajorVersion;
3537 DWORD dwMinorVersion;
3538 DWORD dwBuildNumber;
3539 DWORD dwPlatformId;
3540 WCHAR szCSDVersion[128];
3541 WORD wServicePackMajor;
3542 WORD wServicePackMinor;
3543 WORD wSuiteMask;
3544 BYTE wProductType;
3545 BYTE wReserved;
3546} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
3547
3548DECL_WINELIB_TYPE_AW(OSVERSIONINFOEX)
3549DECL_WINELIB_TYPE_AW(POSVERSIONINFOEX)
3550DECL_WINELIB_TYPE_AW(LPOSVERSIONINFOEX)
3551
3552ULONGLONG WINAPI VerSetConditionMask(ULONGLONG,DWORD,BYTE);
3553
3554#define VER_SET_CONDITION(_m_,_t_,_c_) ((_m_)=VerSetConditionMask((_m_),(_t_),(_c_)))
3555
3556#define VER_PLATFORM_WIN32s 0
3557#define VER_PLATFORM_WIN32_WINDOWS 1
3558#define VER_PLATFORM_WIN32_NT 2
3559
3560#define VER_MINORVERSION 0x00000001
3561#define VER_MAJORVERSION 0x00000002
3562#define VER_BUILDNUMBER 0x00000004
3563#define VER_PLATFORMID 0x00000008
3564#define VER_SERVICEPACKMINOR 0x00000010
3565#define VER_SERVICEPACKMAJOR 0x00000020
3566#define VER_SUITENAME 0x00000040
3567#define VER_PRODUCT_TYPE 0x00000080
3568
3569#define VER_NT_WORKSTATION 1
3570#define VER_NT_DOMAIN_CONTROLLER 2
3571#define VER_NT_SERVER 3
3572
3573#define VER_SUITE_SMALLBUSINESS 0x00000001
3574#define VER_SUITE_ENTERPRISE 0x00000002
3575#define VER_SUITE_BACKOFFICE 0x00000004
3576#define VER_SUITE_COMMUNICATIONS 0x00000008
3577#define VER_SUITE_TERMINAL 0x00000010
3578#define VER_SUITE_SMALLBUSINESS_RESTRICTED 0x00000020
3579#define VER_SUITE_EMBEDDEDNT 0x00000040
3580#define VER_SUITE_DATACENTER 0x00000080
3581#define VER_SUITE_SINGLEUSERTS 0x00000100
3582#define VER_SUITE_PERSONAL 0x00000200
3583
3584#define VER_EQUAL 1
3585#define VER_GREATER 2
3586#define VER_GREATER_EQUAL 3
3587#define VER_LESS 4
3588#define VER_LESS_EQUAL 5
3589#define VER_AND 6
3590#define VER_OR 7
3591
Alexandre Julliard329f0681996-04-14 13:21:20 +00003592#endif /* __WINE_WINNT_H */