[HEADERS]
[reactos.git] / reactos / include / psdk / winnt.h
index 056c860..bd0fac1 100644 (file)
@@ -56,8 +56,9 @@ extern "C" {
 #include <string.h>
 
 /* FIXME: add more architectures. Is there a way to specify this in GCC? */
-#ifdef _X86_
-#define UNALIGNED
+#if defined(_M_AMD64)
+#undef UNALIGNED
+#define UNALIGNED __unaligned
 #else
 #define UNALIGNED
 #endif
@@ -105,7 +106,7 @@ extern "C" {
 #endif
 typedef char CHAR;
 typedef short SHORT;
-#ifndef __ROS_LONG64__
+#if !defined(__ROS_LONG64__) || defined(_M_AMD64)
 typedef long LONG;
 #else
 typedef int LONG;
@@ -225,16 +226,9 @@ typedef BYTE FCHAR;
 typedef WORD FSHORT;
 typedef DWORD FLONG;
 
-#define __C_ASSERT_JOIN(X, Y) __C_ASSERT_DO_JOIN(X, Y)
-#define __C_ASSERT_DO_JOIN(X, Y) __C_ASSERT_DO_JOIN2(X, Y)
-#define __C_ASSERT_DO_JOIN2(X, Y) X##Y
-
-#define C_ASSERT(e) typedef char __C_ASSERT_JOIN(__C_ASSERT__, __LINE__)[(e) ? 1 : -1]
-
+#define C_ASSERT(expr) extern char (*c_assert(void)) [(expr) ? 1 : -1]
 
-#ifdef __GNUC__
 #include "intrin.h"
-#endif
 
 #define NTAPI __stdcall
 #include <basetsd.h>
@@ -406,7 +400,7 @@ typedef DWORD FLONG;
 #define FILE_CREATE_TREE_CONNECTION    0x00000080
 #define FILE_COMPLETE_IF_OPLOCKED      0x00000100
 #define FILE_NO_EA_KNOWLEDGE           0x00000200
-#define FILE_OPEN_FOR_RECOVERY         0x00000400
+#define FILE_OPEN_REMOTE_INSTANCE      0x00000400
 #define FILE_RANDOM_ACCESS             0x00000800
 #define FILE_DELETE_ON_CLOSE           0x00001000
 #define FILE_OPEN_BY_FILE_ID           0x00002000
@@ -474,12 +468,9 @@ typedef DWORD FLONG;
 #define FILE_SUPPORTS_ENCRYPTION        0x00020000
 #define FILE_NAMED_STREAMS              0x00040000
 
-/* FIXME: Oh how I wish, I wish the w32api DDK wouldn't include winnt.h... */
-#ifndef _NTDDK_
 #define IO_COMPLETION_QUERY_STATE       0x0001
 #define IO_COMPLETION_MODIFY_STATE      0x0002
 #define IO_COMPLETION_ALL_ACCESS        (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
-#endif
 /* end ntifs.h */
 
 /* also in ddk/winddk.h */
@@ -489,8 +480,6 @@ typedef DWORD FLONG;
 
 #define MAILSLOT_NO_MESSAGE    ((DWORD)-1)
 #define MAILSLOT_WAIT_FOREVER  ((DWORD)-1)
-/* FIXME: Oh how I wish, I wish the w32api DDK wouldn't include winnt.h... */
-#ifndef _NTDDK_
 #define PROCESS_TERMINATE      1
 #define PROCESS_CREATE_THREAD  2
 #define PROCESS_SET_SESSIONID  4
@@ -504,23 +493,17 @@ typedef DWORD FLONG;
 #define PROCESS_SUSPEND_RESUME 2048
 #define PROCESS_QUERY_LIMITED_INFORMATION 0x1000
 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xFFF)
-#endif
 #define PROCESS_DUP_HANDLE     64
 #define THREAD_TERMINATE       1
 #define THREAD_SUSPEND_RESUME  2
 #define THREAD_GET_CONTEXT     8
 #define THREAD_SET_CONTEXT     16
 #define THREAD_SET_INFORMATION 32
-/* FIXME: Oh how I wish, I wish the w32api DDK wouldn't include winnt.h... */
-#ifndef _NTDDK_
 #define THREAD_QUERY_INFORMATION       64
 #define THREAD_SET_THREAD_TOKEN        128
 #define THREAD_IMPERSONATE     256
 #define THREAD_DIRECT_IMPERSONATION    0x200
-#endif
 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3FF)
-/* FIXME: Oh how I wish, I wish the w32api DDK wouldn't include winnt.h... */
-#ifndef _NTDDK_
 #define MUTANT_QUERY_STATE     0x0001
 #define MUTANT_ALL_ACCESS      (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|MUTANT_QUERY_STATE)
 #define TIMER_QUERY_STATE      0x0001
@@ -530,7 +513,6 @@ typedef DWORD FLONG;
 #define THREAD_BASE_PRIORITY_MAX       2
 #define THREAD_BASE_PRIORITY_MIN       (-2)
 #define THREAD_BASE_PRIORITY_IDLE      (-15)
-#endif
 /*
  * To prevent gcc compiler warnings, bracket these defines when initialising
  * a  SID_IDENTIFIER_AUTHORITY, eg.
@@ -748,8 +730,6 @@ typedef enum {
 #define SE_CHANGE_NOTIFY_NAME  TEXT("SeChangeNotifyPrivilege")
 #define SE_REMOTE_SHUTDOWN_NAME        TEXT("SeRemoteShutdownPrivilege")
 #define SE_CREATE_GLOBAL_NAME TEXT("SeCreateGlobalPrivilege")
-/* FIXME: Oh how I wish, I wish the w32api DDK wouldn't include winnt.h... */
-#ifndef _NTDDK_
 #define SE_GROUP_MANDATORY 1
 #define SE_GROUP_ENABLED_BY_DEFAULT 2
 #define SE_GROUP_ENABLED 4
@@ -757,7 +737,6 @@ typedef enum {
 #define SE_GROUP_USE_FOR_DENY_ONLY 16
 #define SE_GROUP_LOGON_ID 3221225472U
 #define SE_GROUP_RESOURCE 536870912
-#endif
 #define LANG_NEUTRAL   0x00
 #define LANG_INVARIANT   0x7f
 #define LANG_AFRIKAANS   0x36
@@ -1145,6 +1124,7 @@ typedef enum {
 #define LANG_SYSTEM_DEFAULT    MAKELANGID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT)
 #define LANG_USER_DEFAULT      MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT)
 #define LOCALE_NEUTRAL MAKELCID(MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),SORT_DEFAULT)
+#define LOCALE_INVARIANT MAKELCID(MAKELANGID(LANG_INVARIANT, SUBLANG_NEUTRAL), SORT_DEFAULT)
 #define ACL_REVISION   2
 #define ACL_REVISION_DS 4
 #define ACL_REVISION1 1
@@ -1279,8 +1259,6 @@ typedef enum {
 #define MEM_WRITE_WATCH           0x200000 /* 98/Me */
 #define MEM_PHYSICAL      0x400000
 #define MEM_4MB_PAGES    0x80000000
-/* FIXME: Oh how I wish, I wish the w32api DDK wouldn't include winnt.h... */
-#ifndef _NTDDK_
 #define MEM_IMAGE        SEC_IMAGE
 #define SEC_NO_CHANGE  0x00400000
 #define SEC_FILE       0x00800000
@@ -1289,7 +1267,6 @@ typedef enum {
 #define SEC_RESERVE    0x04000000
 #define SEC_COMMIT     0x08000000
 #define SEC_NOCACHE    0x10000000
-#endif
 #define SECTION_EXTEND_SIZE 16
 #define SECTION_MAP_READ 4
 #define SECTION_MAP_WRITE 2
@@ -1297,9 +1274,7 @@ typedef enum {
 #define SECTION_MAP_EXECUTE 8
 #define SECTION_ALL_ACCESS 0xf001f
 #define WRITE_WATCH_FLAG_RESET 0x01
-#ifndef _NTDDK_
 #define MESSAGE_RESOURCE_UNICODE 1
-#endif
 #define RTL_CRITSECT_TYPE 0
 #define RTL_RESOURCE_TYPE 1
 /* Also in winddk.h */
@@ -1929,8 +1904,6 @@ typedef struct _GENERIC_MAPPING {
        ACCESS_MASK GenericExecute;
        ACCESS_MASK GenericAll;
 } GENERIC_MAPPING, *PGENERIC_MAPPING;
-/* Sigh..when will they learn... */
-#ifndef _NTDDK_
 typedef struct _ACE_HEADER {
        BYTE AceType;
        BYTE AceFlags;
@@ -2051,7 +2024,6 @@ typedef struct _SYSTEM_ALARM_CALLBACK_OBJECT_ACE {
        GUID InheritedObjectType;
        DWORD SidStart;
 } SYSTEM_ALARM_CALLBACK_OBJECT_ACE, *PSYSTEM_ALARM_CALLBACK_OBJECT_ACE;
-#endif
 typedef struct _ACL {
        BYTE AclRevision;
        BYTE Sbz1;
@@ -3005,8 +2977,6 @@ typedef struct _SE_IMPERSONATION_STATE {
        BOOLEAN EffectiveOnly;
        SECURITY_IMPERSONATION_LEVEL Level;
 } SE_IMPERSONATION_STATE,*PSE_IMPERSONATION_STATE;
-/* Steven you are my hero when you fix the w32api ddk! */
-#if !defined(_NTDDK_)
 typedef struct _SID_IDENTIFIER_AUTHORITY {
        BYTE Value[6];
 } SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
@@ -3148,7 +3118,6 @@ typedef enum _TOKEN_INFORMATION_CLASS {
   MaxTokenInfoClass
 } TOKEN_INFORMATION_CLASS;
 
-#endif
 typedef enum _SID_NAME_USE {
        SidTypeUser=1,SidTypeGroup,SidTypeDomain,SidTypeAlias,
        SidTypeWellKnownGroup,SidTypeDeletedAccount,SidTypeInvalid,
@@ -3235,13 +3204,11 @@ typedef struct _TAPE_CREATE_PARTITION {
        DWORD Count;
        DWORD Size;
 } TAPE_CREATE_PARTITION,*PTAPE_CREATE_PARTITION;
-/* Sigh..when will they learn... */
-#ifndef _NTDDK_
 typedef struct _MEMORY_BASIC_INFORMATION {
        PVOID BaseAddress;
        PVOID AllocationBase;
        DWORD AllocationProtect;
-       DWORD RegionSize;
+       SIZE_T RegionSize;
        DWORD State;
        DWORD Protect;
        DWORD Type;
@@ -3260,29 +3227,73 @@ typedef struct _MESSAGE_RESOURCE_DATA {
        DWORD NumberOfBlocks;
        MESSAGE_RESOURCE_BLOCK Blocks[1];
 } MESSAGE_RESOURCE_DATA,*PMESSAGE_RESOURCE_DATA;
-#endif
 typedef struct _LIST_ENTRY {
        struct _LIST_ENTRY *Flink;
        struct _LIST_ENTRY *Blink;
 } LIST_ENTRY,*PLIST_ENTRY;
+typedef struct _LIST_ENTRY32 {
+       DWORD Flink;
+       DWORD Blink;
+} LIST_ENTRY32,*PLIST_ENTRY32;
+typedef struct _LIST_ENTRY64 {
+       ULONGLONG Flink;
+       ULONGLONG Blink;
+} LIST_ENTRY64,*PLIST_ENTRY64;
+
 typedef struct _SINGLE_LIST_ENTRY {
        struct _SINGLE_LIST_ENTRY *Next;
 } SINGLE_LIST_ENTRY,*PSINGLE_LIST_ENTRY;
 
+//
+// Slist Header
+//
 #ifndef _SLIST_HEADER_
 #define _SLIST_HEADER_
+
+#if defined(_WIN64)
+typedef struct _SLIST_ENTRY *PSLIST_ENTRY;
+typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
+       PSLIST_ENTRY Next;
+} SLIST_ENTRY;
+typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
+    struct {
+        ULONGLONG Alignment;
+        ULONGLONG Region;
+    } DUMMYSTRUCTNAME;
+    struct {
+        ULONGLONG Depth:16;
+        ULONGLONG Sequence:9;
+        ULONGLONG NextEntry:39;
+        ULONGLONG HeaderType:1;
+        ULONGLONG Init:1;
+        ULONGLONG Reserved:59;
+        ULONGLONG Region:3;
+    } Header8;
+    struct {
+        ULONGLONG Depth:16;
+        ULONGLONG Sequence:48;
+        ULONGLONG HeaderType:1;
+        ULONGLONG Init:1;
+        ULONGLONG Reserved:2;
+        ULONGLONG NextEntry:60;
+    } Header16;
+} SLIST_HEADER, *PSLIST_HEADER;
+#else
 #define SLIST_ENTRY SINGLE_LIST_ENTRY
 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
 typedef union _SLIST_HEADER {
-       ULONGLONG Alignment;
-       _ANONYMOUS_STRUCT struct {
-               SLIST_ENTRY Next;
-               WORD Depth;
-               WORD Sequence;
-       } DUMMYSTRUCTNAME;
-} SLIST_HEADER,*PSLIST_HEADER;
-#endif /* !_SLIST_HEADER_ */
+    ULONGLONG Alignment;
+    struct {
+        SLIST_ENTRY Next;
+        USHORT Depth;
+        USHORT Sequence;
+    } DUMMYSTRUCTNAME;
+} SLIST_HEADER, *PSLIST_HEADER;
+#endif
+
+#endif /* _SLIST_HEADER_ */
+
 
 NTSYSAPI
 VOID
@@ -3327,8 +3338,6 @@ RtlQueryDepthSList (
     IN PSLIST_HEADER ListHead
     );
 
-/* FIXME: Please oh please stop including winnt.h from the DDK... */
-#ifndef _NTDDK_
 typedef struct _RTL_CRITICAL_SECTION_DEBUG {
        WORD Type;
        WORD CreatorBackTraceIndex;
@@ -3348,7 +3357,6 @@ typedef struct _RTL_CRITICAL_SECTION {
        HANDLE LockSemaphore;
        ULONG_PTR SpinCount;
 } RTL_CRITICAL_SECTION,*PRTL_CRITICAL_SECTION;
-#endif
 
 NTSYSAPI
 WORD
@@ -4154,6 +4162,32 @@ typedef struct _NT_TIB {
        struct _NT_TIB *Self;
 } NT_TIB,*PNT_TIB;
 
+typedef struct _NT_TIB32 {
+       DWORD ExceptionList;
+       DWORD StackBase;
+       DWORD StackLimit;
+       DWORD SubSystemTib;
+       union {
+               DWORD FiberData;
+               DWORD Version;
+       };
+       DWORD ArbitraryUserPointer;
+       DWORD Self;
+} NT_TIB32,*PNT_TIB32;
+
+typedef struct _NT_TIB64 {
+       DWORD64 ExceptionList;
+       DWORD64 StackBase;
+       DWORD64 StackLimit;
+       DWORD64 SubSystemTib;
+       union {
+               DWORD64 FiberData;
+               DWORD Version;
+       };
+       DWORD64 ArbitraryUserPointer;
+       DWORD64 Self;
+} NT_TIB64,*PNT_TIB64;
+
 typedef struct _REPARSE_GUID_DATA_BUFFER {
        DWORD  ReparseTag;
        WORD   ReparseDataLength;
@@ -4219,8 +4253,6 @@ typedef union _FILE_SEGMENT_ELEMENT {
 #define JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT   9
 #define JOB_OBJECT_MSG_JOB_MEMORY_LIMIT       10
 
-/* FIXME: Oh how I wish, I wish the w32api DDK wouldn't include winnt.h... */
-#ifndef _NTDDK_
 #define JOB_OBJECT_ASSIGN_PROCESS           1
 #define JOB_OBJECT_SET_ATTRIBUTES           2
 #define JOB_OBJECT_QUERY                    4
@@ -4248,7 +4280,6 @@ typedef struct _JOB_SET_ARRAY
     DWORD MemberLevel;
     DWORD Flags;
 } JOB_SET_ARRAY, *PJOB_SET_ARRAY;
-#endif
 
 typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
        LARGE_INTEGER TotalUserTime;
@@ -4282,8 +4313,6 @@ typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS {
        DWORD UIRestrictionsClass;
 } JOBOBJECT_BASIC_UI_RESTRICTIONS,*PJOBOBJECT_BASIC_UI_RESTRICTIONS;
 
-/* Steven you are my hero when you fix the w32api ddk! */
-#ifndef _NTDDK_
 typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {
        DWORD SecurityLimitFlags;
        HANDLE JobToken;
@@ -4291,7 +4320,6 @@ typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {
        PTOKEN_PRIVILEGES PrivilegesToDelete;
        PTOKEN_GROUPS RestrictedSids;
 } JOBOBJECT_SECURITY_LIMIT_INFORMATION,*PJOBOBJECT_SECURITY_LIMIT_INFORMATION;
-#endif
 
 typedef struct _JOBOBJECT_END_OF_JOB_TIME_INFORMATION {
        DWORD EndOfJobTimeAction;
@@ -4487,7 +4515,6 @@ typedef struct _SYSTEM_BATTERY_STATE {
        ULONG  DefaultAlert2;
 } SYSTEM_BATTERY_STATE, *PSYSTEM_BATTERY_STATE;
 
-#ifndef _NTDDK_ /* HACK!!! ntddk.h shouldn't include winnt.h! */
 typedef struct _PROCESSOR_POWER_INFORMATION {
        ULONG Number;
        ULONG MaxMhz;
@@ -4496,7 +4523,6 @@ typedef struct _PROCESSOR_POWER_INFORMATION {
        ULONG MaxIdleState;
        ULONG CurrentIdleState;
 } PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION;
-#endif
 
 typedef DWORD EXECUTION_STATE;
 typedef enum _POWER_INFORMATION_LEVEL {
@@ -4655,6 +4681,8 @@ typedef OSVERSIONINFOA OSVERSIONINFO,*POSVERSIONINFO,*LPOSVERSIONINFO;
 typedef OSVERSIONINFOEXA OSVERSIONINFOEX,*POSVERSIONINFOEX,*LPOSVERSIONINFOEX;
 #endif
 
+#define VER_SET_CONDITION(lc,t,c) ((lc) = VerSetConditionMask((lc),(t),(c)))
+
 #if (_WIN32_WINNT >= 0x0500)
 ULONGLONG WINAPI VerSetConditionMask(ULONGLONG,DWORD,BYTE);
 #endif
@@ -4835,9 +4863,7 @@ static __inline__ PVOID GetCurrentFiber(void)
 }
 #endif
 
-/* FIXME: Oh how I wish, I wish the w32api DDK wouldn't include winnt.h... */
-#ifndef _NTDDK_
-#ifdef _M_IX86
+#if defined(_M_IX86)
 static __inline__ struct _TEB * NtCurrentTeb(void)
 {
     struct _TEB *ret;
@@ -4850,25 +4876,24 @@ static __inline__ struct _TEB * NtCurrentTeb(void)
 
     return ret;
 }
-#elif _M_ARM
+#elif defined(_M_ARM)
 
 //
 // NT-ARM is not documented
 //
 #include <armddk.h>
 
-#elif defined (_M_AMD64)
+#elif defined(_M_AMD64)
 FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
 {
     return (struct _TEB *)__readgsqword(FIELD_OFFSET(NT_TIB, Self));
 }
-#else
+#elif defined(_M_PPC)
 static __inline__ struct _TEB * NtCurrentTeb(void)
 {
     return __readfsdword_winnt(0x18);
 }
-#endif
-#elif defined(_M_PPC)
+#else
 static __inline__ struct _TEB * NtCurrentTeb(void)
 {
     return __readfsdword_winnt(0x18);
@@ -4893,9 +4918,6 @@ extern struct _TEB * NtCurrentTeb(void);
 
 #if (_MSC_FULL_VER >= 13012035)
 
-unsigned long __readfsdword(const unsigned long Offset);
-#pragma intrinsic(__readfsdword)
-
 __inline PVOID GetCurrentFiber(void) { return (PVOID)(ULONG_PTR)__readfsdword(0x10); }
 __inline struct _TEB * NtCurrentTeb(void) { return (struct _TEB *)(ULONG_PTR)__readfsdword(0x18); }
 
@@ -5013,20 +5035,16 @@ MemoryBarrier(VOID)
 #error Unknown architecture
 #endif
 
-VOID
-_mm_pause (
-    VOID
-    );
-
-
 #if defined(_M_IX86)
 #ifdef _MSC_VER
 #pragma intrinsic(_mm_pause)
+#define YieldProcessor _mm_pause
 #else
 #define YieldProcessor() __asm__ __volatile__("pause");
 #endif
 #elif defined (_M_AMD64)
 #ifdef _MSC_VER
+#pragma intrinsic(_mm_pause)
 #define YieldProcessor _mm_pause
 #else
 #define YieldProcessor() __asm__ __volatile__("pause");