- Fix InterlockedBitTestAndReset and InterlockedBitTestAndSet
[reactos.git] / reactos / w32api / include / winnt.h
index e02affd..eb90227 100644 (file)
@@ -34,6 +34,7 @@
 extern "C" {
 #endif
 
+#include <ctype.h>
 #include <winerror.h>
 
 #ifndef RC_INVOKED
@@ -46,16 +47,49 @@ extern "C" {
 #define UNALIGNED
 #endif
 
+#ifndef DECLSPEC_ADDRSAFE
+#if (_MSC_VER >= 1200) && (defined(_M_ALPHA) || defined(_M_AXP64))
+#define DECLSPEC_ADDRSAFE __declspec(address_safe)
+#else
+#define DECLSPEC_ADDRSAFE
+#endif
+#endif
+
+#ifndef FORCEINLINE
+#if (_MSC_VER >= 1200)
+#define FORCEINLINE __forceinline
+#elif (_MSC_VER)
+#define FORCEINLINE __inline
+#else
+#define FORCEINLINE static __inline
+#endif
+#endif
+
+#if !defined(_NTSYSTEM_)
+#define NTSYSAPI     DECLSPEC_IMPORT
+#define NTSYSCALLAPI DECLSPEC_IMPORT
+#else
+#define NTSYSAPI
+#if defined(_NTDLLBUILD_)
+#define NTSYSCALLAPI
+#else
+#define NTSYSCALLAPI DECLSPEC_ADDRSAFE
+#endif
+#endif
+
 #ifndef VOID
 #define VOID void
 #endif
 typedef char CHAR;
 typedef short SHORT;
-typedef long LONG;
+#ifndef LONG_DEFINED
+#define LONG_DEFINED
+    typedef long LONG;
+    typedef unsigned long ULONG,*PULONG;
+#endif//LONG_DEFINED
 typedef char CCHAR, *PCCHAR;
 typedef unsigned char UCHAR,*PUCHAR;
 typedef unsigned short USHORT,*PUSHORT;
-typedef unsigned long ULONG,*PULONG;
 typedef char *PSZ;
 
 typedef void *PVOID,*LPVOID;
@@ -155,8 +189,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;
@@ -189,6 +223,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
@@ -205,6 +240,55 @@ typedef DWORD FLONG;
 #define SPECIFIC_RIGHTS_ALL    0xFFFF
 #define ACCESS_SYSTEM_SECURITY 0x1000000
 
+#ifndef WIN32_NO_STATUS
+
+#define STATUS_WAIT_0                    ((DWORD)0x00000000)
+#define STATUS_ABANDONED_WAIT_0          ((DWORD)0x00000080)
+#define STATUS_USER_APC                  ((DWORD)0x000000C0)
+#define STATUS_TIMEOUT                   ((DWORD)0x00000102)
+#define STATUS_PENDING                   ((DWORD)0x00000103)
+#define STATUS_SEGMENT_NOTIFICATION      ((DWORD)0x40000005)
+#define STATUS_GUARD_PAGE_VIOLATION      ((DWORD)0x80000001)
+#define STATUS_DATATYPE_MISALIGNMENT     ((DWORD)0x80000002)
+#define STATUS_BREAKPOINT                ((DWORD)0x80000003)
+#define STATUS_SINGLE_STEP               ((DWORD)0x80000004)
+#define STATUS_ACCESS_VIOLATION          ((DWORD)0xC0000005)
+#define STATUS_IN_PAGE_ERROR             ((DWORD)0xC0000006)
+#define STATUS_INVALID_HANDLE            ((DWORD)0xC0000008)
+#define STATUS_NO_MEMORY                 ((DWORD)0xC0000017)
+#define STATUS_ILLEGAL_INSTRUCTION       ((DWORD)0xC000001D)
+#define STATUS_NONCONTINUABLE_EXCEPTION  ((DWORD)0xC0000025)
+#define STATUS_INVALID_DISPOSITION       ((DWORD)0xC0000026)
+#define STATUS_ARRAY_BOUNDS_EXCEEDED     ((DWORD)0xC000008C)
+#define STATUS_FLOAT_DENORMAL_OPERAND    ((DWORD)0xC000008D)
+#define STATUS_FLOAT_DIVIDE_BY_ZERO      ((DWORD)0xC000008E)
+#define STATUS_FLOAT_INEXACT_RESULT      ((DWORD)0xC000008F)
+#define STATUS_FLOAT_INVALID_OPERATION   ((DWORD)0xC0000090)
+#define STATUS_FLOAT_OVERFLOW            ((DWORD)0xC0000091)
+#define STATUS_FLOAT_STACK_CHECK         ((DWORD)0xC0000092)
+#define STATUS_FLOAT_UNDERFLOW           ((DWORD)0xC0000093)
+#define STATUS_INTEGER_DIVIDE_BY_ZERO    ((DWORD)0xC0000094)
+#define STATUS_INTEGER_OVERFLOW          ((DWORD)0xC0000095)
+#define STATUS_PRIVILEGED_INSTRUCTION    ((DWORD)0xC0000096)
+#define STATUS_STACK_OVERFLOW            ((DWORD)0xC00000FD)
+#define STATUS_CONTROL_C_EXIT            ((DWORD)0xC000013A)
+#define STATUS_FLOAT_MULTIPLE_FAULTS     ((DWORD)0xC00002B4)
+#define STATUS_FLOAT_MULTIPLE_TRAPS      ((DWORD)0xC00002B5)
+#define STATUS_REG_NAT_CONSUMPTION       ((DWORD)0xC00002C9)
+#define STATUS_SXS_EARLY_DEACTIVATION    ((DWORD)0xC015000F)
+#define STATUS_SXS_INVALID_DEACTIVATION  ((DWORD)0xC0150010)
+
+#define DBG_EXCEPTION_HANDLED       ((DWORD)0x00010001)
+#define DBG_CONTINUE                ((DWORD)0x00010002)
+#define DBG_TERMINATE_THREAD        ((DWORD)0x40010003)
+#define DBG_TERMINATE_PROCESS       ((DWORD)0x40010004)
+#define DBG_CONTROL_C               ((DWORD)0x40010005)
+#define DBG_CONTROL_BREAK           ((DWORD)0x40010008)
+#define DBG_COMMAND_EXCEPTION       ((DWORD)0x40010009)
+#define DBG_EXCEPTION_NOT_HANDLED   ((DWORD)0x80010001)
+
+#endif /* WIN32_NO_STATUS */
+
 #define MAXIMUM_ALLOWED        0x2000000
 #define GENERIC_READ   0x80000000
 #define GENERIC_WRITE  0x40000000
@@ -261,14 +345,6 @@ typedef DWORD FLONG;
 #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
@@ -355,7 +431,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)
@@ -774,7 +849,8 @@ typedef enum
 #define PROCESSOR_ARCHITECTURE_ARM 5
 #define PROCESSOR_ARCHITECTURE_IA64 6
 #define PROCESSOR_ARCHITECTURE_ALPHA64 7
-#define PROCESSOR_ARCHITECTURE_MSIL8
+#define PROCESSOR_ARCHITECTURE_MSIL 8
+#define PROCESSOR_ARCHITECTURE_AMD64 9
 #define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
 #define PF_FLOATING_POINT_EMULATED 1
@@ -890,7 +966,7 @@ typedef enum
 #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
@@ -952,6 +1028,11 @@ typedef enum
 #define IMAGE_SUBSYSTEM_OS2_CUI        5
 #define IMAGE_SUBSYSTEM_POSIX_CUI      7
 #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_DIRECTORY_ENTRY_EXPORT   0
 #define IMAGE_DIRECTORY_ENTRY_IMPORT   1
@@ -1255,12 +1336,6 @@ typedef enum
 #define DLL_PROCESS_ATTACH     1
 #define DLL_THREAD_ATTACH      2
 #define DLL_THREAD_DETACH      3
-#define DBG_CONTINUE 0x10002
-#define DBG_TERMINATE_THREAD 0x40010003
-#define DBG_TERMINATE_PROCESS 0x40010004
-#define DBG_CONTROL_C 0x40010005
-#define DBG_CONTROL_BREAK 0x40010008
-#define DBG_EXCEPTION_NOT_HANDLED 0x80010001
 #define TAPE_ABSOLUTE_POSITION 0
 #define TAPE_LOGICAL_POSITION 1
 #define TAPE_PSEUDO_LOGICAL_POSITION 2
@@ -1373,7 +1448,9 @@ typedef enum
 #define VER_SUITE_BACKOFFICE 4
 #define VER_SUITE_TERMINAL 16
 #define VER_SUITE_SMALLBUSINESS_RESTRICTED 32
+#define VER_SUITE_EMBEDDEDNT 64
 #define VER_SUITE_DATACENTER 128
+#define VER_SUITE_SINGLEUSERTS 256
 #define VER_SUITE_PERSONAL 512
 #define VER_SUITE_BLADE 1024
 #define WT_EXECUTEDEFAULT 0x00000000
@@ -1415,6 +1492,7 @@ typedef enum
 #define IsReparseTagValid(x) (!((x)&~IO_REPARSE_TAG_VALID_VALUES)&&((x)>IO_REPARSE_TAG_RESERVED_RANGE))
 #define IO_REPARSE_TAG_SYMBOLIC_LINK IO_REPARSE_TAG_RESERVED_ZERO
 #define IO_REPARSE_TAG_MOUNT_POINT 0xA0000003
+#define IO_REPARSE_TAG_SYMLINK 0xA000000CL
 #ifndef RC_INVOKED
 typedef DWORD ACCESS_MASK, *PACCESS_MASK;
 
@@ -1466,11 +1544,14 @@ typedef struct _GENERIC_MAPPING {
        ACCESS_MASK GenericExecute;
        ACCESS_MASK GenericAll;
 } GENERIC_MAPPING, *PGENERIC_MAPPING;
+/* Sigh..when will they learn... */
+#ifndef __NTDDK_H
 typedef struct _ACE_HEADER {
        BYTE AceType;
        BYTE AceFlags;
        WORD AceSize;
 } ACE_HEADER, *PACE_HEADER;
+
 typedef struct _ACCESS_ALLOWED_ACE {
        ACE_HEADER Header;
        ACCESS_MASK Mask;
@@ -1524,6 +1605,7 @@ typedef struct _SYSTEM_ALARM_OBJECT_ACE {
        GUID InheritedObjectType;
        DWORD SidStart;
 } SYSTEM_ALARM_OBJECT_ACE,*PSYSTEM_ALARM_OBJECT_ACE;
+#endif
 typedef struct _ACL {
        BYTE AclRevision;
        BYTE Sbz1;
@@ -1541,7 +1623,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
@@ -1597,7 +1679,7 @@ typedef struct _CONTEXT {
 #define CONTEXT_INTEGER        4L
 #define CONTEXT_DEBUG_REGISTERS        8L
 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_FLOATING_POINT|CONTEXT_INTEGER)
-typedef struct {
+typedef struct _CONTEXT {
        double Fpr0;
        double Fpr1;
        double Fpr2;
@@ -2153,6 +2235,8 @@ 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_H)
 typedef struct _SID_IDENTIFIER_AUTHORITY {
        BYTE Value[6];
 } SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
@@ -2257,6 +2341,7 @@ typedef enum _TOKEN_INFORMATION_CLASS {
        TokenSessionId,TokenGroupsAndPrivileges,TokenSessionReference,
        TokenSandBoxInert,TokenAuditPolicy,TokenOrigin,
 } TOKEN_INFORMATION_CLASS;
+#endif
 typedef enum _SID_NAME_USE {
        SidTypeUser=1,SidTypeGroup,SidTypeDomain,SidTypeAlias,
        SidTypeWellKnownGroup,SidTypeDeletedAccount,SidTypeInvalid,
@@ -2389,6 +2474,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;
@@ -2406,6 +2493,13 @@ typedef struct _RTL_CRITICAL_SECTION {
        HANDLE LockSemaphore;
        ULONG_PTR SpinCount;
 } RTL_CRITICAL_SECTION,*PRTL_CRITICAL_SECTION;
+#endif
+
+typedef LONG
+(NTAPI *PVECTORED_EXCEPTION_HANDLER)(
+    struct _EXCEPTION_POINTERS *ExceptionInfo
+);
+
 typedef struct _EVENTLOGRECORD {
        DWORD Length;
        DWORD Reserved;
@@ -2554,7 +2648,7 @@ typedef struct _IMAGE_OPTIONAL_HEADER32 {
        WORD MinorImageVersion;
        WORD MajorSubsystemVersion;
        WORD MinorSubsystemVersion;
-       DWORD Reserved1;
+       DWORD Win32VersionValue;
        DWORD SizeOfImage;
        DWORD SizeOfHeaders;
        DWORD CheckSum;
@@ -2900,20 +2994,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;
@@ -3015,6 +3115,7 @@ typedef struct _REPARSE_DATA_BUFFER {
                        WORD   SubstituteNameLength;
                        WORD   PrintNameOffset;
                        WORD   PrintNameLength;
+                       ULONG  Flags;
                        WCHAR PathBuffer[1];
                } SymbolicLinkReparseBuffer;
                struct {
@@ -3100,6 +3201,8 @@ typedef union _FILE_SEGMENT_ELEMENT {
 #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,
@@ -3113,6 +3216,8 @@ typedef enum _JOBOBJECTINFOCLASS {
        JobObjectJobSetInformation,
        MaxJobObjectInfoClass
 } JOBOBJECTINFOCLASS;
+#endif
+
 typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
        LARGE_INTEGER TotalUserTime;
        LARGE_INTEGER TotalKernelTime;
@@ -3142,6 +3247,8 @@ typedef struct _JOBOBJECT_BASIC_PROCESS_ID_LIST {
 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_H
 typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {
        DWORD SecurityLimitFlags;
        HANDLE JobToken;
@@ -3149,6 +3256,7 @@ 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;
 } JOBOBJECT_END_OF_JOB_TIME_INFORMATION,*PJOBOBJECT_END_OF_JOB_TIME_INFORMATION;
@@ -3339,6 +3447,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,
@@ -3377,6 +3486,13 @@ typedef struct _SYSTEM_POWER_INFORMATION {
 } SYSTEM_POWER_INFORMATION,*PSYSTEM_POWER_INFORMATION;
 #endif
 
+#if (_WIN32_WINNT >= 0x0500)
+typedef enum _AUDIT_EVENT_TYPE {
+    AuditEventObjectAccess,
+    AuditEventDirectoryServiceAccess
+} AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE;
+#endif
+
 #if (_WIN32_WINNT >= 0x0501)
 typedef enum _HEAP_INFORMATION_CLASS {
        HeapCompatibilityInformation
@@ -3489,6 +3605,17 @@ RtlCompareMemory (
     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)
@@ -3530,6 +3657,16 @@ extern struct _TEB * NtCurrentTeb(void);
 
 #elif defined(_MSC_VER)
 
+#if (_MSC_FULL_VER >= 13012035)
+
+DWORD __readfsdword(DWORD);
+#pragma intrinsic(__readfsdword)
+
+__inline PVOID GetCurrentFiber(void) { return (PVOID)(ULONG_PTR)__readfsdword(0x10); }
+__inline struct _TEB * NtCurrentTeb(void) { return (PVOID)(ULONG_PTR)__readfsdword(0x18); }
+
+#else
+
 static __inline PVOID GetCurrentFiber(void)
 {
     PVOID p;
@@ -3546,6 +3683,8 @@ static __inline struct _TEB * NtCurrentTeb(void)
     return p;
 }
 
+#endif /* _MSC_FULL_VER */
+
 #endif /* __GNUC__/__WATCOMC__/_MSC_VER */
 
 static __inline PVOID GetFiberData(void)
@@ -3553,6 +3692,55 @@ static __inline PVOID GetFiberData(void)
        return *((PVOID *)GetCurrentFiber());
 }
 
+#if defined(__GNUC__)
+
+static __inline__ BOOLEAN
+InterlockedBitTestAndSet(IN LONG *Base,
+                         IN LONG Bit)
+{
+       LONG OldBit;
+
+       __asm__ __volatile__("lock "
+                            "btsl %2,%1\n\t"
+                            "sbbl %0,%0\n\t"
+                            :"=r" (OldBit),"=m" (*Base)
+                            :"Ir" (Bit)
+                            : "memory");
+       return OldBit;
+}
+
+static __inline__ BOOLEAN
+InterlockedBitTestAndReset(IN LONG *Base,
+                          IN LONG Bit)
+{
+       LONG OldBit;
+
+       __asm__ __volatile__("lock "
+                            "btrl %2,%1\n\t"
+                            "sbbl %0,%0\n\t"
+                            :"=r" (OldBit),"=m" (*Base)
+                            :"Ir" (Bit)
+                            : "memory");
+       return OldBit;
+}
+
+#endif
+
+#define YieldProcessor() __asm__ __volatile__("pause");
+
+#if defined(_AMD64_)
+#if defined(_M_AMD64)
+
+#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONG64 *)a, b)
+
+#endif
+
+#else
+
+#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
+
+#endif
+
 #endif /* RC_INVOKED */
 
 #ifdef __cplusplus