Merge trunk head (r43756)
[reactos.git] / reactos / include / ndk / i386 / ketypes.h
index 70e2e4c..dab579f 100644 (file)
-/*\r
- * PROJECT:         ReactOS Native Headers\r
- * FILE:            include/ndk/i386/ketypes.h\r
- * PURPOSE:         I386-specific definitions for Kernel Types not defined in DDK/IFS\r
- * PROGRAMMER:      Alex Ionescu (alex@relsoft.net)\r
- * UPDATE HISTORY:\r
- *                  Created 06/10/04\r
- */\r
-#ifndef _I386_KETYPES_H\r
-#define _I386_KETYPES_H\r
-\r
-/* DEPENDENCIES **************************************************************/\r
-\r
-/* CONSTANTS *****************************************************************/\r
-\r
-/* X86 80386 Segment Types */\r
-#define I386_TSS               0x9\r
-#define I386_ACTIVE_TSS        0xB\r
-#define I386_CALL_GATE         0xC\r
-#define I386_INTERRUPT_GATE    0xE\r
-#define I386_TRAP_GATE         0xF\r
-\r
-/* EXPORTED DATA *************************************************************/\r
-\r
-/* ENUMERATIONS **************************************************************/\r
-\r
-/* TYPES *********************************************************************/\r
-\r
-typedef struct _FNSAVE_FORMAT\r
-{\r
-    ULONG ControlWord;\r
-    ULONG StatusWord;\r
-    ULONG TagWord;\r
-    ULONG ErrorOffset;\r
-    ULONG ErrorSelector;\r
-    ULONG DataOffset;\r
-    ULONG DataSelector;\r
-    UCHAR RegisterArea[80];\r
-} FNSAVE_FORMAT, *PFNSAVE_FORMAT;\r
-\r
-typedef struct _FXSAVE_FORMAT\r
-{\r
-    USHORT ControlWord;\r
-    USHORT StatusWord;\r
-    USHORT TagWord;\r
-    USHORT ErrorOpcode;\r
-    ULONG ErrorOffset;\r
-    ULONG ErrorSelector;\r
-    ULONG DataOffset;\r
-    ULONG DataSelector;\r
-    ULONG MXCsr;\r
-    ULONG MXCsrMask;\r
-    UCHAR RegisterArea[128];\r
-    UCHAR Reserved3[128];\r
-    UCHAR Reserved4[224];\r
-    UCHAR Align16Byte[8];\r
-} FXSAVE_FORMAT, *PFXSAVE_FORMAT;\r
-\r
-typedef struct _FX_SAVE_AREA\r
-{\r
-    union\r
-    {\r
-        FNSAVE_FORMAT FnArea;\r
-        FXSAVE_FORMAT FxArea;\r
-    } U;\r
-    ULONG NpxSavedCpu;\r
-    ULONG Cr0NpxState;\r
-} FX_SAVE_AREA, *PFX_SAVE_AREA;\r
-\r
-typedef struct _KTRAP_FRAME\r
-{\r
-    PVOID DebugEbp;\r
-    PVOID DebugEip;\r
-    PVOID DebugArgMark;\r
-    PVOID DebugPointer;\r
-    PVOID TempCs;\r
-    PVOID TempEip;\r
-    ULONG Dr0;\r
-    ULONG Dr1;\r
-    ULONG Dr2;\r
-    ULONG Dr3;\r
-    ULONG Dr6;\r
-    ULONG Dr7;\r
-    USHORT Gs;\r
-    USHORT Reserved1;\r
-    USHORT Es;\r
-    USHORT Reserved2;\r
-    USHORT Ds;\r
-    USHORT Reserved3;\r
-    ULONG Edx;\r
-    ULONG Ecx;\r
-    ULONG Eax;\r
-    ULONG PreviousMode;\r
-    PVOID ExceptionList;\r
-    USHORT Fs;\r
-    USHORT Reserved4;\r
-    ULONG Edi;\r
-    ULONG Esi;\r
-    ULONG Ebx;\r
-    ULONG Ebp;\r
-    ULONG ErrorCode;\r
-    ULONG Eip;\r
-    ULONG Cs;\r
-    ULONG Eflags;\r
-    ULONG Esp;\r
-    USHORT Ss;\r
-    USHORT Reserved5;\r
-    USHORT V86_Es;\r
-    USHORT Reserved6;\r
-    USHORT V86_Ds;\r
-    USHORT Reserved7;\r
-    USHORT V86_Fs;\r
-    USHORT Reserved8;\r
-    USHORT V86_Gs;\r
-    USHORT Reserved9;\r
-} KTRAP_FRAME, *PKTRAP_FRAME;\r
-\r
-typedef struct _LDT_ENTRY\r
-{\r
-    WORD LimitLow;\r
-    WORD BaseLow;\r
-    union\r
-    {\r
-        struct\r
-        {\r
-            BYTE BaseMid;\r
-            BYTE Flags1;\r
-            BYTE Flags2;\r
-            BYTE BaseHi;\r
-        } Bytes;\r
-        struct\r
-        {\r
-            DWORD BaseMid : 8;\r
-            DWORD Type : 5;\r
-            DWORD Dpl : 2;\r
-            DWORD Pres : 1;\r
-            DWORD LimitHi : 4;\r
-            DWORD Sys : 1;\r
-            DWORD Reserved_0 : 1;\r
-            DWORD Default_Big : 1;\r
-            DWORD Granularity : 1;\r
-            DWORD BaseHi : 8;\r
-        } Bits;\r
-    } HighWord;\r
-} LDT_ENTRY, *PLDT_ENTRY, *LPLDT_ENTRY;\r
-\r
-typedef struct _KGDTENTRY\r
-{\r
-    USHORT LimitLow;\r
-    USHORT BaseLow;\r
-    union\r
-    {\r
-        struct\r
-        {\r
-            UCHAR BaseMid;\r
-            UCHAR Flags1;\r
-            UCHAR Flags2;\r
-            UCHAR BaseHi;\r
-        } Bytes;\r
-        struct\r
-        {\r
-            ULONG BaseMid       : 8;\r
-            ULONG Type          : 5;\r
-            ULONG Dpl           : 2;\r
-            ULONG Pres          : 1;\r
-            ULONG LimitHi       : 4;\r
-            ULONG Sys           : 1;\r
-            ULONG Reserved_0    : 1;\r
-            ULONG Default_Big   : 1;\r
-            ULONG Granularity   : 1;\r
-            ULONG BaseHi        : 8;\r
-        } Bits;\r
-    } HighWord;\r
-} KGDTENTRY, *PKGDTENTRY;\r
-\r
-typedef struct _KIDT_ACCESS\r
-{\r
-    union\r
-    {\r
-        struct\r
-        {\r
-            UCHAR Reserved;\r
-            UCHAR SegmentType:4;\r
-            UCHAR SystemSegmentFlag:1;\r
-            UCHAR Dpl:2;\r
-            UCHAR Present:1;\r
-        };\r
-        USHORT Value;\r
-    };\r
-} KIDT_ACCESS, *PKIDT_ACCESS;\r
-\r
-typedef struct _KIDTENTRY\r
-{\r
-    USHORT Offset;\r
-    USHORT Selector;\r
-    USHORT Access;\r
-    USHORT ExtendedOffset;\r
-} KIDTENTRY, *PKIDTENTRY;\r
-\r
-typedef struct _HARDWARE_PTE_X86\r
-{\r
-    ULONG Valid             : 1;\r
-    ULONG Write             : 1;\r
-    ULONG Owner             : 1;\r
-    ULONG WriteThrough      : 1;\r
-    ULONG CacheDisable      : 1;\r
-    ULONG Accessed          : 1;\r
-    ULONG Dirty             : 1;\r
-    ULONG LargePage         : 1;\r
-    ULONG Global            : 1;\r
-    ULONG CopyOnWrite       : 1;\r
-    ULONG Prototype         : 1;\r
-    ULONG reserved          : 1;\r
-    ULONG PageFrameNumber   : 20;\r
-} HARDWARE_PTE_X86, *PHARDWARE_PTE_X86;\r
-\r
-typedef struct _DESCRIPTOR\r
-{\r
-    WORD Pad;\r
-    WORD Limit;\r
-    DWORD Base;\r
-} KDESCRIPTOR, *PKDESCRIPTOR;\r
-\r
-typedef struct _KSPECIAL_REGISTERS\r
-{\r
-    DWORD Cr0;\r
-    DWORD Cr2;\r
-    DWORD Cr3;\r
-    DWORD Cr4;\r
-    DWORD KernelDr0;\r
-    DWORD KernelDr1;\r
-    DWORD KernelDr2;\r
-    DWORD KernelDr3;\r
-    DWORD KernelDr6;\r
-    DWORD KernelDr7;\r
-    KDESCRIPTOR Gdtr;\r
-    KDESCRIPTOR Idtr;\r
-    WORD Tr;\r
-    WORD Ldtr;\r
-    DWORD Reserved[6];\r
-} KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;\r
-\r
-#pragma pack(push,4)\r
-\r
-typedef struct _KPROCESSOR_STATE\r
-{\r
-    PCONTEXT ContextFrame;\r
-    KSPECIAL_REGISTERS SpecialRegisters;\r
-} KPROCESSOR_STATE;\r
-\r
-/* Processor Control Block */\r
-typedef struct _KPRCB\r
-{\r
-    USHORT MinorVersion;\r
-    USHORT MajorVersion;\r
-    struct _KTHREAD *CurrentThread;\r
-    struct _KTHREAD *NextThread;\r
-    struct _KTHREAD *IdleThread;\r
-    UCHAR Number;\r
-    UCHAR Reserved;\r
-    USHORT BuildType;\r
-    KAFFINITY SetMember;\r
-    UCHAR CpuType;\r
-    UCHAR CpuID;\r
-    USHORT CpuStep;\r
-    KPROCESSOR_STATE ProcessorState;\r
-    ULONG KernelReserved[16];\r
-    ULONG HalReserved[16];\r
-    UCHAR PrcbPad0[92];\r
-    PVOID LockQueue[33]; // Used for Queued Spinlocks\r
-    struct _KTHREAD *NpxThread;\r
-    ULONG InterruptCount;\r
-    ULONG KernelTime;\r
-    ULONG UserTime;\r
-    ULONG DpcTime;\r
-    ULONG DebugDpcTime;\r
-    ULONG InterruptTime;\r
-    ULONG AdjustDpcThreshold;\r
-    ULONG PageColor;\r
-    UCHAR SkipTick;\r
-    UCHAR DebuggerSavedIRQL;\r
-    UCHAR Spare1[6];\r
-    struct _KNODE *ParentNode;\r
-    ULONG MultiThreadProcessorSet;\r
-    struct _KPRCB *MultiThreadSetMaster;\r
-    ULONG ThreadStartCount[2];\r
-    ULONG CcFastReadNoWait;\r
-    ULONG CcFastReadWait;\r
-    ULONG CcFastReadNotPossible;\r
-    ULONG CcCopyReadNoWait;\r
-    ULONG CcCopyReadWait;\r
-    ULONG CcCopyReadNoWaitMiss;\r
-    ULONG KeAlignmentFixupCount;\r
-    ULONG KeContextSwitches;\r
-    ULONG KeDcacheFlushCount;\r
-    ULONG KeExceptionDispatchCount;\r
-    ULONG KeFirstLevelTbFills;\r
-    ULONG KeFloatingEmulationCount;\r
-    ULONG KeIcacheFlushCount;\r
-    ULONG KeSecondLevelTbFills;\r
-    ULONG KeSystemCalls;\r
-    ULONG IoReadOperationCount;\r
-    ULONG IoWriteOperationCount;\r
-    ULONG IoOtherOperationCount;\r
-    LARGE_INTEGER IoReadTransferCount;\r
-    LARGE_INTEGER IoWriteTransferCount;\r
-    LARGE_INTEGER IoOtherTransferCount;\r
-    ULONG SpareCounter1[8];\r
-    PP_LOOKASIDE_LIST PPLookasideList[16];\r
-    PP_LOOKASIDE_LIST PPNPagedLookasideList[32];\r
-    PP_LOOKASIDE_LIST PPPagedLookasideList[32];\r
-    ULONG PacketBarrier;\r
-    ULONG ReverseStall;\r
-    PVOID IpiFrame;\r
-    UCHAR PrcbPad2[52];\r
-    PVOID CurrentPacket[3];\r
-    ULONG TargetSet;\r
-    ULONG_PTR WorkerRoutine;\r
-    ULONG IpiFrozen;\r
-    UCHAR PrcbPad3[40];\r
-    ULONG RequestSummary;\r
-    struct _KPRCB *SignalDone;\r
-    UCHAR PrcbPad4[56];\r
-    struct _KDPC_DATA DpcData[2];\r
-    PVOID DpcStack;\r
-    ULONG MaximumDpcQueueDepth;\r
-    ULONG DpcRequestRate;\r
-    ULONG MinimumDpcRate;\r
-    UCHAR DpcInterruptRequested;\r
-    UCHAR DpcThreadRequested;\r
-    UCHAR DpcRoutineActive;\r
-    UCHAR DpcThreadActive;\r
-    ULONG PrcbLock;\r
-    ULONG DpcLastCount;\r
-    ULONG TimerHand;\r
-    ULONG TimerRequest;\r
-    PVOID DpcThread;\r
-    struct _KEVENT *DpcEvent;\r
-    UCHAR ThreadDpcEnable;\r
-    BOOLEAN QuantumEnd;\r
-    UCHAR PrcbPad50;\r
-    UCHAR IdleSchedule;\r
-    ULONG DpcSetEventRequest;\r
-    UCHAR PrcbPad5[18];\r
-    LONG TickOffset;\r
-    struct _KDPC* CallDpc;\r
-    ULONG PrcbPad7[8];\r
-    LIST_ENTRY WaitListHead;\r
-    ULONG ReadySummary;\r
-    ULONG SelectNextLast;\r
-    LIST_ENTRY DispatcherReadyListHead[32];\r
-    SINGLE_LIST_ENTRY DeferredReadyListHead;\r
-    ULONG PrcbPad72[11];\r
-    PVOID ChainedInterruptList;\r
-    LONG LookasideIrpFloat;\r
-    LONG MmPageFaultCount;\r
-    LONG MmCopyOnWriteCount;\r
-    LONG MmTransitionCount;\r
-    LONG MmCacheTransitionCount;\r
-    LONG MmDemandZeroCount;\r
-    LONG MmPageReadCount;\r
-    LONG MmPageReadIoCount;\r
-    LONG MmCacheReadCount;\r
-    LONG MmCacheIoCount;\r
-    LONG MmDirtyPagesWriteCount;\r
-    LONG MmDirtyWriteIoCount;\r
-    LONG MmMappedPagesWriteCount;\r
-    LONG MmMappedWriteIoCount;\r
-    ULONG SpareFields0[1];\r
-    CHAR VendorString[13];\r
-    UCHAR InitialApicId;\r
-    UCHAR LogicalProcessorsPerPhysicalProcessor;\r
-    ULONG MHz;\r
-    ULONG FeatureBits;\r
-    LARGE_INTEGER UpdateSignature;\r
-    LARGE_INTEGER IsrTime;\r
-    LARGE_INTEGER SpareField1;\r
-    FX_SAVE_AREA NpxSaveArea;\r
-    PROCESSOR_POWER_STATE PowerState;\r
-} KPRCB, *PKPRCB;\r
-\r
-/*\r
- * This is the complete, internal KPCR structure\r
- */\r
-typedef struct _KIPCR\r
-{\r
-    KPCR_TIB  Tib;                /* 00 */\r
-    struct _KPCR  *Self;          /* 1C */\r
-    struct _KPRCB  *Prcb;         /* 20 */\r
-    KIRQL  Irql;                  /* 24 */\r
-    ULONG  IRR;                   /* 28 */\r
-    ULONG  IrrActive;             /* 2C */\r
-    ULONG  IDR;                   /* 30 */\r
-    PVOID  KdVersionBlock;        /* 34 */\r
-    PUSHORT  IDT;                 /* 38 */\r
-    PUSHORT  GDT;                 /* 3C */\r
-    struct _KTSS  *TSS;           /* 40 */\r
-    USHORT  MajorVersion;         /* 44 */\r
-    USHORT  MinorVersion;         /* 46 */\r
-    KAFFINITY  SetMember;         /* 48 */\r
-    ULONG  StallScaleFactor;      /* 4C */\r
-    UCHAR  SparedUnused;          /* 50 */\r
-    UCHAR  Number;                /* 51 */\r
-    UCHAR  Reserved;              /* 52 */\r
-    UCHAR  L2CacheAssociativity;  /* 53 */\r
-    ULONG  VdmAlert;              /* 54 */\r
-    ULONG  KernelReserved[14];    /* 58 */\r
-    ULONG  L2CacheSize;           /* 90 */\r
-    ULONG  HalReserved[16];       /* 94 */\r
-    ULONG  InterruptMode;         /* D4 */\r
-    UCHAR  KernelReserved2[0x48]; /* D8 */\r
-    KPRCB  PrcbData;              /* 120 */\r
-} KIPCR, *PKIPCR;\r
-\r
-#pragma pack(pop)\r
-\r
-#include <pshpack1.h>\r
-\r
-typedef struct _KTSSNOIOPM\r
-{\r
-    USHORT PreviousTask;\r
-    USHORT Reserved1;\r
-    ULONG  Esp0;\r
-    USHORT Ss0;\r
-    USHORT Reserved2;\r
-    ULONG  Esp1;\r
-    USHORT Ss1;\r
-    USHORT Reserved3;\r
-    ULONG  Esp2;\r
-    USHORT Ss2;\r
-    USHORT Reserved4;\r
-    ULONG  Cr3;\r
-    ULONG  Eip;\r
-    ULONG  Eflags;\r
-    ULONG  Eax;\r
-    ULONG  Ecx;\r
-    ULONG  Edx;\r
-    ULONG  Ebx;\r
-    ULONG  Esp;\r
-    ULONG  Ebp;\r
-    ULONG  Esi;\r
-    ULONG  Edi;\r
-    USHORT Es;\r
-    USHORT Reserved5;\r
-    USHORT Cs;\r
-    USHORT Reserved6;\r
-    USHORT Ss;\r
-    USHORT Reserved7;\r
-    USHORT Ds;\r
-    USHORT Reserved8;\r
-    USHORT Fs;\r
-    USHORT Reserved9;\r
-    USHORT Gs;\r
-    USHORT Reserved10;\r
-    USHORT Ldt;\r
-    USHORT Reserved11;\r
-    USHORT Trap;\r
-    USHORT IoMapBase;\r
-    /* no interrupt redirection map */\r
-    UCHAR IoBitmap[1];\r
-} KTSSNOIOPM;\r
-\r
-typedef struct _KTSS\r
-{\r
-    USHORT PreviousTask;\r
-    USHORT Reserved1;\r
-    ULONG  Esp0;\r
-    USHORT Ss0;\r
-    USHORT Reserved2;\r
-    ULONG  Esp1;\r
-    USHORT Ss1;\r
-    USHORT Reserved3;\r
-    ULONG  Esp2;\r
-    USHORT Ss2;\r
-    USHORT Reserved4;\r
-    ULONG  Cr3;\r
-    ULONG  Eip;\r
-    ULONG  Eflags;\r
-    ULONG  Eax;\r
-    ULONG  Ecx;\r
-    ULONG  Edx;\r
-    ULONG  Ebx;\r
-    ULONG  Esp;\r
-    ULONG  Ebp;\r
-    ULONG  Esi;\r
-    ULONG  Edi;\r
-    USHORT Es;\r
-    USHORT Reserved5;\r
-    USHORT Cs;\r
-    USHORT Reserved6;\r
-    USHORT Ss;\r
-    USHORT Reserved7;\r
-    USHORT Ds;\r
-    USHORT Reserved8;\r
-    USHORT Fs;\r
-    USHORT Reserved9;\r
-    USHORT Gs;\r
-    USHORT Reserved10;\r
-    USHORT Ldt;\r
-    USHORT Reserved11;\r
-    USHORT Trap;\r
-    USHORT IoMapBase;\r
-    /* no interrupt redirection map */\r
-    UCHAR  IoBitmap[8193];\r
-} KTSS;\r
-\r
-#include <poppack.h>\r
-\r
-/* i386 Doesn't have Exception Frames */\r
-typedef struct _KEXCEPTION_FRAME\r
-{\r
-\r
-} KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;\r
-\r
-#endif\r
+/*++ NDK Version: 0098
+
+Copyright (c) Alex Ionescu.  All rights reserved.
+
+Header Name:
+
+    ketypes.h (X86)
+
+Abstract:
+
+    i386 Type definitions for the Kernel services.
+
+Author:
+
+    Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
+
+--*/
+
+#ifndef _I386_KETYPES_H
+#define _I386_KETYPES_H
+
+//
+// Dependencies
+//
+
+//
+// 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
+
+//
+// Machine Types
+//
+#define MACHINE_TYPE_ISA        0x0000
+#define MACHINE_TYPE_EISA       0x0001
+#define MACHINE_TYPE_MCA        0x0002
+
+//
+// X86 80386 Segment Types
+//
+#define I386_TASK_GATE          0x5
+#define I386_TSS                0x9
+#define I386_ACTIVE_TSS         0xB
+#define I386_CALL_GATE          0xC
+#define I386_INTERRUPT_GATE     0xE
+#define I386_TRAP_GATE          0xF
+
+//
+// Selector Names
+//
+#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
+
+//
+// CR4
+//
+#define CR4_VME                 0x1
+#define CR4_PVI                 0x2
+#define CR4_TSD                 0x4
+#define CR4_DE                  0x8
+#define CR4_PSE                 0x10
+#define CR4_PAE                 0x20
+#define CR4_MCE                 0x40
+#define CR4_PGE                 0x80
+#define CR4_FXSR                0x200
+#define CR4_XMMEXCPT            0x400
+
+//
+// EFlags
+//
+#define EFLAGS_CF               0x01L
+#define EFLAGS_ZF               0x40L
+#define EFLAGS_TF               0x100L
+#define EFLAGS_INTERRUPT_MASK   0x200L
+#define EFLAGS_DF               0x400L
+#define EFLAGS_IOPL             0x3000L
+#define EFLAGS_NESTED_TASK      0x4000L
+#define EFLAGS_RF               0x10000
+#define EFLAGS_V86_MASK         0x20000
+#define EFLAGS_ALIGN_CHECK      0x40000
+#define EFLAGS_VIF              0x80000
+#define EFLAGS_VIP              0x100000
+#define EFLAGS_ID               0x200000
+#define EFLAGS_USER_SANITIZE    0x3F4DD7
+#define EFLAG_SIGN              0x8000
+#define EFLAG_ZERO              0x4000
+
+//
+// IPI Types
+//
+#define IPI_APC                 1
+#define IPI_DPC                 2
+#define IPI_FREEZE              4
+#define IPI_PACKET_READY        8
+#define IPI_SYNCH_REQUEST       16
+
+//
+// PRCB Flags
+//
+#define PRCB_MAJOR_VERSION      1
+#define PRCB_BUILD_DEBUG        1
+#define PRCB_BUILD_UNIPROCESSOR 2
+
+//
+// HAL Variables
+//
+#define INITIAL_STALL_COUNT     0x64
+
+//
+// IOPM Definitions
+//
+#define IO_ACCESS_MAP_NONE      0
+#define IOPM_OFFSET             FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
+#define KiComputeIopmOffset(MapNumber)              \
+    (MapNumber == IO_ACCESS_MAP_NONE) ?             \
+        (USHORT)(sizeof(KTSS)) :                    \
+        (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
+
+//
+// Size of the XMM register save area in the FXSAVE format
+//
+#define SIZE_OF_FX_REGISTERS    128
+
+//
+// Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
+//
+#define KSEG0_BASE              0x80000000
+
+//
+// Synchronization-level IRQL
+//
+#ifndef CONFIG_SMP
+#define SYNCH_LEVEL             DISPATCH_LEVEL
+#else
+#if (NTDDI_VERSION < NTDDI_WS03)
+#define SYNCH_LEVEL             (IPI_LEVEL - 1)
+#else
+#define SYNCH_LEVEL             (IPI_LEVEL - 2)
+#endif
+#endif
+
+//
+// Trap Frame Definition
+//
+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;
+    union
+    {
+        struct
+        {
+            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;
+} LDT_ENTRY, *PLDT_ENTRY, *LPLDT_ENTRY;
+#endif
+
+//
+// GDT Entry Definition
+//
+typedef struct _KGDTENTRY
+{
+    USHORT LimitLow;
+    USHORT BaseLow;
+    union
+    {
+        struct
+        {
+            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;
+
+//
+// IDT Entry Access Definition
+//
+typedef struct _KIDT_ACCESS
+{
+    union
+    {
+        struct
+        {
+            UCHAR Reserved;
+            UCHAR SegmentType:4;
+            UCHAR SystemSegmentFlag:1;
+            UCHAR Dpl:2;
+            UCHAR Present:1;
+        };
+        USHORT Value;
+    };
+} KIDT_ACCESS, *PKIDT_ACCESS;
+
+//
+// IDT Entry Definition
+//
+typedef struct _KIDTENTRY
+{
+    USHORT Offset;
+    USHORT Selector;
+    USHORT Access;
+    USHORT ExtendedOffset;
+} KIDTENTRY, *PKIDTENTRY;
+
+typedef struct _DESCRIPTOR
+{
+    USHORT Pad;
+    USHORT Limit;
+    ULONG 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[SIZE_OF_FX_REGISTERS];
+    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;
+    USHORT Tr;
+    USHORT Ldtr;
+    ULONG Reserved[6];
+} KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
+
+//
+// Processor State Data
+//
+typedef struct _KPROCESSOR_STATE
+{
+    CONTEXT ContextFrame;
+    KSPECIAL_REGISTERS SpecialRegisters;
+} KPROCESSOR_STATE, *PKPROCESSOR_STATE;
+
+//
+// Processor Region Control Block
+//
+#pragma pack(push,4)
+typedef struct _KPRCB
+{
+    USHORT MinorVersion;
+    USHORT MajorVersion;
+    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];
+#else
+    UCHAR PrcbPad0[92];
+#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;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    UCHAR PollSlot;
+#else
+    UCHAR Spare1;
+#endif
+    ULONG NodeShiftedColor;
+#else
+    UCHAR Spare1[6];
+#endif
+    struct _KNODE *ParentNode;
+    ULONG MultiThreadProcessorSet;
+    struct _KPRCB *MultiThreadSetMaster;
+#if (NTDDI_VERSION >= NTDDI_WS03)
+    ULONG SecondaryColorMask;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    ULONG DpcTimeLimit;
+#else
+    LONG Sleeping;
+#endif
+#else
+    ULONG ThreadStartCount[2];
+#endif
+    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;
+    ULONG KeSystemCalls;
+#endif
+    volatile ULONG IoReadOperationCount;
+    volatile ULONG IoWriteOperationCount;
+    volatile ULONG IoOtherOperationCount;
+    LARGE_INTEGER IoReadTransferCount;
+    LARGE_INTEGER IoWriteTransferCount;
+    LARGE_INTEGER IoOtherTransferCount;
+#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];
+#else
+    ULONG SpareCounter1[8];
+#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;
+    ULONG DpcRequestRate;
+    ULONG MinimumDpcRate;
+    volatile UCHAR DpcInterruptRequested;
+    volatile UCHAR DpcThreadRequested;
+    volatile UCHAR DpcRoutineActive;
+    volatile UCHAR DpcThreadActive;
+    ULONG PrcbLock;
+    ULONG DpcLastCount;
+    volatile ULONG TimerHand;
+    volatile ULONG TimerRequest;
+    PVOID DpcThread;
+    KEVENT DpcEvent;
+    UCHAR ThreadDpcEnable;
+    volatile BOOLEAN QuantumEnd;
+    UCHAR PrcbPad50;
+    volatile UCHAR IdleSchedule;
+    LONG DpcSetEventRequest;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    LONG Sleeping;
+    ULONG PeriodicCount;
+    ULONG PeriodicBias;
+    UCHAR PrcbPad5[6];
+#else
+    UCHAR PrcbPad5[18];
+#endif
+    LONG TickOffset;
+    KDPC CallDpc;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    LONG ClockKeepAlive;
+    UCHAR ClockCheckSlot;
+    UCHAR ClockPollCycle;
+    UCHAR PrcbPad6[2];
+    LONG DpcWatchdogPeriod;
+    LONG DpcWatchDogCount;
+    LONG ThreadWatchdogPeriod;
+    LONG ThreadWatchDogCount;
+    ULONG PrcbPad70[2];
+#else
+    ULONG PrcbPad7[8];
+#endif
+    LIST_ENTRY WaitListHead;
+    ULONG ReadySummary;
+    ULONG QueueIndex;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    SINGLE_LIST_ENTRY DeferredReadyListHead;
+    ULONGLONG StartCycles;
+    ULONGLONG CycleTime;
+    ULONGLONG PrcbPad71[3];
+    LIST_ENTRY DispatcherReadyListHead[32];
+#else
+    LIST_ENTRY DispatcherReadyListHead[32];
+    SINGLE_LIST_ENTRY DeferredReadyListHead;
+    ULONG PrcbPad72[11];
+#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;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    ULONG CachedCommit;
+    ULONG CachedResidentAvailable;
+    PVOID HyperPte;
+    UCHAR CpuVendor;
+    UCHAR PrcbPad9[3];
+#else
+    ULONG SpareFields0[1];
+#endif
+    UCHAR VendorString[13];
+    UCHAR InitialApicId;
+    UCHAR LogicalProcessorsPerPhysicalProcessor;
+    ULONG MHz;
+    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;
+    KTIMER DpcWatchdogTimer;
+    PVOID WheaInfo;
+    PVOID EtwSupport;
+    SLIST_HEADER InterruptObjectPool;
+    LARGE_INTEGER HyperCallPagePhysical;
+    LARGE_INTEGER HyperCallPageVirtual;
+    PVOID RateControl;
+    CACHE_DESCRIPTOR Cache[5];
+    ULONG CacheCount;
+    ULONG CacheProcessorMask[5];
+    UCHAR LogicalProcessorsPerCore;
+    UCHAR PrcbPad8[3];
+    ULONG PackageProcessorSet;
+    ULONG CoreProcessorSet;
+#endif
+} KPRCB, *PKPRCB;
+
+//
+// Processor Control Region
+//
+typedef struct _KIPCR
+{
+    union
+    {
+        NT_TIB NtTib;
+        struct
+        {
+            struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
+            PVOID Used_StackBase;
+            PVOID PerfGlobalGroupMask;
+            PVOID TssCopy;
+            ULONG ContextSwitches;
+            KAFFINITY SetMemberCopy;
+            PVOID Used_Self;
+        };
+    };
+    struct _KPCR *Self;
+    struct _KPRCB *Prcb;
+    KIRQL Irql;
+    ULONG IRR;
+    ULONG IrrActive;
+    ULONG IDR;
+    PVOID KdVersionBlock;
+    PKIDTENTRY IDT;
+    PKGDTENTRY GDT;
+    struct _KTSS *TSS;
+    USHORT MajorVersion;
+    USHORT MinorVersion;
+    KAFFINITY SetMember;
+    ULONG StallScaleFactor;
+    UCHAR SpareUnused;
+    UCHAR Number;
+    UCHAR Reserved;
+    UCHAR L2CacheAssociativity;
+    ULONG VdmAlert;
+    ULONG KernelReserved[14];
+    ULONG SecondLevelCacheSize;
+    ULONG HalReserved[16];
+    ULONG InterruptMode;
+    UCHAR Spare1;
+    ULONG KernelReserved2[17];
+    KPRCB PrcbData;
+} KIPCR, *PKIPCR;
+#pragma pack(pop)
+
+//
+// TSS Definition
+//
+typedef struct _KiIoAccessMap
+{
+    UCHAR DirectionMap[32];
+    UCHAR IoMap[8196];
+} KIIO_ACCESS_MAP;
+
+typedef struct _KTSS
+{
+    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;
+
+//
+// i386 CPUs don't have exception frames
+//
+typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
+#endif
+#endif