Fix msvc/gcc NDK problem
[reactos.git] / reactos / w32api / include / ddk / winddk.h
index 0bb6292..d6cf0b9 100644 (file)
@@ -36,8 +36,10 @@ extern "C" {
 */
 #define DDKAPI __stdcall
 #define DDKFASTAPI __fastcall
+#define FASTCALL __fastcall
 #define DDKCDECLAPI __cdecl
 
+/* FIXME: REMOVE THIS UNCOMPATIBLE CRUFT!!! */
 #if defined(_NTOSKRNL_)
 #ifndef NTOSAPI
 #define NTOSAPI DECL_EXPORT
@@ -73,6 +75,7 @@ extern "C" {
 
 #define RESTRICTED_POINTER
 #define POINTER_ALIGNMENT
+#define DECLSPEC_ADDRSAFE
 
 #ifdef NONAMELESSUNION
 # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
@@ -82,6 +85,18 @@ extern "C" {
 # define _DDK_DUMMYUNION_N_MEMBER(n, name) name
 #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
+
 /*
 ** Forward declarations
 */
@@ -101,6 +116,8 @@ struct _SECTION_OBJECT;
 struct _IO_STATUS_BLOCK;
 struct _DEVICE_DESCRIPTION;
 struct _SCATTER_GATHER_LIST;
+struct _DRIVE_LAYOUT_INFORMATION;
+struct _DRIVE_LAYOUT_INFORMATION_EX;
 
 DECLARE_INTERNAL_OBJECT(ADAPTER_OBJECT)
 DECLARE_INTERNAL_OBJECT(DMA_ADAPTER)
@@ -124,38 +141,6 @@ typedef ULONG LOGICAL;
 */
 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )   
 
-static __inline struct _KPCR * KeGetCurrentKPCR(
-  VOID)
-{
-  ULONG Value;
-#if defined(__GNUC__)
-  __asm__ __volatile__ ("movl %%fs:0x1C, %0\n\t"
-         : "=r" (Value)
-    : /* no inputs */
-  );
-#elif defined(_MSC_VER)
-  __asm mov eax, fs:[1Ch]
-  __asm mov [Value], eax
-#endif
-  return (struct _KPCR *) Value;
-}
-
-static __inline struct _KPRCB * KeGetCurrentPrcb(
-  VOID)
-{
-  ULONG Value;
-#if defined(__GNUC__)
-  __asm__ __volatile__ ("movl %%fs:0x20, %0\n\t"
-         : "=r" (Value)
-    : /* no inputs */
-  );
-#elif defined(_MSC_VER)
-  __asm mov eax, fs:[20h]
-  __asm mov [Value], eax
-#endif
-  return (struct _KPRCB *) Value;
-}
-
 /*
 ** Simple structures
 */
@@ -163,7 +148,6 @@ static __inline struct _KPRCB * KeGetCurrentPrcb(
 typedef LONG KPRIORITY;
 typedef UCHAR KIRQL, *PKIRQL;
 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
-typedef ULONG KAFFINITY, *PKAFFINITY;
 typedef UCHAR KPROCESSOR_MODE;
 
 typedef enum _MODE {
@@ -172,6 +156,14 @@ typedef enum _MODE {
   MaximumMode
 } MODE;
 
+typedef struct _QUAD
+{
+    union
+    {
+        LONGLONG UseThisFieldToCopy;
+        float DoNotUseThisField;
+    };
+} QUAD, *PQUAD;
 
 /* Structures not exposed to drivers */
 typedef struct _IO_TIMER *PIO_TIMER;
@@ -186,9 +178,21 @@ typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
 typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
 typedef struct _BUS_HANDLER *PBUS_HANDLER;
+typedef struct _PEB *PPEB;
 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
 
 /* Constants */
+#define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )  
+#define ZwCurrentProcess() NtCurrentProcess()         
+#define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )   
+#define ZwCurrentThread() NtCurrentThread()      
+
+#define DPFLTR_ERROR_LEVEL                  0
+#define DPFLTR_WARNING_LEVEL                1
+#define DPFLTR_TRACE_LEVEL                  2
+#define DPFLTR_INFO_LEVEL                   3
+#define DPFLTR_MASK                         0x80000000
+
 #define MAXIMUM_PROCESSORS                32
 
 #define MAXIMUM_WAIT_OBJECTS              64
@@ -321,6 +325,9 @@ typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
    SYNCHRONIZE)
 /* end winnt.h */
 
+#define OBJECT_TYPE_CREATE (0x0001)
+#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
+
 #define DIRECTORY_QUERY (0x0001)
 #define DIRECTORY_TRAVERSE (0x0002)
 #define DIRECTORY_CREATE_OBJECT (0x0004)
@@ -335,6 +342,13 @@ typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
 #define SEMAPHORE_MODIFY_STATE (0x0002)
 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
 
+#define THREAD_ALERT (0x0004)
+
+#define FM_LOCK_BIT             (0x1)
+#define FM_LOCK_BIT_V           (0x0)
+#define FM_LOCK_WAITER_WOKEN    (0x2)
+#define FM_LOCK_WAITER_INC      (0x4)
+
 /* Exported object types */
 extern NTOSAPI POBJECT_TYPE ExDesktopObjectType;
 extern NTOSAPI POBJECT_TYPE ExEventObjectType;
@@ -345,6 +359,7 @@ extern NTOSAPI POBJECT_TYPE IoDeviceHandlerObjectType;
 extern NTOSAPI POBJECT_TYPE IoDeviceObjectType;
 extern NTOSAPI POBJECT_TYPE IoDriverObjectType;
 extern NTOSAPI POBJECT_TYPE IoFileObjectType;
+extern NTOSAPI POBJECT_TYPE PsThreadType;
 extern NTOSAPI POBJECT_TYPE LpcPortObjectType;
 extern NTOSAPI POBJECT_TYPE MmSectionObjectType;
 extern NTOSAPI POBJECT_TYPE SeTokenObjectType;
@@ -352,6 +367,7 @@ extern NTOSAPI POBJECT_TYPE SeTokenObjectType;
 extern NTOSAPI CCHAR KeNumberProcessors;
 
 #define PROCESSOR_FEATURE_MAX 64
+#define MAX_WOW64_SHARED_ENTRIES 16
 
 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE 
 {
@@ -376,12 +392,12 @@ typedef struct _KUSER_SHARED_DATA
     volatile KSYSTEM_TIME TimeZoneBias;
     USHORT ImageNumberLow;
     USHORT ImageNumberHigh;
-    WCHAR NtSystemRoot[ 260 ];
+    WCHAR NtSystemRoot[260];
     ULONG MaxStackTraceDepth;
     ULONG CryptoExponent;
     ULONG TimeZoneId;
     ULONG LargePageMinimum;
-    ULONG Reserved2[ 7 ];
+    ULONG Reserved2[7];
     NT_PRODUCT_TYPE NtProductType;
     BOOLEAN ProductTypeIsValid;
     ULONG NtMajorVersion;
@@ -401,12 +417,19 @@ typedef struct _KUSER_SHARED_DATA
     ULONG NumberOfPhysicalPages;
     BOOLEAN SafeBootMode;
     ULONG TraceLogging;
-    ULONGLONG   Fill0;
-    ULONGLONG   SystemCall[4];
+    ULONG Fill0;
+    ULONGLONG TestRetInstruction;
+    ULONG SystemCall;
+    ULONG SystemCallReturn;
+    ULONGLONG SystemCallPad[3];
     union {
         volatile KSYSTEM_TIME TickCount;
         volatile ULONG64 TickCountQuad;
     };
+    ULONG Cookie;
+    LONGLONG ConsoleSessionForegroundProcessId;
+    ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
+    ULONG UserModeGlobalLogging;
 } KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
 
 /*
@@ -530,6 +553,13 @@ typedef IO_ALLOCATION_ACTION
   IN PVOID  MapRegisterBase,
   IN PVOID  Context);
 
+typedef EXCEPTION_DISPOSITION
+(DDKAPI *PEXCEPTION_ROUTINE)(
+  IN struct _EXCEPTION_RECORD *ExceptionRecord,
+  IN PVOID EstablisherFrame,
+  IN OUT struct _CONTEXT *ContextRecord,
+  IN OUT PVOID DispatcherContext);
+
 typedef VOID
 (DDKAPI *PDRIVER_LIST_CONTROL)(
   IN struct _DEVICE_OBJECT  *DeviceObject,
@@ -655,6 +685,42 @@ typedef ULONG
   IN ULONG  Offset,
   IN ULONG  Length);
 
+/* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
+#define PCI_USE_SUBSYSTEM_IDS   0x00000001
+#define PCI_USE_REVISION        0x00000002
+#define PCI_USE_VENDEV_IDS      0x00000004
+#define PCI_USE_CLASS_SUBCLASS  0x00000008
+#define PCI_USE_PROGIF          0x00000010
+#define PCI_USE_LOCAL_BUS       0x00000020
+#define PCI_USE_LOCAL_DEVICE    0x00000040
+
+typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
+  ULONG   Size;
+  ULONG   Flags;
+  USHORT  VendorID;
+  USHORT  DeviceID;
+  UCHAR   RevisionID;
+  USHORT  SubVendorID;
+  USHORT  SubSystemID;
+  UCHAR   BaseClass;
+  UCHAR   SubClass;
+  UCHAR   ProgIf;
+} PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
+
+typedef BOOLEAN
+(DDKAPI *PPCI_IS_DEVICE_PRESENT)(
+  IN USHORT  VendorID,
+  IN USHORT  DeviceID,
+  IN UCHAR   RevisionID,
+  IN USHORT  SubVendorID,
+  IN USHORT  SubSystemID,
+  IN ULONG   Flags);
+
+typedef BOOLEAN
+(DDKAPI *PPCI_IS_DEVICE_PRESENT_EX)(
+  IN PVOID Context,
+  IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
+
 typedef union _POWER_STATE {
   SYSTEM_POWER_STATE  SystemState;
   DEVICE_POWER_STATE  DeviceState;
@@ -677,6 +743,16 @@ typedef struct _BUS_INTERFACE_STANDARD {
   PGET_SET_DEVICE_DATA  GetBusData;
 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
 
+typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
+  USHORT  Size;
+  USHORT  Version;
+  PVOID  Context;
+  PINTERFACE_REFERENCE  InterfaceReference;
+  PINTERFACE_DEREFERENCE  InterfaceDereference;
+  PPCI_IS_DEVICE_PRESENT  IsDevicePresent;
+  PPCI_IS_DEVICE_PRESENT_EX  IsDevicePresentEx;
+} PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
+
 typedef struct _DEVICE_CAPABILITIES {
   USHORT  Size;
   USHORT  Version;
@@ -887,21 +963,24 @@ typedef BOOLEAN
 (DDKAPI *PKTRANSFER_ROUTINE)(
   VOID);
 
-typedef struct _KAPC {
-  CSHORT  Type;
-  CSHORT  Size;
-  ULONG  Spare0;
-  struct _KTHREAD  *Thread;
-  LIST_ENTRY  ApcListEntry;
-  PKKERNEL_ROUTINE  KernelRoutine;
-  PKRUNDOWN_ROUTINE  RundownRoutine;
-  PKNORMAL_ROUTINE  NormalRoutine;
-  PVOID  NormalContext;
-  PVOID  SystemArgument1;
-  PVOID  SystemArgument2;
-  CCHAR  ApcStateIndex;
-  KPROCESSOR_MODE  ApcMode;
-  BOOLEAN  Inserted;
+typedef struct _KAPC
+{
+    UCHAR Type;
+    UCHAR SpareByte0;
+    UCHAR Size;
+    UCHAR SpareByte1;
+    ULONG SpareLong0;
+    struct _KTHREAD *Thread;
+    LIST_ENTRY ApcListEntry;
+    PKKERNEL_ROUTINE KernelRoutine;
+    PKRUNDOWN_ROUTINE RundownRoutine;
+    PKNORMAL_ROUTINE NormalRoutine;
+    PVOID NormalContext;
+    PVOID SystemArgument1;
+    PVOID SystemArgument2;
+    CCHAR ApcStateIndex;
+    KPROCESSOR_MODE ApcMode;
+    BOOLEAN Inserted;
 } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
 
 typedef struct _KDEVICE_QUEUE {
@@ -973,13 +1052,33 @@ typedef struct _WAIT_CONTEXT_BLOCK {
   PKDPC  BufferChainingDpc;
 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
 
-typedef struct _DISPATCHER_HEADER {
-  UCHAR  Type;
-  UCHAR  Absolute;
-  UCHAR  Size;
-  UCHAR  Inserted;
-  LONG  SignalState;
-  LIST_ENTRY  WaitListHead;
+typedef struct _DISPATCHER_HEADER
+{
+    union
+    {
+        struct
+        {
+            UCHAR Type;
+            union
+            {
+                UCHAR Absolute;
+                UCHAR NpxIrql;
+            };
+            union
+            {
+                UCHAR Size;
+                UCHAR Hand;
+            };
+            union
+            {
+                UCHAR Inserted;
+                BOOLEAN DebugActive;
+            };
+        };
+        volatile LONG Lock;
+    };
+    LONG SignalState;
+    LIST_ENTRY WaitListHead;
 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
 
 typedef struct _KEVENT {
@@ -991,12 +1090,13 @@ typedef struct _KSEMAPHORE {
     LONG Limit;
 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
 
-typedef struct _FAST_MUTEX {
-  LONG  Count;
-  struct _KTHREAD  *Owner;
-  ULONG  Contention;
-  KEVENT  Event;
-  ULONG  OldIrql;
+typedef struct _FAST_MUTEX
+{
+    LONG Count;
+    PKTHREAD Owner;
+    ULONG Contention;
+    KEVENT Gate;
+    ULONG OldIrql;
 } FAST_MUTEX, *PFAST_MUTEX;
 
 typedef struct _KGATE
@@ -1536,6 +1636,50 @@ typedef struct _CM_SERIAL_DEVICE_DATA {
   ULONG  BaudClock;
 } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
 
+typedef struct _VM_COUNTERS 
+{
+    SIZE_T PeakVirtualSize;
+    SIZE_T VirtualSize;
+    ULONG PageFaultCount;
+    SIZE_T PeakWorkingSetSize;
+    SIZE_T WorkingSetSize;
+    SIZE_T QuotaPeakPagedPoolUsage;
+    SIZE_T QuotaPagedPoolUsage;
+    SIZE_T QuotaPeakNonPagedPoolUsage;
+    SIZE_T QuotaNonPagedPoolUsage;
+    SIZE_T PagefileUsage;
+    SIZE_T PeakPagefileUsage;
+} VM_COUNTERS, *PVM_COUNTERS;
+
+typedef struct _VM_COUNTERS_EX 
+{
+    SIZE_T PeakVirtualSize;
+    SIZE_T VirtualSize;
+    ULONG PageFaultCount;
+    SIZE_T PeakWorkingSetSize;
+    SIZE_T WorkingSetSize;
+    SIZE_T QuotaPeakPagedPoolUsage;
+    SIZE_T QuotaPagedPoolUsage;
+    SIZE_T QuotaPeakNonPagedPoolUsage;
+    SIZE_T QuotaNonPagedPoolUsage;
+    SIZE_T PagefileUsage;
+    SIZE_T PeakPagefileUsage;
+    SIZE_T PrivateUsage;
+} VM_COUNTERS_EX, *PVM_COUNTERS_EX;
+
+typedef struct _POOLED_USAGE_AND_LIMITS
+{
+    SIZE_T PeakPagedPoolUsage;
+    SIZE_T PagedPoolUsage;
+    SIZE_T PagedPoolLimit;
+    SIZE_T PeakNonPagedPoolUsage;
+    SIZE_T NonPagedPoolUsage;
+    SIZE_T NonPagedPoolLimit;
+    SIZE_T PeakPagefileUsage;
+    SIZE_T PagefileUsage;
+    SIZE_T PagefileLimit;
+} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
+
 /* IO_RESOURCE_DESCRIPTOR.Option */
 
 #define IO_RESOURCE_PREFERRED             0x01
@@ -2418,6 +2562,15 @@ extern DECL_EXPORT HAL_DISPATCH HalDispatchTable;
 #define HalReferenceHandlerForBus       HALDISPATCH->HalReferenceHandlerForBus
 #define HalReferenceBusHandler          HALDISPATCH->HalReferenceBusHandler
 #define HalDereferenceBusHandler        HALDISPATCH->HalDereferenceBusHandler
+#define HalInitPnpDriver                HALDISPATCH->HalInitPnpDriver
+#define HalInitPowerManagement          HALDISPATCH->HalInitPowerManagement
+#define HalGetDmaAdapter                HALDISPATCH->HalGetDmaAdapter
+#define HalGetInterruptTranslator       HALDISPATCH->HalGetInterruptTranslator
+#define HalStartMirroring               HALDISPATCH->HalStartMirroring
+#define HalEndMirroring                 HALDISPATCH->HalEndMirroring
+#define HalMirrorPhysicalMemory         HALDISPATCH->HalMirrorPhysicalMemory
+#define HalEndOfBoot                    HALDISPATCH->HalEndOfBoot
+#define HalMirrorVerify                 HALDISPATCH->HalMirrorVerify
 
 typedef enum _FILE_INFORMATION_CLASS {
   FileDirectoryInformation = 1,
@@ -2469,7 +2622,7 @@ typedef struct _FILE_POSITION_INFORMATION {
 
 typedef struct _FILE_ALIGNMENT_INFORMATION {
   ULONG  AlignmentRequirement;
-} FILE_ALIGNMENT_INFORMATION;
+} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
 
 typedef struct _FILE_NAME_INFORMATION {
   ULONG  FileNameLength;
@@ -2513,6 +2666,16 @@ typedef struct _FILE_DISPOSITION_INFORMATION {
   BOOLEAN  DeleteFile;
 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
 
+typedef struct _FILE_QUOTA_INFORMATION {
+    ULONG NextEntryOffset;
+    ULONG SidLength;
+    LARGE_INTEGER ChangeTime;
+    LARGE_INTEGER QuotaUsed;
+    LARGE_INTEGER QuotaThreshold;
+    LARGE_INTEGER QuotaLimit;
+    SID Sid;
+} FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;
+
 typedef struct _FILE_END_OF_FILE_INFORMATION {
   LARGE_INTEGER  EndOfFile;
 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
@@ -2584,6 +2747,13 @@ typedef struct _ERESOURCE {
   KSPIN_LOCK  SpinLock;
 } ERESOURCE, *PERESOURCE;
 
+typedef struct _DEVOBJ_EXTENSION
+{
+    CSHORT Type;
+    USHORT Size;
+    PDEVICE_OBJECT DeviceObject;
+} DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
+
 typedef struct _DRIVER_EXTENSION {
   struct _DRIVER_OBJECT  *DriverObject;
   PDRIVER_ADD_DEVICE  AddDevice;
@@ -2954,6 +3124,39 @@ typedef struct _INITIAL_PRIVILEGE_SET {
   LUID_AND_ATTRIBUTES  Privilege[INITIAL_PRIVILEGE_COUNT];
 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
 
+#define SE_MIN_WELL_KNOWN_PRIVILEGE       2
+#define SE_CREATE_TOKEN_PRIVILEGE         2
+#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE   3
+#define SE_LOCK_MEMORY_PRIVILEGE          4
+#define SE_INCREASE_QUOTA_PRIVILEGE       5
+#define SE_UNSOLICITED_INPUT_PRIVILEGE    6
+#define SE_MACHINE_ACCOUNT_PRIVILEGE      6
+#define SE_TCB_PRIVILEGE                  7
+#define SE_SECURITY_PRIVILEGE             8
+#define SE_TAKE_OWNERSHIP_PRIVILEGE       9
+#define SE_LOAD_DRIVER_PRIVILEGE          10
+#define SE_SYSTEM_PROFILE_PRIVILEGE       11
+#define SE_SYSTEMTIME_PRIVILEGE           12
+#define SE_PROF_SINGLE_PROCESS_PRIVILEGE  13
+#define SE_INC_BASE_PRIORITY_PRIVILEGE    14
+#define SE_CREATE_PAGEFILE_PRIVILEGE      15
+#define SE_CREATE_PERMANENT_PRIVILEGE     16
+#define SE_BACKUP_PRIVILEGE               17
+#define SE_RESTORE_PRIVILEGE              18
+#define SE_SHUTDOWN_PRIVILEGE             19
+#define SE_DEBUG_PRIVILEGE                20
+#define SE_AUDIT_PRIVILEGE                21
+#define SE_SYSTEM_ENVIRONMENT_PRIVILEGE   22
+#define SE_CHANGE_NOTIFY_PRIVILEGE        23
+#define SE_REMOTE_SHUTDOWN_PRIVILEGE      24
+#define SE_UNDOCK_PRIVILEGE               25
+#define SE_SYNC_AGENT_PRIVILEGE           26
+#define SE_ENABLE_DELEGATION_PRIVILEGE    27
+#define SE_MANAGE_VOLUME_PRIVILEGE        28
+#define SE_IMPERSONATE_PRIVILEGE          29
+#define SE_CREATE_GLOBAL_PRIVILEGE        30
+#define SE_MAX_WELL_KNOWN_PRIVILEGE       SE_CREATE_GLOBAL_PRIVILEGE
+
 typedef struct _SECURITY_SUBJECT_CONTEXT {
   PACCESS_TOKEN  ClientToken;
   SECURITY_IMPERSONATION_LEVEL  ImpersonationLevel;
@@ -3076,22 +3279,6 @@ typedef struct _IO_STACK_LOCATION {
       USHORT  ShareAccess;
       ULONG POINTER_ALIGNMENT  EaLength;
     } Create;
-    /* FIXME: CreatePipe and CreateMailslot aren't defined in official
-     * DDK/IFS headers. */
-    struct {
-      PIO_SECURITY_CONTEXT  SecurityContext;
-      ULONG  Options;
-      USHORT  Reserved;
-      USHORT  ShareAccess;
-      struct _NAMED_PIPE_CREATE_PARAMETERS  *Parameters;
-    } CreatePipe;
-    struct {
-      PIO_SECURITY_CONTEXT  SecurityContext;
-      ULONG  Options;
-      USHORT  Reserved;
-      USHORT  ShareAccess;
-      struct _MAILSLOT_CREATE_PARAMETERS  *Parameters;
-    } CreateMailslot;
     struct {
       ULONG  Length;
       ULONG POINTER_ALIGNMENT  Key;
@@ -3273,6 +3460,11 @@ typedef struct _IO_STACK_LOCATION {
 #define SL_INVOKE_ON_SUCCESS              0x40
 #define SL_INVOKE_ON_ERROR                0x80
 
+/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
+
+#define PCI_WHICHSPACE_CONFIG             0x0
+#define PCI_WHICHSPACE_ROM                0x52696350 /* 'PciR' */
+
 typedef enum _KEY_INFORMATION_CLASS {
   KeyBasicInformation,
   KeyNodeInformation,
@@ -3717,6 +3909,38 @@ typedef struct _RTL_BITMAP_RUN {
     ULONG  NumberOfBits;
 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
 
+typedef struct _RTL_RANGE_LIST
+{
+    LIST_ENTRY ListHead;
+    ULONG Flags;  /* RTL_RANGE_LIST_... flags */
+    ULONG Count;
+    ULONG Stamp;
+} RTL_RANGE_LIST, *PRTL_RANGE_LIST;
+
+typedef struct _RTL_RANGE
+{
+    ULONGLONG Start;
+    ULONGLONG End;
+    PVOID UserData;
+    PVOID Owner;
+    UCHAR Attributes;
+    UCHAR Flags;  /* RTL_RANGE_... flags */
+} RTL_RANGE, *PRTL_RANGE;
+
+typedef struct _RANGE_LIST_ITERATOR
+{
+    PLIST_ENTRY RangeListHead;
+    PLIST_ENTRY MergedHead;
+    PVOID Current;
+    ULONG Stamp;
+} RTL_RANGE_LIST_ITERATOR, *PRTL_RANGE_LIST_ITERATOR;
+
+typedef BOOLEAN
+(NTAPI *PRTL_CONFLICT_RANGE_CALLBACK) (
+    PVOID Context,
+    struct _RTL_RANGE *Range
+);
+
 typedef NTSTATUS
 (DDKAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
   IN PWSTR  ValueName,
@@ -3924,6 +4148,8 @@ typedef enum _KINTERRUPT_MODE {
   Latched
 } KINTERRUPT_MODE;
 
+#define THREAD_WAIT_OBJECTS 3
+
 typedef VOID
 (DDKAPI *PKINTERRUPT_ROUTINE)(
   VOID);
@@ -4237,10 +4463,14 @@ typedef enum _PROCESSINFOCLASS {
   ProcessDebugObjectHandle,
   ProcessDebugFlags,
   ProcessHandleTracing,
-  ProcessUnknown33,
-  ProcessUnknown34,
-  ProcessUnknown35,
+  ProcessIoPriority,
+  ProcessExecuteFlags,
+  ProcessTlsInformation,
   ProcessCookie,
+  ProcessImageInformation,
+  ProcessCycleTime,
+  ProcessPagePriority,
+  ProcessInstrumentationCallback,
   MaxProcessInfoClass
 } PROCESSINFOCLASS;
 
@@ -4264,9 +4494,67 @@ typedef enum _THREADINFOCLASS {
   ThreadIsIoPending,
   ThreadHideFromDebugger,
   ThreadBreakOnTermination,
+  ThreadSwitchLegacyState,
+  ThreadIsTerminated,
+  ThreadLastSystemCall,
+  ThreadIoPriority,
+  ThreadCycleTime,
+  ThreadPagePriority,
+  ThreadActualBasePriority,
   MaxThreadInfoClass
 } THREADINFOCLASS;
 
+typedef struct _PROCESS_BASIC_INFORMATION
+{
+    NTSTATUS ExitStatus;
+    PPEB PebBaseAddress;
+    ULONG_PTR AffinityMask;
+    KPRIORITY BasePriority;
+    ULONG_PTR UniqueProcessId;
+    ULONG_PTR InheritedFromUniqueProcessId;
+} PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION;
+
+typedef struct _PROCESS_WS_WATCH_INFORMATION
+{
+    PVOID FaultingPc;
+    PVOID FaultingVa;
+} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
+
+typedef struct _PROCESS_DEVICEMAP_INFORMATION
+{
+    union
+    {
+        struct
+        {
+            HANDLE DirectoryHandle;
+        } Set;
+        struct
+        {
+            ULONG DriveMap;
+            UCHAR DriveType[32];
+        } Query;
+    };
+} PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
+
+typedef struct _KERNEL_USER_TIMES
+{
+    LARGE_INTEGER CreateTime;
+    LARGE_INTEGER ExitTime;
+    LARGE_INTEGER KernelTime;
+    LARGE_INTEGER UserTime;
+} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
+
+typedef struct _PROCESS_ACCESS_TOKEN
+{
+    HANDLE Token;
+    HANDLE Thread;
+} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
+
+typedef struct _PROCESS_SESSION_INFORMATION
+{
+    ULONG SessionId;
+} PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
+
 #define ES_SYSTEM_REQUIRED                0x00000001
 #define ES_DISPLAY_REQUIRED               0x00000002
 #define ES_USER_PRESENT                   0x00000004
@@ -4293,13 +4581,164 @@ typedef enum _TRACE_INFORMATION_CLASS {
   TraceHandleByNameClass
 } TRACE_INFORMATION_CLASS;
 
+typedef enum _REG_NOTIFY_CLASS
+{
+  RegNtDeleteKey,
+  RegNtPreDeleteKey = RegNtDeleteKey,
+  RegNtSetValueKey,
+  RegNtPreSetValueKey = RegNtSetValueKey,
+  RegNtDeleteValueKey,
+  RegNtPreDeleteValueKey = RegNtDeleteValueKey,
+  RegNtSetInformationKey,
+  RegNtPreSetInformationKey = RegNtSetInformationKey,
+  RegNtRenameKey,
+  RegNtPreRenameKey = RegNtRenameKey,
+  RegNtEnumerateKey,
+  RegNtPreEnumerateKey = RegNtEnumerateKey,
+  RegNtEnumerateValueKey,
+  RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
+  RegNtQueryKey,
+  RegNtPreQueryKey = RegNtQueryKey,
+  RegNtQueryValueKey,
+  RegNtPreQueryValueKey = RegNtQueryValueKey,
+  RegNtQueryMultipleValueKey,
+  RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
+  RegNtPreCreateKey,
+  RegNtPostCreateKey,
+  RegNtPreOpenKey,
+  RegNtPostOpenKey,
+  RegNtKeyHandleClose,
+  RegNtPreKeyHandleClose = RegNtKeyHandleClose,
+  RegNtPostDeleteKey,
+  RegNtPostSetValueKey,
+  RegNtPostDeleteValueKey,
+  RegNtPostSetInformationKey,
+  RegNtPostRenameKey,
+  RegNtPostEnumerateKey,
+  RegNtPostEnumerateValueKey,
+  RegNtPostQueryKey,
+  RegNtPostQueryValueKey,
+  RegNtPostQueryMultipleValueKey,
+  RegNtPostKeyHandleClose,
+  RegNtPreCreateKeyEx,
+  RegNtPostCreateKeyEx,
+  RegNtPreOpenKeyEx,
+  RegNtPostOpenKeyEx
+} REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
+
 typedef NTSTATUS
 (DDKAPI *PEX_CALLBACK_FUNCTION)(
   IN PVOID  CallbackContext,
-  IN PVOID  Argument1,
+  IN REG_NOTIFY_CLASS  Argument1,
   IN PVOID  Argument2);
 
+typedef struct _REG_DELETE_KEY_INFORMATION
+{
+    PVOID Object;
+} REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION;
+
+typedef struct _REG_SET_VALUE_KEY_INFORMATION
+{
+    PVOID Object;
+    PUNICODE_STRING ValueName;
+    ULONG TitleIndex;
+    ULONG Type;
+    PVOID Data;
+    ULONG DataSize;
+} REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
+
+typedef struct _REG_DELETE_VALUE_KEY_INFORMATION 
+{
+    PVOID Object;
+    PUNICODE_STRING ValueName;
+} REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
 
+typedef struct _REG_SET_INFORMATION_KEY_INFORMATION
+{
+    PVOID Object;
+    KEY_SET_INFORMATION_CLASS KeySetInformationClass;
+    PVOID KeySetInformation;
+    ULONG KeySetInformationLength;
+} REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
+
+typedef struct _REG_ENUMERATE_KEY_INFORMATION
+{
+    PVOID Object;
+    ULONG Index;
+    KEY_INFORMATION_CLASS KeyInformationClass;
+    PVOID KeyInformation;
+    ULONG Length;
+    PULONG ResultLength;
+} REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
+
+typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION 
+{
+    PVOID Object;
+    ULONG Index;
+    KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
+    PVOID KeyValueInformation;
+    ULONG Length;
+    PULONG ResultLength;
+} REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
+
+typedef struct _REG_QUERY_KEY_INFORMATION
+{
+    PVOID Object;
+    KEY_INFORMATION_CLASS KeyInformationClass;
+    PVOID KeyInformation;
+    ULONG Length;
+    PULONG ResultLength;
+} REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
+
+typedef struct _REG_QUERY_VALUE_KEY_INFORMATION 
+{
+    PVOID Object;
+    PUNICODE_STRING ValueName;
+    KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
+    PVOID KeyValueInformation;
+    ULONG Length;
+    PULONG ResultLength;
+} REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
+
+typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
+{
+    PVOID Object;
+    PKEY_VALUE_ENTRY ValueEntries;
+    ULONG EntryCount;
+    PVOID ValueBuffer;
+    PULONG BufferLength;
+    PULONG RequiredBufferLength;
+} REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
+
+typedef struct _REG_PRE_CREATE_KEY_INFORMATION 
+{
+    PUNICODE_STRING CompleteName;
+} REG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_CREATE_KEY_INFORMATION;
+
+typedef struct _REG_POST_CREATE_KEY_INFORMATION 
+{
+    PUNICODE_STRING CompleteName;
+    PVOID Object;
+    NTSTATUS Status;
+} REG_POST_CREATE_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION;
+
+typedef struct _REG_PRE_OPEN_KEY_INFORMATION 
+{
+    PUNICODE_STRING  CompleteName;
+} REG_PRE_OPEN_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;
+
+typedef struct _REG_POST_OPEN_KEY_INFORMATION 
+{
+    PUNICODE_STRING CompleteName;
+    PVOID Object;
+    NTSTATUS Status;
+} REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
+
+typedef struct _REG_POST_OPERATION_INFORMATION 
+{
+    PVOID Object;
+    NTSTATUS Status;
+} REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
 
 /*
 ** Storage structures
@@ -4372,45 +4811,6 @@ typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS      0x0008
 #define DRIVER_VERIFIER_IO_CHECKING                 0x0010
 
-#define RTL_RANGE_LIST_ADD_IF_CONFLICT    0x00000001
-#define RTL_RANGE_LIST_ADD_SHARED         0x00000002
-
-#define RTL_RANGE_LIST_SHARED_OK          0x00000001
-#define RTL_RANGE_LIST_NULL_CONFLICT_OK   0x00000002
-
-#define RTL_RANGE_LIST_MERGE_IF_CONFLICT  RTL_RANGE_LIST_ADD_IF_CONFLICT
-
-typedef struct _RTL_RANGE {
-  ULONGLONG  Start;
-  ULONGLONG  End;
-  PVOID  UserData;
-  PVOID  Owner;
-  UCHAR  Attributes;
-  UCHAR  Flags;
-} RTL_RANGE, *PRTL_RANGE;
-
-#define RTL_RANGE_SHARED                  0x01
-#define RTL_RANGE_CONFLICT                0x02
-
-typedef struct _RTL_RANGE_LIST {
-  LIST_ENTRY  ListHead;
-  ULONG  Flags;
-  ULONG  Count;
-  ULONG  Stamp;
-} RTL_RANGE_LIST, *PRTL_RANGE_LIST;
-
-typedef struct _RANGE_LIST_ITERATOR {
-  PLIST_ENTRY  RangeListHead;
-  PLIST_ENTRY  MergedHead;
-  PVOID  Current;
-  ULONG  Stamp;
-} RTL_RANGE_LIST_ITERATOR, *PRTL_RANGE_LIST_ITERATOR;
-
-typedef BOOLEAN
-(DDKAPI *PRTL_CONFLICT_RANGE_CALLBACK)(
-  IN PVOID  Context,
-  IN PRTL_RANGE  Range);
-
 #define HASH_STRING_ALGORITHM_DEFAULT     0
 #define HASH_STRING_ALGORITHM_X65599      1
 #define HASH_STRING_ALGORITHM_INVALID     0xffffffff
@@ -4551,13 +4951,29 @@ DDKAPI
 KeGetCurrentIrql(
   VOID);
 
-/*
- * ULONG
- * KeGetCurrentProcessorNumber(
- *   VOID)
- */
-#define KeGetCurrentProcessorNumber() \
-  ((ULONG)KeGetCurrentKPCR()->Number)
+static __inline
+ULONG
+DDKAPI
+KeGetCurrentProcessorNumber(VOID)
+{
+#if defined(__GNUC__)
+  ULONG ret;
+  __asm__ __volatile__ (
+    "movl %%fs:%c1, %0\n"
+    : "=r" (ret)
+    : "i" (FIELD_OFFSET(KPCR, Number))
+  );
+  return ret;
+#elif defined(_MSC_VER)
+#if _MSC_FULL_VER >= 13012035
+  return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
+#else
+  __asm { movzx eax, _PCR KPCR.Number }
+#endif
+#else
+#error Unknown compiler
+#endif
+}
 
 #if !defined(__INTERLOCKED_DECLARED)
 #define __INTERLOCKED_DECLARED
@@ -4686,8 +5102,8 @@ KfReleaseSpinLock(
  *   IN PCHAR  Field);
  */
 #ifndef CONTAINING_RECORD
-#define CONTAINING_RECORD(Address, Type, Field) \
-  ((Type *) (((ULONG_PTR) Address) - FIELD_OFFSET(Type, Field)))
+#define CONTAINING_RECORD(address, type, field) \
+  ((type *)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type *)0)->field))))
 #endif
 
 /* LONG
@@ -4765,6 +5181,17 @@ RtlAssert(
 
 #endif /* DBG */
 
+/* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
+#if defined(_NTSYSTEM_) || defined(__GNUC__)
+#define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
+#define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
+#else
+#define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
+#define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
+#endif /* _NT_SYSTEM */
+
+extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG;
+extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
 
 /*
 ** Driver support routines
@@ -4909,20 +5336,14 @@ InterlockedPushEntrySList(
 NTOSAPI
 ULONG
 DDKAPI
-RtlAnsiStringToUnicodeSize(
-  IN PANSI_STRING  AnsiString);
+RtlxAnsiStringToUnicodeSize(
+  IN PCANSI_STRING  AnsiString);
 
-NTOSAPI
-NTSTATUS
-DDKAPI
-RtlAddRange(
-  IN OUT PRTL_RANGE_LIST  RangeList,
-  IN ULONGLONG  Start,
-  IN ULONGLONG  End,
-  IN UCHAR  Attributes,
-  IN ULONG  Flags,
-  IN PVOID  UserData  OPTIONAL,
-  IN PVOID  Owner  OPTIONAL);
+#define RtlAnsiStringToUnicodeSize(STRING) (               \
+  NLS_MB_CODE_PAGE_TAG ?                                   \
+  RtlxAnsiStringToUnicodeSize(STRING) :                    \
+  ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR)   \
+)
 
 NTOSAPI
 NTSTATUS
@@ -4937,7 +5358,7 @@ NTSTATUS
 DDKAPI
 RtlAppendUnicodeStringToString(
   IN OUT PUNICODE_STRING  Destination,
-  IN PUNICODE_STRING  Source);
+  IN PCUNICODE_STRING  Source);
 
 NTOSAPI
 NTSTATUS
@@ -5025,15 +5446,20 @@ NTOSAPI
 LONG
 DDKAPI
 RtlCompareUnicodeString(
-  IN PUNICODE_STRING  String1,
-  IN PUNICODE_STRING  String2,
+  IN PCUNICODE_STRING  String1,
+  IN PCUNICODE_STRING  String2,
   IN BOOLEAN  CaseInSensitive);
 
-NTOSAPI
+static __inline
 LARGE_INTEGER
-DDKAPI
-RtlConvertLongToLargeInteger(
-  IN LONG  SignedInteger);
+NTAPI_INLINE
+RtlConvertLongToLargeInteger(LONG SignedInteger)
+{
+    LARGE_INTEGER Result;
+
+    Result.QuadPart = SignedInteger;
+    return Result;
+}
 
 NTOSAPI
 LUID
@@ -5077,13 +5503,6 @@ RtlCopyMemory32(
   IN CONST VOID UNALIGNED  *Source,
   IN ULONG  Length);
 
-NTOSAPI
-NTSTATUS
-DDKAPI
-RtlCopyRangeList(
-  OUT PRTL_RANGE_LIST  CopyRangeList,
-  IN PRTL_RANGE_LIST  RangeList);
-
 NTOSAPI
 VOID
 DDKAPI
@@ -5096,7 +5515,7 @@ VOID
 DDKAPI
 RtlCopyUnicodeString(
   IN OUT PUNICODE_STRING  DestinationString,
-  IN PUNICODE_STRING  SourceString);
+  IN PCUNICODE_STRING  SourceString);
 
 NTOSAPI
 NTSTATUS
@@ -5112,22 +5531,6 @@ RtlCreateSecurityDescriptor(
   IN OUT PSECURITY_DESCRIPTOR  SecurityDescriptor,
   IN ULONG  Revision);
 
-NTOSAPI
-NTSTATUS
-DDKAPI
-RtlDeleteOwnersRanges(
-  IN OUT PRTL_RANGE_LIST  RangeList,
-  IN PVOID  Owner);
-
-NTOSAPI
-NTSTATUS
-DDKAPI
-RtlDeleteRange(
-  IN OUT PRTL_RANGE_LIST  RangeList,
-  IN ULONGLONG  Start,
-  IN ULONGLONG  End,
-  IN PVOID  Owner);
-
 NTOSAPI
 NTSTATUS
 DDKAPI
@@ -5254,21 +5657,6 @@ RtlFindNextForwardRunClear(
   IN ULONG  FromIndex,
   OUT PULONG  StartingRunIndex);
 
-NTOSAPI
-NTSTATUS
-DDKAPI
-RtlFindRange(
-  IN PRTL_RANGE_LIST  RangeList,
-  IN ULONGLONG  Minimum,
-  IN ULONGLONG  Maximum,
-  IN ULONG  Length,
-  IN ULONG  Alignment,
-  IN ULONG  Flags,
-  IN UCHAR  AttributeAvailableMask,
-  IN PVOID  Context  OPTIONAL,
-  IN PRTL_CONFLICT_RANGE_CALLBACK  Callback  OPTIONAL,
-  OUT PULONGLONG  Start);
-
 NTOSAPI
 ULONG
 DDKAPI
@@ -5291,12 +5679,6 @@ DDKAPI
 RtlFreeAnsiString(
   IN PANSI_STRING  AnsiString);
 
-NTOSAPI
-VOID
-DDKAPI
-RtlFreeRangeList(
-  IN PRTL_RANGE_LIST  RangeList);
-
 NTOSAPI
 VOID
 DDKAPI
@@ -5316,32 +5698,6 @@ DDKAPI
 RtlGetVersion(
   IN OUT PRTL_OSVERSIONINFOW  lpVersionInformation);
 
-NTOSAPI
-NTSTATUS
-DDKAPI
-RtlGetFirstRange(
-  IN PRTL_RANGE_LIST  RangeList,
-  OUT PRTL_RANGE_LIST_ITERATOR  Iterator,
-  OUT PRTL_RANGE  *Range);
-
-NTOSAPI
-NTSTATUS
-DDKAPI
-RtlGetNextRange(
-  IN OUT  PRTL_RANGE_LIST_ITERATOR  Iterator,
-  OUT PRTL_RANGE  *Range,
-  IN BOOLEAN  MoveForwards);
-
-#define FOR_ALL_RANGES(RangeList, Iterator, Current)          \
-  for (RtlGetFirstRange((RangeList), (Iterator), &(Current)); \
-    (Current) != NULL;                                        \
-    RtlGetNextRange((Iterator), &(Current), TRUE))
-
-#define FOR_ALL_RANGES_BACKWARDS(RangeList, Iterator, Current) \
-  for (RtlGetLastRange((RangeList), (Iterator), &(Current));   \
-    (Current) != NULL;                                         \
-    RtlGetNextRange((Iterator), &(Current), FALSE))
-
 NTOSAPI
 NTSTATUS
 DDKAPI
@@ -5373,12 +5729,6 @@ RtlInitializeBitMap(
   IN PULONG  BitMapBuffer,
   IN ULONG  SizeOfBitMap);
 
-NTOSAPI
-VOID
-DDKAPI
-RtlInitializeRangeList(
-  IN OUT PRTL_RANGE_LIST  RangeList);
-
 NTOSAPI
 VOID
 DDKAPI
@@ -5417,26 +5767,6 @@ RtlIntPtrToUnicodeString(
   ULONG  Base  OPTIONAL,
   PUNICODE_STRING  String);
 
-NTOSAPI
-NTSTATUS
-DDKAPI
-RtlInvertRangeList(
-  OUT PRTL_RANGE_LIST  InvertedRangeList,
-  IN PRTL_RANGE_LIST  RangeList);
-
-NTOSAPI
-NTSTATUS
-DDKAPI
-RtlIsRangeAvailable(
-  IN PRTL_RANGE_LIST  RangeList,
-  IN ULONGLONG  Start,
-  IN ULONGLONG  End,
-  IN ULONG  Flags,
-  IN UCHAR  AttributeAvailableMask,
-  IN PVOID  Context  OPTIONAL,
-  IN PRTL_CONFLICT_RANGE_CALLBACK  Callback  OPTIONAL,
-  OUT PBOOLEAN  Available);
-
 /*
  * BOOLEAN
  * RtlIsZeroLuid(
@@ -5458,15 +5788,6 @@ RtlMapGenericMask(
   IN OUT PACCESS_MASK  AccessMask,
   IN PGENERIC_MAPPING  GenericMapping);
 
-NTOSAPI
-NTSTATUS
-DDKAPI
-RtlMergeRangeLists(
-  OUT PRTL_RANGE_LIST  MergedRangeList,
-  IN PRTL_RANGE_LIST  RangeList1,
-  IN PRTL_RANGE_LIST  RangeList2,
-  IN ULONG  Flags);
-
 /*
  * VOID
  * RtlMoveMemory(
@@ -5499,8 +5820,8 @@ NTOSAPI
 BOOLEAN
 DDKAPI
 RtlPrefixUnicodeString(
-  IN PUNICODE_STRING  String1,
-  IN PUNICODE_STRING  String2,
+  IN PCUNICODE_STRING  String1,
+  IN PCUNICODE_STRING  String2,
   IN BOOLEAN  CaseInSensitive);
 
 NTOSAPI
@@ -5513,12 +5834,29 @@ RtlQueryRegistryValues(
   IN PVOID  Context,
   IN PVOID  Environment  OPTIONAL);
 
-NTOSAPI
-VOID
-DDKAPI
-RtlRetrieveUlong(
-  IN OUT PULONG  DestinationAddress,
-  IN PULONG  SourceAddress);
+  
+#define LONG_SIZE (sizeof(LONG))
+#define LONG_MASK (LONG_SIZE - 1)
+
+/*
+ * VOID
+ * RtlRetrieveUlong (
+ *     PULONG  DestinationAddress,
+ *     PULONG  SourceAddress
+ *     );
+ */
+#define RtlRetrieveUlong(DestAddress,SrcAddress) \
+    if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
+    { \
+        ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
+        ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
+        ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
+        ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
+    } \
+    else \
+    { \
+        *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
+    }
 
 NTOSAPI
 VOID
@@ -5625,25 +5963,25 @@ DDKFASTAPI
 RtlUlonglongByteSwap(
   IN ULONGLONG  Source);
 
-NTOSAPI
-ULONG
-DDKAPI
-RtlUnicodeStringToAnsiSize(
-  IN PUNICODE_STRING  UnicodeString);
+#define RtlUnicodeStringToAnsiSize(STRING) (                  \
+    NLS_MB_CODE_PAGE_TAG ?                                    \
+    RtlxUnicodeStringToAnsiSize(STRING) :                     \
+    ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
+)
 
 NTOSAPI
 NTSTATUS
 DDKAPI
 RtlUnicodeStringToAnsiString(
   IN OUT PANSI_STRING  DestinationString,
-  IN PUNICODE_STRING  SourceString,
+  IN PCUNICODE_STRING  SourceString,
   IN BOOLEAN  AllocateDestinationString);
 
 NTOSAPI
 NTSTATUS
 DDKAPI
 RtlUnicodeStringToInteger(
-  IN PUNICODE_STRING  String,
+  IN PCUNICODE_STRING  String,
   IN ULONG  Base  OPTIONAL,
   OUT PULONG  Value);
 
@@ -5684,7 +6022,7 @@ NTOSAPI
 BOOLEAN
 DDKAPI
 RtlValidRelativeSecurityDescriptor(
-  IN PSECURITY_DESCRIPTOR_RELATIVE  SecurityDescriptorInput,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
   IN ULONG  SecurityDescriptorLength,
   IN SECURITY_INFORMATION  RequiredInformation);
 
@@ -5732,7 +6070,7 @@ NTOSAPI
 ULONG
 DDKAPI
 RtlxUnicodeStringToAnsiSize(
-  IN PUNICODE_STRING  UnicodeString);
+  IN PCUNICODE_STRING  UnicodeString);
 
 /*
  * VOID
@@ -5796,23 +6134,64 @@ KeTryToAcquireGuardedMutex(
     PKGUARDED_MUTEX GuardedMutex
 );
 
-/** Executive support routines **/
+/* Fast Mutex */
+#define ExInitializeFastMutex(_FastMutex) \
+{ \
+    (_FastMutex)->Count = FM_LOCK_BIT; \
+    (_FastMutex)->Owner = NULL; \
+    (_FastMutex)->Contention = 0; \
+    KeInitializeEvent(&(_FastMutex)->Gate, SynchronizationEvent, FALSE); \
+}
+
+NTOSAPI
+VOID
+FASTCALL
+ExAcquireFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex);
+
+NTOSAPI
+VOID
+FASTCALL
+ExReleaseFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex);
+
+#if defined(_NTHAL_) && defined(_X86_)
+NTOSAPI
+VOID
+FASTCALL
+ExiAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
+
+NTOSAPI
+VOID
+FASTCALL
+ExiReleaseFastMutex(IN OUT PFAST_MUTEX FastMutex);
+
+NTOSAPI
+BOOLEAN
+FASTCALL
+ExiTryToAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
+
+#define ExAcquireFastMutex(FastMutex)       ExiAcquireFastMutex(FastMutex)
+#define ExReleaseFastMutex(FastMutex)       ExiReleaseFastMutex(FastMutex)
+#define ExTryToAcquireFastMutex(FastMutex)  ExiTryToAcquireFastMutex(FastMutex)
 
-#if defined(_X86_)
-NTHALAPI
 #else
+
 NTOSAPI
-#endif
 VOID
-DDKFASTAPI
-ExAcquireFastMutex(
-  IN PFAST_MUTEX  FastMutex);
+FASTCALL
+ExAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
 
 NTOSAPI
 VOID
-DDKFASTAPI
-ExAcquireFastMutexUnsafe(
-  IN PFAST_MUTEX  FastMutex);
+FASTCALL
+ExReleaseFastMutex(IN OUT PFAST_MUTEX FastMutex);
+
+NTOSAPI
+BOOLEAN
+FASTCALL
+ExTryToAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
+#endif
+
+/** Executive support routines **/
 
 NTOSAPI
 BOOLEAN
@@ -6035,19 +6414,6 @@ KeInitializeEvent(
   IN EVENT_TYPE  Type,
   IN BOOLEAN  State);
 
-/*
- * VOID DDKAPI
- * ExInitializeFastMutex(
- *   IN PFAST_MUTEX  FastMutex)
- */
-#define ExInitializeFastMutex(_FastMutex) \
-{ \
-  (_FastMutex)->Count = 1; \
-  (_FastMutex)->Owner = NULL; \
-  (_FastMutex)->Contention = 0; \
-  KeInitializeEvent(&(_FastMutex)->Event, SynchronizationEvent, FALSE); \
-}
-
 NTOSAPI
 VOID
 DDKAPI
@@ -6265,22 +6631,6 @@ DDKAPI
 ExReinitializeResourceLite(
   IN PERESOURCE  Resource);
 
-#if defined(_X86_)
-NTHALAPI
-#else
-NTOSAPI
-#endif
-VOID
-DDKFASTAPI
-ExReleaseFastMutex(
-  IN PFAST_MUTEX  FastMutex);
-
-NTOSAPI
-VOID
-DDKFASTAPI
-ExReleaseFastMutexUnsafe(
-  IN PFAST_MUTEX  FastMutex);
-
 NTOSAPI
 VOID
 DDKAPI
@@ -6315,16 +6665,6 @@ ExSystemTimeToLocalTime(
   IN PLARGE_INTEGER  SystemTime,
   OUT PLARGE_INTEGER  LocalTime);
 
-#ifdef _M_IX86
-NTHALAPI
-#else
-NTOSAPI
-#endif
-BOOLEAN
-DDKFASTAPI
-ExTryToAcquireFastMutex(
-  IN PFAST_MUTEX  FastMutex);
-
 NTOSAPI
 BOOLEAN
 DDKAPI
@@ -7915,31 +8255,6 @@ DDKAPI
 KeAcquireInterruptSpinLock(
   IN PKINTERRUPT  Interrupt);
 
-
-/* System Service Dispatch Table */
-typedef PVOID (NTAPI * SSDT)(VOID);
-typedef SSDT * PSSDT;
-
-/* System Service Parameters Table */
-typedef UCHAR SSPT, * PSSPT;
-
-typedef struct _SSDT_ENTRY {
-       PSSDT  SSDT;
-       PULONG  ServiceCounterTable;
-       ULONG  NumberOfServices;
-       PSSPT  SSPT;
-} SSDT_ENTRY, *PSSDT_ENTRY;
-
-NTOSAPI
-BOOLEAN
-DDKAPI
-KeAddSystemServiceTable(
-  IN PSSDT  SSDT,
-  IN PULONG  ServiceCounterTable,
-  IN ULONG  NumberOfServices,
-  IN PSSPT  SSPT,
-  IN ULONG  TableIndex);
-
 NTOSAPI
 BOOLEAN
 DDKAPI
@@ -8003,6 +8318,11 @@ KeEnterCriticalRegion(
  */
 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
 
+NTHALAPI
+VOID
+DDKAPI
+KeFlushWriteBuffer(VOID);
+
 NTOSAPI
 PRKTHREAD
 DDKAPI
@@ -8090,6 +8410,8 @@ DDKAPI
 KeLeaveCriticalRegion(
   VOID);
 
+#ifdef _X86_
+
 static __inline
 VOID
 KeMemoryBarrier(
@@ -8103,6 +8425,8 @@ KeMemoryBarrier(
 #endif
 }
 
+#endif
+
 NTOSAPI
 LONG
 DDKAPI
@@ -8159,6 +8483,7 @@ DDKAPI
 KeReadStateMutex(
   IN PRKMUTEX  Mutex);
 
+
 NTOSAPI
 LONG
 DDKAPI
@@ -8254,6 +8579,11 @@ DDKAPI
 KeRestoreFloatingPointState(
   IN PKFLOATING_SAVE  FloatSave);
 
+NTOSAPI
+VOID
+DDKAPI
+KeRevertToUserAffinityThread(VOID);
+
 NTOSAPI
 NTSTATUS
 DDKAPI
@@ -8289,6 +8619,12 @@ KeSetPriorityThread(
   IN PKTHREAD  Thread,
   IN KPRIORITY  Priority);
 
+NTOSAPI
+VOID
+DDKAPI
+KeSetSystemAffinityThread(
+    IN KAFFINITY Affinity);
+
 NTOSAPI
 VOID
 DDKAPI
@@ -9866,7 +10202,7 @@ DbgPrintReturnControlC(
   IN ...);
 
 NTOSAPI
-NTSTATUS
+BOOLEAN
 DDKAPI
 DbgQueryDebugFilterState(
   IN ULONG  ComponentId,
@@ -9880,16 +10216,6 @@ DbgSetDebugFilterState(
   IN ULONG  Level,
   IN BOOLEAN  State);
 
-NTOSAPI
-BOOLEAN
-DDKAPI
-KeRosPrintAddress ( PVOID address );
-
-NTOSAPI
-VOID
-DDKAPI
-KeRosDumpStackFrames ( PULONG Frame, ULONG FrameCount );
-
 #ifdef DBG
 
 #define KdPrint(_x_) DbgPrint _x_