1 /*++ BUILD Version: 0091        Increment this if a change has global effects
2
3 Copyright (c) Microsoft Corporation. All rights reserved.
4
5 Module Name:
6
7       winnt.h
8
9 Abstract:
10
11       This module defines the 32-Bit Windows types and constants that are
12       defined by NT, but exposed through the Win32 API.
13
14 Revision History:
15
16 --*/
17
18 #ifndef _WINNT_
19 #define _WINNT_
20
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24
25 #include <ctype.h>  
26 #define ANYSIZE_ARRAY 1           
27
28 #include <specstrings.h>
29
30 #if defined(_M_MRX000) && !(defined(MIDL_PASS) || defined(RC_INVOKED)) && defined(ENABLE_RESTRICTED)
31 #define RESTRICTED_POINTER __restrict
32 #else
33 #define RESTRICTED_POINTER
34 #endif
35
36 #if defined(_M_MRX000) || defined(_M_ALPHA) || defined(_M_PPC) || defined(_M_IA64) || defined(_M_AMD64)
37 #define ALIGNMENT_MACHINE
38 #define UNALIGNED __unaligned
39 #if defined(_WIN64)
40 #define UNALIGNED64 __unaligned
41 #else
42 #define UNALIGNED64
43 #endif
44 #else
45 #undef ALIGNMENT_MACHINE
46 #define UNALIGNED
47 #define UNALIGNED64
48 #endif
49
50
51 #if defined(_WIN64) || defined(_M_ALPHA)
52 #define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)
53 #define MEMORY_ALLOCATION_ALIGNMENT 16
54 #else
55 #define MAX_NATURAL_ALIGNMENT sizeof(DWORD)
56 #define MEMORY_ALLOCATION_ALIGNMENT 8
57 #endif
58
59 //
60 // TYPE_ALIGNMENT will return the alignment requirements of a given type for
61 // the current platform.
62 //
63
64 #ifdef __cplusplus
65 #if _MSC_VER >= 1300
66 #define TYPE_ALIGNMENT( t ) __alignof(t)
67 #endif
68 #else
69 #define TYPE_ALIGNMENT( t ) \
70       FIELD_OFFSET( struct { char x; t test; }, test )
71 #endif
72
73 #if defined(_WIN64)
74
75 #if defined(_AMD64_)
76 #define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )
77 #elif defined(_IA64_)
78 #define PROBE_ALIGNMENT( _s ) (TYPE_ALIGNMENT( _s ) > TYPE_ALIGNMENT( DWORD ) ? \
79                                                   TYPE_ALIGNMENT( _s ) : TYPE_ALIGNMENT( DWORD ))
80 #else
81 #error "No Target Architecture"
82 #endif
83
84 #define PROBE_ALIGNMENT32( _s ) TYPE_ALIGNMENT( DWORD )
85
86 #else
87
88 #define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )
89
90 #endif
91
92 //
93 // C_ASSERT() can be used to perform many compile-time assertions:
94 //                    type sizes, field offsets, etc.
95 //
96 // An assertion failure results in error C2118: negative subscript.
Lines 97 ... 320 are skipped.
321
322 #define UCSCHAR_INVALID_CHARACTER (0xffffffff)
323
324 #define MIN_UCSCHAR (0)
325
326 //
327 //  We'll assume here that the ISO-10646 / Unicode agreement
328 //  not to assign code points after U+0010FFFF holds so that
329 //  we do not have to have separate "UCSCHAR" and "UNICODECHAR"
330 //  types.
331 //
332
333 #define MAX_UCSCHAR (0x0010FFFF)
334
335 typedef UCSCHAR *PUCSCHAR;
336 typedef const UCSCHAR *PCUCSCHAR;
337
338 typedef UCSCHAR *PUCSSTR;
339 typedef UCSCHAR UNALIGNED *PUUCSSTR;
340
341 typedef const UCSCHAR *PCUCSSTR;
342 typedef const UCSCHAR UNALIGNED *PCUUCSSTR;
343
344 typedef UCSCHAR UNALIGNED *PUUCSCHAR;
345 typedef const UCSCHAR UNALIGNED *PCUUCSCHAR;
346
347 #endif // _WIN32_WINNT >= 0x0600
348
349
350 //
351 // ANSI (Multi-byte Character) types
352 //
353 typedef CHAR *PCHAR, *LPCH, *PCH;
354 typedef CONST CHAR *LPCCH, *PCCH;
355
356 typedef __nullterminated CHAR *NPSTR, *LPSTR, *PSTR;
357 typedef __nullterminated PSTR *PZPSTR;
358 typedef __nullterminated CONST PSTR *PCZPSTR;
359 typedef __nullterminated CONST CHAR *LPCSTR, *PCSTR;
360 typedef __nullterminated PCSTR *PZPCSTR;
361
362 //
363 // Neutral ANSI/UNICODE types and macros
364 //
365 #ifdef  UNICODE                                   // r_winnt
366
367 #ifndef _TCHAR_DEFINED
368 typedef WCHAR TCHAR, *PTCHAR;
369 typedef WCHAR TBYTE , *PTBYTE ;
370 #define _TCHAR_DEFINED
371 #endif /* !_TCHAR_DEFINED */
372
373 typedef LPWCH LPTCH, PTCH;
374 typedef LPWSTR PTSTR, LPTSTR;
375 typedef LPCWSTR PCTSTR, LPCTSTR;
376 typedef LPUWSTR PUTSTR, LPUTSTR;
377 typedef LPCUWSTR PCUTSTR, LPCUTSTR;
378 typedef LPWSTR LP;
379 #define __TEXT(quote) L##quote          // r_winnt
380
381 #else     /* UNICODE */                         // r_winnt
382
383 #ifndef _TCHAR_DEFINED
384 typedef char TCHAR, *PTCHAR;
385 typedef unsigned char TBYTE , *PTBYTE ;
386 #define _TCHAR_DEFINED
387 #endif /* !_TCHAR_DEFINED */
388
389 typedef LPCH LPTCH, PTCH;
390 typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR;
391 typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR;
392 #define __TEXT(quote) quote               // r_winnt
393
394 #endif /* UNICODE */                          // r_winnt
395 #define TEXT(quote) __TEXT(quote)     // r_winnt
396
397
398 typedef SHORT *PSHORT;  
399 typedef LONG *PLONG;      
400
401 #ifdef STRICT
402 typedef void *HANDLE;
403 #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
404 #else
405 typedef PVOID HANDLE;
406 #define DECLARE_HANDLE(name) typedef HANDLE name
407 #endif
408 typedef HANDLE *PHANDLE;
409
410 //
411 // Flag (bit) fields
412 //
413
414 typedef BYTE     FCHAR;
415 typedef WORD     FSHORT;
416 typedef DWORD  FLONG;
417
418 // Component Object Model defines, and macros
419
420 #ifndef _HRESULT_DEFINED
421 #define _HRESULT_DEFINED
422 #ifdef __midl
423 typedef LONG HRESULT;
424 #else
425 typedef __success(return >= 0) long HRESULT;
426 #endif // __midl
427 #endif // !_HRESULT_DEFINED
428
429 #ifdef __cplusplus
430       #define EXTERN_C      extern "C"
431 #else
432       #define EXTERN_C      extern
433 #endif
434
435 #if defined(_WIN32) || defined(_MPPC_)
436
Lines 437 ... 1916 are skipped.
1917 _BitScanReverse64 (
1918       __out DWORD *Index,
1919       __in DWORD64 Mask
1920       );
1921
1922 #pragma intrinsic(_BitScanForward)
1923 #pragma intrinsic(_BitScanReverse)
1924 #pragma intrinsic(_BitScanForward64)
1925 #pragma intrinsic(_BitScanReverse64)
1926
1927 //
1928 // Interlocked intrinsic functions.
1929 //
1930
1931 #define InterlockedIncrement16 _InterlockedIncrement16
1932 #define InterlockedDecrement16 _InterlockedDecrement16
1933 #define InterlockedCompareExchange16 _InterlockedCompareExchange16
1934
1935 #define InterlockedAnd _InterlockedAnd
1936 #define InterlockedOr _InterlockedOr
1937 #define InterlockedXor _InterlockedXor
1938 #define InterlockedIncrement _InterlockedIncrement
1939 #define InterlockedIncrementAcquire InterlockedIncrement
1940 #define InterlockedIncrementRelease InterlockedIncrement
1941 #define InterlockedDecrement _InterlockedDecrement
1942 #define InterlockedDecrementAcquire InterlockedDecrement
1943 #define InterlockedDecrementRelease InterlockedDecrement
1944 #define InterlockedAdd _InterlockedAdd
1945 #define InterlockedExchange _InterlockedExchange
1946 #define InterlockedExchangeAdd _InterlockedExchangeAdd
1947 #define InterlockedCompareExchange _InterlockedCompareExchange
1948 #define InterlockedCompareExchangeAcquire InterlockedCompareExchange
1949 #define InterlockedCompareExchangeRelease InterlockedCompareExchange
1950
1951 #define InterlockedAnd64 _InterlockedAnd64
1952 #define InterlockedAndAffinity InterlockedAnd64
1953 #define InterlockedOr64 _InterlockedOr64
1954 #define InterlockedOrAffinity InterlockedOr64
1955 #define InterlockedXor64 _InterlockedXor64
1956 #define InterlockedIncrement64 _InterlockedIncrement64
1957 #define InterlockedDecrement64 _InterlockedDecrement64
1958 #define InterlockedAdd64 _InterlockedAdd64
1959 #define InterlockedExchange64 _InterlockedExchange64
1960 #define InterlockedExchangeAcquire64 InterlockedExchange64
1961 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
1962 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
1963 #define InterlockedCompareExchangeAcquire64 InterlockedCompareExchange64
1964 #define InterlockedCompareExchangeRelease64 InterlockedCompareExchange64
1965
1966 #define InterlockedExchangePointer _InterlockedExchangePointer
1967 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
1968 #define InterlockedCompareExchangePointerAcquire _InterlockedCompareExchangePointer
1969 #define InterlockedCompareExchangePointerRelease _InterlockedCompareExchangePointer
1970
1971 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONG64 *)a, b)
1972 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONG64 *)a)
1973 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONG64 *)a)
1974
1975 SHORT
1976 InterlockedIncrement16 (
1977       __inout SHORT volatile *Addend
1978       );
1979
1980 SHORT
1981 InterlockedDecrement16 (
1982       __inout SHORT volatile *Addend
1983       );
1984
1985 SHORT
1986 InterlockedCompareExchange16 (
1987       __inout SHORT volatile *Destination,
1988       __in SHORT ExChange,
1989       __in SHORT Comperand
1990       );
1991
1992 LONG
1993 InterlockedAnd (
1994       __inout LONG volatile *Destination,
1995       __in LONG Value
1996       );
1997
1998 LONG
1999 InterlockedOr (
2000       __inout LONG volatile *Destination,
2001       __in LONG Value
2002       );
2003
2004 LONG
2005 InterlockedXor (
2006       __inout LONG volatile *Destination,
2007       __in LONG Value
2008       );
2009
2010 LONG64
2011 InterlockedAnd64 (
2012       __inout LONG64 volatile *Destination,
2013       __in LONG64 Value
2014       );
2015
2016 LONG64
Lines 2017 ... 2224 are skipped.
2225 //
2226 // Define memory fence intrinsics
2227 //
2228
2229 #define FastFence __faststorefence
2230 #define LoadFence _mm_lfence
2231 #define MemoryFence _mm_mfence
2232 #define StoreFence _mm_sfence
2233
2234 VOID
2235 __faststorefence (
2236       VOID
2237       );
2238
2239 VOID
2240 _mm_lfence (
2241       VOID
2242       );
2243
2244 VOID
2245 _mm_mfence (
2246       VOID
2247       );
2248
2249 VOID
2250 _mm_sfence (
2251       VOID
2252       );
2253
2254 VOID
2255 _mm_pause (
2256       VOID
2257       );
2258
2259 VOID 
2260 _mm_prefetch (
2261       __in CHAR CONST *a, 
2262       __in int sel
2263       );
2264
2265 VOID
2266 _m_prefetchw (
2267       __in volatile CONST VOID *Source
2268       );
2269
2270 //
2271 // Define constants for use with _mm_prefetch.
2272 //
2273
2274 #define _MM_HINT_T0        1
2275 #define _MM_HINT_T1        2
2276 #define _MM_HINT_T2        3
2277 #define _MM_HINT_NTA      0
2278
2279 #pragma intrinsic(__faststorefence)
2280 #pragma intrinsic(_mm_pause)
2281 #pragma intrinsic(_mm_prefetch)
2282 #pragma intrinsic(_mm_lfence)
2283 #pragma intrinsic(_mm_mfence)
2284 #pragma intrinsic(_mm_sfence)
2285 #pragma intrinsic(_m_prefetchw)
2286
2287 #define YieldProcessor _mm_pause
2288 #define MemoryBarrier __faststorefence
2289 #define PreFetchCacheLine(l, a)  _mm_prefetch((CHAR CONST *) a, l)
2290 #define PrefetchForWrite(p) _m_prefetchw(p)
2291 #define ReadForWriteAccess(p) (_m_prefetchw(p), *(p))
2292
2293 //
2294 // PreFetchCacheLine level defines.
2295 //
2296
2297 #define PF_TEMPORAL_LEVEL_1 _MM_HINT_T0
2298 #define PF_TEMPORAL_LEVEL_2 _MM_HINT_T1
2299 #define PF_TEMPORAL_LEVEL_3 _MM_HINT_T2
2300 #define PF_NON_TEMPORAL_LEVEL_ALL _MM_HINT_NTA
2301
2302 //
2303 // Define get/set MXCSR intrinsics.
2304 //
2305
2306 #define ReadMxCsr _mm_getcsr
2307 #define WriteMxCsr _mm_setcsr
2308
2309 unsigned int
2310 _mm_getcsr (
2311       VOID
2312       );
2313
2314 VOID
2315 _mm_setcsr (
2316       __in unsigned int MxCsr
2317       );
2318
2319 #pragma intrinsic(_mm_getcsr)
2320 #pragma intrinsic(_mm_setcsr)
2321
2322 //
2323 // Assert exception.
2324 //
2325
2326 VOID
2327 __int2c (
Lines 2328 ... 3845 are skipped.
3846 #define InterlockedAddAcquire             _InterlockedAdd_acq
3847 #define InterlockedAddRelease             _InterlockedAdd_rel
3848
3849 #define InterlockedIncrement             _InterlockedIncrement
3850 #define InterlockedIncrementAcquire         _InterlockedIncrement_acq
3851 #define InterlockedIncrementRelease         _InterlockedIncrement_rel
3852
3853 #define InterlockedDecrement             _InterlockedDecrement
3854 #define InterlockedDecrementAcquire         _InterlockedDecrement_acq
3855 #define InterlockedDecrementRelease         _InterlockedDecrement_rel
3856
3857 #define InterlockedExchange             _InterlockedExchange
3858 #define InterlockedExchangeAcquire         _InterlockedExchange_acq
3859
3860 #define InterlockedExchangeAdd             _InterlockedExchangeAdd
3861 #define InterlockedExchangeAddAcquire         _InterlockedExchangeAdd_acq
3862 #define InterlockedExchangeAddRelease         _InterlockedExchangeAdd_rel
3863
3864 #define InterlockedAdd64             _InterlockedAdd64
3865 #define InterlockedAddAcquire64         _InterlockedAdd64_acq
3866 #define InterlockedAddRelease64         _InterlockedAdd64_rel
3867
3868 #define InterlockedIncrement64             _InterlockedIncrement64
3869 #define InterlockedIncrementAcquire64         _InterlockedIncrement64_acq
3870 #define InterlockedIncrementRelease64         _InterlockedIncrement64_rel
3871
3872 #define InterlockedDecrement64             _InterlockedDecrement64
3873 #define InterlockedDecrementAcquire64         _InterlockedDecrement64_acq
3874 #define InterlockedDecrementRelease64         _InterlockedDecrement64_rel
3875
3876 #define InterlockedExchange64             _InterlockedExchange64
3877 #define InterlockedExchangeAcquire64         _InterlockedExchange64_acq
3878
3879 #define InterlockedExchangeAdd64         _InterlockedExchangeAdd64
3880 #define InterlockedExchangeAddAcquire64     _InterlockedExchangeAdd64_acq
3881 #define InterlockedExchangeAddRelease64     _InterlockedExchangeAdd64_rel
3882
3883 #define InterlockedCompareExchange64         _InterlockedCompareExchange64
3884 #define InterlockedCompareExchangeAcquire64     _InterlockedCompareExchange64_acq
3885 #define InterlockedCompareExchangeRelease64     _InterlockedCompareExchange64_rel
3886
3887 #define InterlockedCompare64Exchange128        _InterlockedCompare64Exchange128
3888 #define InterlockedCompare64ExchangeAcquire128  _InterlockedCompare64Exchange128_acq
3889 #define InterlockedCompare64ExchangeRelease128  _InterlockedCompare64Exchange128_rel
3890
3891 #define InterlockedCompareExchange         _InterlockedCompareExchange
3892 #define InterlockedCompareExchangeAcquire     _InterlockedCompareExchange_acq
3893 #define InterlockedCompareExchangeRelease     _InterlockedCompareExchange_rel
3894
3895 #define InterlockedExchangePointer         _InterlockedExchangePointer
3896 #define InterlockedExchangePointerAcquire           _InterlockedExchangePointer_acq
3897
3898 #define InterlockedCompareExchangePointer      _InterlockedCompareExchangePointer
3899 #define InterlockedCompareExchangePointerRelease _InterlockedCompareExchangePointer_rel
3900 #define InterlockedCompareExchangePointerAcquire _InterlockedCompareExchangePointer_acq
3901
3902
3903 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONG64 *)a, b)
3904 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONG64 *)a)
3905 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONG64 *)a)
3906
3907 #define InterlockedOr           _InterlockedOr
3908 #define InterlockedOrAcquire     _InterlockedOr_acq
3909 #define InterlockedOrRelease     _InterlockedOr_rel
3910 #define InterlockedOr8          _InterlockedOr8
3911 #define InterlockedOr8Acquire  _InterlockedOr8_acq
3912 #define InterlockedOr8Release  _InterlockedOr8_rel
3913 #define InterlockedOr16        _InterlockedOr16
3914 #define InterlockedOr16Acquire _InterlockedOr16_acq
3915 #define InterlockedOr16Release _InterlockedOr16_rel
3916 #define InterlockedOr64        _InterlockedOr64
3917 #define InterlockedOr64Acquire _InterlockedOr64_acq
3918 #define InterlockedOr64Release _InterlockedOr64_rel
3919 #define InterlockedXor          _InterlockedXor
3920 #define InterlockedXorAcquire  _InterlockedXor_acq
3921 #define InterlockedXorRelease  _InterlockedXor_rel
3922 #define InterlockedXor8        _InterlockedXor8
3923 #define InterlockedXor8Acquire _InterlockedXor8_acq
3924 #define InterlockedXor8Release _InterlockedXor8_rel
3925 #define InterlockedXor16      _InterlockedXor16
3926 #define InterlockedXor16Acquire _InterlockedXor16_acq
3927 #define InterlockedXor16Release _InterlockedXor16_rel
3928 #define InterlockedXor64        _InterlockedXor64
3929 #define InterlockedXor64Acquire _InterlockedXor64_acq
3930 #define InterlockedXor64Release _InterlockedXor64_rel
3931 #define InterlockedAnd           _InterlockedAnd
3932 #define InterlockedAndAcquire     _InterlockedAnd_acq
3933 #define InterlockedAndRelease     _InterlockedAnd_rel
3934 #define InterlockedAnd8          _InterlockedAnd8
3935 #define InterlockedAnd8Acquire  _InterlockedAnd8_acq
3936 #define InterlockedAnd8Release  _InterlockedAnd8_rel
3937 #define InterlockedAnd16        _InterlockedAnd16
3938 #define InterlockedAnd16Acquire _InterlockedAnd16_acq
3939 #define InterlockedAnd16Release _InterlockedAnd16_rel
3940 #define InterlockedAnd64        _InterlockedAnd64
3941 #define InterlockedAnd64Acquire _InterlockedAnd64_acq
3942 #define InterlockedAnd64Release _InterlockedAnd64_rel
3943
3944 #ifdef __cplusplus
3945 extern "C" {
Lines 3946 ... 12928 are skipped.
12929 #if defined(_M_IX86) && !defined(MIDL_PASS)
12930
12931 #define PcTeb 0x18
12932
12933 #if (_MSC_FULL_VER >= 13012035)
12934
12935 __inline struct _TEB * NtCurrentTeb( void ) { return (struct _TEB *) (ULONG_PTR) __readfsdword (PcTeb); }
12936
12937 #else
12938
12939 #if _MSC_VER >= 1200
12940 #pragma warning(push)
12941 #endif
12942
12943 #pragma warning (disable:4035)             // disable 4035 (function must return something)
12944
12945 __inline struct _TEB * NtCurrentTeb( void ) { __asm mov eax, fs:[PcTeb] }
12946
12947 #if _MSC_VER >= 1200
12948 #pragma warning(pop)
12949 #else
12950 #pragma warning (default:4035)             // reenable it
12951 #endif
12952
12953 #endif
12954
12955 #endif // defined(_M_IX86) && !defined(MIDL_PASS)
12956
12957 #if (_WIN32_WINNT > 0x0500) || (_WIN32_FUSION >= 0x0100) || ISOLATION_AWARE_ENABLED // winnt_only
12958 #define ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION               (1)
12959 #define ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION                       (2)
12960 #define ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION        (3)
12961 #define ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION           (4)
12962 #define ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION      (5)
12963 #define ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION (6)
12964 #define ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION           (7)
12965 #define ACTIVATION_CONTEXT_SECTION_GLOBAL_OBJECT_RENAME_TABLE     (8)
12966 #define ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES                         (9)
12967 #define ACTIVATION_CONTEXT_SECTION_APPLICATION_SETTINGS               (10)
12968 #endif // winnt_only
12969
12970 #ifdef __cplusplus
12971 }
12972 #endif
12973
12974 #endif /* _WINNT_ */
12975
12976
12977