Merge trunk head (r41474)
[reactos.git] / reactos / include / ddk / wdm.h
index 7f47916..a7e1d24 100644 (file)
@@ -28,6 +28,13 @@ extern "C" {
 #define NTKERNELAPI DECLSPEC_IMPORT\r
 #endif\r
 \r
+#ifdef _WIN64\r
+#define PORT_MAXIMUM_MESSAGE_LENGTH 512\r
+#else\r
+#define PORT_MAXIMUM_MESSAGE_LENGTH 256\r
+#endif\r
+\r
+\r
 /* Simple types */\r
 typedef UCHAR KPROCESSOR_MODE;\r
 typedef LONG KPRIORITY;\r
@@ -71,7 +78,100 @@ typedef int CM_RESOURCE_TYPE;
 #define CmResourceTypePcCardConfig       130\r
 #define CmResourceTypeMfCardConfig       131\r
 \r
-\r
+typedef enum _INTERFACE_TYPE {\r
+  InterfaceTypeUndefined = -1,\r
+  Internal,\r
+  Isa,\r
+  Eisa,\r
+  MicroChannel,\r
+  TurboChannel,\r
+  PCIBus,\r
+  VMEBus,\r
+  NuBus,\r
+  PCMCIABus,\r
+  CBus,\r
+  MPIBus,\r
+  MPSABus,\r
+  ProcessorInternal,\r
+  InternalPowerBus,\r
+  PNPISABus,\r
+  PNPBus,\r
+  MaximumInterfaceType\r
+} INTERFACE_TYPE, *PINTERFACE_TYPE;\r
+\r
+/* IO_RESOURCE_DESCRIPTOR.Option */\r
+\r
+#define IO_RESOURCE_PREFERRED             0x01\r
+#define IO_RESOURCE_DEFAULT               0x02\r
+#define IO_RESOURCE_ALTERNATIVE           0x08\r
+\r
+typedef struct _IO_RESOURCE_DESCRIPTOR {\r
+  UCHAR  Option;\r
+  UCHAR  Type;\r
+  UCHAR  ShareDisposition;\r
+  UCHAR  Spare1;\r
+  USHORT  Flags;\r
+  USHORT  Spare2;\r
+  union {\r
+    struct {\r
+      ULONG  Length;\r
+      ULONG  Alignment;\r
+      PHYSICAL_ADDRESS  MinimumAddress;\r
+      PHYSICAL_ADDRESS  MaximumAddress;\r
+    } Port;\r
+    struct {\r
+      ULONG  Length;\r
+      ULONG  Alignment;\r
+      PHYSICAL_ADDRESS  MinimumAddress;\r
+      PHYSICAL_ADDRESS  MaximumAddress;\r
+    } Memory;\r
+    struct {\r
+      ULONG  MinimumVector;\r
+      ULONG  MaximumVector;\r
+    } Interrupt;\r
+    struct {\r
+      ULONG  MinimumChannel;\r
+      ULONG  MaximumChannel;\r
+    } Dma;\r
+    struct {\r
+      ULONG  Length;\r
+      ULONG  Alignment;\r
+      PHYSICAL_ADDRESS  MinimumAddress;\r
+      PHYSICAL_ADDRESS  MaximumAddress;\r
+    } Generic;\r
+    struct {\r
+      ULONG  Data[3];\r
+    } DevicePrivate;\r
+    struct {\r
+      ULONG  Length;\r
+      ULONG  MinBusNumber;\r
+      ULONG  MaxBusNumber;\r
+      ULONG  Reserved;\r
+    } BusNumber;\r
+    struct {\r
+      ULONG  Priority;\r
+      ULONG  Reserved1;\r
+      ULONG  Reserved2;\r
+    } ConfigData;\r
+  } u;\r
+} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;\r
+\r
+typedef struct _IO_RESOURCE_LIST {\r
+  USHORT  Version;\r
+  USHORT  Revision;\r
+  ULONG  Count;\r
+  IO_RESOURCE_DESCRIPTOR  Descriptors[1];\r
+} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;\r
+\r
+typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {\r
+  ULONG  ListSize;\r
+  INTERFACE_TYPE  InterfaceType;\r
+  ULONG  BusNumber;\r
+  ULONG  SlotNumber;\r
+  ULONG  Reserved[3];\r
+  ULONG  AlternativeLists;\r
+  IO_RESOURCE_LIST  List[1];\r
+} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;\r
 \r
 //\r
 // Global debug flag\r
@@ -79,6 +179,81 @@ typedef int CM_RESOURCE_TYPE;
 extern ULONG NtGlobalFlag;\r
 \r
 \r
+#include <pshpack4.h>\r
+typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {\r
+  UCHAR Type;\r
+  UCHAR ShareDisposition;\r
+  USHORT Flags;\r
+  union {\r
+    struct {\r
+      PHYSICAL_ADDRESS Start;\r
+      ULONG Length;\r
+    } Generic;\r
+    struct {\r
+      PHYSICAL_ADDRESS Start;\r
+      ULONG Length;\r
+    } Port;\r
+    struct {\r
+      ULONG Level;\r
+      ULONG Vector;\r
+      KAFFINITY Affinity;\r
+    } Interrupt;\r
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+    struct {\r
+      union {\r
+        struct {\r
+          USHORT Reserved;\r
+          USHORT MessageCount;\r
+          ULONG Vector;\r
+          KAFFINITY Affinity;\r
+        } Raw;\r
+        struct {\r
+          ULONG Level;\r
+          ULONG Vector;\r
+          KAFFINITY Affinity;\r
+        } Translated;\r
+      };\r
+    } MessageInterrupt;\r
+#endif\r
+    struct {\r
+      PHYSICAL_ADDRESS Start;\r
+      ULONG Length;\r
+    } Memory;\r
+    struct {\r
+      ULONG Channel;\r
+      ULONG Port;\r
+      ULONG Reserved1;\r
+    } Dma;\r
+    struct {\r
+      ULONG Data[3];\r
+    } DevicePrivate;\r
+    struct {\r
+      ULONG Start;\r
+      ULONG Length;\r
+      ULONG Reserved;\r
+    } BusNumber;\r
+    struct {\r
+      ULONG DataSize;\r
+      ULONG Reserved1;\r
+      ULONG Reserved2;\r
+    } DeviceSpecificData;\r
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+    struct {\r
+      PHYSICAL_ADDRESS Start;\r
+      ULONG Length40;\r
+    } Memory40;\r
+    struct {\r
+      PHYSICAL_ADDRESS Start;\r
+      ULONG Length48;\r
+    } Memory48;\r
+    struct {\r
+      PHYSICAL_ADDRESS Start;\r
+      ULONG Length64;\r
+    } Memory64;\r
+#endif\r
+  } u;\r
+} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;\r
+#include <poppack.h>\r
 \r
 //\r
 // Section map options\r
@@ -224,11 +399,147 @@ InterlockedBitTestAndReset(IN LONG volatile *Base,
 #define BitScanForward _BitScanForward\r
 #define BitScanReverse _BitScanReverse\r
 \r
+#define BitTest _bittest\r
+#define BitTestAndComplement _bittestandcomplement\r
+#define BitTestAndSet _bittestandset\r
+#define BitTestAndReset _bittestandreset\r
+#define InterlockedBitTestAndSet _interlockedbittestandset\r
+#define InterlockedBitTestAndReset _interlockedbittestandreset\r
+\r
+\r
+/** INTERLOCKED FUNCTIONS *****************************************************/\r
+\r
+#if !defined(__INTERLOCKED_DECLARED)\r
+#define __INTERLOCKED_DECLARED\r
+\r
+#if defined (_X86_)\r
+#if defined(NO_INTERLOCKED_INTRINSICS)\r
+NTKERNELAPI\r
+LONG\r
+FASTCALL\r
+InterlockedIncrement(\r
+  IN OUT LONG volatile *Addend);\r
+\r
+NTKERNELAPI\r
+LONG\r
+FASTCALL\r
+InterlockedDecrement(\r
+  IN OUT LONG volatile *Addend);\r
+\r
+NTKERNELAPI\r
+LONG\r
+FASTCALL\r
+InterlockedCompareExchange(\r
+  IN OUT LONG volatile *Destination,\r
+  IN LONG  Exchange,\r
+  IN LONG  Comparand);\r
+\r
+NTKERNELAPI\r
+LONG\r
+FASTCALL\r
+InterlockedExchange(\r
+  IN OUT LONG volatile *Destination,\r
+  IN LONG Value);\r
+\r
+NTKERNELAPI\r
+LONG\r
+FASTCALL\r
+InterlockedExchangeAdd(\r
+  IN OUT LONG volatile *Addend,\r
+  IN LONG  Value);\r
+\r
+#else // !defined(NO_INTERLOCKED_INTRINSICS)\r
+\r
+#define InterlockedExchange _InterlockedExchange\r
+#define InterlockedIncrement _InterlockedIncrement\r
+#define InterlockedDecrement _InterlockedDecrement\r
+#define InterlockedExchangeAdd _InterlockedExchangeAdd\r
+#define InterlockedCompareExchange _InterlockedCompareExchange\r
+#define InterlockedOr _InterlockedOr\r
+#define InterlockedAnd _InterlockedAnd\r
+#define InterlockedXor _InterlockedXor\r
+\r
+#endif // !defined(NO_INTERLOCKED_INTRINSICS)\r
+\r
+#endif // defined (_X86_)\r
+\r
+#if !defined (_WIN64)\r
+/*\r
+ * PVOID\r
+ * InterlockedExchangePointer(\r
+ *   IN OUT PVOID volatile  *Target,\r
+ *   IN PVOID  Value)\r
+ */\r
+#define InterlockedExchangePointer(Target, Value) \\r
+  ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))\r
+\r
+/*\r
+ * PVOID\r
+ * InterlockedCompareExchangePointer(\r
+ *   IN OUT PVOID  *Destination,\r
+ *   IN PVOID  Exchange,\r
+ *   IN PVOID  Comparand)\r
+ */\r
+#define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \\r
+  ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))\r
+\r
+#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)\r
+#define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)\r
+#define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)\r
+\r
+#endif // !defined (_WIN64)\r
+\r
+#if defined (_M_AMD64)\r
+\r
+#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)\r
+#define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)\r
+#define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)\r
+#define InterlockedAnd _InterlockedAnd\r
+#define InterlockedOr _InterlockedOr\r
+#define InterlockedXor _InterlockedXor\r
+#define InterlockedIncrement _InterlockedIncrement\r
+#define InterlockedDecrement _InterlockedDecrement\r
+#define InterlockedAdd _InterlockedAdd\r
+#define InterlockedExchange _InterlockedExchange\r
+#define InterlockedExchangeAdd _InterlockedExchangeAdd\r
+#define InterlockedCompareExchange _InterlockedCompareExchange\r
+#define InterlockedAnd64 _InterlockedAnd64\r
+#define InterlockedOr64 _InterlockedOr64\r
+#define InterlockedXor64 _InterlockedXor64\r
+#define InterlockedIncrement64 _InterlockedIncrement64\r
+#define InterlockedDecrement64 _InterlockedDecrement64\r
+#define InterlockedAdd64 _InterlockedAdd64\r
+#define InterlockedExchange64 _InterlockedExchange64\r
+#define InterlockedExchangeAdd64 _InterlockedExchangeAdd64\r
+#define InterlockedCompareExchange64 _InterlockedCompareExchange64\r
+#define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer\r
+#define InterlockedExchangePointer _InterlockedExchangePointer\r
+#define InterlockedBitTestAndSet64 _interlockedbittestandset64\r
+#define InterlockedBitTestAndReset64 _interlockedbittestandreset64\r
+\r
+#endif // _M_AMD64\r
+\r
+#if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)\r
+//#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?\r
+FORCEINLINE\r
+LONG64\r
+InterlockedAdd64(\r
+    IN OUT LONG64 volatile *Addend,\r
+    IN LONG64 Value)\r
+{\r
+    return InterlockedExchangeAdd64(Addend, Value) + Value;\r
+}\r
+//#endif\r
+#define BitScanForward _BitScanForward\r
+#define BitScanReverse _BitScanReverse\r
+#endif\r
+\r
 #ifdef _M_AMD64\r
 #define InterlockedBitTestAndSet64 _interlockedbittestandset64\r
 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64\r
 #endif\r
 \r
+#endif /* !__INTERLOCKED_DECLARED */\r
 \r
 #if defined(_M_IX86)\r
 #define YieldProcessor _mm_pause\r
@@ -257,7 +568,7 @@ InterlockedBitTestAndReset(IN LONG volatile *Base,
 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY\r
 \r
 #if defined(_WIN64)\r
-typedef union _SLIST_HEADER {\r
+typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {\r
     struct {\r
         ULONGLONG Alignment;\r
         ULONGLONG Region;\r
@@ -271,13 +582,13 @@ typedef union _SLIST_HEADER {
         ULONGLONG Reserved:59;\r
         ULONGLONG Region:3;\r
     } Header8;\r
+    struct {\r
         ULONGLONG Depth:16;\r
         ULONGLONG Sequence:48;\r
         ULONGLONG HeaderType:1;\r
         ULONGLONG Init:1;\r
         ULONGLONG Reserved:2;\r
         ULONGLONG NextEntry:60;\r
-    struct {\r
     } Header16;\r
 } SLIST_HEADER, *PSLIST_HEADER;\r
 #else\r
@@ -693,6 +1004,52 @@ typedef struct _QUOTA_LIMITS {
 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008\r
 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010\r
 \r
+\r
+/******************************************************************************\r
+ *                             WINBASE Functions                              *\r
+ ******************************************************************************/\r
+#if !defined(_WINBASE_)\r
+\r
+#if defined(_WIN64)\r
+\r
+#define InterlockedPopEntrySList(Head) \\r
+    ExpInterlockedPopEntrySList(Head)\r
+\r
+#define InterlockedPushEntrySList(Head, Entry) \\r
+    ExpInterlockedPushEntrySList(Head, Entry)\r
+\r
+#define InterlockedFlushSList(Head) \\r
+    ExpInterlockedFlushSList(Head)\r
+\r
+#define QueryDepthSList(Head) \\r
+    ExQueryDepthSList(Head)\r
+\r
+#else // !defined(_WIN64)\r
+\r
+NTKERNELAPI\r
+PSLIST_ENTRY\r
+FASTCALL\r
+InterlockedPopEntrySList(\r
+    IN PSLIST_HEADER ListHead);\r
+\r
+NTKERNELAPI\r
+PSLIST_ENTRY\r
+FASTCALL\r
+InterlockedPushEntrySList(\r
+    IN PSLIST_HEADER ListHead,\r
+    IN PSLIST_ENTRY ListEntry);\r
+\r
+#define InterlockedFlushSList(ListHead) \\r
+    ExInterlockedFlushSList(ListHead)\r
+\r
+#define QueryDepthSList(Head) \\r
+    ExQueryDepthSList(Head)\r
+\r
+#endif // !defined(_WIN64)\r
+\r
+#endif // !defined(_WINBASE_)\r
+\r
+\r
 /******************************************************************************\r
  *                              Kernel Types                                  *\r
  ******************************************************************************/\r
@@ -1047,6 +1404,33 @@ RtlEqualUnicodeString(
     IN CONST UNICODE_STRING *String2,\r
     IN BOOLEAN CaseInSensitive);\r
 \r
+#if !defined(_AMD64_) && !defined(_IA64_)\r
+NTSYSAPI\r
+LARGE_INTEGER\r
+NTAPI\r
+RtlExtendedIntegerMultiply(\r
+    IN LARGE_INTEGER Multiplicand,\r
+    IN LONG Multiplier);\r
+\r
+NTSYSAPI\r
+LARGE_INTEGER\r
+NTAPI\r
+RtlExtendedLargeIntegerDivide(\r
+  IN LARGE_INTEGER Dividend,\r
+  IN ULONG Divisor,\r
+  IN OUT PULONG Remainder);\r
+#endif\r
+\r
+#if defined(_X86_) || defined(_IA64_)\r
+NTSYSAPI\r
+LARGE_INTEGER\r
+NTAPI\r
+RtlExtendedMagicDivide(\r
+    IN LARGE_INTEGER Dividend,\r
+    IN LARGE_INTEGER MagicDivisor,\r
+    IN CCHAR  ShiftCount);\r
+#endif\r
+\r
 NTSYSAPI\r
 VOID\r
 NTAPI\r
@@ -1552,9 +1936,9 @@ LARGE_INTEGER
 NTAPI_INLINE\r
 RtlConvertLongToLargeInteger(LONG SignedInteger)\r
 {\r
-    LARGE_INTEGER Result;\r
-    Result.QuadPart = SignedInteger;\r
-    return Result;\r
+    LARGE_INTEGER ret;\r
+    ret.QuadPart = SignedInteger;\r
+    return ret;\r
 }\r
 \r
 //DECLSPEC_DEPRECATED_DDK_WINXP\r
@@ -1569,6 +1953,46 @@ RtlConvertUlongToLargeInteger(
     return ret;\r
 }\r
 \r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+ULONG\r
+NTAPI_INLINE\r
+RtlEnlargedUnsignedDivide(\r
+    IN ULARGE_INTEGER Dividend,\r
+    IN ULONG Divisor,\r
+    IN OUT PULONG Remainder)\r
+{\r
+    if (Remainder)\r
+        *Remainder = Dividend.QuadPart % Divisor;\r
+    return Dividend.QuadPart / Divisor;\r
+}\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlEnlargedUnsignedMultiply(\r
+    IN ULONG Multiplicand,\r
+    IN ULONG Multiplier)\r
+{\r
+    LARGE_INTEGER ret;\r
+    ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;\r
+    return ret;\r
+}\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlEnlargedIntegerMultiply(\r
+    IN LONG Multiplicand,\r
+    IN LONG Multiplier)\r
+{\r
+    LARGE_INTEGER ret;\r
+    ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;\r
+    return ret;\r
+}\r
+\r
 FORCEINLINE\r
 VOID\r
 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,\r
@@ -1592,7 +2016,7 @@ RtlInitEmptyUnicodeString(
     UnicodeString->Buffer = Buffer;\r
 }\r
 \r
-#ifdef _M_AMD64\r
+#if defined(_AMD64_) || defined(_IA64_)\r
 static __inline\r
 LARGE_INTEGER\r
 NTAPI_INLINE\r
@@ -1621,6 +2045,75 @@ RtlExtendedLargeIntegerDivide(
 }\r
 #endif\r
 \r
+#if defined(_AMD64_)\r
+\r
+#define MultiplyHigh __mulh\r
+#define UnsignedMultiplyHigh __umulh\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlExtendedMagicDivide(\r
+    IN LARGE_INTEGER Dividend,\r
+    IN LARGE_INTEGER MagicDivisor,\r
+    IN CCHAR ShiftCount)\r
+{\r
+    LARGE_INTEGER ret;\r
+    ULONG64 ret64;\r
+    BOOLEAN Pos;\r
+    Pos = (Dividend.QuadPart >= 0);\r
+    ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,\r
+                                 MagicDivisor.QuadPart);\r
+    ret64 >>= ShiftCount;\r
+    ret.QuadPart = Pos ? ret64 : -ret64;\r
+    return ret;\r
+}\r
+#endif\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlLargeIntegerAdd(\r
+    IN LARGE_INTEGER Addend1,\r
+    IN LARGE_INTEGER Addend2)\r
+{\r
+    LARGE_INTEGER ret;\r
+    ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;\r
+    return ret;\r
+}\r
+\r
+/* VOID\r
+ * RtlLargeIntegerAnd(\r
+ *     IN OUT LARGE_INTEGER Result,\r
+ *     IN LARGE_INTEGER Source,\r
+ *     IN LARGE_INTEGER Mask);\r
+ */\r
+#define RtlLargeIntegerAnd(Result, Source, Mask) \\r
+    Result.QuadPart = Source.QuadPart & Mask.QuadPart\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlLargeIntegerArithmeticShift(\r
+    IN LARGE_INTEGER LargeInteger,\r
+    IN CCHAR ShiftCount)\r
+{\r
+    LARGE_INTEGER ret;\r
+    ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;\r
+    return ret;\r
+}\r
+\r
+/* BOOLEAN\r
+ * RtlLargeIntegerEqualTo(\r
+ *     IN LARGE_INTEGER  Operand1,\r
+ *     IN LARGE_INTEGER  Operand2);\r
+ */\r
+#define RtlLargeIntegerEqualTo(X,Y) \\r
+    (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))\r
+\r
 FORCEINLINE\r
 PVOID\r
 RtlSecureZeroMemory(\r
@@ -1629,7 +2122,7 @@ RtlSecureZeroMemory(
 {\r
     volatile char* vptr = (volatile char*)Pointer;\r
 #if defined(_M_AMD64)\r
-    _stosb((PUCHAR)vptr, 0, Size);\r
+    __stosb((PUCHAR)vptr, 0, Size);\r
 #else\r
     char * endptr = (char *)vptr + Size;\r
     while (vptr < endptr)\r
@@ -1645,7 +2138,7 @@ FORCEINLINE
 ULONG\r
 RtlCheckBit(\r
     IN PRTL_BITMAP BitMapHeader,\r
-    IN ULONG BitPosition);\r
+    IN ULONG BitPosition)\r
 {\r
     return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition);\r
 }\r
@@ -1658,26 +2151,164 @@ RtlCheckBit(
 //\r
 // Byte Swap Functions\r
 //\r
-#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || \\r
-    ((defined(_M_AMD64) || \\r
-     defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))\r
-\r
-unsigned short __cdecl _byteswap_ushort(unsigned short);\r
-unsigned long  __cdecl _byteswap_ulong (unsigned long);\r
-unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64);\r
-#pragma intrinsic(_byteswap_ushort)\r
-#pragma intrinsic(_byteswap_ulong)\r
-#pragma intrinsic(_byteswap_uint64)\r
+#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \\r
+    ((defined(_M_AMD64) || defined(_M_IA64)) \\r
+        && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))\r
+\r
 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))\r
 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))\r
 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))\r
 \r
-#elif defined(__GNUC__) && (defined(_M_IX86) || defined(_M_AMD64))\r
+#endif\r
 \r
-#define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))\r
-#define RtlUlongByteSwap(_x) _byteswap_ulong((_x))\r
-#define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))\r
+/******************************************************************************\r
+ *                         Memory manager Types                               *\r
+ ******************************************************************************/\r
+\r
+typedef struct _MDL {\r
+    struct _MDL *Next;\r
+    CSHORT Size;\r
+    CSHORT MdlFlags;\r
+    struct _EPROCESS *Process;\r
+    PVOID MappedSystemVa;\r
+    PVOID StartVa;\r
+    ULONG ByteCount;\r
+    ULONG ByteOffset;\r
+} MDL, *PMDL;\r
+\r
+\r
+/******************************************************************************\r
+ *                       Memory manager Functions                             *\r
+ ******************************************************************************/\r
+\r
+/* PVOID MmGetSystemAddressForMdl(\r
+ *     IN PMDL Mdl);\r
+ */\r
+#define MmGetSystemAddressForMdl(Mdl) \\r
+  (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \\r
+    MDL_SOURCE_IS_NONPAGED_POOL)) ? \\r
+      ((Mdl)->MappedSystemVa) : \\r
+      (MmMapLockedPages((Mdl), KernelMode)))\r
+\r
+/* PVOID\r
+ * MmGetSystemAddressForMdlSafe(\r
+ *     IN PMDL Mdl,\r
+ *     IN MM_PAGE_PRIORITY Priority)\r
+ */\r
+#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \\r
+  (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \\r
+    | MDL_SOURCE_IS_NONPAGED_POOL)) ? \\r
+    (_Mdl)->MappedSystemVa : \\r
+    (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \\r
+      KernelMode, MmCached, NULL, FALSE, (_Priority)))\r
+\r
+#if (NTDDI_VERSION >= NTDDI_WIN2K)\r
+NTKERNELAPI\r
+PMDL\r
+NTAPI\r
+MmCreateMdl(\r
+  IN PMDL  MemoryDescriptorList  OPTIONAL,\r
+  IN PVOID  Base,\r
+  IN SIZE_T  Length);\r
+\r
+#endif\r
+\r
+\r
+/******************************************************************************\r
+ *                         I/O Manager Functions                              *\r
+ ******************************************************************************/\r
+\r
+#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \\r
+   (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)\r
+\r
+#define DMA_MACROS_DEFINED\r
+\r
+FORCEINLINE\r
+NTSTATUS\r
+IoAllocateAdapterChannel(\r
+    IN PADAPTER_OBJECT AdapterObject,\r
+    IN PDEVICE_OBJECT DeviceObject,\r
+    IN ULONG NumberOfMapRegisters,\r
+    IN PDRIVER_CONTROL ExecutionRoutine,\r
+    IN PVOID Context)\r
+{\r
+    PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;\r
+    AllocateAdapterChannel =\r
+        *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;\r
+    ASSERT(AllocateAdapterChannel);\r
+    return AllocateAdapterChannel(DmaAdapter,\r
+                                  DeviceObject,\r
+                                  NumberOfMapRegisters,\r
+                                  ExecutionRoutine,\r
+                                  Context );\r
+}\r
+\r
+FORCEINLINE\r
+BOOLEAN\r
+IoFlushAdapterBuffers(\r
+    IN PADAPTER_OBJECT AdapterObject,\r
+    IN PMDL Mdl,\r
+    IN PVOID MapRegisterBase,\r
+    IN PVOID CurrentVa,\r
+    IN ULONG Length,\r
+    IN BOOLEAN WriteToDevice)\r
+{\r
+    PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;\r
+    FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;\r
+    ASSERT(FlushAdapterBuffers);\r
+    return FlushAdapterBuffers(DmaAdapter,\r
+                               Mdl,\r
+                               MapRegisterBase,\r
+                               CurrentVa,\r
+                               Length,\r
+                               WriteToDevice );\r
+}\r
 \r
+FORCEINLINE\r
+VOID\r
+IoFreeAdapterChannel(\r
+    IN PADAPTER_OBJECT AdapterObject)\r
+{\r
+    PFREE_ADAPTER_CHANNEL FreeAdapterChannel;\r
+    FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;\r
+    ASSERT(FreeAdapterChannel);\r
+    FreeAdapterChannel(DmaAdapter);\r
+}\r
+\r
+FORCEINLINE\r
+VOID\r
+IoFreeMapRegisters(\r
+    IN PADAPTER_OBJECT AdapterObject,\r
+    IN PVOID MapRegisterBase,\r
+    IN ULONG NumberOfMapRegisters)\r
+{\r
+    PFREE_MAP_REGISTERS FreeMapRegisters;\r
+    FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;\r
+    ASSERT(FreeMapRegisters);\r
+    FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);\r
+}\r
+\r
+FORCEINLINE\r
+PHYSICAL_ADDRESS\r
+IoMapTransfer(\r
+    IN PDMA_ADAPTER DmaAdapter,\r
+    IN PMDL Mdl,\r
+    IN PVOID MapRegisterBase,\r
+    IN PVOID CurrentVa,\r
+    IN OUT PULONG Length,\r
+    IN BOOLEAN WriteToDevice)\r
+{\r
+    PMAP_TRANSFER MapTransfer;\r
+\r
+    MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;\r
+    ASSERT(MapTransfer);\r
+    return MapTransfer(DmaAdapter,\r
+                       Mdl,\r
+                       MapRegisterBase,\r
+                       CurrentVa,\r
+                       Length,\r
+                       WriteToDevice);\r
+}\r
 #endif\r
 \r
 \r
@@ -1773,7 +2404,7 @@ typedef struct _ERESOURCE
 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))\r
 #define LOOKASIDE_ALIGN\r
 #else\r
-#define LOOKASIDE_ALIGN DECLSPEC_CACHEALIGN\r
+#define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */\r
 #endif\r
 \r
 typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;\r
@@ -1868,30 +2499,59 @@ typedef struct _EX_RUNDOWN_REF {
     };\r
 } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;\r
 \r
+typedef struct _EX_RUNDOWN_REF_CACHE_AWARE  *PEX_RUNDOWN_REF_CACHE_AWARE;\r
+\r
+typedef enum _WORK_QUEUE_TYPE {\r
+  CriticalWorkQueue,\r
+  DelayedWorkQueue,\r
+  HyperCriticalWorkQueue,\r
+  MaximumWorkQueue\r
+} WORK_QUEUE_TYPE;\r
+\r
+typedef VOID\r
+(DDKAPI *PWORKER_THREAD_ROUTINE)(\r
+  IN PVOID Parameter);\r
+\r
+typedef struct _WORK_QUEUE_ITEM {\r
+  LIST_ENTRY  List;\r
+  PWORKER_THREAD_ROUTINE  WorkerRoutine;\r
+  volatile PVOID  Parameter;\r
+} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;\r
+\r
 \r
 /******************************************************************************\r
  *                          Executive Functions                               *\r
  ******************************************************************************/\r
 \r
-#if defined (_WIN64)\r
-#if defined(_NTDRIVER_) || defined(_NTDDK) || defined(_NTIFS_) || \\r
+#if defined(_X86_)\r
+#if defined(_NTHAL_)\r
+#define ExAcquireFastMutex ExiAcquireFastMutex\r
+#define ExReleaseFastMutex ExiReleaseFastMutex\r
+#define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex\r
+#endif\r
+#define ExInterlockedAddUlong ExfInterlockedAddUlong\r
+#define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList\r
+#define ExInterlockedInsertTailList ExfInterlockedInsertTailList\r
+#define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList\r
+#define ExInterlockedPopEntryList ExfInterlockedPopEntryList\r
+#define ExInterlockedPushEntryList ExfInterlockedPushEntryList\r
+#endif\r
+\r
+#if defined(_WIN64)\r
+\r
+#if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \\r
     defined(_NTHAL_) || defined(_NTOSP_)\r
-NTKRNLAPI\r
+NTKERNELAPI\r
 USHORT\r
-ExQueryDepthSList(IN PSLIST_HEADER Listhead);\r
+ExQueryDepthSList(IN PSLIST_HEADER ListHead);\r
 #else\r
 FORCEINLINE\r
 USHORT\r
-ExQueryDepthSList(IN PSLIST_HEADER Listhead)\r
+ExQueryDepthSList(IN PSLIST_HEADER ListHead)\r
 {\r
     return (USHORT)(ListHead->Alignment & 0xffff);\r
 }\r
 #endif\r
-#else\r
-#define ExQueryDepthSList(listhead) (listhead)->Depth\r
-#endif\r
-\r
-#if defined(_WIN64)\r
 \r
 NTKERNELAPI\r
 PSLIST_ENTRY\r
@@ -1918,6 +2578,8 @@ ExpInterlockedPushEntrySList(
 \r
 #else // !defined(_WIN64)\r
 \r
+#define ExQueryDepthSList(listhead) (listhead)->Depth\r
+\r
 NTKERNELAPI\r
 PSINGLE_LIST_ENTRY\r
 FASTCALL\r
@@ -1946,30 +2608,30 @@ ExInterlockedPushEntrySList(
     InterlockedPushEntrySList(_ListHead, _ListEntry)\r
 #endif // _WIN2K_COMPAT_SLIST_USAGE\r
 \r
+#endif // !defined(_WIN64)\r
+\r
 /* ERESOURCE_THREAD\r
  * ExGetCurrentResourceThread(\r
  *     VOID);\r
  */\r
 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())\r
 \r
-#endif // !defined(_WIN64)\r
-\r
-#if (NTDDI_VERSION >= NTDDI_WIN2K)\r
+#define ExReleaseResource(R) (ExReleaseResourceLite(R))\r
 \r
-#if defined(_NTHAL_) && defined(_X86_)\r
-#define ExAcquireFastMutex ExiAcquireFastMutex\r
-#define ExReleaseFastMutex ExiReleaseFastMutex\r
-#define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex\r
-#endif\r
+/* VOID\r
+ * ExInitializeWorkItem(\r
+ *     IN PWORK_QUEUE_ITEM Item,\r
+ *     IN PWORKER_THREAD_ROUTINE Routine,\r
+ *     IN PVOID Context)\r
+ */\r
+#define ExInitializeWorkItem(Item, Routine, Context) \\r
+{ \\r
+  (Item)->WorkerRoutine = Routine; \\r
+  (Item)->Parameter = Context; \\r
+  (Item)->List.Flink = NULL; \\r
+}\r
 \r
-#if defined(_X86_)\r
-#define ExInterlockedAddUlong ExfInterlockedAddUlong\r
-#define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList\r
-#define ExInterlockedInsertTailList ExfInterlockedInsertTailList\r
-#define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList\r
-#define ExInterlockedPopEntryList ExfInterlockedPopEntryList\r
-#define ExInterlockedPushEntryList ExfInterlockedPushEntryList\r
-#endif\r
+#if (NTDDI_VERSION >= NTDDI_WIN2K)\r
 \r
 NTKERNELAPI\r
 VOID\r
@@ -1989,6 +2651,18 @@ FASTCALL
 ExTryToAcquireFastMutex(\r
     IN OUT PFAST_MUTEX FastMutex);\r
 \r
+NTKERNELAPI\r
+VOID\r
+FASTCALL\r
+ExAcquireFastMutexUnsafe(\r
+    IN OUT PFAST_MUTEX FastMutex);\r
+\r
+NTKERNELAPI\r
+VOID\r
+FASTCALL\r
+ExReleaseFastMutexUnsafe(\r
+    IN OUT PFAST_MUTEX FastMutex);\r
+\r
 NTKERNELAPI\r
 BOOLEAN\r
 NTAPI\r
@@ -2287,6 +2961,13 @@ ExNotifyCallback(
     IN PVOID Argument1,\r
     IN PVOID Argument2);\r
 \r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExQueueWorkItem(\r
+    IN PWORK_QUEUE_ITEM WorkItem,\r
+    IN WORK_QUEUE_TYPE QueueType);\r
+\r
 NTKERNELAPI\r
 DECLSPEC_NORETURN\r
 VOID\r
@@ -2444,49 +3125,73 @@ ExInitializeLookasideListEx(
 #endif\r
 \r
 \r
-/******************************************************************************\r
- *                             WINBASE Functions                              *\r
- ******************************************************************************/\r
-#if !defined(_WINBASE_)\r
-\r
-#if defined(_WIN64)\r
-\r
-#define InterlockedPopEntrySList(Head) \\r
-    ExpInterlockedPopEntrySList(Head)\r
-\r
-#define InterlockedPushEntrySList(Head, Entry) \\r
-    ExpInterlockedPushEntrySList(Head, Entry)\r
-\r
-#define InterlockedFlushSList(Head) \\r
-    ExpInterlockedFlushSList(Head)\r
-\r
-#define QueryDepthSList(Head) \\r
-    ExQueryDepthSList(Head)\r
+#if !defined(MIDL_PASS)\r
 \r
-#else // !defined(_WIN64)\r
+static __inline PVOID\r
+ExAllocateFromNPagedLookasideList(\r
+    IN PNPAGED_LOOKASIDE_LIST Lookaside)\r
+{\r
+    PVOID Entry;\r
+\r
+    Lookaside->L.TotalAllocates++;\r
+    Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);\r
+    if (Entry == NULL) {\r
+        Lookaside->L.AllocateMisses++;\r
+        Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,\r
+                                        Lookaside->L.Size,\r
+                                        Lookaside->L.Tag);\r
+    }\r
+    return Entry;\r
+}\r
 \r
-NTKERNELAPI\r
-PSLIST_ENTRY\r
-FASTCALL\r
-InterlockedPopEntrySList(\r
-    IN PSLIST_HEADER ListHead);\r
+static __inline PVOID\r
+ExAllocateFromPagedLookasideList(\r
+    IN PPAGED_LOOKASIDE_LIST Lookaside)\r
+{\r
+    PVOID Entry;\r
+\r
+    Lookaside->L.TotalAllocates++;\r
+    Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);\r
+    if (Entry == NULL) {\r
+        Lookaside->L.AllocateMisses++;\r
+        Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,\r
+                                        Lookaside->L.Size,\r
+                                        Lookaside->L.Tag);\r
+    }\r
+    return Entry;\r
+}\r
 \r
-NTKERNELAPI\r
-PSLIST_ENTRY\r
-FASTCALL\r
-InterlockedPushEntrySList(\r
-    IN PSLIST_HEADER ListHead,\r
-    IN PSLIST_ENTRY ListEntry);\r
+static __inline VOID\r
+ExFreeToNPagedLookasideList(\r
+    IN PNPAGED_LOOKASIDE_LIST Lookaside,\r
+    IN PVOID  Entry)\r
+{\r
+    Lookaside->L.TotalFrees++;\r
+    if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {\r
+        Lookaside->L.FreeMisses++;\r
+        (Lookaside->L.Free)(Entry);\r
+    } else {\r
+        InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);\r
+    }\r
+}\r
 \r
-#define InterlockedFlushSList(ListHead) \\r
-    ExInterlockedFlushSList(ListHead)\r
+static __inline VOID\r
+ExFreeToPagedLookasideList(\r
+    IN PPAGED_LOOKASIDE_LIST Lookaside,\r
+    IN PVOID  Entry)\r
+{\r
+    Lookaside->L.TotalFrees++;\r
+    if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {\r
+        Lookaside->L.FreeMisses++;\r
+        (Lookaside->L.Free)(Entry);\r
+    } else {\r
+        InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);\r
+    }\r
+}\r
 \r
-#define QueryDepthSList(Head) \\r
-    ExQueryDepthSList(Head)\r
 \r
-#endif // !defined(_WIN64)\r
+#endif // !defined(MIDL_PASS)\r
 \r
-#endif // !defined(_WINBASE_)\r
 \r
 #ifdef __cplusplus\r
 }\r