- Fix the sad sad definition of sizeof(ANSI_NULL) which returned 4...
[reactos.git] / reactos / w32api / include / winnt.h
index 35fdbc6..7b295bc 100644 (file)
@@ -19,6 +19,9 @@
 #define _X86_
 #elif defined(_M_ALPHA) && !defined(_ALPHA_)
 #define _ALPHA_
+
+#elif defined(_M_ARM) && !defined(ARM)
+#define ARM
 #elif defined(_M_PPC) && !defined(_PPC_)
 #define _PPC_
 #elif defined(_M_MRX000) && !defined(_MIPS_)
@@ -31,6 +34,7 @@
 extern "C" {
 #endif
 
+#include <ctype.h>
 #include <winerror.h>
 
 #ifndef RC_INVOKED
@@ -113,7 +117,7 @@ typedef const TCHAR *LPCTSTR;
  * The corresponding macros  _TEXT() and _T() for mapping _UNICODE strings
  * passed to C runtime functions are defined in mingw/tchar.h
  */
-#define TEXT(q) __TEXT(q)    
+#define TEXT(q) __TEXT(q)
 typedef SHORT *PSHORT;
 typedef LONG *PLONG;
 #ifdef STRICT
@@ -152,8 +156,8 @@ typedef LONGLONG USN;
 #define Int64ShraMod32(a,b) ((LONGLONG)(a)>>(b))
 #define Int64ShrlMod32(a,b) ((DWORDLONG)(a)>>(b))
 #endif
-#define ANSI_NULL '\0'
-#define UNICODE_NULL L'\0'
+#define ANSI_NULL ((CHAR)0)
+#define UNICODE_NULL ((WCHAR)0)
 typedef BYTE BOOLEAN,*PBOOLEAN;
 #endif
 typedef BYTE FCHAR;
@@ -186,6 +190,7 @@ typedef DWORD FLONG;
 #define CONTAINER_INHERIT_ACE  2
 #define NO_PROPAGATE_INHERIT_ACE       4
 #define INHERIT_ONLY_ACE       8
+#define INHERITED_ACE  10
 #define VALID_INHERIT_FLAGS    16
 #define SUCCESSFUL_ACCESS_ACE_FLAG     64
 #define FAILED_ACCESS_ACE_FLAG 128
@@ -232,7 +237,7 @@ typedef DWORD FLONG;
 #define FILE_SHARE_WRITE               0x00000002
 #define FILE_SHARE_DELETE              0x00000004
 #define FILE_SHARE_VALID_FLAGS         0x00000007
-                       
+
 #define FILE_ATTRIBUTE_READONLY                        0x00000001
 #define FILE_ATTRIBUTE_HIDDEN                  0x00000002
 #define FILE_ATTRIBUTE_SYSTEM                  0x00000004
@@ -249,23 +254,15 @@ typedef DWORD FLONG;
 #define FILE_ATTRIBUTE_ENCRYPTED               0x00004000
 #define FILE_ATTRIBUTE_VALID_FLAGS             0x00007fb7
 #define FILE_ATTRIBUTE_VALID_SET_FLAGS         0x000031a7
-                               
+
 #define FILE_COPY_STRUCTURED_STORAGE           0x00000041
 #define FILE_STRUCTURED_STORAGE                        0x00000441
-                       
+
 #define FILE_VALID_OPTION_FLAGS                        0x00ffffff
 #define FILE_VALID_PIPE_OPTION_FLAGS           0x00000032
 #define FILE_VALID_MAILSLOT_OPTION_FLAGS       0x00000032
 #define FILE_VALID_SET_FLAGS                   0x00000036
-                       
-#define FILE_SUPERSEDE                 0x00000000
-#define FILE_OPEN                      0x00000001
-#define FILE_CREATE                    0x00000002
-#define FILE_OPEN_IF                   0x00000003
-#define FILE_OVERWRITE                 0x00000004
-#define FILE_OVERWRITE_IF              0x00000005
-#define FILE_MAXIMUM_DISPOSITION       0x00000005
-                       
+
 #define FILE_DIRECTORY_FILE            0x00000001
 #define FILE_WRITE_THROUGH             0x00000002
 #define FILE_SEQUENTIAL_ONLY           0x00000004
@@ -352,7 +349,6 @@ typedef DWORD FLONG;
 /* also in ddk/winddk.h */
 #define DUPLICATE_CLOSE_SOURCE         0x00000001
 #define DUPLICATE_SAME_ACCESS          0x00000002
-#define DUPLICATE_SAME_ATTRIBUTES      0x00000004
 /* end winddk.k */
 
 #define MAILSLOT_NO_MESSAGE    ((DWORD)-1)
@@ -368,6 +364,7 @@ typedef DWORD FLONG;
 #define PROCESS_SET_QUOTA      256
 #define PROCESS_SET_INFORMATION        512
 #define PROCESS_QUERY_INFORMATION      1024
+#define PROCESS_SUSPEND_RESUME 2048
 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xFFF)
 #define THREAD_TERMINATE       1
 #define THREAD_SUSPEND_RESUME  2
@@ -395,6 +392,7 @@ typedef DWORD FLONG;
  * a  SID_IDENTIFIER_AUTHORITY, eg.
  * SID_IDENTIFIER_AUTHORITY aNullSidAuthority = {SECURITY_NULL_SID_AUTHORITY};
  */
+#define SID_MAX_SUB_AUTHORITIES     15
 #define SECURITY_NULL_SID_AUTHORITY    {0,0,0,0,0,0}
 #define SECURITY_WORLD_SID_AUTHORITY   {0,0,0,0,0,1}
 #define SECURITY_LOCAL_SID_AUTHORITY   {0,0,0,0,0,2}
@@ -439,6 +437,73 @@ typedef DWORD FLONG;
 #define DOMAIN_ALIAS_RID_PRINT_OPS     0x226L
 #define DOMAIN_ALIAS_RID_BACKUP_OPS    0x227L
 #define DOMAIN_ALIAS_RID_REPLICATOR    0x228L
+
+typedef enum
+{
+    WinNullSid = 0,
+    WinWorldSid,
+    WinLocalSid,
+    WinCreatorOwnerSid,
+    WinCreatorGroupSid,
+    WinCreatorOwnerServerSid,
+    WinCreatorGroupServerSid,
+    WinNtAuthoritySid,
+    WinDialupSid,
+    WinNetworkSid,
+    WinBatchSid,
+    WinInteractiveSid,
+    WinServiceSid,
+    WinAnonymousSid,
+    WinProxySid,
+    WinEnterpriseControllersSid,
+    WinSelfSid,
+    WinAuthenticatedUserSid,
+    WinRestrictedCodeSid,
+    WinTerminalServerSid,
+    WinRemoteLogonIdSid,
+    WinLogonIdsSid,
+    WinLocalSystemSid,
+    WinLocalServiceSid,
+    WinNetworkServiceSid,
+    WinBuiltinDomainSid,
+    WinBuiltinAdministratorsSid,
+    WinBuiltinUsersSid,
+    WinBuiltinGuestsSid,
+    WinBuiltinPowerUsersSid,
+    WinBuiltinAccountOperatorsSid,
+    WinBuiltinSystemOperatorsSid,
+    WinBuiltinPrintOperatorsSid,
+    WinBuiltinBackupOperatorsSid,
+    WinBuiltinReplicatorSid,
+    WinBuiltinPreWindows2000CompatibleAccessSid,
+    WinBuiltinRemoteDesktopUsersSid,
+    WinBuiltinNetworkConfigurationOperatorsSid,
+    WinAccountAdministratorSid,
+    WinAccountGuestSid,
+    WinAccountKrbtgtSid,
+    WinAccountDomainAdminsSid,
+    WinAccountDomainUsersSid,
+    WinAccountDomainGuestsSid,
+    WinAccountComputersSid,
+    WinAccountControllersSid,
+    WinAccountCertAdminsSid,
+    WinAccountSchemaAdminsSid,
+    WinAccountEnterpriseAdminsSid,
+    WinAccountPolicyAdminsSid,
+    WinAccountRasAndIasServersSid,
+    WinNTLMAuthenticationSid,
+    WinDigestAuthenticationSid,
+    WinSChannelAuthenticationSid,
+    WinThisOrganizationSid,
+    WinOtherOrganizationSid,
+    WinBuiltinIncomingForestTrustBuildersSid,
+    WinBuiltinPerfMonitoringUsersSid,
+    WinBuiltinPerfLoggingUsersSid,
+    WinBuiltinAuthorizationAccessSid,
+    WinBuiltinTerminalServerLicenseServersSid,
+    WinBuiltinDCOMUsersSid
+} WELL_KNOWN_SID_TYPE;
+
 #define SE_CREATE_TOKEN_NAME   TEXT("SeCreateTokenPrivilege")
 #define SE_ASSIGNPRIMARYTOKEN_NAME     TEXT("SeAssignPrimaryTokenPrivilege")
 #define SE_LOCK_MEMORY_NAME    TEXT("SeLockMemoryPrivilege")
@@ -766,6 +831,10 @@ typedef DWORD FLONG;
 #define GROUP_SECURITY_INFORMATION 2
 #define DACL_SECURITY_INFORMATION 4
 #define SACL_SECURITY_INFORMATION 8
+#define PROTECTED_DACL_SECURITY_INFORMATION     0x80000000
+#define PROTECTED_SACL_SECURITY_INFORMATION     0x40000000
+#define UNPROTECTED_DACL_SECURITY_INFORMATION   0x20000000
+#define UNPROTECTED_SACL_SECURITY_INFORMATION   0x10000000
 #define MAXIMUM_PROCESSORS 32
 #define PAGE_NOACCESS  0x0001
 #define PAGE_READONLY  0x0002
@@ -777,6 +846,7 @@ typedef DWORD FLONG;
 #define PAGE_EXECUTE_WRITECOPY 0x0080
 #define PAGE_GUARD             0x0100
 #define PAGE_NOCACHE           0x0200
+#define PAGE_WRITECOMBINE      0x0400
 #define MEM_COMMIT           0x1000
 #define MEM_RESERVE          0x2000
 #define MEM_DECOMMIT         0x4000
@@ -813,7 +883,7 @@ typedef DWORD FLONG;
 #define FIELD_OFFSET(t,f) ((LONG)&(((t*)0)->f))
 #ifndef CONTAINING_RECORD
 #define CONTAINING_RECORD(address, type, field) \
-  ((type*)((PCHAR)(address) - (PCHAR)(&((type *)0)->field)))
+  ((type *)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type *)0)->field))))
 #endif
 /* end winddk.h */
 #define IMAGE_SIZEOF_FILE_HEADER       20
@@ -839,12 +909,20 @@ typedef DWORD FLONG;
 #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_DOS_SIGNATURE 0x5A4D
 #define IMAGE_OS2_SIGNATURE 0x454E
 #define IMAGE_OS2_SIGNATURE_LE 0x454C
 #define IMAGE_VXD_SIGNATURE 0x454C
 #define IMAGE_NT_SIGNATURE 0x00004550
-#define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b
+#define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b
+#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
+#ifdef _WIN64
+#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR64_MAGIC
+#else
+#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR32_MAGIC
+#endif
 #define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107
 #define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944
 #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
@@ -881,6 +959,10 @@ typedef DWORD FLONG;
 #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG      10
 #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT     11
 #define IMAGE_DIRECTORY_ENTRY_IAT      12
+#define IMAGE_SCN_TYPE_REG 0
+#define IMAGE_SCN_TYPE_DSECT 1
+#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
 #define IMAGE_SCN_CNT_INITIALIZED_DATA 64
@@ -1119,6 +1201,7 @@ typedef DWORD FLONG;
 #define SE_SACL_AUTO_INHERITED 2048
 #define SE_DACL_PROTECTED 4096
 #define SE_SACL_PROTECTED 8192
+#define SE_RM_CONTROL_VALID 0x4000
 #define SE_SELF_RELATIVE 0x8000
 #define SECURITY_DESCRIPTOR_MIN_LENGTH 20
 #define SECURITY_DESCRIPTOR_REVISION 1
@@ -1286,14 +1369,14 @@ typedef DWORD FLONG;
 #define VER_SUITE_DATACENTER 128
 #define VER_SUITE_PERSONAL 512
 #define VER_SUITE_BLADE 1024
-#define WT_EXECUTEDEFAULT 0x00000000                           
-#define WT_EXECUTEINIOTHREAD 0x00000001                           
-#define WT_EXECUTEINWAITTHREAD 0x00000004                           
-#define WT_EXECUTEONLYONCE 0x00000008                           
-#define WT_EXECUTELONGFUNCTION 0x00000010                           
-#define WT_EXECUTEINTIMERTHREAD 0x00000020                           
-#define WT_EXECUTEINPERSISTENTTHREAD 0x00000080                      
-#define WT_TRANSFER_IMPERSONATION 0x00000100                         
+#define WT_EXECUTEDEFAULT 0x00000000
+#define WT_EXECUTEINIOTHREAD 0x00000001
+#define WT_EXECUTEINWAITTHREAD 0x00000004
+#define WT_EXECUTEONLYONCE 0x00000008
+#define WT_EXECUTELONGFUNCTION 0x00000010
+#define WT_EXECUTEINTIMERTHREAD 0x00000020
+#define WT_EXECUTEINPERSISTENTTHREAD 0x00000080
+#define WT_TRANSFER_IMPERSONATION 0x00000100
 #if (_WIN32_WINNT >= 0x0501)
 #define ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION 1
 #define ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION 2
@@ -1340,8 +1423,36 @@ typedef struct _GUID {
        unsigned short Data3;
        unsigned char  Data4[8];
 } GUID, *REFGUID, *LPGUID;
-#define SYSTEM_LUID { QuadPart:999 }
+#define SYSTEM_LUID { 0x3E7, 0x0 }
 #endif /* GUID_DEFINED */
+
+/* ACE Access Types, also in ntifs.h */
+#define ACCESS_MIN_MS_ACE_TYPE                  (0x0)
+#define ACCESS_ALLOWED_ACE_TYPE                 (0x0)
+#define ACCESS_DENIED_ACE_TYPE                  (0x1)
+#define SYSTEM_AUDIT_ACE_TYPE                   (0x2)
+#define SYSTEM_ALARM_ACE_TYPE                   (0x3)
+#define ACCESS_MAX_MS_V2_ACE_TYPE               (0x3)
+#define ACCESS_ALLOWED_COMPOUND_ACE_TYPE        (0x4)
+#define ACCESS_MAX_MS_V3_ACE_TYPE               (0x4)
+#define ACCESS_MIN_MS_OBJECT_ACE_TYPE           (0x5)
+#define ACCESS_ALLOWED_OBJECT_ACE_TYPE          (0x5)
+#define ACCESS_DENIED_OBJECT_ACE_TYPE           (0x6)
+#define SYSTEM_AUDIT_OBJECT_ACE_TYPE            (0x7)
+#define SYSTEM_ALARM_OBJECT_ACE_TYPE            (0x8)
+#define ACCESS_MAX_MS_OBJECT_ACE_TYPE           (0x8)
+#define ACCESS_MAX_MS_V4_ACE_TYPE               (0x8)
+#define ACCESS_MAX_MS_ACE_TYPE                  (0x8)
+#define ACCESS_ALLOWED_CALLBACK_ACE_TYPE        (0x9)
+#define ACCESS_DENIED_CALLBACK_ACE_TYPE         (0xA)
+#define ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE (0xB)
+#define ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE  (0xC)
+#define SYSTEM_AUDIT_CALLBACK_ACE_TYPE          (0xD)
+#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)
+/* end ntifs.h */
 typedef struct _GENERIC_MAPPING {
        ACCESS_MASK GenericRead;
        ACCESS_MASK GenericWrite;
@@ -1423,7 +1534,7 @@ typedef struct _ACL_SIZE_INFORMATION {
 } ACL_SIZE_INFORMATION;
 
 /* FIXME: add more machines */
-#ifdef _X86_
+#if defined(_X86_) || defined(linux)
 #define SIZE_OF_80387_REGISTERS        80
 #define CONTEXT_i386   0x10000
 #define CONTEXT_i486   0x10000
@@ -1913,18 +2024,18 @@ typedef struct _CONTEXT {
 typedef struct _CONTEXT {
        /* The flags values within this flag control the contents of
           a CONTEXT record.
-         
+
           If the context record is used as an input parameter, then
           for each portion of the context record controlled by a flag
           whose value is set, it is assumed that that portion of the
           context record contains valid context. If the context record
           is being used to modify a thread's context, then only that
           portion of the threads context will be modified.
-         
+
           If the context record is used as an IN OUT parameter to capture
           the context of a thread, then only those portions of the thread's
           context corresponding to set flags will be returned.
-         
+
           The context record is never used as an OUT only parameter. */
 
        ULONG ContextFlags;
@@ -1993,7 +2104,10 @@ typedef union _ULARGE_INTEGER {
 #endif /* NONAMELESSUNION */
   ULONGLONG QuadPart;
 } ULARGE_INTEGER, *PULARGE_INTEGER;
-typedef LARGE_INTEGER LUID,*PLUID;
+typedef struct _LUID {
+    DWORD LowPart;
+    LONG HighPart;
+} LUID, *PLUID;
 #pragma pack(push,4)
 typedef struct _LUID_AND_ATTRIBUTES {
        LUID   Luid;
@@ -2121,14 +2235,14 @@ typedef struct _SECURITY_DESCRIPTOR {
        PACL Dacl;
 } SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
 typedef struct _SECURITY_DESCRIPTOR_RELATIVE {
-       UCHAR  Revision;
-       UCHAR  Sbz1;
-       SECURITY_DESCRIPTOR_CONTROL Control;
-       ULONG Owner;
-       ULONG Group;
-       ULONG Sacl;
-       ULONG Dacl;
-} SECURITY_DESCRIPTOR_RELATIVE, *PSECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
+    BYTE Revision;
+    BYTE Sbz1;
+    SECURITY_DESCRIPTOR_CONTROL Control;
+    DWORD Owner;
+    DWORD Group;
+    DWORD Sacl;
+    DWORD Dacl;
+} SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
 typedef enum _TOKEN_INFORMATION_CLASS {
        TokenUser=1,TokenGroups,TokenPrivileges,TokenOwner,
        TokenPrimaryGroup,TokenDefaultDacl,TokenSource,TokenType,
@@ -2268,6 +2382,8 @@ typedef union _SLIST_HEADER {
 } SLIST_HEADER,*PSLIST_HEADER;
 #endif /* !_SLIST_HEADER_ */
 
+/* FIXME: Please oh please stop including winnt.h from the DDK... */
+#ifndef __NTDDK_H
 typedef struct _RTL_CRITICAL_SECTION_DEBUG {
        WORD Type;
        WORD CreatorBackTraceIndex;
@@ -2283,8 +2399,10 @@ typedef struct _RTL_CRITICAL_SECTION {
        LONG RecursionCount;
        HANDLE OwningThread;
        HANDLE LockSemaphore;
-       DWORD Reserved;
+       ULONG_PTR SpinCount;
 } RTL_CRITICAL_SECTION,*PRTL_CRITICAL_SECTION;
+#endif
+
 typedef struct _EVENTLOGRECORD {
        DWORD Length;
        DWORD Reserved;
@@ -2414,7 +2532,7 @@ typedef struct _IMAGE_DATA_DIRECTORY {
        DWORD VirtualAddress;
        DWORD Size;
 } IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;
-typedef struct _IMAGE_OPTIONAL_HEADER {
+typedef struct _IMAGE_OPTIONAL_HEADER32 {
        WORD Magic;
        BYTE MajorLinkerVersion;
        BYTE MinorLinkerVersion;
@@ -2433,7 +2551,7 @@ typedef struct _IMAGE_OPTIONAL_HEADER {
        WORD MinorImageVersion;
        WORD MajorSubsystemVersion;
        WORD MinorSubsystemVersion;
-       DWORD Reserved1;
+       DWORD Win32VersionValue;
        DWORD SizeOfImage;
        DWORD SizeOfHeaders;
        DWORD CheckSum;
@@ -2446,7 +2564,39 @@ typedef struct _IMAGE_OPTIONAL_HEADER {
        DWORD LoaderFlags;
        DWORD NumberOfRvaAndSizes;
        IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
-} IMAGE_OPTIONAL_HEADER,*PIMAGE_OPTIONAL_HEADER;
+} IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32;
+typedef struct _IMAGE_OPTIONAL_HEADER64 {
+       WORD Magic;
+       BYTE MajorLinkerVersion;
+       BYTE MinorLinkerVersion;
+       DWORD SizeOfCode;
+       DWORD SizeOfInitializedData;
+       DWORD SizeOfUninitializedData;
+       DWORD AddressOfEntryPoint;
+       DWORD BaseOfCode;
+       ULONGLONG ImageBase;
+       DWORD SectionAlignment;
+       DWORD FileAlignment;
+       WORD MajorOperatingSystemVersion;
+       WORD MinorOperatingSystemVersion;
+       WORD MajorImageVersion;
+       WORD MinorImageVersion;
+       WORD MajorSubsystemVersion;
+       WORD MinorSubsystemVersion;
+       DWORD Reserved1;
+       DWORD SizeOfImage;
+       DWORD SizeOfHeaders;
+       DWORD CheckSum;
+       WORD Subsystem;
+       WORD DllCharacteristics;
+       ULONGLONG SizeOfStackReserve;
+       ULONGLONG SizeOfStackCommit;
+       ULONGLONG SizeOfHeapReserve;
+       ULONGLONG SizeOfHeapCommit;
+       DWORD LoaderFlags;
+       DWORD NumberOfRvaAndSizes;
+       IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
+} IMAGE_OPTIONAL_HEADER64,*PIMAGE_OPTIONAL_HEADER64;
 typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
        WORD Magic;
        BYTE MajorLinkerVersion;
@@ -2519,11 +2669,27 @@ typedef struct _IMAGE_OS2_HEADER {
 } IMAGE_OS2_HEADER,*PIMAGE_OS2_HEADER;
 #pragma pack(pop)
 #pragma pack(push,4)
-typedef struct _IMAGE_NT_HEADERS {
+typedef struct _IMAGE_NT_HEADERS32 {
        DWORD Signature;
        IMAGE_FILE_HEADER FileHeader;
-       IMAGE_OPTIONAL_HEADER OptionalHeader;
-} IMAGE_NT_HEADERS,*PIMAGE_NT_HEADERS;
+       IMAGE_OPTIONAL_HEADER32 OptionalHeader;
+} IMAGE_NT_HEADERS32,*PIMAGE_NT_HEADERS32;
+typedef struct _IMAGE_NT_HEADERS64 {
+       DWORD Signature;
+       IMAGE_FILE_HEADER FileHeader;
+       IMAGE_OPTIONAL_HEADER64 OptionalHeader;
+} IMAGE_NT_HEADERS64,*PIMAGE_NT_HEADERS64;
+#ifdef _WIN64
+typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER;
+typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER;
+typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS;
+typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS;
+#else
+typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER;
+typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER;
+typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS;
+typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
+#endif
 typedef struct _IMAGE_ROM_HEADERS {
        IMAGE_FILE_HEADER FileHeader;
        IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
@@ -2731,20 +2897,26 @@ typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
        DWORD Reserved;
 } IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY;
 typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY {
-       DWORD Characteristics;
-       DWORD TimeDateStamp;
-       WORD MajorVersion;
-       WORD MinorVersion;
-       DWORD GlobalFlagsClear;
-       DWORD GlobalFlagsSet;
-       DWORD CriticalSectionDefaultTimeout;
-       DWORD DeCommitFreeBlockThreshold;
-       DWORD DeCommitTotalFreeThreshold;
-       PVOID LockPrefixTable;
-       DWORD MaximumAllocationSize;
-       DWORD VirtualMemoryThreshold;
-       DWORD ProcessHeapFlags;
-       DWORD Reserved[4];
+    DWORD Size;
+    DWORD TimeDateStamp;
+    WORD MajorVersion;
+    WORD MinorVersion;
+    DWORD GlobalFlagsClear;
+    DWORD GlobalFlagsSet;
+    DWORD CriticalSectionDefaultTimeout;
+    DWORD DeCommitFreeBlockThreshold;
+    DWORD DeCommitTotalFreeThreshold;
+    DWORD LockPrefixTable;
+    DWORD MaximumAllocationSize;
+    DWORD VirtualMemoryThreshold;
+    DWORD ProcessHeapFlags;
+    DWORD ProcessAffinityMask;
+    WORD CSDVersion;
+    WORD Reserved1;
+    DWORD EditList;
+    DWORD SecurityCookie;
+    DWORD SEHandlerTable;
+    DWORD SEHandlerCount;
 } IMAGE_LOAD_CONFIG_DIRECTORY,*PIMAGE_LOAD_CONFIG_DIRECTORY;
 typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {
        DWORD BeginAddress;
@@ -2924,6 +3096,15 @@ typedef union _FILE_SEGMENT_ELEMENT {
 #define JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT   9
 #define JOB_OBJECT_MSG_JOB_MEMORY_LIMIT       10
 
+#define JOB_OBJECT_ASSIGN_PROCESS           1
+#define JOB_OBJECT_SET_ATTRIBUTES           2
+#define JOB_OBJECT_QUERY                    4
+#define JOB_OBJECT_TERMINATE                8
+#define JOB_OBJECT_SET_SECURITY_ATTRIBUTES  16
+#define JOB_OBJECT_ALL_ACCESS               (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|31)
+
+/* FIXME: Oh how I wish, I wish the w32api DDK wouldn't include winnt.h... */
+#ifndef __NTDDK_H
 typedef enum _JOBOBJECTINFOCLASS {
        JobObjectBasicAccountingInformation = 1,
        JobObjectBasicLimitInformation,
@@ -2937,6 +3118,8 @@ typedef enum _JOBOBJECTINFOCLASS {
        JobObjectJobSetInformation,
        MaxJobObjectInfoClass
 } JOBOBJECTINFOCLASS;
+#endif
+
 typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
        LARGE_INTEGER TotalUserTime;
        LARGE_INTEGER TotalKernelTime;
@@ -2996,9 +3179,8 @@ typedef struct _JOBOBJECT_JOBSET_INFORMATION {
        DWORD MemberLevel;
 } JOBOBJECT_JOBSET_INFORMATION,*PJOBOBJECT_JOBSET_INFORMATION;
 
-/* Fixme: Making these defines conditional on WINVER will break ddk includes */ 
+/* Fixme: Making these defines conditional on WINVER will break ddk includes */
 #if 1 /* (WINVER >= 0x0500) */
-#include <pshpack4.h>
 
 #define ES_SYSTEM_REQUIRED                0x00000001
 #define ES_DISPLAY_REQUIRED               0x00000002
@@ -3164,6 +3346,7 @@ typedef struct _SYSTEM_BATTERY_STATE {
        ULONG  DefaultAlert2;
 } SYSTEM_BATTERY_STATE, *PSYSTEM_BATTERY_STATE;
 
+typedef DWORD EXECUTION_STATE;
 typedef enum _POWER_INFORMATION_LEVEL {
        SystemPowerPolicyAc,
        SystemPowerPolicyDc,
@@ -3290,7 +3473,6 @@ typedef struct _ADMINISTRATOR_POWER_POLICY {
        ULONG  MinSpindownTimeout;
        ULONG  MaxSpindownTimeout;
 } ADMINISTRATOR_POWER_POLICY, *PADMINISTRATOR_POWER_POLICY;
-#include <poppack.h>
 #endif /* WINVER >= 0x0500 */
 
 typedef VOID (NTAPI *WAITORTIMERCALLBACKFUNC)(PVOID,BOOLEAN);
@@ -3307,6 +3489,25 @@ typedef OSVERSIONINFOEXA OSVERSIONINFOEX,*POSVERSIONINFOEX,*LPOSVERSIONINFOEX;
 ULONGLONG WINAPI VerSetConditionMask(ULONGLONG,DWORD,BYTE);
 #endif
 
+SIZE_T
+STDCALL
+RtlCompareMemory (
+    const VOID *Source1,
+    const VOID *Source2,
+    SIZE_T Length
+    );
+
+#define RtlMoveMemory memmove
+#define RtlCopyMemory memcpy
+#define RtlFillMemory(d,l,f) memset((d), (f), (l))
+#define RtlZeroMemory(d,l) RtlFillMemory((d),(l),0)
+
+typedef struct _OBJECT_TYPE_LIST {
+    WORD   Level;
+    WORD   Sbz;
+    GUID *ObjectType;
+} OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST;
+
 #if defined(__GNUC__)
 
 static __inline__ PVOID GetCurrentFiber(void)
@@ -3319,17 +3520,6 @@ static __inline__ PVOID GetCurrentFiber(void)
     return ret;
 }
 
-static __inline__ PVOID GetFiberData(void)
-{
-    void* ret;
-    __asm__ __volatile__ (
-       "movl   %%fs:0x10,%0\n"
-       "movl   (%0),%0"
-       : "=r" (ret) /* allow use of reg eax,ebx,ecx,edx,esi,edi */
-       );
-    return ret;
-}
-
 static __inline__ struct _TEB * NtCurrentTeb(void)
 {
     struct _TEB *ret;
@@ -3343,7 +3533,7 @@ static __inline__ struct _TEB * NtCurrentTeb(void)
     return ret;
 }
 
-#else
+#elif defined(__WATCOMC__)
 
 extern PVOID GetCurrentFiber(void);
 #pragma aux GetCurrentFiber = \
@@ -3351,14 +3541,36 @@ extern PVOID GetCurrentFiber(void);
         value [eax] \
         modify [eax];
 
-extern PVOID GetFiberData(void);
-#pragma aux GetFiberData = \
-       "mov    eax, dword ptr fs:0x10" \
-       "mov    eax, [eax]" \
+extern struct _TEB * NtCurrentTeb(void);
+#pragma aux NtCurrentTeb = \
+        "mov   eax, dword ptr fs:0x18" \
         value [eax] \
         modify [eax];
-        
-#endif /* __GNUC__ */
+
+#elif defined(_MSC_VER)
+
+static __inline PVOID GetCurrentFiber(void)
+{
+    PVOID p;
+       __asm mov eax, fs:[10h]
+       __asm mov [p], eax
+    return p;
+}
+
+static __inline struct _TEB * NtCurrentTeb(void)
+{
+    struct _TEB *p;
+       __asm mov eax, fs:[18h]
+       __asm mov [p], eax
+    return p;
+}
+
+#endif /* __GNUC__/__WATCOMC__/_MSC_VER */
+
+static __inline PVOID GetFiberData(void)
+{
+       return *((PVOID *)GetCurrentFiber());
+}
 
 #endif /* RC_INVOKED */