Merge amd64 NDK from amd64 branch:
[reactos.git] / reactos / include / ndk / amd64 / ketypes.h
index 414ef1d..733996f 100644 (file)
@@ -1,23 +1,25 @@
 /*++ NDK Version: 0098
 
 Copyright (c) Alex Ionescu.  All rights reserved.
+Copyright (c) Timo Kreuzer.  All rights reserved.
 
 Header Name:
 
-    ketypes.h (X86)
+    ketypes.h (AMD64)
 
 Abstract:
 
-    i386 Type definitions for the Kernel services.
+    amd64 Type definitions for the Kernel services.
 
 Author:
 
     Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
+    Timo Kreuzer (timo.kreuzer@reactos.org) - Updated - 14-Aug-2008
 
 --*/
 
-#ifndef _I386_KETYPES_H
-#define _I386_KETYPES_H
+#ifndef _AMD64_KETYPES_H
+#define _AMD64_KETYPES_H
 
 //
 // Dependencies
@@ -26,12 +28,13 @@ Author:
 //
 // KPCR Access for non-IA64 builds
 //
-#define K0IPCR                  ((ULONG_PTR)(KIP0PCRADDRESS))
-#define PCR                     ((volatile KPCR * const)K0IPCR)
-#if defined(CONFIG_SMP) || defined(NT_BUILD)
-#undef  KeGetPcr
-#define KeGetPcr()              ((volatile KPCR * const)__readfsdword(0x1C))
-#endif
+//#define K0IPCR                  ((ULONG_PTR)(KIP0PCRADDRESS))
+//#define PCR                     ((volatile KPCR * const)K0IPCR)
+#define PCR ((volatile KPCR * const)__readgsqword(FIELD_OFFSET(KPCR, Self)))
+//#if defined(CONFIG_SMP) || defined(NT_BUILD)
+//#undef  KeGetPcr
+//#define KeGetPcr()              ((volatile KPCR * const)__readfsdword(0x1C))
+//#endif
 
 //
 // Machine Types
@@ -55,16 +58,13 @@ Author:
 //
 #define RPL_MASK                0x0003
 #define MODE_MASK               0x0001
-#define KGDT_R0_CODE            0x8
-#define KGDT_R0_DATA            0x10
-#define KGDT_R3_CODE            0x18
-#define KGDT_R3_DATA            0x20
-#define KGDT_TSS                0x28
-#define KGDT_R0_PCR             0x30
-#define KGDT_R3_TEB             0x38
-#define KGDT_LDT                0x48
-#define KGDT_DF_TSS             0x50
-#define KGDT_NMI_TSS            0x58
+#define KGDT_64_R0_CODE         0x0010
+#define KGDT_64_R0_SS           0x0018
+#define KGDT_64_DATA            0x0028 // 2b
+#define KGDT_64_R3_CODE         0x0030 // 33
+#define KGDT_TSS                0x0040
+#define KGDT_32_R3_TEB          0x0050 // 53
+
 
 //
 // CR4
@@ -131,7 +131,7 @@ Author:
 //
 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
 //
-#define KSEG0_BASE              0x80000000
+#define KSEG0_BASE 0xfffff80000000000ULL
 
 //
 // Synchronization-level IRQL
@@ -139,7 +139,7 @@ Author:
 #ifndef CONFIG_SMP
 #define SYNCH_LEVEL             DISPATCH_LEVEL
 #else
-#define SYNCH_LEVEL             (IPI_LEVEL - 1)
+#define SYNCH_LEVEL             (IPI_LEVEL - 2)
 #endif
 
 //
@@ -147,109 +147,134 @@ Author:
 //
 typedef struct _KTRAP_FRAME
 {
-    ULONG DbgEbp;
-    ULONG DbgEip;
-    ULONG DbgArgMark;
-    ULONG DbgArgPointer;
-    ULONG TempSegCs;
-    ULONG TempEsp;
-    ULONG Dr0;
-    ULONG Dr1;
-    ULONG Dr2;
-    ULONG Dr3;
-    ULONG Dr6;
-    ULONG Dr7;
-    ULONG SegGs;
-    ULONG SegEs;
-    ULONG SegDs;
-    ULONG Edx;
-    ULONG Ecx;
-    ULONG Eax;
-    ULONG PreviousPreviousMode;
-    struct _EXCEPTION_REGISTRATION_RECORD FAR *ExceptionList;
-    ULONG SegFs;
-    ULONG Edi;
-    ULONG Esi;
-    ULONG Ebx;
-    ULONG Ebp;
-    ULONG ErrCode;
-    ULONG Eip;
-    ULONG SegCs;
-    ULONG EFlags;
-    ULONG HardwareEsp;
-    ULONG HardwareSegSs;
-    ULONG V86Es;
-    ULONG V86Ds;
-    ULONG V86Fs;
-    ULONG V86Gs;
-} KTRAP_FRAME, *PKTRAP_FRAME;
-
-//
-// LDT Entry Definition
-//
-#ifndef _LDT_ENTRY_DEFINED
-#define _LDT_ENTRY_DEFINED
-typedef struct _LDT_ENTRY
-{
-    USHORT LimitLow;
-    USHORT BaseLow;
+    UINT64 P1Home;
+    UINT64 P2Home;
+    UINT64 P3Home;
+    UINT64 P4Home;
+    UINT64 P5;
+    CHAR PreviousMode;
+    UCHAR PreviousIrql;
+    UCHAR FaultIndicator;
+    UCHAR ExceptionActive;
+    ULONG MxCsr;
+    UINT64 Rax;
+    UINT64 Rcx;
+    UINT64 Rdx;
+    UINT64 R8;
+    UINT64 R9;
+    UINT64 R10;
+    UINT64 R11;
+    union
+    {
+        UINT64 GsBase;
+        UINT64 GsSwap;
+    };
+    M128A Xmm0;
+    M128A Xmm1;
+    M128A Xmm2;
+    M128A Xmm3;
+    M128A Xmm4;
+    M128A Xmm5;
+    union
+    {
+        UINT64 FaultAddress;
+        UINT64 ContextRecord;
+        UINT64 TimeStampCKCL;
+    };
+    UINT64 Dr0;
+    UINT64 Dr1;
+    UINT64 Dr2;
+    UINT64 Dr3;
+    UINT64 Dr6;
+    UINT64 Dr7;
     union
     {
         struct
         {
-            UCHAR BaseMid;
-            UCHAR Flags1;
-            UCHAR Flags2;
-            UCHAR BaseHi;
-        } Bytes;
+            UINT64 DebugControl;
+            UINT64 LastBranchToRip;
+            UINT64 LastBranchFromRip;
+            UINT64 LastExceptionToRip;
+            UINT64 LastExceptionFromRip;
+        };
         struct
         {
-            ULONG BaseMid:8;
-            ULONG Type:5;
-            ULONG Dpl:2;
-            ULONG Pres:1;
-            ULONG LimitHi:4;
-            ULONG Sys:1;
-            ULONG Reserved_0:1;
-            ULONG Default_Big:1;
-            ULONG Granularity:1;
-            ULONG BaseHi:8;
-        } Bits;
-    } HighWord;
-} LDT_ENTRY, *PLDT_ENTRY, *LPLDT_ENTRY;
-#endif
+            UINT64 LastBranchControl;
+            ULONG LastBranchMSR;
+        };
+    };
+    USHORT SegDs;
+    USHORT SegEs;
+    USHORT SegFs;
+    USHORT SegGs;
+    UINT64 TrapFrame;
+    UINT64 Rbx;
+    UINT64 Rdi;
+    UINT64 Rsi;
+    UINT64 Rbp;
+    union
+    {
+        UINT64 ErrorCode;
+        UINT64 ExceptionFrame;
+        UINT64 TimeStampKlog;
+    };
+    UINT64 Rip;
+    USHORT SegCs;
+    UCHAR Fill0;
+    UCHAR Logging;
+    USHORT Fill1[2];
+    ULONG EFlags;
+    ULONG Fill2;
+    UINT64 Rsp;
+    USHORT SegSs;
+    USHORT Fill3;
+    LONG CodePatchCycle;
+} KTRAP_FRAME, *PKTRAP_FRAME;
+
+//
+// Dummy LDT_ENTRY
+//
+typedef ULONG LDT_ENTRY;
 
 //
 // GDT Entry Definition
 //
-typedef struct _KGDTENTRY
+typedef union _KGDTENTRY64
 {
-    USHORT LimitLow;
-    USHORT BaseLow;
-    union
+    struct
     {
-        struct
+        USHORT LimitLow;
+        USHORT BaseLow;
+        union
         {
-            UCHAR BaseMid;
-            UCHAR Flags1;
-            UCHAR Flags2;
-            UCHAR BaseHi;
-        } Bytes;
-        struct
-        {
-            ULONG BaseMid:8;
-            ULONG Type:5;
-            ULONG Dpl:2;
-            ULONG Pres:1;
-            ULONG LimitHi:4;
-            ULONG Sys:1;
-            ULONG Reserved_0:1;
-            ULONG Default_Big:1;
-            ULONG Granularity:1;
-            ULONG BaseHi:8;
-        } Bits;
-    } HighWord;
-} KGDTENTRY, *PKGDTENTRY;
+            struct
+            {
+                UCHAR BaseMiddle;
+                UCHAR Flags1;
+                UCHAR Flags2;
+                UCHAR BaseHigh;
+            } Bytes;
+            struct
+            {
+                ULONG BaseMiddle:8;
+                ULONG Type:5;
+                ULONG Dpl:2;
+                ULONG Present:1;
+                ULONG LimitHigh:4;
+                ULONG System:1;
+                ULONG LongMode:1;
+                ULONG DefaultBig:1;
+                ULONG Granularity:1;
+                ULONG BaseHigh:8;
+            } Bits;
+        };
+        ULONG BaseUpper;
+        ULONG MustBeZero;
+    };
+    UINT64 Alignment;
+} KGDTENTRY64, *PKGDTENTRY64;
+#define KGDTENTRY KGDTENTRY64
+#define PKGDTENTRY PKGDTENTRY64
 
 //
 // IDT Entry Access Definition
@@ -273,96 +298,67 @@ typedef struct _KIDT_ACCESS
 //
 // IDT Entry Definition
 //
-typedef struct _KIDTENTRY
+typedef union _KIDTENTRY64
 {
-    USHORT Offset;
-    USHORT Selector;
-    USHORT Access;
-    USHORT ExtendedOffset;
-} KIDTENTRY, *PKIDTENTRY;
+    struct
+    {
+        USHORT OffsetLow;
+        USHORT Selector;
+        USHORT IstIndex:3;
+        USHORT Reserved0:5;
+        USHORT Type:5;
+        USHORT Dpl:2;
+        USHORT Present:1;
+        USHORT OffsetMiddle;
+        ULONG OffsetHigh;
+        ULONG Reserved1;
+    };
+    UINT64 Alignment;
+} KIDTENTRY64, *PKIDTENTRY64;
+#define KIDTENTRY KIDTENTRY64
+#define PKIDTENTRY PKIDTENTRY64
 
-typedef struct _DESCRIPTOR
+typedef struct _KDESCRIPTOR
 {
-    USHORT Pad;
+    USHORT Pad[3];
     USHORT Limit;
-    ULONG Base;
+    PVOID Base;
 } KDESCRIPTOR, *PKDESCRIPTOR;
 
 #ifndef NTOS_MODE_USER
-//
-// Macro to get current KPRCB
-//
-FORCEINLINE
-struct _KPRCB *
-KeGetCurrentPrcb(VOID)
-{
-    return (struct _KPRCB *)(ULONG_PTR)__readfsdword(FIELD_OFFSET(KPCR, Prcb));
-}
-
-//
-// FN/FX (FPU) Save Area Structures
-//
-typedef struct _FNSAVE_FORMAT
-{
-    ULONG ControlWord;
-    ULONG StatusWord;
-    ULONG TagWord;
-    ULONG ErrorOffset;
-    ULONG ErrorSelector;
-    ULONG DataOffset;
-    ULONG DataSelector;
-    UCHAR RegisterArea[80];
-} FNSAVE_FORMAT, *PFNSAVE_FORMAT;
-
-typedef struct _FXSAVE_FORMAT
-{
-    USHORT ControlWord;
-    USHORT StatusWord;
-    USHORT TagWord;
-    USHORT ErrorOpcode;
-    ULONG ErrorOffset;
-    ULONG ErrorSelector;
-    ULONG DataOffset;
-    ULONG DataSelector;
-    ULONG MXCsr;
-    ULONG MXCsrMask;
-    UCHAR RegisterArea[128];
-    UCHAR Reserved3[128];
-    UCHAR Reserved4[224];
-    UCHAR Align16Byte[8];
-} FXSAVE_FORMAT, *PFXSAVE_FORMAT;
-
-typedef struct _FX_SAVE_AREA
-{
-    union
-    {
-        FNSAVE_FORMAT FnArea;
-        FXSAVE_FORMAT FxArea;
-    } U;
-    ULONG NpxSavedCpu;
-    ULONG Cr0NpxState;
-} FX_SAVE_AREA, *PFX_SAVE_AREA;
 
 //
 // Special Registers Structure (outside of CONTEXT)
 //
 typedef struct _KSPECIAL_REGISTERS
 {
-    ULONG Cr0;
-    ULONG Cr2;
-    ULONG Cr3;
-    ULONG Cr4;
-    ULONG KernelDr0;
-    ULONG KernelDr1;
-    ULONG KernelDr2;
-    ULONG KernelDr3;
-    ULONG KernelDr6;
-    ULONG KernelDr7;
-    KDESCRIPTOR Gdtr;
-    KDESCRIPTOR Idtr;
+    UINT64 Cr0;
+    UINT64 Cr2;
+    UINT64 Cr3;
+    UINT64 Cr4;
+    UINT64 KernelDr0;
+    UINT64 KernelDr1;
+    UINT64 KernelDr2;
+    UINT64 KernelDr3;
+    UINT64 KernelDr6;
+    UINT64 KernelDr7;
+    struct _KDESCRIPTOR Gdtr;
+    struct _KDESCRIPTOR Idtr;
     USHORT Tr;
     USHORT Ldtr;
-    ULONG Reserved[6];
+    ULONG MxCsr;
+    UINT64 DebugControl;
+    UINT64 LastBranchToRip;
+    UINT64 LastBranchFromRip;
+    UINT64 LastExceptionToRip;
+    UINT64 LastExceptionFromRip;
+    UINT64 Cr8;
+    UINT64 MsrGsBase;
+    UINT64 MsrGsSwap;
+    UINT64 MsrStar;
+    UINT64 MsrLStar;
+    UINT64 MsrCStar;
+    UINT64 MsrSyscallMask;
 } KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
 
 //
@@ -370,176 +366,230 @@ typedef struct _KSPECIAL_REGISTERS
 //
 typedef struct _KPROCESSOR_STATE
 {
-    CONTEXT ContextFrame;
     KSPECIAL_REGISTERS SpecialRegisters;
+    CONTEXT ContextFrame;
 } KPROCESSOR_STATE, *PKPROCESSOR_STATE;
 
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+typedef struct _GENERAL_LOOKASIDE_POOL
+{
+    union
+    {
+        SLIST_HEADER ListHead;
+        SINGLE_LIST_ENTRY SingleListHead;
+    };
+    USHORT Depth;
+    USHORT MaximumDepth;
+    ULONG TotalAllocates;
+    union
+    {
+        ULONG AllocateMisses;
+        ULONG AllocateHits;
+    };
+    union
+    {
+        ULONG TotalFrees;
+        ULONG FreeMisses;
+    };
+    ULONG FreeHits;
+    POOL_TYPE Type;
+    ULONG Tag;
+    ULONG Size;
+    union
+    {
+        PVOID AllocateEx;
+        PVOID Allocate;
+    };
+    union
+    {
+        PVOID FreeEx;
+        PVOID Free;
+    };
+    LIST_ENTRY ListEntry;
+    ULONG LastTotalAllocates;
+    union
+    {
+        ULONG LastAllocateMisses;
+        ULONG LastAllocateHits;
+    };
+    ULONG Future[2];
+} GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
+#else
+#define GENERAL_LOOKASIDE_POOL PP_LOOKASIDE_LIST
+#endif
+
+typedef struct _KREQUEST_PACKET
+{
+    PVOID CurrentPacket[3];
+    PVOID WorkerRoutine;
+} KREQUEST_PACKET, *PKREQUEST_PACKET;
+
+typedef struct _REQUEST_MAILBOX
+{
+    INT64 RequestSummary;
+    KREQUEST_PACKET RequestPacket;
+    PVOID Virtual[7];
+} REQUEST_MAILBOX, *PREQUEST_MAILBOX;
+
 //
 // Processor Region Control Block
 //
 #pragma pack(push,4)
 typedef struct _KPRCB
 {
-    USHORT MinorVersion;
-    USHORT MajorVersion;
+    ULONG MxCsr;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    USHORT Number;
+#else
+    UCHAR Number;
+    UCHAR NestingLevel;
+#endif
+    UCHAR InterruptRequest;
+    UCHAR IdleHalt;
     struct _KTHREAD *CurrentThread;
     struct _KTHREAD *NextThread;
     struct _KTHREAD *IdleThread;
-    UCHAR Number;
-    UCHAR Reserved;
-    USHORT BuildType;
-    KAFFINITY SetMember;
-    UCHAR CpuType;
-    UCHAR CpuID;
-    USHORT CpuStep;
-    KPROCESSOR_STATE ProcessorState;
-    ULONG KernelReserved[16];
-    ULONG HalReserved[16];
 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
-    ULONG CFlushSize;
-    UCHAR PrcbPad0[88];
+    UCHAR NestingLevel;
+    UCHAR Group;
+    UCHAR PrcbPad00[6];
 #else
-    UCHAR PrcbPad0[92];
+    UINT64 UserRsp;
 #endif
-    KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock];
-    struct _KTHREAD *NpxThread;
-    ULONG InterruptCount;
-    ULONG KernelTime;
-    ULONG UserTime;
-    ULONG DpcTime;
-    ULONG DebugDpcTime;
-    ULONG InterruptTime;
-    ULONG AdjustDpcThreshold;
-    ULONG PageColor;
-    UCHAR SkipTick;
-    UCHAR DebuggerSavedIRQL;
-#if (NTDDI_VERSION >= NTDDI_WS03)
-    UCHAR NodeColor;
+    UINT64 RspBase;
+    UINT64 PrcbLock;
+    UINT64 SetMember;
+    KPROCESSOR_STATE ProcessorState;
+    CHAR CpuType;
+    CHAR CpuID;
 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
-    UCHAR PollSlot;
+    union
+    {
+        USHORT CpuStep;
+        struct
+        {
+            UCHAR CpuStepping;
+            UCHAR CpuModel;
+        };
+    };
 #else
-    UCHAR Spare1;
+    USHORT CpuStep;
 #endif
-    ULONG NodeShiftedColor;
+    ULONG MHz;
+    UINT64 HalReserved[8];
+    USHORT MinorVersion;
+    USHORT MajorVersion;
+    UCHAR BuildType;
+    UCHAR CpuVendor;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    UCHAR CoresPerPhysicalProcessor;
+    UCHAR LogicalProcessorsPerCore;
 #else
-    UCHAR Spare1[6];
+    UCHAR InitialApicId;
+    UCHAR LogicalProcessorsPerPhysicalProcessor;
 #endif
-    struct _KNODE *ParentNode;
-    ULONG MultiThreadProcessorSet;
-    struct _KPRCB *MultiThreadSetMaster;
-#if (NTDDI_VERSION >= NTDDI_WS03)
-    ULONG SecondaryColorMask;
+    ULONG ApicMask;
 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
-    ULONG DpcTimeLimit;
+    ULONG CFlushSize;
 #else
-    LONG Sleeping;
+    UCHAR CFlushSize;
+    UCHAR PrcbPad0x[3];
 #endif
+    PVOID AcpiReserved;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    ULONG InitialApicId;
+    ULONG Stride;
+    UINT64 PrcbPad01[3];
 #else
-    ULONG ThreadStartCount[2];
+    UINT64 PrcbPad00[4];
+#endif
+    KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock]; // 2003: 33, vista:49
+    PP_LOOKASIDE_LIST PPLookasideList[16];
+    GENERAL_LOOKASIDE_POOL PPNPagedLookasideList[32];
+    GENERAL_LOOKASIDE_POOL PPPagedLookasideList[32];
+    UINT64 PacketBarrier;
+    SINGLE_LIST_ENTRY DeferredReadyListHead;
+    LONG MmPageFaultCount;
+    LONG MmCopyOnWriteCount;
+    LONG MmTransitionCount;
+#if (NTDDI_VERSION < NTDDI_LONGHORN)
+    LONG MmCacheTransitionCount;
 #endif
+    LONG MmDemandZeroCount;
+    LONG MmPageReadCount;
+    LONG MmPageReadIoCount;
+#if (NTDDI_VERSION < NTDDI_LONGHORN)
+    LONG MmCacheReadCount;
+    LONG MmCacheIoCount;
+#endif
+    LONG MmDirtyPagesWriteCount;
+    LONG MmDirtyWriteIoCount;
+    LONG MmMappedPagesWriteCount;
+    LONG MmMappedWriteIoCount;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    ULONG KeSystemCalls;
+    ULONG KeContextSwitches;
     ULONG CcFastReadNoWait;
     ULONG CcFastReadWait;
     ULONG CcFastReadNotPossible;
     ULONG CcCopyReadNoWait;
     ULONG CcCopyReadWait;
     ULONG CcCopyReadNoWaitMiss;
-#if (NTDDI_VERSION < NTDDI_LONGHORN)
-    ULONG KeAlignmentFixupCount;
-#endif
-    ULONG SpareCounter0;
-#if (NTDDI_VERSION < NTDDI_LONGHORN)
-    ULONG KeDcacheFlushCount;
-    ULONG KeExceptionDispatchCount;
-    ULONG KeFirstLevelTbFills;
-    ULONG KeFloatingEmulationCount;
-    ULONG KeIcacheFlushCount;
-    ULONG KeSecondLevelTbFills;
+    LONG LookasideIrpFloat;
+#else
+    LONG LookasideIrpFloat;
     ULONG KeSystemCalls;
 #endif
-    volatile ULONG IoReadOperationCount;
-    volatile ULONG IoWriteOperationCount;
-    volatile ULONG IoOtherOperationCount;
+    LONG IoReadOperationCount;
+    LONG IoWriteOperationCount;
+    LONG IoOtherOperationCount;
     LARGE_INTEGER IoReadTransferCount;
     LARGE_INTEGER IoWriteTransferCount;
     LARGE_INTEGER IoOtherTransferCount;
+#if (NTDDI_VERSION < NTDDI_LONGHORN)
+    ULONG KeContextSwitches;
+    UCHAR PrcbPad2[12];
+#endif
+    UINT64 TargetSet;
+    ULONG IpiFrozen;
+    UCHAR PrcbPad3[116];
+    REQUEST_MAILBOX RequestMailbox[64];
+    UINT64 SenderSummary;
+    UCHAR PrcbPad4[120];
+    KDPC_DATA DpcData[2];
+    PVOID DpcStack;
 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
-    ULONG CcFastMdlReadNoWait;
-    ULONG CcFastMdlReadWait;
-    ULONG CcFastMdlReadNotPossible;
-    ULONG CcMapDataNoWait;
-    ULONG CcMapDataWait;
-    ULONG CcPinMappedDataCount;
-    ULONG CcPinReadNoWait;
-    ULONG CcPinReadWait;
-    ULONG CcMdlReadNoWait;
-    ULONG CcMdlReadWait;
-    ULONG CcLazyWriteHotSpots;
-    ULONG CcLazyWriteIos;
-    ULONG CcLazyWritePages;
-    ULONG CcDataFlushes;
-    ULONG CcDataPages;
-    ULONG CcLostDelayedWrites;
-    ULONG CcFastReadResourceMiss;
-    ULONG CcCopyReadWaitMiss;
-    ULONG CcFastMdlReadResourceMiss;
-    ULONG CcMapDataNoWaitMiss;
-    ULONG CcMapDataWaitMiss;
-    ULONG CcPinReadNoWaitMiss;
-    ULONG CcPinReadWaitMiss;
-    ULONG CcMdlReadNoWaitMiss;
-    ULONG CcMdlReadWaitMiss;
-    ULONG CcReadAheadIos;
-    ULONG KeAlignmentFixupCount;
-    ULONG KeExceptionDispatchCount;
-    ULONG KeSystemCalls;
-    ULONG PrcbPad1[3];
+    PVOID SparePtr0;
 #else
-    ULONG SpareCounter1[8];
+    PVOID SavedRsp;
 #endif
-    PP_LOOKASIDE_LIST PPLookasideList[16];
-    PP_LOOKASIDE_LIST PPNPagedLookasideList[32];
-    PP_LOOKASIDE_LIST PPPagedLookasideList[32];
-    volatile ULONG PacketBarrier;
-    volatile ULONG ReverseStall;
-    PVOID IpiFrame;
-    UCHAR PrcbPad2[52];
-    volatile PVOID CurrentPacket[3];
-    volatile ULONG TargetSet;
-    volatile PKIPI_WORKER WorkerRoutine;
-    volatile ULONG IpiFrozen;
-    UCHAR PrcbPad3[40];
-    volatile ULONG RequestSummary;
-    volatile struct _KPRCB *SignalDone;
-    UCHAR PrcbPad4[56];
-    struct _KDPC_DATA DpcData[2];
-    PVOID DpcStack;
-    ULONG MaximumDpcQueueDepth;
+    LONG MaximumDpcQueueDepth;
     ULONG DpcRequestRate;
     ULONG MinimumDpcRate;
-    volatile UCHAR DpcInterruptRequested;
-    volatile UCHAR DpcThreadRequested;
-    volatile UCHAR DpcRoutineActive;
-    volatile UCHAR DpcThreadActive;
-    ULONG PrcbLock;
+    UCHAR DpcInterruptRequested;
+    UCHAR DpcThreadRequested;
+    UCHAR DpcRoutineActive;
+    UCHAR DpcThreadActive;
+    UINT64 TimerHand;
+    UINT64 TimerRequest;
+    LONG TickOffset;
+    LONG MasterOffset;
     ULONG DpcLastCount;
-    volatile ULONG TimerHand;
-    volatile ULONG TimerRequest;
-    PVOID DpcThread;
-    KEVENT DpcEvent;
     UCHAR ThreadDpcEnable;
-    volatile BOOLEAN QuantumEnd;
+    UCHAR QuantumEnd;
     UCHAR PrcbPad50;
-    volatile UCHAR IdleSchedule;
+    UCHAR IdleSchedule;
     LONG DpcSetEventRequest;
 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
-    LONG Sleeping;
-    ULONG PeriodicCount;
-    ULONG PeriodicBias;
-    UCHAR PrcbPad5[6];
+    ULONG KeExceptionDispatchCount;
 #else
-    UCHAR PrcbPad5[18];
+    LONG PrcbPad40;
+    PVOID DpcThread;
+#endif
+    KEVENT DpcEvent;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    PVOID PrcbPad51;
 #endif
-    LONG TickOffset;
     KDPC CallDpc;
 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
     LONG ClockKeepAlive;
@@ -547,79 +597,139 @@ typedef struct _KPRCB
     UCHAR ClockPollCycle;
     UCHAR PrcbPad6[2];
     LONG DpcWatchdogPeriod;
-    LONG DpcWatchDogCount;
-    LONG ThreadWatchdogPeriod;
-    LONG ThreadWatchDogCount;
-    ULONG PrcbPad70[2];
+    LONG DpcWatchdogCount;
+    UINT64 PrcbPad70[2];
 #else
-    ULONG PrcbPad7[8];
+    UINT64 PrcbPad7[4];
 #endif
     LIST_ENTRY WaitListHead;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    UINT64 WaitLock;
+#endif
     ULONG ReadySummary;
     ULONG QueueIndex;
 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
-    SINGLE_LIST_ENTRY DeferredReadyListHead;
-    ULONGLONG StartCycles;
-    ULONGLONG CycleTime;
-    ULONGLONG PrcbPad71[3];
+    UINT64 PrcbPad71[12];
+#endif
     LIST_ENTRY DispatcherReadyListHead[32];
+    ULONG InterruptCount;
+    ULONG KernelTime;
+    ULONG UserTime;
+    ULONG DpcTime;
+    ULONG InterruptTime;
+    ULONG AdjustDpcThreshold;
+    UCHAR SkipTick;
+    UCHAR DebuggerSavedIRQL;
+    UCHAR PollSlot;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    UCHAR PrcbPad80[5];
+    ULONG DpcTimeCount;
+    ULONG DpcTimeLimit;
+    ULONG PeriodicCount;
+    ULONG PeriodicBias;
+    UINT64 PrcbPad81[2];
 #else
-    LIST_ENTRY DispatcherReadyListHead[32];
-    SINGLE_LIST_ENTRY DeferredReadyListHead;
-    ULONG PrcbPad72[11];
+    UCHAR PrcbPad8[13];
 #endif
-    PVOID ChainedInterruptList;
-    LONG LookasideIrpFloat;
-    volatile LONG MmPageFaultCount;
-    volatile LONG MmCopyOnWriteCount;
-    volatile LONG MmTransitionCount;
-    volatile LONG MmCacheTransitionCount;
-    volatile LONG MmDemandZeroCount;
-    volatile LONG MmPageReadCount;
-    volatile LONG MmPageReadIoCount;
-    volatile LONG MmCacheReadCount;
-    volatile LONG MmCacheIoCount;
-    volatile LONG MmDirtyPagesWriteCount;
-    volatile LONG MmDirtyWriteIoCount;
-    volatile LONG MmMappedPagesWriteCount;
-    volatile LONG MmMappedWriteIoCount;
+    struct _KNODE *ParentNode;
+    UINT64 MultiThreadProcessorSet;
+    struct _KPRCB *MultiThreadSetMaster;
 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
-    ULONG CachedCommit;
-    ULONG CachedResidentAvailable;
-    PVOID HyperPte;
-    UCHAR CpuVendor;
-    UCHAR PrcbPad9[3];
-#else
-    ULONG SpareFields0[1];
+    UINT64 StartCycles;
+    LONG MmSpinLockOrdering;
+    ULONG PageColor;
+    ULONG NodeColor;
+    ULONG NodeShiftedColor;
+    ULONG SecondaryColorMask;
 #endif
-    CHAR VendorString[13];
-    UCHAR InitialApicId;
-    UCHAR LogicalProcessorsPerPhysicalProcessor;
-    ULONG MHz;
+    LONG Sleeping;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    UINT64 CycleTime;
+    ULONG CcFastMdlReadNoWait;
+    ULONG CcFastMdlReadWait;
+    ULONG CcFastMdlReadNotPossible;
+    ULONG CcMapDataNoWait;
+    ULONG CcMapDataWait;
+    ULONG CcPinMappedDataCount;
+    ULONG CcPinReadNoWait;
+    ULONG CcPinReadWait;
+    ULONG CcMdlReadNoWait;
+    ULONG CcMdlReadWait;
+    ULONG CcLazyWriteHotSpots;
+    ULONG CcLazyWriteIos;
+    ULONG CcLazyWritePages;
+    ULONG CcDataFlushes;
+    ULONG CcDataPages;
+    ULONG CcLostDelayedWrites;
+    ULONG CcFastReadResourceMiss;
+    ULONG CcCopyReadWaitMiss;
+    ULONG CcFastMdlReadResourceMiss;
+    ULONG CcMapDataNoWaitMiss;
+    ULONG CcMapDataWaitMiss;
+    ULONG CcPinReadNoWaitMiss;
+    ULONG CcPinReadWaitMiss;
+    ULONG CcMdlReadNoWaitMiss;
+    ULONG CcMdlReadWaitMiss;
+    ULONG CcReadAheadIos;
+    LONG MmCacheTransitionCount;
+    LONG MmCacheReadCount;
+    LONG MmCacheIoCount;
+    ULONG PrcbPad91[3];
+    PROCESSOR_POWER_STATE PowerState;
+    ULONG KeAlignmentFixupCount;
+    UCHAR VendorString[13];
+    UCHAR PrcbPad10[3];
     ULONG FeatureBits;
     LARGE_INTEGER UpdateSignature;
-    volatile LARGE_INTEGER IsrTime;
-    LARGE_INTEGER SpareField1;
-    FX_SAVE_AREA NpxSaveArea;
-    PROCESSOR_POWER_STATE PowerState;
-#if (NTDDI_VERSION >= NTDDI_LONGHORN)
-    KDPC DpcWatchdogDoc;
+    KDPC DpcWatchdogDpc;
     KTIMER DpcWatchdogTimer;
+    CACHE_DESCRIPTOR Cache[5];
+    ULONG CacheCount;
+    ULONG CachedCommit;
+    ULONG CachedResidentAvailable;
+    PVOID HyperPte;
     PVOID WheaInfo;
     PVOID EtwSupport;
     SLIST_HEADER InterruptObjectPool;
-    LARGE_INTEGER HyperCallPagePhysical;
-    LARGE_INTEGER HyperCallPageVirtual;
+    SLIST_HEADER HypercallPageList;
+    PVOID HypercallPageVirtual;
+    PVOID VirtualApicAssist;
+    UINT64* StatisticsPage;
     PVOID RateControl;
+    UINT64 CacheProcessorMask[5];
+    UINT64 PackageProcessorSet;
+    UINT64 CoreProcessorSet;
+#else
+    ULONG PrcbPad90[1];
+    ULONG DebugDpcTime;
+    ULONG PageColor;
+    ULONG NodeColor;
+    ULONG NodeShiftedColor;
+    ULONG SecondaryColorMask;
+    UCHAR PrcbPad9[12];
+    ULONG CcFastReadNoWait;
+    ULONG CcFastReadWait;
+    ULONG CcFastReadNotPossible;
+    ULONG CcCopyReadNoWait;
+    ULONG CcCopyReadWait;
+    ULONG CcCopyReadNoWaitMiss;
+    ULONG KeAlignmentFixupCount;
+    ULONG KeDcacheFlushCount;
+    ULONG KeExceptionDispatchCount;
+    ULONG KeFirstLevelTbFills;
+    ULONG KeFloatingEmulationCount;
+    ULONG KeIcacheFlushCount;
+    ULONG KeSecondLevelTbFills;
+    UCHAR VendorString[13];
+    UCHAR PrcbPad10[2];
+    ULONG FeatureBits;
+    LARGE_INTEGER UpdateSignature;
+    PROCESSOR_POWER_STATE PowerState;
     CACHE_DESCRIPTOR Cache[5];
     ULONG CacheCount;
-    ULONG CacheProcessorMask[5];
-    UCHAR LogicalProcessorsPerCore;
-    UCHAR PrcbPad8[3];
-    ULONG PackageProcessorSet;
-    ULONG CoreProcessorSet;
 #endif
-} KPRCB, *PKPRCB;
+}
+ KPRCB, *PKPRCB;
 
 //
 // Processor Control Region
@@ -631,41 +741,40 @@ typedef struct _KIPCR
         NT_TIB NtTib;
         struct
         {
-            struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
-            PVOID Used_StackBase;
-            PVOID PerfGlobalGroupMask;
-            PVOID TssCopy;
-            ULONG ContextSwitches;
-            KAFFINITY SetMemberCopy;
+            union _KGDTENTRY64 *GdtBase;
+            struct _KTSS64 *TssBase;
+            ULONG64 UserRsp;
+            struct _KPCR *Self;
+            struct _KPRCB *CurrentPrcb;
+            PKSPIN_LOCK_QUEUE LockArray;
             PVOID Used_Self;
         };
     };
-    struct _KPCR *Self;
-    struct _KPRCB *Prcb;
+    union _KIDTENTRY64 *IdtBase;
+    ULONG64 Unused[2];
     KIRQL Irql;
-    ULONG IRR;
-    ULONG IrrActive;
-    ULONG IDR;
-    PVOID KdVersionBlock;
-    PKIDTENTRY IDT;
-    PKGDTENTRY GDT;
-    struct _KTSS *TSS;
+    UCHAR SecondLevelCacheAssociativity;
+    UCHAR ObsoleteNumber;
+    UCHAR Fill0;
+    ULONG Unused0[3];
     USHORT MajorVersion;
     USHORT MinorVersion;
-    KAFFINITY SetMember;
     ULONG StallScaleFactor;
-    UCHAR SparedUnused;
-    UCHAR Number;
-    UCHAR Reserved;
-    UCHAR L2CacheAssociativity;
-    ULONG VdmAlert;
-    ULONG KernelReserved[14];
+    PVOID Unused1[3];
+    ULONG KernelReserved[15];
     ULONG SecondLevelCacheSize;
     ULONG HalReserved[16];
-    ULONG InterruptMode;
-    UCHAR Spare1;
-    ULONG KernelReserved2[17];
-    KPRCB PrcbData;
+    ULONG Unused2;
+    ULONG Fill1;
+    PVOID KdVersionBlock; // 0x108
+    PVOID Unused3;
+    ULONG PcrAlign1[24];
+    ULONG Fill2[2]; // 0x178
+    KPRCB Prcb; // 0x180
+
+    // hack:
+    ULONG ContextSwitches;
+
 } KIPCR, *PKIPCR;
 #pragma pack(pop)
 
@@ -678,48 +787,37 @@ typedef struct _KiIoAccessMap
     UCHAR IoMap[8196];
 } KIIO_ACCESS_MAP;
 
-typedef struct _KTSS
+
+#pragma pack(push,4)
+typedef struct _KTSS64
 {
-    USHORT Backlink;
-    USHORT Reserved0;
-    ULONG Esp0;
-    USHORT Ss0;
-    USHORT Reserved1;
-    ULONG NotUsed1[4];
-    ULONG CR3;
-    ULONG Eip;
-    ULONG EFlags;
-    ULONG Eax;
-    ULONG Ecx;
-    ULONG Edx;
-    ULONG Ebx;
-    ULONG Esp;
-    ULONG Ebp;
-    ULONG Esi;
-    ULONG Edi;
-    USHORT Es;
-    USHORT Reserved2;
-    USHORT Cs;
-    USHORT Reserved3;
-    USHORT Ss;
-    USHORT Reserved4;
-    USHORT Ds;
-    USHORT Reserved5;
-    USHORT Fs;
-    USHORT Reserved6;
-    USHORT Gs;
-    USHORT Reserved7;
-    USHORT LDT;
-    USHORT Reserved8;
-    USHORT Flags;
-    USHORT IoMapBase;
-    KIIO_ACCESS_MAP IoMaps[1];
-    UCHAR IntDirectionMap[32];
-} KTSS, *PKTSS;
+ /* 000 */  ULONG Reserved0;
+ /* 004 */  UINT64 Rsp0;
+ /* 00c */  UINT64 Rsp1;
+ /* 014 */  UINT64 Rsp2;
+ /* 01c */  UINT64 Ist[8];
+ /* 05c */  UINT64 Reserved1;
+ /* 064 */  USHORT Reserved2;
+ /* 066 */  USHORT IoMapBase;
+} KTSS64, *PKTSS64;
+#pragma pack(pop)
+#define KTSS KTSS64
+#define PKTSS PKTSS64
 
 //
 // i386 CPUs don't have exception frames
 //
 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
+
+//
+// Inline function to get current KPRCB
+//
+FORCEINLINE
+struct _KPRCB *
+KeGetCurrentPrcb(VOID)
+{
+    return (struct _KPRCB *)__readgsqword(FIELD_OFFSET(KIPCR, CurrentPrcb));
+}
+
 #endif
 #endif