sync with trunk head (34904)
[reactos.git] / reactos / include / psdk / winnt.h
index 9c95b6d..f7b6c05 100644 (file)
@@ -4,24 +4,16 @@
 #pragma GCC system_header
 #endif
 
-/* translate GCC target defines to MS equivalents. Keep this synchronized
-   with windows.h. */
-#if defined(__i686__) && !defined(_M_IX86)
-#define _M_IX86 600
-#elif defined(__i586__) && !defined(_M_IX86)
-#define _M_IX86 500
-#elif defined(__i486__) && !defined(_M_IX86)
-#define _M_IX86 400
-#elif defined(__i386__) && !defined(_M_IX86)
-#define _M_IX86 300
+#ifdef __GNUC__
+#include <msvctarget.h>
 #endif
+
 #if defined(_M_IX86) && !defined(_X86_)
 #define _X86_
 #elif defined(_M_ALPHA) && !defined(_ALPHA_)
 #define _ALPHA_
-
-#elif defined(_M_ARM) && !defined(ARM)
-#define ARM
+#elif defined(_M_ARM) && !defined(_ARM_)
+#define _ARM_
 #elif defined(_M_PPC) && !defined(_PPC_)
 #define _PPC_
 #elif defined(_M_MRX000) && !defined(_MIPS_)
 #define _68K_
 #endif
 
+#ifndef DECLSPEC_ALIGN
+# if defined(_MSC_VER) && (_MSC_VER >= 1300) && !defined(MIDL_PASS)
+#  define DECLSPEC_ALIGN(x) __declspec(align(x))
+# elif defined(__GNUC__)
+#  define DECLSPEC_ALIGN(x) __attribute__((aligned(x)))
+# else
+#  define DECLSPEC_ALIGN(x)
+# endif
+#endif
+
+# define DECLSPEC_HIDDEN
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+#include <basetsd.h>
+#include <guiddef.h>
+
+#ifndef __cplusplus
+    typedef unsigned short wchar_t;
+#endif
+
 #include <ctype.h>
+#undef __need_wchar_t
+
 #include <winerror.h>
+#include <stddef.h>
 #include <sdkddkver.h>
 
 #ifndef RC_INVOKED
@@ -62,7 +76,7 @@ extern "C" {
 #elif (_MSC_VER)
 #define FORCEINLINE __inline
 #else
-#define FORCEINLINE static __inline
+#define FORCEINLINE static __inline__ __attribute__((always_inline))
 #endif
 #endif
 
@@ -81,12 +95,12 @@ extern "C" {
 #ifndef VOID
 #define VOID void
 #endif
-typedef signed char CHAR;
+typedef char CHAR;
 typedef short SHORT;
 #ifndef LONG_DEFINED
 #define LONG_DEFINED
-    typedef long LONG;
-    typedef unsigned long ULONG,*PULONG;
+       typedef long LONG;
+       typedef unsigned long ULONG,*PULONG;
 #endif//LONG_DEFINED
 typedef char CCHAR, *PCCHAR;
 typedef unsigned char UCHAR,*PUCHAR;
@@ -101,17 +115,26 @@ typedef void *PVOID,*LPVOID;
 #endif
 typedef void* __ptr64 PVOID64;
 
-#ifndef _WCHAR_T_DEFINED
-#define _WCHAR_T_DEFINED
-#ifndef _WCHAR_T_
-#define _WCHAR_T_
-#undef __need_wchar_t
-#ifndef __cplusplus
-typedef unsigned short wchar_t;
-#endif
-#endif
+#ifdef __cplusplus
+# define EXTERN_C    extern "C"
+#else
+# define EXTERN_C    extern
 #endif
 
+#define STDMETHODCALLTYPE       __stdcall
+#define STDMETHODVCALLTYPE      __cdecl
+#define STDAPICALLTYPE          __stdcall
+#define STDAPIVCALLTYPE         __cdecl
+
+#define STDAPI                  EXTERN_C HRESULT STDAPICALLTYPE
+#define STDAPI_(type)           EXTERN_C type STDAPICALLTYPE
+#define STDMETHODIMP            HRESULT STDMETHODCALLTYPE
+#define STDMETHODIMP_(type)     type STDMETHODCALLTYPE
+#define STDAPIV                 EXTERN_C HRESULT STDAPIVCALLTYPE
+#define STDAPIV_(type)          EXTERN_C type STDAPIVCALLTYPE
+#define STDMETHODIMPV           HRESULT STDMETHODVCALLTYPE
+#define STDMETHODIMPV_(type)    type STDMETHODVCALLTYPE
+
 typedef wchar_t WCHAR;
 typedef WCHAR *PWCHAR,*LPWCH,*PWCH,*NWPSTR,*LPWSTR,*PWSTR;
 typedef CONST WCHAR *LPCWCH,*PCWCH,*LPCWSTR,*PCWSTR;
@@ -198,6 +221,17 @@ 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]
+
+
+#ifdef __GNUC__
+#include "intrin.h"
+#endif
+
 #define NTAPI __stdcall
 #include <basetsd.h>
 #define ACE_OBJECT_TYPE_PRESENT           0x00000001
@@ -424,9 +458,12 @@ 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_H
 #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 */
@@ -457,22 +494,26 @@ typedef DWORD FLONG;
 #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_H
 #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)
-#define THREAD_BASE_PRIORITY_LOWRT     15
-#define THREAD_BASE_PRIORITY_MAX       2
-#define THREAD_BASE_PRIORITY_MIN       (-2)
-#define THREAD_BASE_PRIORITY_IDLE      (-15)
-#define EXCEPTION_NONCONTINUABLE       1
-#define EXCEPTION_MAXIMUM_PARAMETERS 15
+/* FIXME: Oh how I wish, I wish the w32api DDK wouldn't include winnt.h... */
+#ifndef __NTDDK_H
 #define MUTANT_QUERY_STATE     0x0001
 #define MUTANT_ALL_ACCESS      (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|MUTANT_QUERY_STATE)
 #define TIMER_QUERY_STATE      0x0001
 #define TIMER_MODIFY_STATE     0x0002
 #define TIMER_ALL_ACCESS       (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|TIMER_QUERY_STATE|TIMER_MODIFY_STATE)
+#define THREAD_BASE_PRIORITY_LOWRT     15
+#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.
@@ -539,6 +580,12 @@ typedef DWORD FLONG;
 #define DOMAIN_GROUP_RID_ADMINS                 0x00000200L
 #define DOMAIN_GROUP_RID_USERS                  0x00000201L
 #define DOMAIN_GROUP_RID_GUESTS                 0x00000202L
+#define DOMAIN_GROUP_RID_COMPUTERS              0x00000203L
+#define DOMAIN_GROUP_RID_CONTROLLERS            0x00000204L
+#define DOMAIN_GROUP_RID_CERT_ADMINS            0x00000205L
+#define DOMAIN_GROUP_RID_SCHEMA_ADMINS          0x00000206L
+#define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS      0x00000207L
+#define DOMAIN_GROUP_RID_POLICY_ADMINS          0x00000208L
 
 #define DOMAIN_ALIAS_RID_ADMINS                 0x00000220L
 #define DOMAIN_ALIAS_RID_USERS                  0x00000221L
@@ -563,6 +610,8 @@ typedef DWORD FLONG;
 #define DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS     0x00000231L
 #define DOMAIN_ALIAS_RID_DCOM_USERS             0x00000232L
 
+#define SECURITY_MANDATORY_LABEL_AUTHORITY  {0,0,0,0,0,16}
+
 typedef enum
 {
     WinNullSid = 0,
@@ -654,6 +703,8 @@ 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_H
 #define SE_GROUP_MANDATORY 1
 #define SE_GROUP_ENABLED_BY_DEFAULT 2
 #define SE_GROUP_ENABLED 4
@@ -661,196 +712,355 @@ typedef enum
 #define SE_GROUP_USE_FOR_DENY_ONLY 16
 #define SE_GROUP_LOGON_ID 3221225472U
 #define SE_GROUP_RESOURCE 536870912
-#define LANG_NEUTRAL   0x00
-#define LANG_ARABIC    0x01
-#define LANG_BULGARIAN         0x02
-#define LANG_CATALAN   0x03
-#define LANG_CHINESE   0x04
-#define LANG_CZECH     0x05
-#define LANG_DANISH    0x06
-#define LANG_GERMAN    0x07
-#define LANG_GREEK     0x08
-#define LANG_ENGLISH   0x09
-#define LANG_SPANISH   0x0a
-#define LANG_FINNISH   0x0b
-#define LANG_FRENCH    0x0c
-#define LANG_HEBREW    0x0d
-#define LANG_HUNGARIAN 0x0e
-#define LANG_ICELANDIC 0x0f
-#define LANG_IRISH      0x3c
-#define LANG_ITALIAN   0x10
-#define LANG_JAPANESE  0x11
-#define LANG_KOREAN    0x12
-#define LANG_DUTCH     0x13
-#define LANG_NORWEGIAN 0x14
-#define LANG_POLISH    0x15
-#define LANG_PORTUGUESE        0x16
-#define LANG_ROMANIAN  0x18
-#define LANG_ROMANSH    0x17
-#define LANG_RUSSIAN   0x19
-#define LANG_SAMI       0x3b
-#define LANG_CROATIAN  0x1a
-#define LANG_SERBIAN   0x1a
-#define LANG_SLOVAK    0x1b
-#define LANG_ALBANIAN  0x1c
-#define LANG_SWEDISH   0x1d
-#define LANG_THAI      0x1e
-#define LANG_TURKISH   0x1f
-#define LANG_URDU      0x20
-#define LANG_INDONESIAN        0x21
-#define LANG_UPPER_SORBIAN 0x2e
-#define LANG_UKRAINIAN 0x22
-#define LANG_BELARUSIAN        0x23
-#define LANG_SLOVENIAN 0x24
-#define LANG_ESTONIAN  0x25
-#define LANG_LATVIAN   0x26
-#define LANG_LITHUANIAN        0x27
-#define LANG_TAJIK     0x28
-#define LANG_FARSI     0x29
-#define LANG_VIETNAMESE        0x2a
-#define LANG_ARMENIAN  0x2b
-#define LANG_AZERI     0x2c
-#define LANG_BASQUE    0x2d
-#define LANG_MACEDONIAN        0x2f
-#define LANG_AFRIKAANS 0x36
-#define LANG_GEORGIAN  0x37
-#define LANG_FAEROESE  0x38
-#define LANG_HINDI     0x39
-#define LANG_MALAY     0x3e
-#define LANG_KAZAK     0x3f
-#define LANG_KYRGYZ    0x40
-#define LANG_SWAHILI   0x41
-#define LANG_UZBEK     0x43
-#define LANG_TATAR     0x44
-#define LANG_BENGALI   0x45
-#define LANG_PUNJABI   0x46
-#define LANG_GUJARATI  0x47
-#define LANG_ORIYA     0x48
-#define LANG_TAMIL     0x49
-#define LANG_TELUGU    0x4a
-#define LANG_KANNADA   0x4b
-#define LANG_MALAYALAM 0x4c
-#define LANG_ASSAMESE  0x4d
-#define LANG_MARATHI   0x4e
-#define LANG_SANSKRIT  0x4f
-#define LANG_MONGOLIAN 0x50
-#define LANG_GALICIAN  0x56
-#define LANG_KONKANI   0x57
-#define LANG_MANIPURI  0x58
-#define LANG_SINDHI    0x59
-#define LANG_SYRIAC    0x5a
-#define LANG_KASHMIRI  0x60
-#define LANG_NEPALI    0x61
-#define LANG_DIVEHI    0x65
-#define LANG_INVARIANT 0x7f
-#define LANG_MAORI      0x81
-#define SUBLANG_NEUTRAL        0x00
-#define SUBLANG_DEFAULT        0x01
-#define SUBLANG_SYS_DEFAULT    0x02
-#define SUBLANG_ARABIC_SAUDI_ARABIA    0x01
-#define SUBLANG_ARABIC_IRAQ    0x02
-#define SUBLANG_ARABIC_EGYPT   0x03
-#define SUBLANG_ARABIC_LIBYA   0x04
-#define SUBLANG_ARABIC_ALGERIA 0x05
-#define SUBLANG_ARABIC_MOROCCO 0x06
-#define SUBLANG_ARABIC_TUNISIA 0x07
-#define SUBLANG_ARABIC_OMAN    0x08
-#define SUBLANG_ARABIC_YEMEN   0x09
-#define SUBLANG_ARABIC_SYRIA   0x0a
-#define SUBLANG_ARABIC_JORDAN  0x0b
-#define SUBLANG_ARABIC_LEBANON 0x0c
-#define SUBLANG_ARABIC_KUWAIT  0x0d
-#define SUBLANG_ARABIC_UAE     0x0e
-#define SUBLANG_ARABIC_BAHRAIN 0x0f
-#define SUBLANG_ARABIC_QATAR   0x10
-#define SUBLANG_AZERI_LATIN    0x01
-#define SUBLANG_AZERI_CYRILLIC 0x02
-#define SUBLANG_CHINESE_TRADITIONAL    0x01
-#define SUBLANG_CHINESE_SIMPLIFIED     0x02
-#define SUBLANG_CHINESE_HONGKONG       0x03
-#define SUBLANG_CHINESE_SINGAPORE      0x04
-#define SUBLANG_CHINESE_MACAU  0x05
-#define SUBLANG_CZECH_CZECH_REPUBLIC 0x1
-#define SUBLANG_DANISH_DENMARK 0x1
-#define SUBLANG_DUTCH  0x01
-#define SUBLANG_DUTCH_BELGIAN  0x02
-#define SUBLANG_ENGLISH_US     0x01
-#define SUBLANG_ENGLISH_UK     0x02
-#define SUBLANG_ENGLISH_AUS    0x03
-#define SUBLANG_ENGLISH_CAN    0x04
-#define SUBLANG_ENGLISH_NZ     0x05
-#define SUBLANG_ENGLISH_EIRE   0x06
-#define SUBLANG_ENGLISH_SOUTH_AFRICA   0x07
-#define SUBLANG_ENGLISH_JAMAICA        0x08
-#define SUBLANG_ENGLISH_CARIBBEAN      0x09
-#define SUBLANG_ENGLISH_BELIZE 0x0a
-#define SUBLANG_ENGLISH_TRINIDAD       0x0b
-#define SUBLANG_ENGLISH_ZIMBABWE       0x0c
-#define SUBLANG_ENGLISH_PHILIPPINES    0x0d
-#define SUBLANG_FINNISH_FINLAND 0x1
-#define SUBLANG_FRENCH 0x01
-#define SUBLANG_FRENCH_BELGIAN 0x02
-#define SUBLANG_FRENCH_CANADIAN        0x03
-#define SUBLANG_FRENCH_SWISS   0x04
-#define SUBLANG_FRENCH_LUXEMBOURG      0x05
-#define SUBLANG_FRENCH_MONACO  0x06
-#define SUBLANG_GERMAN 0x01
-#define SUBLANG_GERMAN_SWISS   0x02
-#define SUBLANG_GERMAN_AUSTRIAN        0x03
-#define SUBLANG_GERMAN_LUXEMBOURG      0x04
-#define SUBLANG_GERMAN_LIECHTENSTEIN   0x05
-#define SUBLANG_GREEK_GREECE 0x1
-#define SUBLANG_HUNGARIAN_HUNGARY 0x1
-#define SUBLANG_ITALIAN        0x01
-#define SUBLANG_ITALIAN_SWISS  0x02
-#define SUBLANG_JAPANESE_JAPAN 0x1
-#define SUBLANG_KASHMIRI_INDIA 0x02
-#define SUBLANG_KASHMIRI_SASIA 0x02
-#define SUBLANG_KOREAN 0x01
-#define SUBLANG_LITHUANIAN     0x01
-#define SUBLANG_MALAY_MALAYSIA 0x01
-#define SUBLANG_MALAY_BRUNEI_DARUSSALAM        0x02
-#define SUBLANG_NEPALI_INDIA   0x02
-#define SUBLANG_NORWEGIAN_BOKMAL       0x01
-#define SUBLANG_NORWEGIAN_NYNORSK      0x02
-#define SUBLANG_POLISH_POLAND 0x1
-#define SUBLANG_PORTUGUESE     0x01
-#define SUBLANG_PORTUGUESE_BRAZILIAN   0x02
-#define SUBLANG_ROMANIAN_ROMANIA 0x1
-#define SUBLANG_RUSSIAN_RUSSIA 0x1
-#define SUBLANG_SERBIAN_LATIN  0x02
-#define SUBLANG_SERBIAN_CYRILLIC       0x03
-#define SUBLANG_SLOVAK_SLOVAKIA 0x1
-#define SUBLANG_SLOVENIAN_SLOVENIA 0x1
-#define SUBLANG_SPANISH        0x01
-#define SUBLANG_SPANISH_MEXICAN        0x02
-#define SUBLANG_SPANISH_MODERN 0x03
-#define SUBLANG_SPANISH_GUATEMALA      0x04
-#define SUBLANG_SPANISH_COSTA_RICA     0x05
-#define SUBLANG_SPANISH_PANAMA 0x06
-#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC     0x07
-#define SUBLANG_SPANISH_VENEZUELA      0x08
-#define SUBLANG_SPANISH_COLOMBIA       0x09
-#define SUBLANG_SPANISH_PERU   0x0a
-#define SUBLANG_SPANISH_ARGENTINA      0x0b
-#define SUBLANG_SPANISH_ECUADOR        0x0c
-#define SUBLANG_SPANISH_CHILE  0x0d
-#define SUBLANG_SPANISH_URUGUAY        0x0e
-#define SUBLANG_SPANISH_PARAGUAY       0x0f
-#define SUBLANG_SPANISH_BOLIVIA        0x10
-#define SUBLANG_SPANISH_EL_SALVADOR    0x11
-#define SUBLANG_SPANISH_HONDURAS       0x12
-#define SUBLANG_SPANISH_NICARAGUA      0x13
-#define SUBLANG_SPANISH_PUERTO_RICO    0x14
-#define SUBLANG_SWEDISH        0x01
-#define SUBLANG_SWEDISH_FINLAND        0x02
-#define SUBLANG_TAJIK_TAJIKISTAN       0x01
-#define SUBLANG_THAI_THAILAND 0x1
-#define SUBLANG_URDU_PAKISTAN  0x01
-#define SUBLANG_URDU_INDIA     0x02
-#define SUBLANG_UKRAINIAN_UKRAINE 0x1
-#define SUBLANG_UZBEK_LATIN    0x01
-#define SUBLANG_UZBEK_CYRILLIC 0x02
+#endif
+#define LANG_NEUTRAL   0x00
+#define LANG_INVARIANT   0x7f
+#define LANG_AFRIKAANS   0x36
+#define LANG_ALBANIAN   0x1c
+#define LANG_ALSATIAN   0x84
+#define LANG_AMHARIC   0x5e
+#define LANG_ARABIC   0x01
+#define LANG_ARMENIAN   0x2b
+#define LANG_ASSAMESE   0x4d
+#define LANG_AZERI   0x2c
+#define LANG_BASHKIR   0x6d
+#define LANG_BASQUE   0x2d
+#define LANG_BELARUSIAN   0x23
+#define LANG_BENGALI   0x45
+#define LANG_BOSNIAN   0x1a
+#define LANG_BRETON   0x7e
+#define LANG_BULGARIAN   0x02
+#define LANG_CATALAN   0x03
+#define LANG_CHINESE   0x04
+#define LANG_CHINESE_SIMPLIFIED   0x04
+#define LANG_CORSICAN   0x83
+#define LANG_CROATIAN   0x1a
+#define LANG_CROATIAN   0x1a
+#define LANG_CZECH   0x05
+#define LANG_DANISH   0x06
+#define LANG_DARI   0x8c
+#define LANG_DIVEHI   0x65
+#define LANG_DUTCH   0x13
+#define LANG_ENGLISH   0x09
+#define LANG_ESTONIAN   0x25
+#define LANG_FAEROESE   0x38
+#define LANG_FILIPINO   0x64
+#define LANG_FINNISH   0x0b
+#define LANG_FRENCH   0x0c
+#define LANG_FRISIAN   0x62
+#define LANG_GALICIAN   0x56
+#define LANG_GEORGIAN   0x37
+#define LANG_GERMAN   0x07
+#define LANG_GREEK   0x08
+#define LANG_GREENLANDIC   0x6f
+#define LANG_GUJARATI   0x47
+#define LANG_HAUSA   0x68
+#define LANG_HEBREW   0x0d
+#define LANG_HINDI   0x39
+#define LANG_HUNGARIAN   0x0e
+#define LANG_ICELANDIC   0x0f
+#define LANG_IGBO   0x70
+#define LANG_INDONESIAN   0x21
+#define LANG_INUKTITUT   0x5d
+#define LANG_IRISH   0x3c
+#define LANG_ITALIAN   0x10
+#define LANG_JAPANESE   0x11
+#define LANG_KANNADA   0x4b
+#define LANG_KASHMIRI   0x60
+#define LANG_KAZAK   0x3f
+#define LANG_KHMER   0x53
+#define LANG_KICHE   0x86
+#define LANG_KINYARWANDA   0x87
+#define LANG_KONKANI   0x57
+#define LANG_KOREAN   0x12
+#define LANG_KYRGYZ   0x40
+#define LANG_LAO   0x54
+#define LANG_LATVIAN   0x26
+#define LANG_LITHUANIAN   0x27
+#define LANG_LOWER_SORBIAN   0x2e
+#define LANG_LUXEMBOURGISH   0x6e
+#define LANG_MACEDONIAN   0x2f
+#define LANG_MALAY   0x3e
+#define LANG_MALAYALAM   0x4c
+#define LANG_MALTESE   0x3a
+#define LANG_MANIPURI   0x58
+#define LANG_MAORI   0x81
+#define LANG_MAPUDUNGUN   0x7a
+#define LANG_MARATHI   0x4e
+#define LANG_MOHAWK   0x7c
+#define LANG_MONGOLIAN   0x50
+#define LANG_NEPALI   0x61
+#define LANG_NORWEGIAN   0x14
+#define LANG_OCCITAN   0x82
+#define LANG_ORIYA   0x48
+#define LANG_PASHTO   0x63
+#define LANG_FARSI   0x29
+#define LANG_POLISH   0x15
+#define LANG_PORTUGUESE   0x16
+#define LANG_PUNJABI   0x46
+#define LANG_QUECHUA   0x6b
+#define LANG_ROMANIAN   0x18
+#define LANG_ROMANSH   0x17
+#define LANG_RUSSIAN   0x19
+#define LANG_SAMI   0x3b
+#define LANG_SANSKRIT   0x4f
+#define LANG_SERBIAN   0x1a
+#define LANG_SOTHO   0x6c
+#define LANG_TSWANA   0x32
+#define LANG_SINDHI   0x59
+#define LANG_SINHALESE   0x5b
+#define LANG_SLOVAK   0x1b
+#define LANG_SLOVENIAN   0x24
+#define LANG_SPANISH   0x0a
+#define LANG_SWAHILI   0x41
+#define LANG_SWEDISH   0x1d
+#define LANG_SYRIAC   0x5a
+#define LANG_TAJIK   0x28
+#define LANG_TAMAZIGHT   0x5f
+#define LANG_TAMIL   0x49
+#define LANG_TATAR   0x44
+#define LANG_TELUGU   0x4a
+#define LANG_THAI   0x1e
+#define LANG_TIBETAN   0x51
+#define LANG_TIGRIGNA   0x73
+#define LANG_TURKISH   0x1f
+#define LANG_TURKMEN   0x42
+#define LANG_UIGHUR   0x80
+#define LANG_UKRAINIAN   0x22
+#define LANG_UPPER_SORBIAN   0x2e
+#define LANG_URDU   0x20
+#define LANG_UZBEK   0x43
+#define LANG_VIETNAMESE   0x2a
+#define LANG_WELSH   0x52
+#define LANG_WOLOF   0x88
+#define LANG_XHOSA   0x34
+#define LANG_YAKUT   0x85
+#define LANG_YI   0x78
+#define LANG_YORUBA   0x6a
+#define LANG_ZULU   0x35
+#define SUBLANG_CUSTOM_UNSPECIFIED   0x04
+#define SUBLANG_CUSTOM_DEFAULT   0x03
+#define SUBLANG_UI_CUSTOM_DEFAULT   0x05
+#define SUBLANG_NEUTRAL   0x00
+#define SUBLANG_SYS_DEFAULT   0x02
+#define SUBLANG_DEFAULT   0x01
+#define SUBLANG_AFRIKAANS_SOUTH_AFRICA   0x01
+#define SUBLANG_ALBANIAN_ALBANIA   0x01
+#define SUBLANG_ALSATIAN_FRANCE   0x01
+#define SUBLANG_AMHARIC_ETHIOPIA   0x01
+#define SUBLANG_ARABIC_ALGERIA   0x05
+#define SUBLANG_ARABIC_BAHRAIN   0x0f
+#define SUBLANG_ARABIC_EGYPT   0x03
+#define SUBLANG_ARABIC_IRAQ   0x02
+#define SUBLANG_ARABIC_JORDAN   0x0b
+#define SUBLANG_ARABIC_KUWAIT   0x0d
+#define SUBLANG_ARABIC_LEBANON   0x0c
+#define SUBLANG_ARABIC_LIBYA   0x04
+#define SUBLANG_ARABIC_MOROCCO   0x06
+#define SUBLANG_ARABIC_OMAN   0x08
+#define SUBLANG_ARABIC_QATAR   0x10
+#define SUBLANG_ARABIC_SAUDI_ARABIA   0x01
+#define SUBLANG_ARABIC_SYRIA   0x0a
+#define SUBLANG_ARABIC_TUNISIA   0x07
+#define SUBLANG_ARABIC_UAE   0x0e
+#define SUBLANG_ARABIC_YEMEN   0x09
+#define SUBLANG_ARMENIAN_ARMENIA   0x01
+#define SUBLANG_ASSAMESE_INDIA   0x01
+#define SUBLANG_AZERI_CYRILLIC   0x02
+#define SUBLANG_AZERI_LATIN   0x01
+#define SUBLANG_BASHKIR_RUSSIA   0x01
+#define SUBLANG_BASQUE_BASQUE   0x01
+#define SUBLANG_BELARUSIAN_BELARUS   0x01
+#define SUBLANG_BENGALI_BANGLADESH   0x02
+#define SUBLANG_BENGALI_INDIA   0x01
+#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC   0x08
+#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN   0x05
+#define SUBLANG_BRETON_FRANCE   0x01
+#define SUBLANG_BULGARIAN_BULGARIA   0x01
+#define SUBLANG_CATALAN_CATALAN   0x01
+#define SUBLANG_CHINESE_HONGKONG   0x03
+#define SUBLANG_CHINESE_MACAU   0x05
+#define SUBLANG_CHINESE_SINGAPORE   0x04
+#define SUBLANG_CHINESE_SIMPLIFIED   0x02
+#define SUBLANG_CHINESE_TRADITIONAL   0x01
+#define SUBLANG_CORSICAN_FRANCE   0x01
+#define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN   0x04
+#define SUBLANG_CROATIAN_CROATIA   0x01
+#define SUBLANG_CZECH_CZECH_REPUBLIC   0x01
+#define SUBLANG_DANISH_DENMARK   0x01
+#define SUBLANG_DARI_AFGHANISTAN   0x01
+#define SUBLANG_DIVEHI_MALDIVES   0x01
+#define SUBLANG_DUTCH_BELGIAN   0x02
+#define SUBLANG_DUTCH   0x01
+#define SUBLANG_ENGLISH_AUS   0x03
+#define SUBLANG_ENGLISH_BELIZE   0x0a
+#define SUBLANG_ENGLISH_CAN   0x04
+#define SUBLANG_ENGLISH_CARIBBEAN   0x09
+#define SUBLANG_ENGLISH_INDIA   0x10
+#define SUBLANG_ENGLISH_EIRE   0x06
+#define SUBLANG_ENGLISH_IRELAND   0x06
+#define SUBLANG_ENGLISH_JAMAICA   0x08
+#define SUBLANG_ENGLISH_MALAYSIA   0x11
+#define SUBLANG_ENGLISH_NZ   0x05
+#define SUBLANG_ENGLISH_PHILIPPINES   0x0d
+#define SUBLANG_ENGLISH_SINGAPORE   0x12
+#define SUBLANG_ENGLISH_SOUTH_AFRICA   0x07
+#define SUBLANG_ENGLISH_TRINIDAD   0x0b
+#define SUBLANG_ENGLISH_UK   0x02
+#define SUBLANG_ENGLISH_US   0x01
+#define SUBLANG_ENGLISH_ZIMBABWE   0x0c
+#define SUBLANG_ESTONIAN_ESTONIA   0x01
+#define SUBLANG_FAEROESE_FAROE_ISLANDS   0x01
+#define SUBLANG_FILIPINO_PHILIPPINES   0x01
+#define SUBLANG_FINNISH_FINLAND   0x01
+#define SUBLANG_FRENCH_BELGIAN   0x02
+#define SUBLANG_FRENCH_CANADIAN   0x03
+#define SUBLANG_FRENCH   0x01
+#define SUBLANG_FRENCH_LUXEMBOURG   0x05
+#define SUBLANG_FRENCH_MONACO   0x06
+#define SUBLANG_FRENCH_SWISS   0x04
+#define SUBLANG_FRISIAN_NETHERLANDS   0x01
+#define SUBLANG_GALICIAN_GALICIAN   0x01
+#define SUBLANG_GEORGIAN_GEORGIA   0x01
+#define SUBLANG_GERMAN_AUSTRIAN   0x03
+#define SUBLANG_GERMAN   0x01
+#define SUBLANG_GERMAN_LIECHTENSTEIN   0x05
+#define SUBLANG_GERMAN_LUXEMBOURG   0x04
+#define SUBLANG_GERMAN_SWISS   0x02
+#define SUBLANG_GREEK_GREECE   0x01
+#define SUBLANG_GREENLANDIC_GREENLAND   0x01
+#define SUBLANG_GUJARATI_INDIA   0x01
+#define SUBLANG_HAUSA_NIGERIA_LATIN   0x01
+#define SUBLANG_HEBREW_ISRAEL   0x01
+#define SUBLANG_HINDI_INDIA   0x01
+#define SUBLANG_HUNGARIAN_HUNGARY   0x01
+#define SUBLANG_ICELANDIC_ICELAND   0x01
+#define SUBLANG_IGBO_NIGERIA   0x01
+#define SUBLANG_INDONESIAN_INDONESIA   0x01
+#define SUBLANG_INUKTITUT_CANADA_LATIN   0x02
+#define SUBLANG_INUKTITUT_CANADA   0x01
+#define SUBLANG_IRISH_IRELAND   0x02
+#define SUBLANG_ITALIAN   0x01
+#define SUBLANG_ITALIAN_SWISS   0x02
+#define SUBLANG_JAPANESE_JAPAN   0x01
+#define SUBLANG_KANNADA_INDIA   0x01
+#define SUBLANG_KASHMIRI_INDIA   0x02
+#define SUBLANG_KASHMIRI_SASIA   0x02
+#define SUBLANG_KAZAK_KAZAKHSTAN   0x01
+#define SUBLANG_KHMER_CAMBODIA   0x01
+#define SUBLANG_KICHE_GUATEMALA   0x01
+#define SUBLANG_KINYARWANDA_RWANDA   0x01
+#define SUBLANG_KONKANI_INDIA   0x01
+#define SUBLANG_KOREAN   0x01
+#define SUBLANG_KYRGYZ_KYRGYZSTAN   0x01
+#define SUBLANG_LAO_LAO   0x01
+#define SUBLANG_LATVIAN_LATVIA   0x01
+#define SUBLANG_LITHUANIAN_LITHUANIA   0x01
+#define SUBLANG_LOWER_SORBIAN_GERMANY   0x02
+#define SUBLANG_LUXEMBOURGISH_LUXEMBOURG   0x01
+#define SUBLANG_MACEDONIAN_MACEDONIA   0x01
+#define SUBLANG_MALAY_BRUNEI_DARUSSALAM   0x02
+#define SUBLANG_MALAY_MALAYSIA   0x01
+#define SUBLANG_MALAYALAM_INDIA   0x01
+#define SUBLANG_MALTESE_MALTA   0x01
+#define SUBLANG_MAORI_NEW_ZEALAND   0x01
+#define SUBLANG_MAPUDUNGUN_CHILE   0x01
+#define SUBLANG_MARATHI_INDIA   0x01
+#define SUBLANG_MOHAWK_MOHAWK   0x01
+#define SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA   0x01
+#define SUBLANG_MONGOLIAN_PRC   0x02
+#define SUBLANG_NEPALI_NEPAL   0x01
+#define SUBLANG_NEPALI_INDIA   0x02
+#define SUBLANG_NORWEGIAN_BOKMAL   0x01
+#define SUBLANG_NORWEGIAN_NYNORSK   0x02
+#define SUBLANG_OCCITAN_FRANCE   0x01
+#define SUBLANG_ORIYA_INDIA   0x01
+#define SUBLANG_PASHTO_AFGHANISTAN   0x01
+#define SUBLANG_PERSIAN_IRAN   0x01
+#define SUBLANG_POLISH_POLAND   0x01
+#define SUBLANG_PORTUGUESE_BRAZILIAN   0x01
+#define SUBLANG_PORTUGUESE   0x02
+#define SUBLANG_PORTUGUESE_PORTUGAL   0x02
+#define SUBLANG_PUNJABI_INDIA   0x01
+#define SUBLANG_QUECHUA_BOLIVIA   0x01
+#define SUBLANG_QUECHUA_ECUADOR   0x02
+#define SUBLANG_QUECHUA_PERU   0x03
+#define SUBLANG_ROMANIAN_ROMANIA   0x01
+#define SUBLANG_ROMANSH_SWITZERLAND   0x01
+#define SUBLANG_RUSSIAN_RUSSIA   0x01
+#define SUBLANG_SAMI_INARI_FINLAND   0x09
+#define SUBLANG_SAMI_LULE_NORWAY   0x04
+#define SUBLANG_SAMI_LULE_SWEDEN   0x05
+#define SUBLANG_SAMI_NORTHERN_FINLAND   0x03
+#define SUBLANG_SAMI_NORTHERN_NORWAY   0x01
+#define SUBLANG_SAMI_NORTHERN_SWEDEN   0x02
+#define SUBLANG_SAMI_SKOLT_FINLAND   0x08
+#define SUBLANG_SAMI_SOUTHERN_NORWAY   0x06
+#define SUBLANG_SAMI_SOUTHERN_SWEDEN   0x07
+#define SUBLANG_SANSKRIT_INDIA   0x01
+#define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC   0x07
+#define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN   0x06
+#define SUBLANG_SERBIAN_CROATIA   0x01
+#define SUBLANG_SERBIAN_CYRILLIC   0x03
+#define SUBLANG_SERBIAN_LATIN   0x02
+#define SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA   0x01
+#define SUBLANG_TSWANA_SOUTH_AFRICA   0x01
+#define SUBLANG_SINDHI_AFGHANISTAN   0x02
+#define SUBLANG_SINDHI_PAKISTAN   0x01
+#define SUBLANG_SINHALESE_SRI_LANKA   0x01
+#define SUBLANG_SLOVAK_SLOVAKIA   0x01
+#define SUBLANG_SLOVENIAN_SLOVENIA   0x01
+#define SUBLANG_SPANISH_ARGENTINA   0x0b
+#define SUBLANG_SPANISH_BOLIVIA   0x10
+#define SUBLANG_SPANISH_CHILE   0x0d
+#define SUBLANG_SPANISH_COLOMBIA   0x09
+#define SUBLANG_SPANISH_COSTA_RICA   0x05
+#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC   0x07
+#define SUBLANG_SPANISH_ECUADOR   0x0c
+#define SUBLANG_SPANISH_EL_SALVADOR   0x11
+#define SUBLANG_SPANISH_GUATEMALA   0x04
+#define SUBLANG_SPANISH_HONDURAS   0x12
+#define SUBLANG_SPANISH_MEXICAN   0x02
+#define SUBLANG_SPANISH_MODERN   0x03
+#define SUBLANG_SPANISH_NICARAGUA   0x13
+#define SUBLANG_SPANISH_PANAMA   0x06
+#define SUBLANG_SPANISH_PARAGUAY   0x0f
+#define SUBLANG_SPANISH_PERU   0x0a
+#define SUBLANG_SPANISH_PUERTO_RICO   0x14
+#define SUBLANG_SPANISH   0x01
+#define SUBLANG_SPANISH_US   0x15
+#define SUBLANG_SPANISH_URUGUAY   0x0e
+#define SUBLANG_SPANISH_VENEZUELA   0x08
+#define SUBLANG_SWAHILI   0x01
+#define SUBLANG_SWEDISH_FINLAND   0x02
+#define SUBLANG_SWEDISH   0x01
+#define SUBLANG_SWEDISH_SWEDEN   0x01
+#define SUBLANG_SYRIAC   0x01
+#define SUBLANG_TAJIK_TAJIKISTAN   0x01
+#define SUBLANG_TAMAZIGHT_ALGERIA_LATIN   0x02
+#define SUBLANG_TAMIL_INDIA   0x01
+#define SUBLANG_TATAR_RUSSIA   0x01
+#define SUBLANG_TELUGU_INDIA   0x01
+#define SUBLANG_THAI_THAILAND   0x01
+#define SUBLANG_TIBETAN_PRC   0x01
+#define SUBLANG_TIGRIGNA_ERITREA   0x02
+#define SUBLANG_TURKISH_TURKEY   0x01
+#define SUBLANG_TURKMEN_TURKMENISTAN   0x01
+#define SUBLANG_UIGHUR_PRC   0x01
+#define SUBLANG_UKRAINIAN_UKRAINE   0x01
+#define SUBLANG_UPPER_SORBIAN_GERMANY   0x01
+#define SUBLANG_URDU_INDIA   0x02
+#define SUBLANG_URDU_PAKISTAN   0x01
+#define SUBLANG_UZBEK_CYRILLIC   0x02
+#define SUBLANG_UZBEK_LATIN   0x01
+#define SUBLANG_VIETNAMESE_VIETNAM   0x01
+#define SUBLANG_WELSH_UNITED_KINGDOM   0x01
+#define SUBLANG_WOLOF_SENEGAL   0x01
+#define SUBLANG_XHOSA_SOUTH_AFRICA   0x01
+#define SUBLANG_YAKUT_RUSSIA   0x01
+#define SUBLANG_YI_PRC   0x01
+#define SUBLANG_YORUBA_NIGERIA   0x01
+#define SUBLANG_ZULU_SOUTH_AFRICA   0x01
 #define NLS_VALID_LOCALE_MASK  1048575
 #define SORT_DEFAULT   0
 #define SORT_JAPANESE_XJIS     0
@@ -949,6 +1159,7 @@ typedef enum
 #define HEAP_DISABLE_COALESCE_ON_FREE 128
 #define HEAP_CREATE_ALIGN_16 0x10000
 #define HEAP_CREATE_ENABLE_TRACING 0x20000
+#define HEAP_CREATE_ENABLE_EXECUTE 0x00040000
 #define HEAP_MAXIMUM_TAG 0xFFF
 #define HEAP_PSEUDO_TAG_FLAG 0x8000
 #define HEAP_TAG_SHIFT 16
@@ -1005,9 +1216,9 @@ typedef enum
 #define MEM_WRITE_WATCH           0x200000 /* 98/Me */
 #define MEM_PHYSICAL      0x400000
 #define MEM_4MB_PAGES    0x80000000
-/* also in ddk/ntifs.h */
+/* FIXME: Oh how I wish, I wish the w32api DDK wouldn't include winnt.h... */
+#ifndef __NTDDK_H
 #define MEM_IMAGE        SEC_IMAGE
-#define SEC_BASED      0x00200000
 #define SEC_NO_CHANGE  0x00400000
 #define SEC_FILE       0x00800000
 #define SEC_IMAGE      0x01000000
@@ -1015,7 +1226,7 @@ typedef enum
 #define SEC_RESERVE    0x04000000
 #define SEC_COMMIT     0x08000000
 #define SEC_NOCACHE    0x10000000
-/* end ntifs.h */
+#endif
 #define SECTION_EXTEND_SIZE 16
 #define SECTION_MAP_READ 4
 #define SECTION_MAP_WRITE 2
@@ -1051,14 +1262,36 @@ typedef enum
 #define IMAGE_FILE_UP_SYSTEM_ONLY      16384
 #define IMAGE_FILE_BYTES_REVERSED_HI   32768
 #define IMAGE_FILE_MACHINE_UNKNOWN     0
-#define IMAGE_FILE_MACHINE_I386        332
-#define IMAGE_FILE_MACHINE_R3000       354
-#define IMAGE_FILE_MACHINE_R4000       358
-#define IMAGE_FILE_MACHINE_R10000      360
-#define IMAGE_FILE_MACHINE_ALPHA       388
-#define IMAGE_FILE_MACHINE_POWERPC     496
-#define IMAGE_FILE_MACHINE_IA64        512
-#define IMAGE_FILE_MACHINE_AMD64       0x8664
+
+#define IMAGE_FILE_MACHINE_AM33       0x1d3
+#define IMAGE_FILE_MACHINE_AMD64      0x8664
+#define IMAGE_FILE_MACHINE_ARM        0x1c0
+#define IMAGE_FILE_MACHINE_EBC        0xebc
+#define IMAGE_FILE_MACHINE_I386       0x14c
+#define IMAGE_FILE_MACHINE_IA64       0x200
+#define IMAGE_FILE_MACHINE_M32R       0x9041
+#define IMAGE_FILE_MACHINE_MIPS16     0x266
+#define IMAGE_FILE_MACHINE_MIPSFPU    0x366
+#define IMAGE_FILE_MACHINE_MIPSFPU16  0x466
+#define IMAGE_FILE_MACHINE_POWERPC    0x1f0
+#define IMAGE_FILE_MACHINE_POWERPCFP  0x1f1
+#define IMAGE_FILE_MACHINE_R4000      0x166
+#define IMAGE_FILE_MACHINE_SH3        0x1a2
+#define IMAGE_FILE_MACHINE_SH3E       0x01a4
+#define IMAGE_FILE_MACHINE_SH3DSP     0x1a3
+#define IMAGE_FILE_MACHINE_SH4        0x1a6
+#define IMAGE_FILE_MACHINE_SH5        0x1a8
+#define IMAGE_FILE_MACHINE_THUMB      0x1c2
+#define IMAGE_FILE_MACHINE_WCEMIPSV2  0x169
+#define IMAGE_FILE_MACHINE_R3000      0x162
+#define IMAGE_FILE_MACHINE_R10000     0x168
+#define IMAGE_FILE_MACHINE_ALPHA      0x184
+#define IMAGE_FILE_MACHINE_ALPHA64    0x0284
+#define IMAGE_FILE_MACHINE_AXP64      IMAGE_FILE_MACHINE_ALPHA64
+#define IMAGE_FILE_MACHINE_CEE        0xC0EE
+#define IMAGE_FILE_MACHINE_TRICORE    0x0520
+#define IMAGE_FILE_MACHINE_CEF        0x0CEF
+
 #define IMAGE_DOS_SIGNATURE 0x5A4D
 #define IMAGE_OS2_SIGNATURE 0x454E
 #define IMAGE_OS2_SIGNATURE_LE 0x454C
@@ -1086,19 +1319,27 @@ typedef enum
 #define IMAGE_SIZEOF_LINENUMBER 6
 #define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60
 #define SIZEOF_RFPO_DATA 16
-#define IMAGE_SUBSYSTEM_UNKNOWN        0
-#define IMAGE_SUBSYSTEM_NATIVE 1
-#define IMAGE_SUBSYSTEM_WINDOWS_GUI    2
-#define IMAGE_SUBSYSTEM_WINDOWS_CUI    3
-#define IMAGE_SUBSYSTEM_OS2_CUI        5
-#define IMAGE_SUBSYSTEM_POSIX_CUI      7
-#define IMAGE_SUBSYSTEM_XBOX   14
+
+#define IMAGE_SUBSYSTEM_UNKNOWN                      0
+#define IMAGE_SUBSYSTEM_NATIVE                       1
+#define IMAGE_SUBSYSTEM_WINDOWS_GUI                  2
+#define IMAGE_SUBSYSTEM_WINDOWS_CUI                  3
+#define IMAGE_SUBSYSTEM_OS2_CUI                      5
+#define IMAGE_SUBSYSTEM_POSIX_CUI                    7
+#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS               8
+#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI               9
+#define IMAGE_SUBSYSTEM_EFI_APPLICATION             10
+#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER     11
+#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER          12
+#define IMAGE_SUBSYSTEM_EFI_ROM                     13
+#define IMAGE_SUBSYSTEM_XBOX                        14
+
 #define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200
 #define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400
 #define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800
 #define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000
 #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
-#define IMAGE_FIRST_SECTION(h) ((PIMAGE_SECTION_HEADER) ((DWORD)h+FIELD_OFFSET(IMAGE_NT_HEADERS,OptionalHeader)+((PIMAGE_NT_HEADERS)(h))->FileHeader.SizeOfOptionalHeader))
+#define IMAGE_FIRST_SECTION(h) ((PIMAGE_SECTION_HEADER) ((ULONG_PTR)h+FIELD_OFFSET(IMAGE_NT_HEADERS,OptionalHeader)+((PIMAGE_NT_HEADERS)(h))->FileHeader.SizeOfOptionalHeader))
 #define IMAGE_DIRECTORY_ENTRY_EXPORT   0
 #define IMAGE_DIRECTORY_ENTRY_IMPORT   1
 #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
@@ -1116,7 +1357,7 @@ typedef enum
 #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR   14
 #define IMAGE_SCN_TYPE_REG 0
 #define IMAGE_SCN_TYPE_DSECT 1
-#define IMAGE_SCN_TYPE_NOLOAD 2
+//#define IMAGE_SCN_TYPE_NOLOAD 2
 #define IMAGE_SCN_TYPE_GROUP 4
 #define IMAGE_SCN_TYPE_NO_PAD 8
 #define IMAGE_SCN_CNT_CODE 32
@@ -1279,6 +1520,9 @@ typedef enum
 #define IMAGE_REL_BASED_HIGHLOW 3
 #define IMAGE_REL_BASED_HIGHADJ 4
 #define IMAGE_REL_BASED_MIPS_JMPADDR 5
+#define IMAGE_REL_BASED_MIPS_JMPADDR16 9
+#define IMAGE_REL_BASED_IA64_IMM64 9
+#define IMAGE_REL_BASED_DIR64 10
 #define IMAGE_ARCHIVE_START_SIZE 8
 #define IMAGE_ARCHIVE_START "!<arch>\n"
 #define IMAGE_ARCHIVE_END "`\n"
@@ -1553,7 +1797,6 @@ typedef VOID (NTAPI *WORKERCALLBACKFUNC)(PVOID);
 #define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK))
 #define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
 #define TLS_MINIMUM_AVAILABLE 64
-#define REPARSE_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
 #define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)
 #define MAXIMUM_REPARSE_DATA_BUFFER_SIZE 16384
 #define IO_REPARSE_TAG_RESERVED_ZERO 0
@@ -1582,9 +1825,10 @@ typedef struct _GUID {
        unsigned short Data3;
        unsigned char  Data4[8];
 } GUID, *REFGUID, *LPGUID;
-#define SYSTEM_LUID { 0x3E7, 0x0 }
 #endif /* GUID_DEFINED */
 
+#define SYSTEM_LUID { 0x3E7, 0x0 }
+
 /* ACE Access Types, also in ntifs.h */
 #define ACCESS_MIN_MS_ACE_TYPE                  (0x0)
 #define ACCESS_ALLOWED_ACE_TYPE                 (0x0)
@@ -1610,7 +1854,8 @@ typedef struct _GUID {
 #define SYSTEM_ALARM_CALLBACK_ACE_TYPE          (0xE)
 #define SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE   (0xF)
 #define SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE   (0x10)
-#define ACCESS_MAX_MS_V5_ACE_TYPE               (0x10)
+#define SYSTEM_MANDATORY_LABEL_ACE_TYPE         (0x11)
+#define ACCESS_MAX_MS_V5_ACE_TYPE               (0x11)
 /* end ntifs.h */
 typedef struct _GENERIC_MAPPING {
        ACCESS_MASK GenericRead;
@@ -1647,6 +1892,15 @@ typedef struct _SYSTEM_ALARM_ACE {
        ACCESS_MASK Mask;
        DWORD SidStart;
 } SYSTEM_ALARM_ACE,*PSYSTEM_ALARM_ACE;
+typedef struct _SYSTEM_MANDATORY_LABEL_ACE {
+       ACE_HEADER Header;
+       ACCESS_MASK Mask;
+       DWORD SidStart;
+} SYSTEM_MANDATORY_LABEL_ACE, *PSYSTEM_MANDATORY_LABEL_ACE;
+#define SYSTEM_MANDATORY_LABEL_NO_WRITE_UP  0x1
+#define SYSTEM_MANDATORY_LABEL_NO_READ_UP   0x2
+#define SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP    0x4
+#define SYSTEM_MANDATORY_LABEL_VALID_MASK (SYSTEM_MANDATORY_LABEL_NO_WRITE_UP | SYSTEM_MANDATORY_LABEL_NO_READ_UP | SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP)
 typedef struct _ACCESS_ALLOWED_OBJECT_ACE {
        ACE_HEADER Header;
        ACCESS_MASK Mask;
@@ -1749,7 +2003,7 @@ typedef struct _ACL_SIZE_INFORMATION {
 } ACL_SIZE_INFORMATION;
 
 /* FIXME: add more machines */
-#if defined(_X86_) || defined(linux)
+#if defined(__i386__) && !defined(__PowerPC__)
 #define SIZE_OF_80387_REGISTERS        80
 #define CONTEXT_i386   0x10000
 #define CONTEXT_i486   0x10000
@@ -1761,6 +2015,11 @@ typedef struct _ACL_SIZE_INFORMATION {
 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
 #define CONTEXT_FULL   (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
 #define MAXIMUM_SUPPORTED_EXTENSION  512
+
+#define EXCEPTION_READ_FAULT    0
+#define EXCEPTION_WRITE_FAULT   1
+#define EXCEPTION_EXECUTE_FAULT 8
+
 typedef struct _FLOATING_SAVE_AREA {
        DWORD   ControlWord;
        DWORD   StatusWord;
@@ -1799,13 +2058,245 @@ typedef struct _CONTEXT {
        DWORD   SegSs;
        BYTE    ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
 } CONTEXT;
+#elif defined(__x86_64__)
+
+
+#define CONTEXT_AMD64 0x100000
+
+#if !defined(RC_INVOKED)
+#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
+#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
+#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
+#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
+#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
+
+#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
+#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
+
+#define CONTEXT_EXCEPTION_ACTIVE 0x8000000
+#define CONTEXT_SERVICE_ACTIVE 0x10000000
+#define CONTEXT_EXCEPTION_REQUEST 0x40000000
+#define CONTEXT_EXCEPTION_REPORTING 0x80000000
+#endif
+
+#define INITIAL_MXCSR 0x1f80
+#define INITIAL_FPCSR 0x027f
+#define EXCEPTION_READ_FAULT    0
+#define EXCEPTION_WRITE_FAULT   1
+#define EXCEPTION_EXECUTE_FAULT 8
+
+typedef struct DECLSPEC_ALIGN(16) _M128A {
+    ULONGLONG Low;
+    LONGLONG High;
+} M128A, *PM128A;
+
+typedef struct _XMM_SAVE_AREA32 {
+    WORD ControlWord;
+    WORD StatusWord;
+    BYTE TagWord;
+    BYTE Reserved1;
+    WORD ErrorOpcode;
+    DWORD ErrorOffset;
+    WORD ErrorSelector;
+    WORD Reserved2;
+    DWORD DataOffset;
+    WORD DataSelector;
+    WORD Reserved3;
+    DWORD MxCsr;
+    DWORD MxCsr_Mask;
+    M128A FloatRegisters[8];
+    M128A XmmRegisters[16];
+    BYTE Reserved4[96];
+} XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
+
+typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
+    DWORD64 P1Home;
+    DWORD64 P2Home;
+    DWORD64 P3Home;
+    DWORD64 P4Home;
+    DWORD64 P5Home;
+    DWORD64 P6Home;
+
+    /* Control flags */
+    DWORD ContextFlags;
+    DWORD MxCsr;
+
+    /* Segment */
+    WORD SegCs;
+    WORD SegDs;
+    WORD SegEs;
+    WORD SegFs;
+    WORD SegGs;
+    WORD SegSs;
+    DWORD EFlags;
+
+    /* Debug */
+    DWORD64 Dr0;
+    DWORD64 Dr1;
+    DWORD64 Dr2;
+    DWORD64 Dr3;
+    DWORD64 Dr6;
+    DWORD64 Dr7;
+
+    /* Integer */
+    DWORD64 Rax;
+    DWORD64 Rcx;
+    DWORD64 Rdx;
+    DWORD64 Rbx;
+    DWORD64 Rsp;
+    DWORD64 Rbp;
+    DWORD64 Rsi;
+    DWORD64 Rdi;
+    DWORD64 R8;
+    DWORD64 R9;
+    DWORD64 R10;
+    DWORD64 R11;
+    DWORD64 R12;
+    DWORD64 R13;
+    DWORD64 R14;
+    DWORD64 R15;
+
+    /* Counter */
+    DWORD64 Rip;
+
+   /* Floating point */
+   union {
+       XMM_SAVE_AREA32 FltSave;
+       struct {
+           M128A Header[2];
+           M128A Legacy[8];
+           M128A Xmm0;
+           M128A Xmm1;
+           M128A Xmm2;
+           M128A Xmm3;
+           M128A Xmm4;
+           M128A Xmm5;
+           M128A Xmm6;
+           M128A Xmm7;
+           M128A Xmm8;
+           M128A Xmm9;
+           M128A Xmm10;
+           M128A Xmm11;
+           M128A Xmm12;
+           M128A Xmm13;
+           M128A Xmm14;
+           M128A Xmm15;
+      } DUMMYSTRUCTNAME;
+    } DUMMYUNIONNAME;
+
+     /* Vector */
+    M128A VectorRegister[26];
+    DWORD64 VectorControl;
+
+    /* Debug control */
+    DWORD64 DebugControl;
+    DWORD64 LastBranchToRip;
+    DWORD64 LastBranchFromRip;
+    DWORD64 LastExceptionToRip;
+    DWORD64 LastExceptionFromRip;
+} CONTEXT, *PCONTEXT;
+
+
+typedef struct _KNONVOLATILE_CONTEXT_POINTERS {
+    union {
+        PM128A FloatingContext[16];
+        struct {
+            PM128A Xmm0;
+            PM128A Xmm1;
+            PM128A Xmm2;
+            PM128A Xmm3;
+            PM128A Xmm4;
+            PM128A Xmm5;
+            PM128A Xmm6;
+            PM128A Xmm7;
+            PM128A Xmm8;
+            PM128A Xmm9;
+            PM128A Xmm10;
+            PM128A Xmm11;
+            PM128A Xmm12;
+            PM128A Xmm13;
+            PM128A Xmm14;
+            PM128A Xmm15;
+        };
+    };
+
+    union {
+        PULONG64 IntegerContext[16];
+        struct {
+            PULONG64 Rax;
+            PULONG64 Rcx;
+            PULONG64 Rdx;
+            PULONG64 Rbx;
+            PULONG64 Rsp;
+            PULONG64 Rbp;
+            PULONG64 Rsi;
+            PULONG64 Rdi;
+            PULONG64 R8;
+            PULONG64 R9;
+            PULONG64 R10;
+            PULONG64 R11;
+            PULONG64 R12;
+            PULONG64 R13;
+            PULONG64 R14;
+            PULONG64 R15;
+        };
+    };
+} KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS;
+
+#define UNW_FLAG_NHANDLER 0x0 /* No handler. */
+#define UNW_FLAG_EHANDLER 0x1 /* Exception handler should be called */
+#define UNW_FLAG_UHANDLER 0x2 /* Termination handler that should be called when unwinding an exception */
+#define UNW_FLAG_CHAININFO 0x4 /* FunctionEntry member is the contents of a previous function table entry */
+
+#define RUNTIME_FUNCTION_INDIRECT 0x1
+
+  typedef struct _RUNTIME_FUNCTION {
+    DWORD BeginAddress;
+    DWORD EndAddress;
+    DWORD UnwindData;
+  } RUNTIME_FUNCTION,*PRUNTIME_FUNCTION;
+
+  typedef PRUNTIME_FUNCTION (*PGET_RUNTIME_FUNCTION_CALLBACK)(DWORD64 ControlPc,PVOID Context);
+  typedef DWORD (*POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK)(HANDLE Process,PVOID TableAddress,PDWORD Entries,PRUNTIME_FUNCTION *Functions);
+
+  #define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME "OutOfProcessFunctionTableCallback"
+
+NTSYSAPI
+VOID
+__cdecl
+RtlRestoreContext(PCONTEXT ContextRecord,
+                  struct _EXCEPTION_RECORD *ExceptionRecord);
+
+NTSYSAPI
+BOOLEAN
+__cdecl
+RtlAddFunctionTable(PRUNTIME_FUNCTION FunctionTable,
+                    DWORD EntryCount,
+                    DWORD64 BaseAddress);
+
+NTSYSAPI
+BOOLEAN
+__cdecl
+RtlInstallFunctionTableCallback(DWORD64 TableIdentifier,
+                                DWORD64 BaseAddress,
+                                DWORD Length,
+                                PGET_RUNTIME_FUNCTION_CALLBACK Callback,
+                                PVOID Context,
+                                PCWSTR OutOfProcessCallbackDll);
+
+NTSYSAPI
+BOOLEAN
+__cdecl
+RtlDeleteFunctionTable(PRUNTIME_FUNCTION FunctionTable);
+
 #elif defined(_PPC_)
 #define CONTEXT_CONTROL        1L
 #define CONTEXT_FLOATING_POINT 2L
 #define CONTEXT_INTEGER        4L
 #define CONTEXT_DEBUG_REGISTERS        8L
 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_FLOATING_POINT|CONTEXT_INTEGER)
-typedef struct _CONTEXT {
+typedef struct _FLOATING_SAVE_AREA
+{
        double Fpr0;
        double Fpr1;
        double Fpr2;
@@ -1839,6 +2330,10 @@ typedef struct _CONTEXT {
        double Fpr30;
        double Fpr31;
        double Fpscr;
+} FLOATING_SAVE_AREA;
+
+typedef struct _CONTEXT {
+        FLOATING_SAVE_AREA FloatSave;
        DWORD Gpr0;
        DWORD Gpr1;
        DWORD Gpr2;
@@ -2078,7 +2573,7 @@ typedef struct _CONTEXT {
 #endif
 } CONTEXT;
 
-#elif defined(MIPS)
+#elif defined(_MIPS_)
 
 /* The following flags control the contents of the CONTEXT structure. */
 
@@ -2281,47 +2776,75 @@ typedef struct _CONTEXT {
 #error "undefined processor type"
 #endif
 typedef CONTEXT *PCONTEXT,*LPCONTEXT;
-typedef struct _EXCEPTION_RECORD {
-       DWORD ExceptionCode;
-       DWORD ExceptionFlags;
-       struct _EXCEPTION_RECORD *ExceptionRecord;
-       PVOID ExceptionAddress;
-       DWORD NumberParameters;
-       ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
-} EXCEPTION_RECORD,*PEXCEPTION_RECORD,*LPEXCEPTION_RECORD;
-typedef struct _EXCEPTION_POINTERS {
-       PEXCEPTION_RECORD ExceptionRecord;
-       PCONTEXT ContextRecord;
-} EXCEPTION_POINTERS,*PEXCEPTION_POINTERS,*LPEXCEPTION_POINTERS;
+
+#define EXCEPTION_NONCONTINUABLE       1
+#define EXCEPTION_MAXIMUM_PARAMETERS 15
+
+    typedef struct _EXCEPTION_RECORD {
+      DWORD ExceptionCode;
+      DWORD ExceptionFlags;
+      struct _EXCEPTION_RECORD *ExceptionRecord;
+      PVOID ExceptionAddress;
+      DWORD NumberParameters;
+      ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+    } EXCEPTION_RECORD, *PEXCEPTION_RECORD, *LPEXCEPTION_RECORD;
+
+    typedef EXCEPTION_RECORD *PEXCEPTION_RECORD;
+
+    typedef struct _EXCEPTION_RECORD32 {
+      DWORD ExceptionCode;
+      DWORD ExceptionFlags;
+      DWORD ExceptionRecord;
+      DWORD ExceptionAddress;
+      DWORD NumberParameters;
+      DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+    } EXCEPTION_RECORD32,*PEXCEPTION_RECORD32;
+
+    typedef struct _EXCEPTION_RECORD64 {
+      DWORD ExceptionCode;
+      DWORD ExceptionFlags;
+      DWORD64 ExceptionRecord;
+      DWORD64 ExceptionAddress;
+      DWORD NumberParameters;
+      DWORD __unusedAlignment;
+      DWORD64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+    } EXCEPTION_RECORD64,*PEXCEPTION_RECORD64;
+
+    typedef struct _EXCEPTION_POINTERS {
+      PEXCEPTION_RECORD ExceptionRecord;
+      PCONTEXT ContextRecord;
+    } EXCEPTION_POINTERS,*PEXCEPTION_POINTERS, *LPEXCEPTION_POINTERS;
+
+#ifdef _M_PPC
+#define LARGE_INTEGER_ORDER(x) x HighPart; DWORD LowPart;
+#else
+#define LARGE_INTEGER_ORDER(x) DWORD LowPart; x HighPart;
+#endif
+
 typedef union _LARGE_INTEGER {
 #if ! defined(NONAMELESSUNION) || defined(__cplusplus)
   _ANONYMOUS_STRUCT struct {
-    DWORD LowPart;
-    LONG  HighPart;
+      LARGE_INTEGER_ORDER(LONG)
   };
 #endif /* NONAMELESSUNION */
   struct {
-    DWORD LowPart;
-    LONG  HighPart;
+      LARGE_INTEGER_ORDER(LONG)
   } u;
   LONGLONG QuadPart;
 } LARGE_INTEGER, *PLARGE_INTEGER;
 typedef union _ULARGE_INTEGER {
 #if ! defined(NONAMELESSUNION) || defined(__cplusplus)
   _ANONYMOUS_STRUCT struct {
-    DWORD LowPart;
-    DWORD HighPart;
+      LARGE_INTEGER_ORDER(DWORD)
   };
 #endif /* NONAMELESSUNION */
   struct {
-    DWORD LowPart;
-    DWORD HighPart;
+      LARGE_INTEGER_ORDER(DWORD)
   } u;
   ULONGLONG QuadPart;
 } ULARGE_INTEGER, *PULARGE_INTEGER;
 typedef struct _LUID {
-    DWORD LowPart;
-    LONG HighPart;
+    LARGE_INTEGER_ORDER(LONG)
 } LUID, *PLUID;
 #pragma pack(push,4)
 typedef struct _LUID_AND_ATTRIBUTES {
@@ -2444,6 +2967,9 @@ typedef struct _TOKEN_USER {
 } TOKEN_USER, *PTOKEN_USER;
 typedef DWORD SECURITY_INFORMATION,*PSECURITY_INFORMATION;
 typedef WORD SECURITY_DESCRIPTOR_CONTROL,*PSECURITY_DESCRIPTOR_CONTROL;
+
+#ifndef _SECURITY_ATTRIBUTES_
+#define _SECURITY_ATTRIBUTES_
 typedef struct _SECURITY_DESCRIPTOR {
        BYTE Revision;
        BYTE Sbz1;
@@ -2453,6 +2979,7 @@ typedef struct _SECURITY_DESCRIPTOR {
        PACL Sacl;
        PACL Dacl;
 } SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
+#endif
 typedef struct _SECURITY_DESCRIPTOR_RELATIVE {
     BYTE Revision;
     BYTE Sbz1;
@@ -2614,7 +3141,9 @@ typedef struct _RTL_CRITICAL_SECTION_DEBUG {
        LIST_ENTRY ProcessLocksList;
        DWORD EntryCount;
        DWORD ContentionCount;
-       DWORD Spare[2];
+    DWORD Flags;
+    WORD CreatorBackTraceIndexHigh;
+    WORD SpareWORD;
 } RTL_CRITICAL_SECTION_DEBUG,*PRTL_CRITICAL_SECTION_DEBUG;
 typedef struct _RTL_CRITICAL_SECTION {
        PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
@@ -2626,6 +3155,41 @@ typedef struct _RTL_CRITICAL_SECTION {
 } RTL_CRITICAL_SECTION,*PRTL_CRITICAL_SECTION;
 #endif
 
+NTSYSAPI
+WORD
+NTAPI
+RtlCaptureStackBackTrace(
+    IN DWORD FramesToSkip,
+    IN DWORD FramesToCapture,
+    OUT PVOID *BackTrace,
+    OUT PDWORD BackTraceHash OPTIONAL
+);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlCaptureContext(
+    PCONTEXT ContextRecord
+);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlPcToFileHeader(
+    IN PVOID PcValue,
+    PVOID* BaseOfImage
+);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlUnwind (
+    IN PVOID TargetFrame OPTIONAL,
+    IN PVOID TargetIp OPTIONAL,
+    IN PEXCEPTION_RECORD ExceptionRecord OPTIONAL,
+    IN PVOID ReturnValue
+    );
+
 #define RTL_SRWLOCK_INIT {0}
 typedef struct _RTL_SRWLOCK
 {
@@ -3061,23 +3625,84 @@ typedef struct _IMAGE_IMPORT_BY_NAME {
        WORD Hint;
        BYTE Name[1];
 } IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME;
-typedef struct _IMAGE_THUNK_DATA {
-       union {
-               PBYTE ForwarderString;
-               PDWORD Function;
-               DWORD Ordinal;
-               PIMAGE_IMPORT_BY_NAME AddressOfData;
-       } u1;
-} IMAGE_THUNK_DATA,*PIMAGE_THUNK_DATA;
+#include "pshpack8.h"
+typedef struct _IMAGE_THUNK_DATA64 {
+    union {
+        ULONGLONG ForwarderString;
+        ULONGLONG Function;
+        ULONGLONG Ordinal;
+        ULONGLONG AddressOfData;
+    } u1;
+} IMAGE_THUNK_DATA64;
+typedef IMAGE_THUNK_DATA64 *PIMAGE_THUNK_DATA64;
+#include "poppack.h"
+
+typedef struct _IMAGE_THUNK_DATA32 {
+    union {
+        DWORD ForwarderString;
+        DWORD Function;
+        DWORD Ordinal;
+        DWORD AddressOfData;
+    } u1;
+} IMAGE_THUNK_DATA32;
+typedef IMAGE_THUNK_DATA32 *PIMAGE_THUNK_DATA32;
+
+#define IMAGE_ORDINAL_FLAG64 0x8000000000000000
+#define IMAGE_ORDINAL_FLAG32 0x80000000
+#define IMAGE_ORDINAL64(Ordinal) (Ordinal & 0xffff)
+#define IMAGE_ORDINAL32(Ordinal) (Ordinal & 0xffff)
+#define IMAGE_SNAP_BY_ORDINAL64(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG64)!=0)
+#define IMAGE_SNAP_BY_ORDINAL32(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG32)!=0)
+
+typedef VOID
+(NTAPI *PIMAGE_TLS_CALLBACK)(PVOID DllHandle,DWORD Reason,PVOID Reserved);
+
+typedef struct _IMAGE_TLS_DIRECTORY64 {
+    ULONGLONG StartAddressOfRawData;
+    ULONGLONG EndAddressOfRawData;
+    ULONGLONG AddressOfIndex;
+    ULONGLONG AddressOfCallBacks;
+    DWORD SizeOfZeroFill;
+    DWORD Characteristics;
+} IMAGE_TLS_DIRECTORY64;
+typedef IMAGE_TLS_DIRECTORY64 *PIMAGE_TLS_DIRECTORY64;
+
+typedef struct _IMAGE_TLS_DIRECTORY32 {
+    DWORD StartAddressOfRawData;
+    DWORD EndAddressOfRawData;
+    DWORD AddressOfIndex;
+    DWORD AddressOfCallBacks;
+    DWORD SizeOfZeroFill;
+    DWORD Characteristics;
+} IMAGE_TLS_DIRECTORY32;
+typedef IMAGE_TLS_DIRECTORY32 *PIMAGE_TLS_DIRECTORY32;
+#ifdef _WIN64
+#define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG64
+#define IMAGE_ORDINAL(Ordinal) IMAGE_ORDINAL64(Ordinal)
+typedef IMAGE_THUNK_DATA64 IMAGE_THUNK_DATA;
+typedef PIMAGE_THUNK_DATA64 PIMAGE_THUNK_DATA;
+#define IMAGE_SNAP_BY_ORDINAL(Ordinal) IMAGE_SNAP_BY_ORDINAL64(Ordinal)
+typedef IMAGE_TLS_DIRECTORY64 IMAGE_TLS_DIRECTORY;
+typedef PIMAGE_TLS_DIRECTORY64 PIMAGE_TLS_DIRECTORY;
+#else
+#define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG32
+#define IMAGE_ORDINAL(Ordinal) IMAGE_ORDINAL32(Ordinal)
+typedef IMAGE_THUNK_DATA32 IMAGE_THUNK_DATA;
+typedef PIMAGE_THUNK_DATA32 PIMAGE_THUNK_DATA;
+#define IMAGE_SNAP_BY_ORDINAL(Ordinal) IMAGE_SNAP_BY_ORDINAL32(Ordinal)
+typedef IMAGE_TLS_DIRECTORY32 IMAGE_TLS_DIRECTORY;
+typedef PIMAGE_TLS_DIRECTORY32 PIMAGE_TLS_DIRECTORY;
+#endif
+
 typedef struct _IMAGE_IMPORT_DESCRIPTOR {
        _ANONYMOUS_UNION union {
                DWORD Characteristics;
-               PIMAGE_THUNK_DATA OriginalFirstThunk;
+               ULONG OriginalFirstThunk;
        } DUMMYUNIONNAME;
        DWORD TimeDateStamp;
        DWORD ForwarderChain;
        DWORD Name;
-       PIMAGE_THUNK_DATA FirstThunk;
+       ULONG FirstThunk;
 } IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
 typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {
        DWORD TimeDateStamp;
@@ -3090,14 +3715,6 @@ typedef struct _IMAGE_BOUND_FORWARDER_REF {
        WORD Reserved;
 } IMAGE_BOUND_FORWARDER_REF,*PIMAGE_BOUND_FORWARDER_REF;
 typedef void(NTAPI *PIMAGE_TLS_CALLBACK)(PVOID,DWORD,PVOID);
-typedef struct _IMAGE_TLS_DIRECTORY {
-       DWORD StartAddressOfRawData;
-       DWORD EndAddressOfRawData;
-       PDWORD AddressOfIndex;
-       PIMAGE_TLS_CALLBACK *AddressOfCallBacks;
-       DWORD SizeOfZeroFill;
-       DWORD Characteristics;
-} IMAGE_TLS_DIRECTORY,*PIMAGE_TLS_DIRECTORY;
 typedef struct _IMAGE_RESOURCE_DIRECTORY {
        DWORD Characteristics;
        DWORD TimeDateStamp;
@@ -3111,16 +3728,19 @@ _ANONYMOUS_STRUCT typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
                _ANONYMOUS_STRUCT struct {
                        DWORD NameOffset:31;
                        DWORD NameIsString:1;
-               }DUMMYSTRUCTNAME;
+               }DUMMYSTRUCTNAME1;
                DWORD Name;
-               WORD Id;
-       } DUMMYUNIONNAME;
+               _ANONYMOUS_STRUCT struct {
+                       WORD Id;
+                       WORD __pad;
+               }DUMMYSTRUCTNAME2;
+       } DUMMYUNIONNAME1;
        _ANONYMOUS_UNION union {
                DWORD OffsetToData;
                _ANONYMOUS_STRUCT struct {
                        DWORD OffsetToDirectory:31;
                        DWORD DataIsDirectory:1;
-               } DUMMYSTRUCTNAME2;
+               } DUMMYSTRUCTNAME3;
        } DUMMYUNIONNAME2;
 } IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY;
 typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
@@ -3249,31 +3869,6 @@ typedef struct _NT_TIB {
        PVOID ArbitraryUserPointer;
        struct _NT_TIB *Self;
 } NT_TIB,*PNT_TIB;
-typedef struct _REPARSE_DATA_BUFFER {
-       DWORD  ReparseTag;
-       WORD   ReparseDataLength;
-       WORD   Reserved;
-       _ANONYMOUS_UNION union {
-               struct {
-                       WORD   SubstituteNameOffset;
-                       WORD   SubstituteNameLength;
-                       WORD   PrintNameOffset;
-                       WORD   PrintNameLength;
-                       ULONG  Flags;
-                       WCHAR PathBuffer[1];
-               } SymbolicLinkReparseBuffer;
-               struct {
-                       WORD   SubstituteNameOffset;
-                       WORD   SubstituteNameLength;
-                       WORD   PrintNameOffset;
-                       WORD   PrintNameLength;
-                       WCHAR PathBuffer[1];
-               } MountPointReparseBuffer;
-               struct {
-                       BYTE   DataBuffer[1];
-               } GenericReparseBuffer;
-       } DUMMYUNIONNAME;
-} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
 typedef struct _REPARSE_GUID_DATA_BUFFER {
        DWORD  ReparseTag;
        WORD   ReparseDataLength;
@@ -3360,6 +3955,13 @@ typedef enum _JOBOBJECTINFOCLASS {
        JobObjectJobSetInformation,
        MaxJobObjectInfoClass
 } JOBOBJECTINFOCLASS;
+
+typedef struct _JOB_SET_ARRAY
+{
+    HANDLE JobHandle;
+    DWORD MemberLevel;
+    DWORD Flags;
+} JOB_SET_ARRAY, *PJOB_SET_ARRAY;
 #endif
 
 typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
@@ -3591,6 +4193,17 @@ typedef struct _SYSTEM_BATTERY_STATE {
        ULONG  DefaultAlert2;
 } SYSTEM_BATTERY_STATE, *PSYSTEM_BATTERY_STATE;
 
+#ifndef __NTDDK_H /* HACK!!! ntddk.h shouldn't include winnt.h! */
+typedef struct _PROCESSOR_POWER_INFORMATION {
+       ULONG Number;
+       ULONG MaxMhz;
+       ULONG CurrentMhz;
+       ULONG MhzLimit;
+       ULONG MaxIdleState;
+       ULONG CurrentIdleState;
+} PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION;
+#endif
+
 typedef DWORD EXECUTION_STATE;
 typedef enum _POWER_INFORMATION_LEVEL {
        SystemPowerPolicyAc,
@@ -3631,6 +4244,7 @@ typedef struct _SYSTEM_POWER_INFORMATION {
 #endif
 
 #if (_WIN32_WINNT >= 0x0500)
+#define _AUDIT_EVENT_TYPE_HACK 1
 typedef enum _AUDIT_EVENT_TYPE {
     AuditEventObjectAccess,
     AuditEventDirectoryServiceAccess
@@ -3696,6 +4310,22 @@ typedef struct _ASSEMBLY_FILE_DETAILED_INFORMATION {
        PCWSTR lpFilePath;
 } ASSEMBLY_FILE_DETAILED_INFORMATION,*PASSEMBLY_FILE_DETAILED_INFORMATION;
 typedef const ASSEMBLY_FILE_DETAILED_INFORMATION *PCASSEMBLY_FILE_DETAILED_INFORMATION;
+
+#define ACTIVATION_CONTEXT_PATH_TYPE_NONE         1
+#define ACTIVATION_CONTEXT_PATH_TYPE_WIN32_FILE   2
+#define ACTIVATION_CONTEXT_PATH_TYPE_URL          3
+#define ACTIVATION_CONTEXT_PATH_TYPE_ASSEMBLYREF  4
+
+#define ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION          1
+#define ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION               2
+#define ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION      3
+#define ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION        4
+#define ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION     5
+#define ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION  6
+#define ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION        7
+#define ACTIVATION_CONTEXT_SECTION_GLOBAL_OBJECT_RENAME_TABLE    8
+#define ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES                9
+
 #endif /* (WIN32_WINNT >= 0x0501) */
 
 typedef struct _PROCESSOR_POWER_POLICY_INFO {
@@ -3741,6 +4371,7 @@ typedef OSVERSIONINFOEXA OSVERSIONINFOEX,*POSVERSIONINFOEX,*LPOSVERSIONINFOEX;
 ULONGLONG WINAPI VerSetConditionMask(ULONGLONG,DWORD,BYTE);
 #endif
 
+NTSYSAPI
 SIZE_T
 STDCALL
 RtlCompareMemory (
@@ -3762,30 +4393,85 @@ typedef struct _OBJECT_TYPE_LIST {
 
 #if defined(__GNUC__)
 
+#if defined(_M_IX86)
 static __inline__ PVOID GetCurrentFiber(void)
 {
     void* ret;
     __asm__ __volatile__ (
-       "movl   %%fs:0x10,%0"
-       : "=r" (ret) /* allow use of reg eax,ebx,ecx,edx,esi,edi */
-       );
+        "movl  %%fs:0x10,%0"
+        : "=r" (ret) /* allow use of reg eax,ebx,ecx,edx,esi,edi */
+    );
     return ret;
 }
+#elif defined (_M_AMD64)
+FORCEINLINE PVOID GetCurrentFiber(VOID)
+{
+    return (PVOID)__readgsqword(FIELD_OFFSET(NT_TIB, FiberData));
+}
+#elif defined (_M_ARM)
+    PVOID WINAPI GetCurrentFiber(VOID);
+#else
+#if defined(_M_PPC)
+static __inline__ __attribute__((always_inline)) unsigned long __readfsdword_winnt(const unsigned long Offset)
+{
+    unsigned long result;
+    __asm__("\tadd 7,13,%1\n"
+            "\tlwz %0,0(7)\n"
+            : "=r" (result)
+            : "r" (Offset)
+            : "r7");
+    return result;
+}
+
+#else
+#error Unknown architecture
+#endif
+static __inline__ PVOID GetCurrentFiber(void)
+{
+    return __readfsdword_winnt(0x10);
+}
+#endif
 
+/* FIXME: Oh how I wish, I wish the w32api DDK wouldn't include winnt.h... */
+#ifndef __NTDDK_H
+#ifdef _M_IX86
 static __inline__ struct _TEB * NtCurrentTeb(void)
 {
     struct _TEB *ret;
 
-#ifndef _M_PPC
     __asm__ __volatile__ (
         "movl %%fs:0x18, %0\n"
         : "=r" (ret)
         : /* no inputs */
     );
-#endif
 
     return ret;
 }
+#elif _M_ARM
+
+//
+// NT-ARM is not documented
+//
+#define KIRQL ULONG // Hack!
+#include <armddk.h>
+
+#elif defined (_M_AMD64)
+FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
+{
+    return (struct _TEB *)__readgsqword(FIELD_OFFSET(NT_TIB, Self));
+}
+#else
+static __inline__ struct _TEB * NtCurrentTeb(void)
+{
+    return __readfsdword_winnt(0x18);
+}
+#endif
+#elif defined(_M_PPC)
+static __inline__ struct _TEB * NtCurrentTeb(void)
+{
+    return __readfsdword_winnt(0x18);
+}
+#endif
 
 #elif defined(__WATCOMC__)
 
@@ -3844,99 +4530,53 @@ static __inline__ BOOLEAN
 InterlockedBitTestAndSet(IN LONG volatile *Base,
                          IN LONG Bit)
 {
+#if defined(_M_IX86)
        LONG OldBit;
-
-#ifdef _M_IX86
        __asm__ __volatile__("lock "
                             "btsl %2,%1\n\t"
                             "sbbl %0,%0\n\t"
-                            :"=r" (OldBit),"=m" (*Base)
-                            :"Ir" (Bit)
-                            : "memory");
-#elif defined(_M_PPC)
-       LONG scratch;
-
-       Bit = 1 << Bit;
-       /* %0 - OldBit
-        * %1 - Bit
-        * %2 - scratch
-        * %3 - Base
-        */
-       __asm__ __volatile__(
-           "sync\n"
-           "0:\n\t"
-           "lwarx %2,0,%3\n\t"
-            "mr %0,%2\n\t"
-           "or %2,%1,%2\n\t"
-           "stwcx. %2,0,%3\n\t"
-           "bne- 0b\n\t" : 
-           "=r" (OldBit) :
-           "r" (Bit),
-           "r" (scratch),
-           "r" (Base)
-           );
-#endif
-
+                            :"=r" (OldBit),"=m" (*Base)
+                            :"Ir" (Bit)
+                            : "memory");
        return OldBit;
+#else
+       return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
+#endif
 }
 
 static __inline__ BOOLEAN
 InterlockedBitTestAndReset(IN LONG volatile *Base,
-                          IN LONG Bit)
+                           IN LONG Bit)
 {
+#if defined(_M_IX86)
        LONG OldBit;
-
-#ifdef _M_IX86
        __asm__ __volatile__("lock "
                             "btrl %2,%1\n\t"
                             "sbbl %0,%0\n\t"
-                            :"=r" (OldBit),"=m" (*Base)
-                            :"Ir" (Bit)
-                            : "memory");
-#elif defined(_M_PPC)
-       LONG scratch;
-
-       Bit = ~(1 << Bit);
-       /* %0 - OldBit
-        * %1 - Bit
-        * %2 - scratch
-        * %3 - Base
-        */
-       __asm__ __volatile__(
-           "sync\n"
-           "0:\n\t"
-           "lwarx %2,0,%3\n\t"
-            "mr %0,%2\n\t"
-           "and %2,%1,%2\n\t"
-           "stwcx. %2,0,%3\n\t"
-           "bne- 0b\n\t" : 
-           "=r" (OldBit) :
-           "r" (Bit),
-           "r" (scratch),
-           "r" (Base)
-           );
-#endif
-
+                            :"=r" (OldBit),"=m" (*Base)
+                            :"Ir" (Bit)
+                            : "memory");
        return OldBit;
+#else
+       return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
+#endif
 }
 
 static __inline__ BOOLEAN
 BitScanReverse(OUT ULONG *Index,
                IN ULONG Mask)
 {
-#ifdef _M_IX86
        BOOLEAN BitPosition = 0;
-
+#if defined(_M_IX86)
        __asm__ __volatile__("bsrl %2,%0\n\t"
                             "setnz %1\n\t"
-                         :"=&r" (*Index), "=r" (BitPosition)
-                                :"rm" (Mask)
-                                    :"memory");
-
+                            :"=&r" (*Index), "=r" (BitPosition)
+                            :"rm" (Mask)
+                            :"memory");
        return BitPosition;
 #else
        /* Slow implementation for now */
-       for( *Index = 31; *Index; *Index-- ) {
+       for( *Index = 31; *Index; (*Index)-- ) {
                if( (1<<*Index) & Mask ) {
                        return TRUE;
                }
@@ -3948,10 +4588,18 @@ BitScanReverse(OUT ULONG *Index,
 
 #endif
 
-#ifdef _M_IX86
+#if defined(_M_IX86)
+#define YieldProcessor() __asm__ __volatile__("pause");
+#elif defined (_M_AMD64)
 #define YieldProcessor() __asm__ __volatile__("pause");
 #elif defined(_M_PPC)
 #define YieldProcessor() __asm__ __volatile__("nop");
+#elif defined(_M_MIPS)
+#define YieldProcessor() __asm__ __volatile__("nop");
+#elif defined(_M_ARM)
+#define YieldProcessor()
+#else
+#error Unknown architecture
 #endif
 
 #if defined(_AMD64_)
@@ -3959,6 +4607,19 @@ BitScanReverse(OUT ULONG *Index,
 
 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONG64 *)a, b)
 
+#define InterlockedAnd _InterlockedAnd
+#define InterlockedExchange _InterlockedExchange
+#define InterlockedOr _InterlockedOr
+
+#define InterlockedAnd64 _InterlockedAnd64
+#define InterlockedOr64 _InterlockedOr64
+
+#define InterlockedBitTestAndSet _interlockedbittestandset
+#define InterlockedBitTestAndSet64 _interlockedbittestandset64
+#define InterlockedBitTestAndReset _interlockedbittestandreset
+#define InterlockedBitTestAndReset64 _interlockedbittestandreset64
+
+
 #endif
 
 #else