[XDK/DDK/NDK]
[reactos.git] / reactos / include / ddk / wdm.h
index 124e45b..39e4681 100644 (file)
@@ -82,10 +82,13 @@ extern "C" {
 #endif
 
 /* For ReactOS */
-#if !defined(_NTOSKRNL_) && !defined(_BLDR_)
+#if !defined(_NTOSKRNL_) && !defined(_BLDR_) && !defined(_NTSYSTEM_)
 #define NTKERNELAPI DECLSPEC_IMPORT
 #else
 #define NTKERNELAPI
+#ifndef _NTSYSTEM_
+#define _NTSYSTEM_
+#endif
 #endif
 
 #if defined(_X86_) && !defined(_NTHAL_)
@@ -129,6 +132,29 @@ extern "C" {
 #define ALLOC_DATA_PRAGMA 1
 #endif
 
+#endif /* _MSC_VER */
+
+/* These macros are used to create aliases for imported data. We need to do
+   this to have declarations that are compatible with MS DDK */
+#ifdef _M_IX86
+#define __SYMBOL(_Name) "_"#_Name
+#define __IMPORTSYMBOL(_Name) "__imp__"#_Name
+#define __IMPORTNAME(_Name) __imp__##_Name
+#else
+#define __SYMBOL(_Name) #_Name
+#define __IMPORTSYMBOL(_Name) "__imp_"#_Name
+#define __IMPORTNAME(_Name) __imp_##_Name
+#endif
+#ifdef _MSC_VER
+#define __CREATE_NTOS_DATA_IMPORT_ALIAS(_Name) \
+    __pragma(comment(linker, "/alternatename:"__SYMBOL(_Name) "=" __IMPORTSYMBOL(_Name)))
+#else /* !_MSC_VER */
+#ifndef __STRINGIFY
+#define __STRINGIFY(_exp) #_exp
+#endif
+#define _Pragma_redefine_extname(_Name, _Target) _Pragma(__STRINGIFY(redefine_extname _Name _Target))
+#define __CREATE_NTOS_DATA_IMPORT_ALIAS(_Name) \
+    _Pragma_redefine_extname(_Name,__IMPORTNAME(_Name))
 #endif
 
 #if defined(_WIN64)
@@ -209,51 +235,6 @@ inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
 /******************************************************************************
  *                           INTERLOCKED Functions                            *
  ******************************************************************************/
-//
-// Intrinsics (note: taken from our winnt.h)
-// FIXME: 64-bit
-//
-#if defined(__GNUC__)
-
-static __inline__ BOOLEAN
-InterlockedBitTestAndSet(
-    _Inout_updates_bytes_((Bit+7)/8) _Interlocked_operand_ LONG volatile *Base,
-    _In_ LONG Bit)
-{
-#if defined(_M_IX86)
-  LONG OldBit;
-  __asm__ __volatile__("lock "
-                       "btsl %2,%1\n\t"
-                       "sbbl %0,%0\n\t"
-                       :"=r" (OldBit),"+m" (*Base)
-                       :"Ir" (Bit)
-                       : "memory");
-  return OldBit;
-#else
-  return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
-#endif
-}
-
-static __inline__ BOOLEAN
-InterlockedBitTestAndReset(
-    _Inout_updates_bytes_((Bit+7)/8) _Interlocked_operand_ LONG volatile *Base,
-    _In_ LONG Bit)
-{
-#if defined(_M_IX86)
-  LONG OldBit;
-  __asm__ __volatile__("lock "
-                       "btrl %2,%1\n\t"
-                       "sbbl %0,%0\n\t"
-                       :"=r" (OldBit),"+m" (*Base)
-                       :"Ir" (Bit)
-                       : "memory");
-  return OldBit;
-#else
-  return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
-#endif
-}
-
-#endif /* defined(__GNUC__) */
 
 #define BitScanForward _BitScanForward
 #define BitScanReverse _BitScanReverse
@@ -261,145 +242,533 @@ InterlockedBitTestAndReset(
 #define BitTestAndComplement _bittestandcomplement
 #define BitTestAndSet _bittestandset
 #define BitTestAndReset _bittestandreset
-#define InterlockedBitTestAndSet _interlockedbittestandset
-#define InterlockedBitTestAndReset _interlockedbittestandreset
-
-#ifdef _M_AMD64
+#ifdef _WIN64
 #define BitScanForward64 _BitScanForward64
 #define BitScanReverse64 _BitScanReverse64
 #define BitTest64 _bittest64
 #define BitTestAndComplement64 _bittestandcomplement64
 #define BitTestAndSet64 _bittestandset64
 #define BitTestAndReset64 _bittestandreset64
+#endif /* _WIN64 */
+
+#if defined(_M_ARM) || defined(_M_IA64)
+#define __ACQ_(x) x##_acq
+#define __REL_(x) x##_rel
+#define __NF_(x) x##_nf
+#else
+#define __ACQ_(x) x
+#define __REL_(x) x
+#define __NF_(x) x
+#endif
+
+#define InterlockedBitTestAndSet _interlockedbittestandset
+#define InterlockedBitTestAndSetAcquire __ACQ_(_interlockedbittestandset)
+#define InterlockedBitTestAndSetRelease __REL_(_interlockedbittestandset)
+#define InterlockedBitTestAndSetNoFence __NF_(_interlockedbittestandset)
+
+#define InterlockedBitTestAndReset _interlockedbittestandreset
+#define InterlockedBitTestAndResetAcquire __ACQ_(_interlockedbittestandreset)
+#define InterlockedBitTestAndResetRelease __REL_(_interlockedbittestandreset)
+#define InterlockedBitTestAndResetNoFence __NF_(_interlockedbittestandreset)
+
+#ifdef _WIN64
 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
+#define InterlockedBitTestAndSet64Acquire __ACQ_(_interlockedbittestandset64)
+#define InterlockedBitTestAndSet64Release __REL_(_interlockedbittestandset64)
+#define InterlockedBitTestAndSet64NoFence __NF_(_interlockedbittestandset64)
+
 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
-#endif
+#define InterlockedBitTestAndReset64Acquire __ACQ_(_interlockedbittestandreset64)
+#define InterlockedBitTestAndReset64Release __REL_(_interlockedbittestandreset64)
+#define InterlockedBitTestAndReset64NoFence __NF_(_interlockedbittestandreset64)
+#endif /* _WIN64 */
 
-#if !defined(__INTERLOCKED_DECLARED)
-#define __INTERLOCKED_DECLARED
+#define InterlockedAdd _InterlockedAdd
+#define InterlockedAddAcquire __ACQ_(_InterlockedAdd)
+#define InterlockedAddRelease __REL_(_InterlockedAdd)
+#define InterlockedAddNoFence __NF_(_InterlockedAdd)
 
-#if defined (_X86_)
-#if defined(NO_INTERLOCKED_INTRINSICS)
-NTKERNELAPI
-LONG
-FASTCALL
-InterlockedIncrement(
-    _Inout_ _Interlocked_operand_ LONG volatile *Addend);
+#define InterlockedAdd64 _InterlockedAdd64
+#define InterlockedAddAcquire64 __ACQ_(_InterlockedAdd64)
+#define InterlockedAddRelease64 __REL_(_InterlockedAdd64)
+#define InterlockedAddNoFence64 __NF_(_InterlockedAdd64)
 
-NTKERNELAPI
-LONG
-FASTCALL
-InterlockedDecrement(
-    _Inout_ _Interlocked_operand_ LONG volatile *Addend);
+#define InterlockedAnd _InterlockedAnd
+#define InterlockedAndAcquire __ACQ_(_InterlockedAnd)
+#define InterlockedAndRelease __REL_(_InterlockedAnd)
+#define InterlockedAndNoFence __NF_(_InterlockedAnd)
+
+#define InterlockedAnd8 _InterlockedAnd8
+#ifdef _M_ARM
+#define InterlockedAndAcquire8 _InterlockedAnd8_acq
+#define InterlockedAndRelease8 _InterlockedAnd8_rel
+#define InterlockedAndNoFence8 _InterlockedAnd8_nf
+#elif defined(_M_IA64)
+#define InterlockedAnd8Acquire  _InterlockedAnd8_acq
+#define InterlockedAnd8Release  _InterlockedAnd8_rel
+#endif // _M_ARM
+
+#define InterlockedAnd16 _InterlockedAnd16
+#ifdef _M_ARM
+#define InterlockedAndAcquire16 _InterlockedAnd16_acq
+#define InterlockedAndRelease16 _InterlockedAnd16_rel
+#define InterlockedAndNoFence16 _InterlockedAnd16_nf
+#elif defined(_M_IA64)
+#define InterlockedAnd16Acquire _InterlockedAnd16_acq
+#define InterlockedAnd16Release _InterlockedAnd16_rel
+#endif // _M_ARM
 
-NTKERNELAPI
-LONG
-FASTCALL
-InterlockedCompareExchange(
-    _Inout_ _Interlocked_operand_ LONG volatile *Destination,
-  _In_ LONG Exchange,
-  _In_ LONG Comparand);
+#define InterlockedAnd64 _InterlockedAnd64
+#ifdef _M_ARM
+#define InterlockedAndAcquire64 __ACQ_(_InterlockedAnd64)
+#define InterlockedAndRelease64 __REL_(_InterlockedAnd64)
+#define InterlockedAndNoFence64 __NF_(_InterlockedAnd64)
+#else // _M_ARM
+#define InterlockedAnd64Acquire __ACQ_(_InterlockedAnd64)
+#define InterlockedAnd64Release __REL_(_InterlockedAnd64)
+#define InterlockedAnd64NoFence __NF_(_InterlockedAnd64)
+#endif // _M_ARM
 
-NTKERNELAPI
-LONG
-FASTCALL
-InterlockedExchange(
-    _Inout_ _Interlocked_operand_ LONG volatile *Destination,
-    _In_ LONG Value);
+#ifdef _WIN64
+#define InterlockedAndAffinity InterlockedAnd64
+#else
+#define InterlockedAndAffinity InterlockedAnd
+#endif // _WIN64
 
-NTKERNELAPI
-LONG
-FASTCALL
-InterlockedExchangeAdd(
-    _Inout_ _Interlocked_operand_ LONG volatile *Addend,
-    _In_ LONG Value);
+#define InterlockedCompareExchange _InterlockedCompareExchange
+#define InterlockedCompareExchangeAcquire __ACQ_(_InterlockedCompareExchange)
+#define InterlockedCompareExchangeRelease __REL_(_InterlockedCompareExchange)
+#define InterlockedCompareExchangeNoFence __NF_(_InterlockedCompareExchange)
 
-#else /* !defined(NO_INTERLOCKED_INTRINSICS) */
+#define InterlockedCompareExchange16 _InterlockedCompareExchange16
+#define InterlockedCompareExchangeAcquire16 __ACQ_(_InterlockedCompareExchange16)
+#define InterlockedCompareExchangeRelease16 __REL_(_InterlockedCompareExchange16)
+#define InterlockedCompareExchangeNoFence16 __NF_(_InterlockedCompareExchange16)
+
+#define InterlockedCompareExchange64 _InterlockedCompareExchange64
+#define InterlockedCompareExchangeAcquire64 __ACQ_(_InterlockedCompareExchange64)
+#define InterlockedCompareExchangeRelease64 __REL_(_InterlockedCompareExchange64)
+#define InterlockedCompareExchangeNoFence64 __NF_(_InterlockedCompareExchange64)
+
+#ifdef _WIN64
+#define InterlockedCompareExchange128 _InterlockedCompareExchange128
+#endif // _WIN64
+
+#ifdef _M_IA64
+#define InterlockedCompare64Exchange128         _InterlockedCompare64Exchange128
+#define InterlockedCompare64ExchangeAcquire128  _InterlockedCompare64Exchange128_acq
+#define InterlockedCompare64ExchangeRelease128  _InterlockedCompare64Exchange128_rel
+#endif // _M_IA64
+
+#define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
+#define InterlockedCompareExchangePointerAcquire __ACQ_(_InterlockedCompareExchangePointer)
+#define InterlockedCompareExchangePointerRelease __REL_(_InterlockedCompareExchangePointer)
+#define InterlockedCompareExchangePointerNoFence __NF_(_InterlockedCompareExchangePointer)
 
-#define InterlockedExchange _InterlockedExchange
-#define InterlockedIncrement _InterlockedIncrement
 #define InterlockedDecrement _InterlockedDecrement
-#define InterlockedExchangeAdd _InterlockedExchangeAdd
-#define InterlockedCompareExchange _InterlockedCompareExchange
-#define InterlockedOr _InterlockedOr
-#define InterlockedAnd _InterlockedAnd
-#define InterlockedXor _InterlockedXor
+#define InterlockedDecrementAcquire __ACQ_(_InterlockedDecrement)
+#define InterlockedDecrementRelease __REL_(_InterlockedDecrement)
+#define InterlockedDecrementNoFence __NF_(_InterlockedDecrement)
 
-#endif /* !defined(NO_INTERLOCKED_INTRINSICS) */
+#define InterlockedDecrement16 _InterlockedDecrement16
+#define InterlockedDecrementAcquire16 __ACQ_(_InterlockedDecrement16)
+#define InterlockedDecrementRelease16 __REL_(_InterlockedDecrement16)
+#define InterlockedDecrementNoFence16 __NF_(_InterlockedDecrement16)
 
-#endif /* defined (_X86_) */
+#define InterlockedDecrement64 _InterlockedDecrement64
+#define InterlockedDecrementAcquire64 __ACQ_(_InterlockedDecrement64)
+#define InterlockedDecrementRelease64 __REL_(_InterlockedDecrement64)
+#define InterlockedDecrementNoFence64 __NF_(_InterlockedDecrement64)
 
-#if !defined (_WIN64)
-/*
- * PVOID
- * InterlockedExchangePointer(
- *   IN OUT PVOID volatile  *Target,
- *   IN PVOID  Value)
- */
-#define InterlockedExchangePointer(Target, Value) \
-  ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
+#ifdef _WIN64
+#define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONG64 *)a)
+#define InterlockedDecrementSizeTNoFence(a) InterlockedDecrementNoFence64((LONG64 *)a)
+#else
+#define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
+#define InterlockedDecrementSizeTNoFence(a) InterlockedDecrementNoFence((LONG *)a)
+#endif // _WIN64
 
-/*
- * PVOID
- * InterlockedCompareExchangePointer(
- *   IN OUT PVOID  *Destination,
- *   IN PVOID  Exchange,
- *   IN PVOID  Comparand)
- */
-#define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
-  ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
+#define InterlockedExchange _InterlockedExchange
+#define InterlockedExchangeAcquire __ACQ_(_InterlockedExchange)
+/* No release here */
+#define InterlockedExchangeNoFence __NF_(_InterlockedExchange)
+
+#if (_MSC_VER >= 1600)
+#define InterlockedExchange8 _InterlockedExchange8
+#endif // (_MSC_VER >= 1600)
 
+#define InterlockedExchange16 _InterlockedExchange16
+/* No release here */
+#define InterlockedExchangeAcquire16 __ACQ_(_InterlockedExchange16)
+#define InterlockedExchangeNoFence16 __NF_(_InterlockedExchange16)
+
+#define InterlockedExchange64 _InterlockedExchange64
+#define InterlockedExchangeAcquire64 __ACQ_(_InterlockedExchange64)
+/* No release here */
+#define InterlockedExchangeNoFence64 __NF_(_InterlockedExchange64)
+
+#define InterlockedExchangePointer _InterlockedExchangePointer
+#define InterlockedExchangePointerAcquire __ACQ_(_InterlockedExchangePointer)
+/* No release here */
+#define InterlockedExchangePointerNoFence __NF_(_InterlockedExchangePointer)
+
+#define InterlockedExchangeAdd _InterlockedExchangeAdd
+#define InterlockedExchangeAddAcquire __ACQ_(_InterlockedExchangeAdd)
+#define InterlockedExchangeAddRelease __REL_(_InterlockedExchangeAdd)
+#define InterlockedExchangeAddNoFence __NF_(_InterlockedExchangeAdd)
+
+#define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
+#define InterlockedExchangeAddAcquire64 __ACQ_(_InterlockedExchangeAdd64)
+#define InterlockedExchangeAddRelease64 __REL_(_InterlockedExchangeAdd64)
+#define InterlockedExchangeAddNoFence64 __NF_(_InterlockedExchangeAdd64)
+
+#ifdef _WIN64
+#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONG64 *)a, b)
+#define InterlockedExchangeAddSizeTAcquire(a, b) InterlockedExchangeAddAcquire64((LONG64 *)a, b)
+#define InterlockedExchangeAddSizeTNoFence(a, b) InterlockedExchangeAddNoFence64((LONG64 *)a, b)
+#else
 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
-#define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
-#define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
+#define InterlockedExchangeAddSizeTAcquire(a, b) InterlockedExchangeAddAcquire((LONG *)a, b)
+#define InterlockedExchangeAddSizeTNoFence(a, b) InterlockedExchangeAddNoFence((LONG *)a, b)
+#endif // _WIN64
 
-#endif // !defined (_WIN64)
+#define InterlockedIncrement _InterlockedIncrement
+#define InterlockedIncrementAcquire __ACQ_(_InterlockedIncrement)
+#define InterlockedIncrementRelease __REL_(_InterlockedIncrement)
+#define InterlockedIncrementNoFence __NF_(_InterlockedIncrement)
 
-#if defined (_M_AMD64)
+#define InterlockedIncrement16 _InterlockedIncrement16
+#define InterlockedIncrementAcquire16 __ACQ_(_InterlockedIncrement16)
+#define InterlockedIncrementRelease16 __REL_(_InterlockedIncrement16)
+#define InterlockedIncrementNoFence16 __NF_(_InterlockedIncrement16)
+
+#define InterlockedIncrement64 _InterlockedIncrement64
+#define InterlockedIncrementAcquire64 __ACQ_(_InterlockedIncrement64)
+#define InterlockedIncrementRelease64 __REL_(_InterlockedIncrement64)
+#define InterlockedIncrementNoFence64 __NF_(_InterlockedIncrement64)
+
+#ifdef _WIN64
+#define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONG64 *)a)
+#define InterlockedIncrementSizeTNoFence(a) InterlockedIncrementNoFence64((LONG64 *)a)
+#else
+#define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
+#define InterlockedIncrementSizeTNoFence(a) InterlockedIncrementNoFence((LONG *)a)
+#endif // _WIN64
 
-#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
-#define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
-#define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
-#define InterlockedAnd _InterlockedAnd
 #define InterlockedOr _InterlockedOr
-#define InterlockedXor _InterlockedXor
-#define InterlockedIncrement _InterlockedIncrement
-#define InterlockedDecrement _InterlockedDecrement
-#define InterlockedAdd _InterlockedAdd
-#define InterlockedExchange _InterlockedExchange
-#define InterlockedExchangeAdd _InterlockedExchangeAdd
-#define InterlockedCompareExchange _InterlockedCompareExchange
-#define InterlockedAnd64 _InterlockedAnd64
+#define InterlockedOrAcquire __ACQ_(_InterlockedOr)
+#define InterlockedOrRelease __REL_(_InterlockedOr)
+#define InterlockedOrNoFence __NF_(_InterlockedOr)
+
+#define InterlockedOr8 _InterlockedOr8
+#ifdef _M_ARM
+#define InterlockedOrAcquire8 _InterlockedOr8_acq
+#define InterlockedOrRelease8 _InterlockedOr8_rel
+#define InterlockedOrNoFence8 _InterlockedOr8_nf
+#elif defined(_M_IA64)
+#define InterlockedOr8Acquire  _InterlockedOr8_acq
+#define InterlockedOr8Release  _InterlockedOr8_rel
+#endif // _M_ARM
+
+#define InterlockedOr16 _InterlockedOr16
+#ifdef _M_ARM
+#define InterlockedOrAcquire16 _InterlockedOr16_acq
+#define InterlockedOrRelease16 _InterlockedOr16_rel
+#define InterlockedOrNoFence16 _InterlockedOr16_nf
+#elif defined(_M_IA64)
+#define InterlockedOr16Acquire _InterlockedOr16_acq
+#define InterlockedOr16Release _InterlockedOr16_rel
+#endif // _M_ARM
+
 #define InterlockedOr64 _InterlockedOr64
+#ifdef _M_ARM
+#define InterlockedOrAcquire64 _InterlockedOr64_acq
+#define InterlockedOrRelease64 _InterlockedOr64_rel
+#define InterlockedOrNoFence64 _InterlockedOr64_nf
+#elif defined(_M_IA64) || defined(_M_AMD64)
+#define InterlockedOr64Acquire __ACQ_(_InterlockedOr64)
+#define InterlockedOr64Release __REL_(_InterlockedOr64)
+#define InterlockedOr64NoFence __NF_(_InterlockedOr64)
+#endif // _M_ARM
+
+#ifdef _WIN64
+#define InterlockedOrAffinity InterlockedOr64
+#else
+#define InterlockedOrAffinity InterlockedOr
+#endif // _WIN64
+
+#define InterlockedXor _InterlockedXor
+#define InterlockedXorAcquire __ACQ_(_InterlockedXor)
+#define InterlockedXorRelease __REL_(_InterlockedXor)
+#define InterlockedXorNoFence __NF_(_InterlockedXor)
+
+#define InterlockedXor8 _InterlockedXor8
+#ifdef _M_ARM
+#define InterlockedXorAcquire8 _InterlockedXor8_acq
+#define InterlockedXorRelease8 _InterlockedXor8_rel
+#define InterlockedXorNoFence8 _InterlockedXor8_nf
+#elif defined(_M_IA64)
+#define InterlockedXor8Acquire _InterlockedXor8_acq
+#define InterlockedXor8Release _InterlockedXor8_rel
+#endif /* _M_ARM */
+
+#define InterlockedXor16 _InterlockedXor16
+#ifdef _M_ARM
+#define InterlockedXorAcquire16 _InterlockedXor16_acq
+#define InterlockedXorRelease16 _InterlockedXor16_rel
+#define InterlockedXorNoFence16 _InterlockedXor16_nf
+#elif defined(_M_IA64)
+#define InterlockedXor16Acquire _InterlockedXor16_acq
+#define InterlockedXor16Release _InterlockedXor16_rel
+#endif /* _M_ARM */
+
 #define InterlockedXor64 _InterlockedXor64
-#define InterlockedIncrement64 _InterlockedIncrement64
-#define InterlockedDecrement64 _InterlockedDecrement64
-#define InterlockedAdd64 _InterlockedAdd64
-#define InterlockedExchange64 _InterlockedExchange64
-#define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
-#define InterlockedCompareExchange64 _InterlockedCompareExchange64
-#define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
-#define InterlockedExchangePointer _InterlockedExchangePointer
-#define InterlockedBitTestAndSet64 _interlockedbittestandset64
-#define InterlockedBitTestAndReset64 _interlockedbittestandreset64
+#ifdef _M_ARM
+#define InterlockedXorAcquire64 _InterlockedXor64_acq
+#define InterlockedXorRelease64 _InterlockedXor64_rel
+#define InterlockedXorNoFence64 _InterlockedXor64_nf
+#elif defined(_M_IA64) || defined(_M_AMD64)
+#define InterlockedXor64Acquire __ACQ_(_InterlockedXor64)
+#define InterlockedXor64Release __REL_(_InterlockedXor64)
+#define InterlockedXor64NoFence __NF_(_InterlockedXor64)
+#endif /* _M_ARM */
+
+#ifdef _M_IX86
 
-#endif // _M_AMD64
+FORCEINLINE
+LONG64
+_InterlockedExchange64(
+    _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
+    _In_ LONG64 Value)
+{
+    LONG64 Old, Prev;
+    for (Old = *Target; ; Old = Prev)
+    {
+        Prev = _InterlockedCompareExchange64(Target, Value, Old);
+        if (Prev == Old)
+            return Prev;
+    }
+}
 
-#if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
-//#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
 FORCEINLINE
 LONG64
-InterlockedAdd64(
-    _Inout_ _Interlocked_operand_ LONG64 volatile *Addend,
+_InterlockedAdd64(
+    _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
     _In_ LONG64 Value)
 {
-  return InterlockedExchangeAdd64(Addend, Value) + Value;
+    LONG64 Old, Prev, New;
+    for (Old = *Target; ; Old = Prev)
+    {
+        New = Old + Value;
+        Prev = _InterlockedCompareExchange64(Target, New, Old);
+        if (Prev == Old)
+            return New;
+    }
 }
-//#endif
-#endif
 
-#endif /* !__INTERLOCKED_DECLARED */
+FORCEINLINE
+LONG64
+_InterlockedExchangeAdd64 (
+    _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
+    _In_ LONG64 Value
+    )
+{
+    LONG64 Old, Prev, New;
+    for (Old = *Target; ; Old = Prev)
+    {
+        New = Old + Value;
+        Prev = _InterlockedCompareExchange64(Target, New, Old);
+        if (Prev == Old)
+            return Prev;
+    }
+}
 
+FORCEINLINE
+LONG64
+_InterlockedAnd64(
+    _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
+    _In_ LONG64 Value)
+{
+    LONG64 Old, Prev, New;
+    for (Old = *Target; ; Old = Prev)
+    {
+        New = Old & Value;
+        Prev = _InterlockedCompareExchange64(Target, New, Old);
+        if (Prev == Old)
+            return New;
+    }
+}
+
+FORCEINLINE
+LONG64
+_InterlockedOr64(
+    _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
+    _In_ LONG64 Value)
+{
+    LONG64 Old, Prev, New;
+    for (Old = *Target; ; Old = Prev)
+    {
+        New = Old | Value;
+        Prev = _InterlockedCompareExchange64(Target, New, Old);
+        if (Prev == Old)
+            return New;
+    }
+}
+
+FORCEINLINE
+LONG64
+_InterlockedXor64(
+    _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
+    _In_ LONG64 Value)
+{
+    LONG64 Old, Prev, New;
+    for (Old = *Target; ; Old = Prev)
+    {
+        New = Old ^ Value;
+        Prev = _InterlockedCompareExchange64(Target, New, Old);
+        if (Prev == Old)
+            return New;
+    }
+}
+
+FORCEINLINE
+LONG64
+_InterlockedIncrement64(
+    _Inout_ _Interlocked_operand_ volatile LONG64 *Target)
+{
+    return _InterlockedAdd64(Target, 1);
+}
+
+FORCEINLINE
+LONG64
+_InterlockedDecrement64(
+    _Inout_ _Interlocked_operand_ volatile LONG64 *Target)
+{
+    return _InterlockedAdd64(Target, -1);
+}
+
+#undef _InterlockedExchangePointer
+#define _InterlockedExchangePointer _InlineInterlockedExchangePointer
+FORCEINLINE
+_Ret_writes_(_Inexpressible_(Unknown))
+PVOID
+_InterlockedExchangePointer(
+    _Inout_ _At_(*Destination, _Pre_writable_byte_size_(_Inexpressible_(Unknown))
+        _Post_writable_byte_size_(_Inexpressible_(Unknown)))
+        _Interlocked_operand_ volatile PVOID *Destination,
+    _In_opt_ PVOID Value)
+{
+    return (PVOID)InterlockedExchange((volatile long *)Destination, (long)Value);
+}
+
+#undef _InterlockedCompareExchangePointer
+#define _InterlockedCompareExchangePointer _InlineInterlockedCompareExchangePointer
+FORCEINLINE
+_Ret_writes_(_Inexpressible_(Unknown))
+PVOID
+_InterlockedCompareExchangePointer(
+    _Inout_ _At_(*Destination, _Pre_writable_byte_size_(_Inexpressible_(Unknown))
+        _Post_writable_byte_size_(_Inexpressible_(Unknown)))
+        _Interlocked_operand_ volatile PVOID *Destination,
+    _In_opt_ PVOID ExChange,
+    _In_opt_ PVOID Comperand)
+{
+    return (PVOID)InterlockedCompareExchange((volatile long *)Destination,
+                                             (long)ExChange,
+                                             (long)Comperand);
+}
+
+#endif /* _M_IX86 */
+
+#ifdef _M_AMD64
+
+FORCEINLINE
+LONG64
+_InterlockedAdd64(
+    _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
+    _In_ LONG64 Value)
+
+{
+    return _InterlockedExchangeAdd64(Target, Value) + Value;
+}
+
+#endif /* _M_AMD64 */
+
+#ifdef _M_IA64
+
+#undef _InterlockedBitTestAndSet
+#define _InterlockedBitTestAndSet InterlockedBitTestAndSet_Inline
+FORCEINLINE
+BOOLEAN
+_InterlockedBitTestAndSet(
+    _Inout_ _Interlocked_operand_ volatile LONG *Target,
+    _In_ LONG Bit)
+{
+    ULONG Mask = 1 << (Bit & 31);
+    return (BOOLEAN)((InterlockedOr(&Target[Bit / 32], Mask) & Mask) != 0);
+}
+
+#undef _InterlockedBitTestAndReset
+#define _InterlockedBitTestAndReset InterlockedBitTestAndReset_Inline
+FORCEINLINE
+BOOLEAN
+_InterlockedBitTestAndReset(
+    _Inout_ _Interlocked_operand_ volatile LONG *Target,
+    _In_ LONG Bit)
+{
+    ULONG Mask = 1 << (Bit & 31);
+    return (BOOLEAN)((InterlockedAnd(&Target[Bit / 32], ~Mask) & Mask) != 0);
+}
+
+#undef _InterlockedBitTestAndSet64
+#define _InterlockedBitTestAndSet64 InterlockedBitTestAndSet64_Inline
+FORCEINLINE
+BOOLEAN
+_InterlockedBitTestAndSet64(
+    _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
+    _In_ LONG64 Bit)
+{
+    ULONG64 Mask = 1LL << (Bit & 63);
+    return (BOOLEAN)((InterlockedOr64(&Target[Bit / 64], Mask) & Mask) != 0);
+}
+
+#undef _InterlockedBitTestAndReset64
+#define _InterlockedBitTestAndReset64 InterlockedBitTestAndReset64_Inline
+FORCEINLINE
+BOOLEAN
+_InterlockedBitTestAndReset64(
+    _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
+    _In_ LONG64 Bit)
+{
+    ULONG64 Mask = 1LL << (Bit & 63);
+    return (BOOLEAN)((InterlockedAnd64(&Target[Bit / 64], ~Mask) & Mask) != 0);
+}
+
+#undef _InterlockedBitTestAndComplement
+#define _InterlockedBitTestAndComplement InterlockedBitTestAndComplement_Inline
+FORCEINLINE
+BOOLEAN
+_InterlockedBitTestAndComplement(
+    _Inout_ _Interlocked_operand_ volatile LONG *Target,
+    _In_ LONG Bit)
+{
+    ULONG Mask = 1 << (Bit & 31);
+    return (BOOLEAN)((InterlockedXor(&Target[Bit / 32], Mask) & Mask) != 0);
+}
+
+#undef _InterlockedBitTestAndComplement64
+#define _InterlockedBitTestAndComplement64 InterlockedBitTestAndComplement64_Inline
+FORCEINLINE
+BOOLEAN
+_InterlockedBitTestAndComplement64(
+    _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
+    _In_ LONG64 Bit)
+{
+    ULONG64 Mask = 1LL << (Bit & 63);
+    return (BOOLEAN)((InterlockedXor64(&Target[Bit / 64], Mask) & Mask) != 0);
+}
+
+#endif /* M_IA64 */
 
 /******************************************************************************
  *                           Runtime Library Types                            *
@@ -599,11 +968,19 @@ typedef struct _EXCEPTION_POINTERS {
   PCONTEXT ContextRecord;
 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
 
-/* MS definition is broken! */
-extern BOOLEAN NTSYSAPI NlsMbCodePageTag;
-extern BOOLEAN NTSYSAPI NlsMbOemCodePageTag;
+#ifdef _NTSYSTEM_
+extern BOOLEAN NlsMbCodePageTag;
 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
+extern BOOLEAN NlsMbOemCodePageTag;
 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
+#else
+__CREATE_NTOS_DATA_IMPORT_ALIAS(NlsMbCodePageTag)
+extern BOOLEAN *NlsMbCodePageTag;
+#define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
+__CREATE_NTOS_DATA_IMPORT_ALIAS(NlsMbOemCodePageTag)
+extern BOOLEAN *NlsMbOemCodePageTag;
+#define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
+#endif
 
 #define SHORT_LEAST_SIGNIFICANT_BIT       0
 #define SHORT_MOST_SIGNIFICANT_BIT        1
@@ -1162,6 +1539,7 @@ typedef enum _KD_OPTION {
   KD_OPTION_SET_BLOCK_ENABLE,
 } KD_OPTION;
 
+#ifdef _NTSYSTEM_
 typedef VOID
 (NTAPI *PKNORMAL_ROUTINE)(
   IN PVOID NormalContext OPTIONAL,
@@ -1179,6 +1557,7 @@ typedef VOID
   IN OUT PVOID *NormalContext OPTIONAL,
   IN OUT PVOID *SystemArgument1 OPTIONAL,
   IN OUT PVOID *SystemArgument2 OPTIONAL);
+#endif
 
 typedef struct _KAPC {
   UCHAR Type;
@@ -1188,9 +1567,13 @@ typedef struct _KAPC {
   ULONG SpareLong0;
   struct _KTHREAD *Thread;
   LIST_ENTRY ApcListEntry;
+#ifdef _NTSYSTEM_
   PKKERNEL_ROUTINE KernelRoutine;
   PKRUNDOWN_ROUTINE RundownRoutine;
   PKNORMAL_ROUTINE NormalRoutine;
+#else
+  PVOID Reserved[3];
+#endif
   PVOID NormalContext;
   PVOID SystemArgument1;
   PVOID SystemArgument2;
@@ -1672,6 +2055,7 @@ extern NTSYSAPI volatile CCHAR KeNumberProcessors;
 #elif (NTDDI_VERSION >= NTDDI_WINXP)
 extern NTSYSAPI CCHAR KeNumberProcessors;
 #else
+__CREATE_NTOS_DATA_IMPORT_ALIAS(KeNumberProcessors)
 extern PCCHAR KeNumberProcessors;
 #endif
 
@@ -1824,8 +2208,11 @@ typedef enum _MM_SYSTEM_SIZE {
   MmLargeSystem
 } MM_SYSTEMSIZE;
 
-extern NTKERNELAPI BOOLEAN Mm64BitPhysicalAddress;
-extern PVOID MmBadPointer;
+#ifndef _NTSYSTEM_
+__CREATE_NTOS_DATA_IMPORT_ALIAS(Mm64BitPhysicalAddress)
+extern PBOOLEAN Mm64BitPhysicalAddress;
+#endif
+extern NTKERNELAPI PVOID MmBadPointer;
 
 
 /******************************************************************************
@@ -2098,7 +2485,7 @@ typedef struct _RESOURCE_PERFORMANCE_DATA {
 
 /* Global debug flag */
 #if DEVL
-extern ULONG NtGlobalFlag;
+extern NTKERNELAPI ULONG NtGlobalFlag;
 #define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName))
 #else
 #define IF_NTOS_DEBUG(FlagName) if(FALSE)
@@ -7857,6 +8244,7 @@ typedef struct _OBJECT_NAME_INFORMATION {
 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
 
 /* Exported object types */
+#ifdef _NTSYSTEM_
 extern POBJECT_TYPE NTSYSAPI CmKeyObjectType;
 extern POBJECT_TYPE NTSYSAPI ExEventObjectType;
 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType;
@@ -7864,6 +8252,30 @@ extern POBJECT_TYPE NTSYSAPI IoFileObjectType;
 extern POBJECT_TYPE NTSYSAPI PsThreadType;
 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
 extern POBJECT_TYPE NTSYSAPI PsProcessType;
+#else
+__CREATE_NTOS_DATA_IMPORT_ALIAS(CmKeyObjectType)
+__CREATE_NTOS_DATA_IMPORT_ALIAS(IoFileObjectType)
+__CREATE_NTOS_DATA_IMPORT_ALIAS(ExEventObjectType)
+__CREATE_NTOS_DATA_IMPORT_ALIAS(ExSemaphoreObjectType)
+__CREATE_NTOS_DATA_IMPORT_ALIAS(TmTransactionManagerObjectType)
+__CREATE_NTOS_DATA_IMPORT_ALIAS(TmResourceManagerObjectType)
+__CREATE_NTOS_DATA_IMPORT_ALIAS(TmEnlistmentObjectType)
+__CREATE_NTOS_DATA_IMPORT_ALIAS(TmTransactionObjectType)
+__CREATE_NTOS_DATA_IMPORT_ALIAS(PsProcessType)
+__CREATE_NTOS_DATA_IMPORT_ALIAS(PsThreadType)
+__CREATE_NTOS_DATA_IMPORT_ALIAS(SeTokenObjectType)
+extern POBJECT_TYPE *CmKeyObjectType;
+extern POBJECT_TYPE *IoFileObjectType;
+extern POBJECT_TYPE *ExEventObjectType;
+extern POBJECT_TYPE *ExSemaphoreObjectType;
+extern POBJECT_TYPE *TmTransactionManagerObjectType;
+extern POBJECT_TYPE *TmResourceManagerObjectType;
+extern POBJECT_TYPE *TmEnlistmentObjectType;
+extern POBJECT_TYPE *TmTransactionObjectType;
+extern POBJECT_TYPE *PsProcessType;
+extern POBJECT_TYPE *PsThreadType;
+extern POBJECT_TYPE *SeTokenObjectType;
+#endif
 
 
 /******************************************************************************
@@ -8339,7 +8751,7 @@ KeRestoreFloatingPointState(PVOID FloatingState)
 #define HIGH_LEVEL              15
 
 #define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000))
-extern volatile LARGE_INTEGER KeTickCount;
+extern NTKERNELAPI volatile LARGE_INTEGER KeTickCount;
 
 #define PAUSE_PROCESSOR __yield();
 
@@ -8530,6 +8942,8 @@ KeRaiseIrqlToSynchLevel(VOID);
 
 #elif defined(_M_ARM)
 #include <armddk.h>
+
+#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
 #else
 #error Unknown Architecture
 #endif
@@ -9571,6 +9985,41 @@ void __PREfastPagedCodeLocked(void);
  *                         Runtime Library Functions                          *
  ******************************************************************************/
 
+#define FAST_FAIL_LEGACY_GS_VIOLATION           0
+#define FAST_FAIL_VTGUARD_CHECK_FAILURE         1
+#define FAST_FAIL_STACK_COOKIE_CHECK_FAILURE    2
+#define FAST_FAIL_CORRUPT_LIST_ENTRY            3
+#define FAST_FAIL_INCORRECT_STACK               4
+#define FAST_FAIL_INVALID_ARG                   5
+#define FAST_FAIL_GS_COOKIE_INIT                6
+#define FAST_FAIL_FATAL_APP_EXIT                7
+#define FAST_FAIL_RANGE_CHECK_FAILURE           8
+#define FAST_FAIL_UNSAFE_REGISTRY_ACCESS        9
+#define FAST_FAIL_GUARD_ICALL_CHECK_FAILURE     10
+#define FAST_FAIL_GUARD_WRITE_CHECK_FAILURE     11
+#define FAST_FAIL_INVALID_FIBER_SWITCH          12
+#define FAST_FAIL_INVALID_SET_OF_CONTEXT        13
+#define FAST_FAIL_INVALID_REFERENCE_COUNT       14
+#define FAST_FAIL_INVALID_JUMP_BUFFER           18
+#define FAST_FAIL_MRDATA_MODIFIED               19
+#define FAST_FAIL_INVALID_FAST_FAIL_CODE        0xFFFFFFFF
+
+DECLSPEC_NORETURN
+FORCEINLINE
+VOID
+RtlFailFast(
+  _In_ ULONG Code)
+{
+  __fastfail(Code);
+}
+
+#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && (defined(_M_CEE_PURE) || defined(_M_CEE_SAFE))
+#define NO_KERNEL_LIST_ENTRY_CHECKS
+#endif
+
+#if !defined(EXTRA_KERNEL_LIST_ENTRY_CHECKS) && defined(__REACTOS__)
+#define EXTRA_KERNEL_LIST_ENTRY_CHECKS
+#endif
 
 #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
 
@@ -9593,6 +10042,46 @@ IsListEmpty(
   return (BOOLEAN)(ListHead->Flink == ListHead);
 }
 
+FORCEINLINE
+BOOLEAN
+RemoveEntryListUnsafe(
+  _In_ PLIST_ENTRY Entry)
+{
+  PLIST_ENTRY OldFlink;
+  PLIST_ENTRY OldBlink;
+
+  OldFlink = Entry->Flink;
+  OldBlink = Entry->Blink;
+  OldFlink->Blink = OldBlink;
+  OldBlink->Flink = OldFlink;
+  return (BOOLEAN)(OldFlink == OldBlink);
+}
+
+#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
+FORCEINLINE
+VOID
+FatalListEntryError(
+  _In_ PVOID P1,
+  _In_ PVOID P2,
+  _In_ PVOID P3)
+{
+  UNREFERENCED_PARAMETER(P1);
+  UNREFERENCED_PARAMETER(P2);
+  UNREFERENCED_PARAMETER(P3);
+
+  RtlFailFast(FAST_FAIL_CORRUPT_LIST_ENTRY);
+}
+
+FORCEINLINE
+VOID
+RtlpCheckListEntry(
+  _In_ PLIST_ENTRY Entry)
+{
+  if (Entry->Flink->Blink != Entry || Entry->Blink->Flink != Entry)
+    FatalListEntryError(Entry->Blink, Entry, Entry->Flink);
+}
+#endif
+
 FORCEINLINE
 BOOLEAN
 RemoveEntryList(
@@ -9603,6 +10092,14 @@ RemoveEntryList(
 
   OldFlink = Entry->Flink;
   OldBlink = Entry->Blink;
+#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
+#ifdef EXTRA_KERNEL_LIST_ENTRY_CHECKS
+  if (OldFlink == Entry || OldBlink == Entry)
+    FatalListEntryError(OldBlink, Entry, OldFlink);
+#endif
+  if (OldFlink->Blink != Entry || OldBlink->Flink != Entry)
+    FatalListEntryError(OldBlink, Entry, OldFlink);
+#endif
   OldFlink->Blink = OldBlink;
   OldBlink->Flink = OldFlink;
   return (BOOLEAN)(OldFlink == OldBlink);
@@ -9616,8 +10113,19 @@ RemoveHeadList(
   PLIST_ENTRY Flink;
   PLIST_ENTRY Entry;
 
+#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
+  RtlpCheckListEntry(ListHead);
+#ifdef EXTRA_KERNEL_LIST_ENTRY_CHECKS
+  if (ListHead->Flink == ListHead || ListHead->Blink == ListHead)
+    FatalListEntryError(ListHead->Blink, ListHead, ListHead->Flink);
+#endif
+#endif
   Entry = ListHead->Flink;
   Flink = Entry->Flink;
+#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
+  if (Entry->Blink != ListHead || Flink->Blink != Entry)
+    FatalListEntryError(ListHead, Entry, Flink);
+#endif
   ListHead->Flink = Flink;
   Flink->Blink = ListHead;
   return Entry;
@@ -9631,8 +10139,19 @@ RemoveTailList(
   PLIST_ENTRY Blink;
   PLIST_ENTRY Entry;
 
+#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
+  RtlpCheckListEntry(ListHead);
+#ifdef EXTRA_KERNEL_LIST_ENTRY_CHECKS
+  if (ListHead->Flink == ListHead || ListHead->Blink == ListHead)
+    FatalListEntryError(ListHead->Blink, ListHead, ListHead->Flink);
+#endif
+#endif
   Entry = ListHead->Blink;
   Blink = Entry->Blink;
+#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
+  if (Blink->Flink != Entry || Entry->Flink != ListHead)
+    FatalListEntryError(Blink, Entry, ListHead);
+#endif
   ListHead->Blink = Blink;
   Blink->Flink = ListHead;
   return Entry;
@@ -9645,9 +10164,16 @@ InsertTailList(
   _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
 {
   PLIST_ENTRY OldBlink;
+#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
+  RtlpCheckListEntry(ListHead);
+#endif
   OldBlink = ListHead->Blink;
   Entry->Flink = ListHead;
   Entry->Blink = OldBlink;
+#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
+  if (OldBlink->Flink != ListHead)
+    FatalListEntryError(OldBlink->Blink, OldBlink, ListHead);
+#endif
   OldBlink->Flink = Entry;
   ListHead->Blink = Entry;
 }
@@ -9659,9 +10185,16 @@ InsertHeadList(
   _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
 {
   PLIST_ENTRY OldFlink;
+#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
+  RtlpCheckListEntry(ListHead);
+#endif
   OldFlink = ListHead->Flink;
   Entry->Flink = OldFlink;
   Entry->Blink = ListHead;
+#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
+  if (OldFlink->Blink != ListHead)
+    FatalListEntryError(ListHead, OldFlink, OldFlink->Flink);
+#endif
   OldFlink->Blink = Entry;
   ListHead->Flink = Entry;
 }
@@ -9674,6 +10207,10 @@ AppendTailList(
 {
   PLIST_ENTRY ListEnd = ListHead->Blink;
 
+#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
+  RtlpCheckListEntry(ListHead);
+  RtlpCheckListEntry(ListToAppend);
+#endif
   ListHead->Blink->Flink = ListToAppend;
   ListHead->Blink = ListToAppend->Blink;
   ListToAppend->Blink->Flink = ListHead;
@@ -10991,16 +11528,10 @@ RtlCheckBit(
 #endif /* !defined(MIDL_PASS) */
 
 /* Byte Swap Functions */
-#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
-    ((defined(_M_AMD64) || defined(_M_IA64)) \
-        && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
-
 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
 
-#endif
-
 #if DBG
 
 #define RTL_VERIFY(exp) \
@@ -11043,9 +11574,15 @@ RtlCheckBit(
 # define __assert_annotationW(msg) __annotation(L"Debug", L"AssertFail", msg)
 #else
 # define __assert_annotationA(msg) \
-    DbgPrint("Assertion %s(%d): %s", __FILE__, __LINE__, msg)
+    DbgPrint("Assertion failed at %s(%d): %s\n", __FILE__, __LINE__, msg)
 # define __assert_annotationW(msg) \
-    DbgPrint("Assertion %s(%d): %S", __FILE__, __LINE__, msg)
+    DbgPrint("Assertion failed at %s(%d): %S\n", __FILE__, __LINE__, msg)
+#endif
+
+#ifdef _PREFAST_
+#define __analysis_unreachable() __assume(0)
+#else
+#define __analysis_unreachable() ((void)0)
 #endif
 
 #define NT_VERIFY(exp) \
@@ -11067,17 +11604,17 @@ RtlCheckBit(
 #define NT_ASSERT(exp) \
    ((VOID)((!(exp)) ? \
       (__assert_annotationA(#exp), \
-       DbgRaiseAssertionFailure(), FALSE) : TRUE))
+       DbgRaiseAssertionFailure(), __analysis_unreachable(), FALSE) : TRUE))
 
 #define NT_ASSERTMSG(msg, exp) \
    ((VOID)((!(exp)) ? \
       (__assert_annotationA(msg), \
-      DbgRaiseAssertionFailure(), FALSE) : TRUE))
+      DbgRaiseAssertionFailure(), __analysis_unreachable(), FALSE) : TRUE))
 
 #define NT_ASSERTMSGW(msg, exp) \
     ((VOID)((!(exp)) ? \
         (__assert_annotationW(msg), \
-         DbgRaiseAssertionFailure(), FALSE) : TRUE))
+         DbgRaiseAssertionFailure(), __analysis_unreachable(), FALSE) : TRUE))
 
 #else /* !DBG */
 
@@ -11452,7 +11989,7 @@ NTKERNELAPI
 VOID
 NTAPI
 MmBuildMdlForNonPagedPool(
-  _Inout_ PMDLX MemoryDescriptorList);
+  _Inout_ PMDL MemoryDescriptorList);
 
 //DECLSPEC_DEPRECATED_DDK
 NTKERNELAPI
@@ -11485,7 +12022,7 @@ NTKERNELAPI
 VOID
 NTAPI
 MmFreePagesFromMdl(
-  _Inout_ PMDLX MemoryDescriptorList);
+  _Inout_ PMDL MemoryDescriptorList);
 
 _IRQL_requires_max_(PASSIVE_LEVEL)
 NTKERNELAPI
@@ -11540,7 +12077,7 @@ NTKERNELAPI
 PVOID
 NTAPI
 MmMapLockedPagesSpecifyCache(
-  _Inout_ PMDLX MemoryDescriptorList,
+  _Inout_ PMDL MemoryDescriptorList,
   _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst)
     KPROCESSOR_MODE AccessMode,
   _In_ __drv_strictTypeMatch(__drv_typeCond) MEMORY_CACHING_TYPE CacheType,
@@ -11562,7 +12099,7 @@ NTKERNELAPI
 VOID
 NTAPI
 MmProbeAndLockPages(
-  _Inout_ PMDLX MemoryDescriptorList,
+  _Inout_ PMDL MemoryDescriptorList,
   _In_ KPROCESSOR_MODE AccessMode,
   _In_ LOCK_OPERATION Operation);
 
@@ -11597,7 +12134,7 @@ NTKERNELAPI
 VOID
 NTAPI
 MmUnlockPages(
-  _Inout_ PMDLX MemoryDescriptorList);
+  _Inout_ PMDL MemoryDescriptorList);
 
 _IRQL_requires_max_(DISPATCH_LEVEL)
 NTKERNELAPI
@@ -11648,7 +12185,7 @@ NTKERNELAPI
 NTSTATUS
 NTAPI
 MmAdvanceMdl(
-  _Inout_ PMDLX Mdl,
+  _Inout_ PMDL Mdl,
   _In_ ULONG NumberOfBytes);
 
 _Must_inspect_result_
@@ -11688,7 +12225,7 @@ NTAPI
 MmMapLockedPagesWithReservedMapping(
   _In_ PVOID MappingAddress,
   _In_ ULONG PoolTag,
-  _Inout_ PMDLX MemoryDescriptorList,
+  _Inout_ PMDL MemoryDescriptorList,
   _In_ __drv_strictTypeMatch(__drv_typeCond)
     MEMORY_CACHING_TYPE CacheType);
 
@@ -11698,7 +12235,7 @@ NTKERNELAPI
 NTSTATUS
 NTAPI
 MmProtectMdlSystemAddress(
-  _In_ PMDLX MemoryDescriptorList,
+  _In_ PMDL MemoryDescriptorList,
   _In_ ULONG NewProtect);
 
 _IRQL_requires_max_(DISPATCH_LEVEL)
@@ -11708,7 +12245,7 @@ NTAPI
 MmUnmapReservedMapping(
   _In_ PVOID BaseAddress,
   _In_ ULONG PoolTag,
-  _Inout_ PMDLX MemoryDescriptorList);
+  _Inout_ PMDL MemoryDescriptorList);
 
 _IRQL_requires_max_ (APC_LEVEL)
 NTKERNELAPI
@@ -13405,7 +13942,7 @@ NTKERNELAPI
 NTSTATUS
 NTAPI
 IoWMIOpenBlock(
-  _In_ GUID *DataBlockGuid,
+  _In_ LPCGUID DataBlockGuid,
   _In_ ULONG DesiredAccess,
   _Out_ PVOID *DataBlockObject);
 
@@ -14658,14 +15195,14 @@ NTKERNELAPI
 VOID
 NTAPI
 ExFreePool(
-  _In_ __drv_freesMem(Mem) PVOID P);
+  _Pre_notnull_ __drv_freesMem(Mem) PVOID P);
 
 _IRQL_requires_max_(DISPATCH_LEVEL)
 NTKERNELAPI
 VOID
 NTAPI
 ExFreePoolWithTag(
-  _In_ __drv_freesMem(Mem) PVOID P,
+  _Pre_notnull_ __drv_freesMem(Mem) PVOID P,
   _In_ ULONG Tag);
 
 _IRQL_requires_max_(DISPATCH_LEVEL)
@@ -14729,12 +15266,12 @@ ExInterlockedAddLargeInteger(
   _In_ LARGE_INTEGER Increment,
   _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
 
-#if defined(_WIN64)
+#if !defined(_M_IX86)
 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
     (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
 #else
 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
-    _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
+    (VOID)_InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
 #endif
 
 NTKERNELAPI
@@ -15770,27 +16307,18 @@ DbgSetDebugPrintCallback(
 
 #endif /* !DBG */
 
-#if defined(__GNUC__)
-
-extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
-extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
-#define KD_DEBUGGER_ENABLED KdDebuggerEnabled
-#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
-
-#elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
-
-extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
-extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
-#define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
-#define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
-
-#else
-
-extern BOOLEAN KdDebuggerNotPresent;
+#ifdef _NTSYSTEM_
 extern BOOLEAN KdDebuggerEnabled;
 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
+extern BOOLEAN KdDebuggerNotPresent;
 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
-
+#else
+__CREATE_NTOS_DATA_IMPORT_ALIAS(KdDebuggerEnabled)
+extern BOOLEAN *KdDebuggerEnabled;
+#define KD_DEBUGGER_ENABLED (*KdDebuggerEnabled)
+__CREATE_NTOS_DATA_IMPORT_ALIAS(KdDebuggerNotPresent)
+extern BOOLEAN *KdDebuggerNotPresent;
+#define KD_DEBUGGER_NOT_PRESENT (*KdDebuggerNotPresent)
 #endif
 
 #if (NTDDI_VERSION >= NTDDI_WIN2K)