/*++ 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 _IAMD64_KETYPES_H
-#define _IAMD64_KETYPES_H
+#ifndef _AMD64_KETYPES_H
+#define _AMD64_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
+//#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
//
#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 KGDT64_NULL 0x0000
+#define KGDT64_R0_CODE 0x0010
+#define KGDT64_R0_DATA 0x0018
+#define KGDT64_R3_CMCODE 0x0020
+#define KGDT64_R3_DATA 0x0028
+#define KGDT64_R3_CODE 0x0030
+#define KGDT64_SYS_TSS 0x0040
+#define KGDT64_R3_CMTEB 0x0050
+
//
// CR4
//
// HAL Variables
//
-#define INITIAL_STALL_COUNT 0x64
+#define INITIAL_STALL_COUNT 100
//
// IOPM Definitions
//
// Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
//
-#define KSEG0_BASE 0x80000000
+#define KSEG0_BASE 0xfffff80000000000ULL
//
// Synchronization-level IRQL
#ifndef CONFIG_SMP
#define SYNCH_LEVEL DISPATCH_LEVEL
#else
-#define SYNCH_LEVEL (IPI_LEVEL - 1)
+#define SYNCH_LEVEL (IPI_LEVEL - 2)
#endif
//
//
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;
+
+//
+// Defines the Callback Stack Layout for User Mode Callbacks
+//
+typedef struct _KCALLOUT_FRAME
+{
+ ULONG64 InitialStack;
+ ULONG64 TrapFrame;
+ ULONG64 CallbackStack;
+ ULONG64 Rdi;
+ ULONG64 Rsi;
+ ULONG64 Rbx;
+ ULONG64 Rbp;
+ ULONG64 ReturnAddress;
+ ULONG64 Result;
+ ULONG64 ResultLength;
+} KCALLOUT_FRAME, *PKCALLOUT_FRAME;
+
+//
+// Dummy LDT_ENTRY
+//
+typedef ULONG LDT_ENTRY;
//
// GDT Entry Definition
//
-typedef struct _KGDTENTRY
+typedef union _KGDTENTRY64
{
- USHORT LimitLow;
- USHORT BaseLow;
- union
+ struct
{
- struct
- {
- UCHAR BaseMid;
- UCHAR Flags1;
- UCHAR Flags2;
- UCHAR BaseHi;
- } Bytes;
- struct
+ USHORT LimitLow;
+ USHORT BaseLow;
+ union
{
- 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
//
// 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)__readgsqword(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;
//
//
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;
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
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)
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