-/*++ NDK Version: 0095
+/*++ NDK Version: 0098
Copyright (c) Alex Ionescu. All rights reserved.
Author:
- Alex Ionescu (alex.ionescu@reactos.com) 06-Oct-2004
+ Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
--*/
// 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_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 3
-#define IPI_PACKET_READY 4
-#define IPI_SYNCH_REQUEST 10
+#define IPI_FREEZE 4
+#define IPI_PACKET_READY 8
+#define IPI_SYNCH_REQUEST 16
//
-// FN/FX (FPU) Save Area Structures
+// PRCB Flags
//
-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;
+#define PRCB_MAJOR_VERSION 1
+#define PRCB_BUILD_DEBUG 1
+#define PRCB_BUILD_UNIPROCESSOR 2
-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;
+//
+// HAL Variables
+//
+#define INITIAL_STALL_COUNT 0x64
-typedef struct _FX_SAVE_AREA
-{
- union
- {
- FNSAVE_FORMAT FnArea;
- FXSAVE_FORMAT FxArea;
- } U;
- ULONG NpxSavedCpu;
- ULONG Cr0NpxState;
-} FX_SAVE_AREA, *PFX_SAVE_AREA;
+//
+// 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
ULONG Ecx;
ULONG Eax;
ULONG PreviousPreviousMode;
- struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
+ struct _EXCEPTION_REGISTRATION_RECORD FAR *ExceptionList;
ULONG SegFs;
ULONG Edi;
ULONG Esi;
//
// LDT Entry Definition
//
+#ifndef _LDT_ENTRY_DEFINED
+#define _LDT_ENTRY_DEFINED
typedef struct _LDT_ENTRY
{
USHORT LimitLow;
} 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;
+ 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
} 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;
+ 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;
USHORT ExtendedOffset;
} KIDTENTRY, *PKIDTENTRY;
-//
-// Page Table Entry Definition
-//
-typedef struct _HARDWARE_PTE_X86
-{
- ULONG Valid : 1;
- ULONG Write : 1;
- ULONG Owner : 1;
- ULONG WriteThrough : 1;
- ULONG CacheDisable : 1;
- ULONG Accessed : 1;
- ULONG Dirty : 1;
- ULONG LargePage : 1;
- ULONG Global : 1;
- ULONG CopyOnWrite : 1;
- ULONG Prototype : 1;
- ULONG reserved : 1;
- ULONG PageFrameNumber : 20;
-} HARDWARE_PTE_X86, *PHARDWARE_PTE_X86;
-
typedef struct _DESCRIPTOR
{
USHORT Pad;
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)
//
//
// Processor State Data
//
-#pragma pack(push,4)
typedef struct _KPROCESSOR_STATE
{
- PCONTEXT ContextFrame;
+ CONTEXT ContextFrame;
KSPECIAL_REGISTERS SpecialRegisters;
-} KPROCESSOR_STATE;
+} KPROCESSOR_STATE, *PKPROCESSOR_STATE;
//
// Processor Region Control Block
//
+#pragma pack(push,4)
typedef struct _KPRCB
{
USHORT MinorVersion;
KPROCESSOR_STATE ProcessorState;
ULONG KernelReserved[16];
ULONG HalReserved[16];
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+ ULONG CFlushSize;
+ UCHAR PrcbPad0[88];
+#else
UCHAR PrcbPad0[92];
- PVOID LockQueue[33]; // Used for Queued Spinlocks
+#endif
+ KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock];
struct _KTHREAD *NpxThread;
ULONG InterruptCount;
ULONG KernelTime;
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;
- ULONG KeContextSwitches;
+#endif
+ ULONG SpareCounter0;
+#if (NTDDI_VERSION < NTDDI_LONGHORN)
ULONG KeDcacheFlushCount;
ULONG KeExceptionDispatchCount;
ULONG KeFirstLevelTbFills;
ULONG KeIcacheFlushCount;
ULONG KeSecondLevelTbFills;
ULONG KeSystemCalls;
- ULONG IoReadOperationCount;
- ULONG IoWriteOperationCount;
- ULONG IoOtherOperationCount;
+#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];
- ULONG PacketBarrier;
- ULONG ReverseStall;
+ volatile ULONG PacketBarrier;
+ volatile ULONG ReverseStall;
PVOID IpiFrame;
UCHAR PrcbPad2[52];
- PVOID CurrentPacket[3];
- ULONG TargetSet;
- ULONG_PTR WorkerRoutine;
- ULONG IpiFrozen;
+ volatile PVOID CurrentPacket[3];
+ volatile ULONG TargetSet;
+ volatile PKIPI_WORKER WorkerRoutine;
+ volatile ULONG IpiFrozen;
UCHAR PrcbPad3[40];
- ULONG RequestSummary;
- struct _KPRCB *SignalDone;
+ volatile ULONG RequestSummary;
+ volatile struct _KPRCB *SignalDone;
UCHAR PrcbPad4[56];
struct _KDPC_DATA DpcData[2];
PVOID DpcStack;
ULONG MaximumDpcQueueDepth;
ULONG DpcRequestRate;
ULONG MinimumDpcRate;
- UCHAR DpcInterruptRequested;
- UCHAR DpcThreadRequested;
- UCHAR DpcRoutineActive;
- UCHAR DpcThreadActive;
+ volatile UCHAR DpcInterruptRequested;
+ volatile UCHAR DpcThreadRequested;
+ volatile UCHAR DpcRoutineActive;
+ volatile UCHAR DpcThreadActive;
ULONG PrcbLock;
ULONG DpcLastCount;
- ULONG TimerHand;
- ULONG TimerRequest;
+ volatile ULONG TimerHand;
+ volatile ULONG TimerRequest;
PVOID DpcThread;
- struct _KEVENT *DpcEvent;
+ KEVENT DpcEvent;
UCHAR ThreadDpcEnable;
- BOOLEAN QuantumEnd;
+ volatile BOOLEAN QuantumEnd;
UCHAR PrcbPad50;
- UCHAR IdleSchedule;
- ULONG DpcSetEventRequest;
+ 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;
- struct _KDPC* CallDpc;
+ 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 SelectNextLast;
+ 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;
- LONG MmPageFaultCount;
- LONG MmCopyOnWriteCount;
- LONG MmTransitionCount;
- LONG MmCacheTransitionCount;
- LONG MmDemandZeroCount;
- LONG MmPageReadCount;
- LONG MmPageReadIoCount;
- LONG MmCacheReadCount;
- LONG MmCacheIoCount;
- LONG MmDirtyPagesWriteCount;
- LONG MmDirtyWriteIoCount;
- LONG MmMappedPagesWriteCount;
- LONG MmMappedWriteIoCount;
+ 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];
- CHAR VendorString[13];
+#endif
+ UCHAR VendorString[13];
UCHAR InitialApicId;
UCHAR LogicalProcessorsPerPhysicalProcessor;
ULONG MHz;
ULONG FeatureBits;
LARGE_INTEGER UpdateSignature;
- LARGE_INTEGER IsrTime;
+ 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;
//
union
{
NT_TIB NtTib;
- struct
+ struct
{
struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
PVOID Used_StackBase;
PVOID Used_Self;
};
};
- struct _KPCR *Self; /* 1C */
- struct _KPRCB *Prcb; /* 20 */
- KIRQL Irql; /* 24 */
- ULONG IRR; /* 28 */
- ULONG IrrActive; /* 2C */
- ULONG IDR; /* 30 */
- PVOID KdVersionBlock; /* 34 */
- PKIDTENTRY IDT; /* 38 */
-#ifdef _REACTOS_
- PUSHORT GDT; /* 3C */
-#else
- PKGDTENTRY GDT; /* 3C */
-#endif
- struct _KTSS *TSS; /* 40 */
- USHORT MajorVersion; /* 44 */
- USHORT MinorVersion; /* 46 */
- KAFFINITY SetMember; /* 48 */
- ULONG StallScaleFactor; /* 4C */
- UCHAR SparedUnused; /* 50 */
- UCHAR Number; /* 51 */
- UCHAR Reserved; /* 52 */
- UCHAR L2CacheAssociativity; /* 53 */
- ULONG VdmAlert; /* 54 */
- ULONG KernelReserved[14]; /* 58 */
- ULONG L2CacheSize; /* 90 */
- ULONG HalReserved[16]; /* 94 */
- ULONG InterruptMode; /* D4 */
- UCHAR KernelReserved2[0x48]; /* D8 */
- KPRCB PrcbData; /* 120 */
+ 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)
UCHAR IoMap[8196];
} KIIO_ACCESS_MAP;
-#include <pshpack1.h>
typedef struct _KTSS
{
USHORT Backlink;
ULONG NotUsed1[4];
ULONG CR3;
ULONG Eip;
- ULONG NotUsed2[9];
+ ULONG EFlags;
+ ULONG Eax;
+ ULONG Ecx;
+ ULONG Edx;
+ ULONG Ebx;
+ ULONG Esp;
+ ULONG Ebp;
+ ULONG Esi;
+ ULONG Edi;
USHORT Es;
USHORT Reserved2;
USHORT Cs;
KIIO_ACCESS_MAP IoMaps[1];
UCHAR IntDirectionMap[32];
} KTSS, *PKTSS;
-#include <poppack.h>
//
// i386 CPUs don't have exception frames
//
typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
-
+#endif
#endif