--- /dev/null
--- /dev/null
-
-//
-// Trap Frame Offsets
-//
++ /*++ NDK Version: 0095
++
++ Copyright (c) Timo Kreuzer. All rights reserved.
++
++ Header Name:
++
++ amd64/asm.h
++
++ Abstract:
++
++ ASM Offsets for dealing with de-referencing structures in registers.
++
++ Author:
++
++ Timo Kreuzer (timo.kreuzer@reactos.org) 06-Sep-2008
++
++ --*/
++ #ifndef _ASM_AMD64_H
++ #define _ASM_AMD64_H
++
++
++ #define SIZEOF_FX_SAVE_AREA 528 // HACK
++
++ //
++ // CPU Modes
++ //
++ #define KernelMode 0x0
++ #define UserMode 0x1
++
++ //
++ // CPU Types
++ //
++ #define CPU_INTEL 0x1
++ #define CPU_AMD 0x2
++
++ //
++ // KTSS Offsets
++ //
++ #define KTSS64_RSP0 0x04
++ #define KTSS64_RSP1 0x0c
++ #define KTSS64_RSP2 0x14
++ #define KTSS64_IST 0x1c
++ #define KTSS64_IO_MAP_BASE 0x66
++
++ //
++ // KTHREAD Offsets
++ //
++ #define KTHREAD_DEBUG_ACTIVE 0x03
++ #define KTHREAD_INITIAL_STACK 0x28
++ #define KTHREAD_STACK_LIMIT 0x30
++ #define KTHREAD_WAIT_IRQL 0x156
++
++++//
++++// KPRCB Offsets
++++//
++++#define KPRCB_CurrentThread 0x08
++++
++
++ //
++ // KPCR Offsets
++ //
++ #define KPCR_TSS_BASE 0x08
++ #define KPCR_SELF 0x18
++ #define KPCR_STALL_SCALE_FACTOR 0x64
- // Trap Frame Offsets
++++#define KPCR_PRCB 0x180
++ +
++ +//
++++// KTRAP_FRAME Offsets
++ +//
++++#define KTRAP_FRAME_P1Home 0x00
++++#define KTRAP_FRAME_P2Home 0x08
++++#define KTRAP_FRAME_P3Home 0x10
++++#define KTRAP_FRAME_P4Home 0x18
++++#define KTRAP_FRAME_P5 0x20
++++#define KTRAP_FRAME_PreviousMode 0x28
++++#define KTRAP_FRAME_PreviousIrql 0x29
++++#define KTRAP_FRAME_FaultIndicator 0x2A
++++#define KTRAP_FRAME_ExceptionActive 0x2B
++++#define KTRAP_FRAME_MxCsr 0x2C
++++#define KTRAP_FRAME_Rax 0x30
++++#define KTRAP_FRAME_Rcx 0x38
++++#define KTRAP_FRAME_Rdx 0x40
++++#define KTRAP_FRAME_R8 0x48
++++#define KTRAP_FRAME_R9 0x50
++++#define KTRAP_FRAME_R10 0x58
++++#define KTRAP_FRAME_R11 0x60
++++#define KTRAP_FRAME_GsBase 0x68
++++#define KTRAP_FRAME_Xmm0 0x70
++++#define KTRAP_FRAME_Xmm1 0x80
++++#define KTRAP_FRAME_Xmm2 0x90
++++#define KTRAP_FRAME_Xmm3 0xA0
++++#define KTRAP_FRAME_Xmm4 0xB0
++++#define KTRAP_FRAME_Xmm5 0xC0
++++#define KTRAP_FRAME_FaultAddress 0xD0
++++#define KTRAP_FRAME_Dr0 0xD8
++++#define KTRAP_FRAME_Dr1 0xE0
++++#define KTRAP_FRAME_Dr2 0xE8
++++#define KTRAP_FRAME_Dr3 0xF0
++++#define KTRAP_FRAME_Dr6 0xF8
++++#define KTRAP_FRAME_Dr7 0x100
++++#define KTRAP_FRAME_DebugControl 0x108
++++#define KTRAP_FRAME_LastBranchToRip 0x110
++++#define KTRAP_FRAME_LastBranchFromRip 0x118
++++#define KTRAP_FRAME_LastExceptionToRip 0x120
++++#define KTRAP_FRAME_LastExceptionFromRip 0x128
++++#define KTRAP_FRAME_SegDs 0x130
++++#define KTRAP_FRAME_SegEs 0x132
++++#define KTRAP_FRAME_SegFs 0x134
++++#define KTRAP_FRAME_SegGs 0x136
++++#define KTRAP_FRAME_TrapFrame 0x138
++++#define KTRAP_FRAME_Rbx 0x140
++++#define KTRAP_FRAME_Rdi 0x148
++++#define KTRAP_FRAME_Rsi 0x150
++++#define KTRAP_FRAME_Rbp 0x158
++++#define KTRAP_FRAME_ErrorCode 0x160
++++#define KTRAP_FRAME_Rip 0x168
++++#define KTRAP_FRAME_SegCs 0x170
++++#define KTRAP_FRAME_Logging 0x173
++++#define KTRAP_FRAME_EFlags 0x178
++++#define KTRAP_FRAME_Rsp 0x180
++++#define KTRAP_FRAME_SegSs 0x188
++++#define KTRAP_FRAME_CodePatchCycle 0x18c
++++#define SIZE_KTRAP_FRAME 0x190
++ #define KTRAP_FRAME_ALIGN 0x10
++ #define KTRAP_FRAME_LENGTH 0x190
++
+++ //
+++ // CONTEXT Offsets
+++ //
+++ #define CONTEXT_P1Home 0
+++ #define CONTEXT_P2Home 0x08
+++ #define CONTEXT_P3Home 0x10
+++ #define CONTEXT_P4Home 0x18
+++ #define CONTEXT_P5Home 0x20
+++ #define CONTEXT_P6Home 0x28
+++ #define CONTEXT_ContextFlags 0x30
+++ #define CONTEXT_MxCsr 0x34
+++ #define CONTEXT_SegCs 0x38
+++ #define CONTEXT_SegDs 0x3a
+++ #define CONTEXT_SegEs 0x3c
+++ #define CONTEXT_SegFs 0x3e
+++ #define CONTEXT_SegGs 0x40
+++ #define CONTEXT_SegSs 0x42
+++ #define CONTEXT_EFlags 0x44
+++ #define CONTEXT_Dr0 0x48
+++ #define CONTEXT_Dr1 0x50
+++ #define CONTEXT_Dr2 0x58
+++ #define CONTEXT_Dr3 0x60
+++ #define CONTEXT_Dr6 0x68
+++ #define CONTEXT_Dr7 0x70
+++ #define CONTEXT_Rax 0x78
+++ #define CONTEXT_Rcx 0x80
+++ #define CONTEXT_Rdx 0x88
+++ #define CONTEXT_Rbx 0x90
+++ #define CONTEXT_Rsp 0x98
+++ #define CONTEXT_Rbp 0xa0
+++ #define CONTEXT_Rsi 0xa8
+++ #define CONTEXT_Rdi 0xb0
+++ #define CONTEXT_R8 0xb8
+++ #define CONTEXT_R9 0xc0
+++ #define CONTEXT_R10 0xc8
+++ #define CONTEXT_R11 0xd0
+++ #define CONTEXT_R12 0xd8
+++ #define CONTEXT_R13 0xe0
+++ #define CONTEXT_R14 0xe8
+++ #define CONTEXT_R15 0xf0
+++ #define CONTEXT_Rip 0xf8
+++ #define CONTEXT_Header 0x100
+++ #define CONTEXT_Legacy 0x120
+++ #define CONTEXT_Xmm0 0x1a0
+++ #define CONTEXT_Xmm1 0x1b0
+++ #define CONTEXT_Xmm2 0x1c0
+++ #define CONTEXT_Xmm3 0x1d0
+++ #define CONTEXT_Xmm4 0x1e0
+++ #define CONTEXT_Xmm5 0x1f0
+++ #define CONTEXT_Xmm6 0x200
+++ #define CONTEXT_Xmm7 0x210
+++ #define CONTEXT_Xmm8 0x220
+++ #define CONTEXT_Xmm9 0x230
+++ #define CONTEXT_Xmm10 0x240
+++ #define CONTEXT_Xmm11 0x250
+++ #define CONTEXT_Xmm12 0x260
+++ #define CONTEXT_Xmm13 0x270
+++ #define CONTEXT_Xmm14 0x280
+++ #define CONTEXT_Xmm15 0x290
+++ #define CONTEXT_VectorRegister 0x300
+++ #define CONTEXT_VectorControl 0x4a0
+++ #define CONTEXT_DebugControl 0x4a8
+++ #define CONTEXT_LastBranchToRip 0x4b0
+++ #define CONTEXT_LastBranchFromRip 0x4b8
+++ #define CONTEXT_LastExceptionToRip 0x4c0
+++ #define CONTEXT_LastExceptionFromRip 0x4c8
+++
++++//
++++// EXCEPTION_RECORD Offsets
++++//
++++#define EXCEPTION_RECORD_ExceptionCode 0x00
++++#define EXCEPTION_RECORD_ExceptionFlags 0x04
++++#define EXCEPTION_RECORD_ExceptionRecord 0x08
++++#define EXCEPTION_RECORD_ExceptionAddress 0x10
++++#define EXCEPTION_RECORD_NumberParameters 0x18
++++#define EXCEPTION_RECORD_ExceptionInformation 0x20
++++#define SIZE_EXCEPTION_RECORD 0x98
++++
++ //
++ // CR0
++ //
++ #define CR0_PE 0x1
++ #define CR0_MP 0x2
++ #define CR0_EM 0x4
++ #define CR0_TS 0x8
++ #define CR0_ET 0x10
++ #define CR0_NE 0x20
++ #define CR0_WP 0x10000
++ #define CR0_AM 0x40000
++ #define CR0_NW 0x20000000
++ #define CR0_CD 0x40000000
++ #define CR0_PG 0x80000000
++
++++//
++++// 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
++++
++ //
++ // Generic Definitions
++ //
++ #define PRIMARY_VECTOR_BASE 0x30
++ #define MAXIMUM_IDTVECTOR 0xFF
++
++++//
++++// Usermode callout frame definitions
++++//
++++#define CBSTACK_STACK 0x0
++++#define CBSTACK_TRAP_FRAME 0x8
++++#define CBSTACK_CALLBACK_STACK 0x10
++++#define CBSTACK_RBP 0x18
++++#define CBSTACK_RESULT 0x20
++++#define CBSTACK_RESULT_LENGTH 0x28
++++#define CBSTACK_FRAME_POINTER CBSTACK_RBP
++++
++
++ /* Following ones are ASM only! ***********************************************/
++
++ #ifdef __ASM__
++
++ //
++ // PCR Access
++ //
++ #define PCR gs:
++
++ //
++ // EFLAGS
++ //
++ #define EFLAGS_TF 0x100
++ #define EFLAGS_INTERRUPT_MASK 0x200
++ #define EFLAGS_NESTED_TASK 0x4000
++ #define EFLAGS_V86_MASK 0x20000
++ #define EFLAGS_ALIGN_CHECK 0x40000
++ #define EFLAGS_VIF 0x80000
++ #define EFLAGS_VIP 0x100000
++ #define EFLAG_SIGN 0x8000
++ #define EFLAG_ZERO 0x4000
++ #define EFLAG_SELECT (EFLAG_SIGN + EFLAG_ZERO)
++ #define EFLAGS_USER_SANITIZE 0x3F4DD7
++
++++//
++++// NTSTATUS and Bugcheck Codes
++++//
++++#define STATUS_ACCESS_VIOLATION 0xC0000005
++++#define STATUS_IN_PAGE_ERROR 0xC0000006
++++#define STATUS_GUARD_PAGE_VIOLATION 0x80000001
++++#define STATUS_PRIVILEGED_INSTRUCTION 0xC0000096
++++#define STATUS_STACK_OVERFLOW 0xC00000FD
++++#define KI_EXCEPTION_ACCESS_VIOLATION 0x10000004
++++#define STATUS_INVALID_SYSTEM_SERVICE 0xC000001C
++++#define STATUS_NO_CALLBACK_ACTIVE 0xC0000258
++++#define STATUS_CALLBACK_POP_STACK 0xC0000423
++++#define STATUS_ARRAY_BOUNDS_EXCEEDED 0xC000008C
++++#define STATUS_ILLEGAL_INSTRUCTION 0xC000001D
++++#define STATUS_INVALID_LOCK_SEQUENCE 0xC000001E
++++#define STATUS_BREAKPOINT 0x80000003
++++#define STATUS_SINGLE_STEP 0x80000004
++++#define STATUS_INTEGER_DIVIDE_BY_ZERO 0xC0000094
++++#define STATUS_INTEGER_OVERFLOW 0xC0000095
++++#define STATUS_FLOAT_DENORMAL_OPERAND 0xC000008D
++++#define STATUS_FLOAT_DIVIDE_BY_ZERO 0xC000008E
++++#define STATUS_FLOAT_INEXACT_RESULT 0xC000008F
++++#define STATUS_FLOAT_INVALID_OPERATION 0xC0000090
++++#define STATUS_FLOAT_OVERFLOW 0xC0000091
++++#define STATUS_FLOAT_STACK_CHECK 0xC0000092
++++#define STATUS_FLOAT_UNDERFLOW 0xC0000093
++++#define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4
++++#define STATUS_FLOAT_MULTIPLE_TRAPS 0xC00002B5
++++#define APC_INDEX_MISMATCH 0x01
++++#define IRQL_NOT_GREATER_OR_EQUAL 0x09
++++#define IRQL_NOT_LESS_OR_EQUAL 0x0A
++++#define TRAP_CAUSE_UNKNOWN 0x12
++++#define KMODE_EXCEPTION_NOT_HANDLED 0x13
++++#define IRQL_GT_ZERO_AT_SYSTEM_SERVICE 0x4A
++++#define UNEXPECTED_KERNEL_MODE_TRAP 0x7F
++++#define ATTEMPTED_SWITCH_FROM_DPC 0xB8
++++#define HARDWARE_INTERRUPT_STORM 0xF2
++
++ //
++ // IRQL Levels
++ //
++ #define PASSIVE_LEVEL 0
++ #define LOW_LEVEL 0
++ #define APC_LEVEL 1
++ #define DISPATCH_LEVEL 2
++ #define CLOCK_LEVEL 13
++ #define IPI_LEVEL 14
++ #define POWER_LEVEL 14
++ #define PROFILE_LEVEL 15
++ #define HIGH_LEVEL 15
++
++ //
++ // Quantum Decrements
++ //
++ #define CLOCK_QUANTUM_DECREMENT 0x3
++
++ //
++ // Machine types
++ //
++ #define MACHINE_TYPE_ISA 0x0000
++ #define MACHINE_TYPE_EISA 0x0001
++ #define MACHINE_TYPE_MCA 0x0002
++
++ //
++ // Kernel Feature Bits
++ //
++ #define KF_RDTSC 0x00000002
++
++ //
++ // Kernel Stack Size
++ //
++ #define KERNEL_STACK_SIZE 0x6000
++
++ #endif // __ASM__
++
++ #endif // !_ASM_AMD64_H
++
--- /dev/null
- ketypes.h (X86)
+ /*++ NDK Version: 0098
+
+ Copyright (c) Alex Ionescu. All rights reserved.
++ Copyright (c) Timo Kreuzer. All rights reserved.
+
+ Header Name:
+
- i386 Type definitions for the Kernel services.
++ ketypes.h (AMD64)
+
+ Abstract:
+
- #ifndef _I386_KETYPES_H
- #define _I386_KETYPES_H
++ 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
+
+ --*/
+
- #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
++ #ifndef _AMD64_KETYPES_H
++ #define _AMD64_KETYPES_H
+
+ //
+ // Dependencies
+ //
+
+ //
+ // KPCR Access for non-IA64 builds
+ //
- #define PCR ((volatile KPCR * const)__readgsqword(KPCR_SELF))
++ //#define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
++ //#define PCR ((volatile KPCR * const)K0IPCR)
- #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 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 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 KSEG0_BASE 0x80000000
++ #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
+ //
+ #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_NESTED_TASK 0x4000L
+ #define EFLAGS_V86_MASK 0x20000
+ #define EFLAGS_ALIGN_CHECK 0x40000
+ #define EFLAGS_VIF 0x80000
+ #define EFLAGS_VIP 0x100000
+ #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))
+
+ //
+ // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
+ //
- #define SYNCH_LEVEL (IPI_LEVEL - 1)
++ #define KSEG0_BASE 0xfffff80000000000ULL
+
+ //
+ // Synchronization-level IRQL
+ //
+ #ifndef CONFIG_SMP
+ #define SYNCH_LEVEL DISPATCH_LEVEL
+ #else
- 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;
++ #define SYNCH_LEVEL (IPI_LEVEL - 2)
+ #endif
+
+ //
+ // Trap Frame Definition
+ //
+ typedef struct _KTRAP_FRAME
+ {
-- UINT64 GsBase;
-- UINT64 GsSwap;
++ 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;
-- UINT64 FaultAddress;
-- UINT64 ContextRecord;
-- UINT64 TimeStampCKCL;
++++ union
++++ {
++++ UINT64 GsBase;
++++ UINT64 GsSwap;
++++ };
++ M128A Xmm0;
++ M128A Xmm1;
++ M128A Xmm2;
++ M128A Xmm3;
++ M128A Xmm4;
++ M128A Xmm5;
-- UINT64 DebugControl;
-- UINT64 LastBranchToRip;
-- UINT64 LastBranchFromRip;
-- UINT64 LastExceptionToRip;
-- UINT64 LastExceptionFromRip;
-- UINT64 LastBranchControl;
-- ULONG LastBranchMSR;
++++ union
++++ {
++++ UINT64 FaultAddress;
++++ UINT64 ContextRecord;
++++ UINT64 TimeStampCKCL;
++++ };
++ UINT64 Dr0;
++ UINT64 Dr1;
++ UINT64 Dr2;
++ UINT64 Dr3;
++ UINT64 Dr6;
++ UINT64 Dr7;
- UCHAR BaseMid;
- UCHAR Flags1;
- UCHAR Flags2;
- UCHAR BaseHi;
- } Bytes;
+ ++ union
+ ++ {
+ ++ 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 DebugControl;
++++ UINT64 LastBranchToRip;
++++ UINT64 LastBranchFromRip;
++++ UINT64 LastExceptionToRip;
++++ UINT64 LastExceptionFromRip;
++++ };
+ ++ struct
+ ++ {
-- UINT64 ErrorCode;
-- UINT64 ExceptionFrame;
-- UINT64 TimeStampKlog;
++++ UINT64 LastBranchControl;
++++ ULONG LastBranchMSR;
++++ };
++++ };
++ USHORT SegDs;
++ USHORT SegEs;
++ USHORT SegFs;
++ USHORT SegGs;
++ UINT64 TrapFrame;
++ UINT64 Rbx;
++ UINT64 Rdi;
++ UINT64 Rsi;
++ UINT64 Rbp;
- typedef struct _KGDTENTRY
++++ 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
+ //
- USHORT LimitLow;
- USHORT BaseLow;
- union
++ typedef union _KGDTENTRY64
+ {
- struct
++ 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;
++ USHORT LimitLow;
++ USHORT BaseLow;
++ union
+ {
- typedef struct _KIDTENTRY
++ 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
+ //
+ 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
+ //
- USHORT Offset;
- USHORT Selector;
- USHORT Access;
- USHORT ExtendedOffset;
- } KIDTENTRY, *PKIDTENTRY;
++ typedef union _KIDTENTRY64
+ {
- typedef struct _DESCRIPTOR
++ 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
+
- USHORT Pad;
++ typedef struct _KDESCRIPTOR
+ {
- ULONG Base;
++ USHORT Pad[3];
+ USHORT Limit;
- //
- // 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;
++ PVOID Base;
+ } KDESCRIPTOR, *PKDESCRIPTOR;
+
+ #ifndef NTOS_MODE_USER
- ULONG Cr0;
- ULONG Cr2;
- ULONG Cr3;
- ULONG Cr4;
- ULONG KernelDr0;
- ULONG KernelDr1;
- ULONG KernelDr2;
- ULONG KernelDr3;
- ULONG KernelDr6;
- ULONG KernelDr7;
- KDESCRIPTOR Gdtr;
- KDESCRIPTOR Idtr;
+
+ //
+ // Special Registers Structure (outside of CONTEXT)
+ //
+ typedef struct _KSPECIAL_REGISTERS
+ {
- ULONG Reserved[6];
++ 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;
- CONTEXT ContextFrame;
++ 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;
+
+ //
+ // Processor State Data
+ //
+ typedef struct _KPROCESSOR_STATE
+ {
- USHORT MinorVersion;
- USHORT MajorVersion;
+ 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
+ {
- UCHAR Number;
- UCHAR Reserved;
- USHORT BuildType;
- KAFFINITY SetMember;
- UCHAR CpuType;
- UCHAR CpuID;
- USHORT CpuStep;
- KPROCESSOR_STATE ProcessorState;
- ULONG KernelReserved[16];
- ULONG HalReserved[16];
++ 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;
- ULONG CFlushSize;
- UCHAR PrcbPad0[88];
+ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
- UCHAR PrcbPad0[92];
++ UCHAR NestingLevel;
++ UCHAR Group;
++ UCHAR PrcbPad00[6];
+ #else
- 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 UserRsp;
+ #endif
- UCHAR PollSlot;
++ UINT64 RspBase;
++ UINT64 PrcbLock;
++ UINT64 SetMember;
++ KPROCESSOR_STATE ProcessorState;
++ CHAR CpuType;
++ CHAR CpuID;
+ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
- UCHAR Spare1;
++ union
++ {
++ USHORT CpuStep;
++ struct
++ {
++ UCHAR CpuStepping;
++ UCHAR CpuModel;
++ };
++ };
+ #else
- ULONG NodeShiftedColor;
++ USHORT CpuStep;
+ #endif
- UCHAR Spare1[6];
++ ULONG MHz;
++ UINT64 HalReserved[8];
++ USHORT MinorVersion;
++ USHORT MajorVersion;
++ UCHAR BuildType;
++ UCHAR CpuVendor;
++ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
++ UCHAR CoresPerPhysicalProcessor;
++ UCHAR LogicalProcessorsPerCore;
+ #else
- struct _KNODE *ParentNode;
- ULONG MultiThreadProcessorSet;
- struct _KPRCB *MultiThreadSetMaster;
- #if (NTDDI_VERSION >= NTDDI_WS03)
- ULONG SecondaryColorMask;
++ UCHAR InitialApicId;
++ UCHAR LogicalProcessorsPerPhysicalProcessor;
+ #endif
- ULONG DpcTimeLimit;
++ ULONG ApicMask;
+ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
- LONG Sleeping;
++ ULONG CFlushSize;
+ #else
- ULONG ThreadStartCount[2];
++ UCHAR CFlushSize;
++ UCHAR PrcbPad0x[3];
+ #endif
++ PVOID AcpiReserved;
++ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
++ ULONG InitialApicId;
++ ULONG Stride;
++ UINT64 PrcbPad01[3];
+ #else
- #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;
++ 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;
- volatile ULONG IoReadOperationCount;
- volatile ULONG IoWriteOperationCount;
- volatile ULONG IoOtherOperationCount;
++ LONG LookasideIrpFloat;
++ #else
++ LONG LookasideIrpFloat;
+ ULONG KeSystemCalls;
+ #endif
- 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];
++ 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 SpareCounter1[8];
++ PVOID SparePtr0;
+ #else
- 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;
++ PVOID SavedRsp;
+ #endif
- volatile UCHAR DpcInterruptRequested;
- volatile UCHAR DpcThreadRequested;
- volatile UCHAR DpcRoutineActive;
- volatile UCHAR DpcThreadActive;
- ULONG PrcbLock;
++ LONG MaximumDpcQueueDepth;
+ ULONG DpcRequestRate;
+ ULONG MinimumDpcRate;
- volatile ULONG TimerHand;
- volatile ULONG TimerRequest;
- PVOID DpcThread;
- KEVENT DpcEvent;
++ UCHAR DpcInterruptRequested;
++ UCHAR DpcThreadRequested;
++ UCHAR DpcRoutineActive;
++ UCHAR DpcThreadActive;
++ UINT64 TimerHand;
++ UINT64 TimerRequest;
++ LONG TickOffset;
++ LONG MasterOffset;
+ ULONG DpcLastCount;
- volatile BOOLEAN QuantumEnd;
+ UCHAR ThreadDpcEnable;
- volatile UCHAR IdleSchedule;
++ UCHAR QuantumEnd;
+ UCHAR PrcbPad50;
- LONG Sleeping;
- ULONG PeriodicCount;
- ULONG PeriodicBias;
- UCHAR PrcbPad5[6];
++ UCHAR IdleSchedule;
+ LONG DpcSetEventRequest;
+ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
- UCHAR PrcbPad5[18];
++ ULONG KeExceptionDispatchCount;
+ #else
- LONG TickOffset;
++ LONG PrcbPad40;
++ PVOID DpcThread;
++ #endif
++ KEVENT DpcEvent;
++ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
++ PVOID PrcbPad51;
+ #endif
- LONG DpcWatchDogCount;
- LONG ThreadWatchdogPeriod;
- LONG ThreadWatchDogCount;
- ULONG PrcbPad70[2];
+ KDPC CallDpc;
+ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
+ LONG ClockKeepAlive;
+ UCHAR ClockCheckSlot;
+ UCHAR ClockPollCycle;
+ UCHAR PrcbPad6[2];
+ LONG DpcWatchdogPeriod;
- ULONG PrcbPad7[8];
++ LONG DpcWatchdogCount;
++ UINT64 PrcbPad70[2];
+ #else
- SINGLE_LIST_ENTRY DeferredReadyListHead;
- ULONGLONG StartCycles;
- ULONGLONG CycleTime;
- ULONGLONG PrcbPad71[3];
++ UINT64 PrcbPad7[4];
+ #endif
+ LIST_ENTRY WaitListHead;
++ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
++ UINT64 WaitLock;
++ #endif
+ ULONG ReadySummary;
+ ULONG QueueIndex;
+ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
- LIST_ENTRY DispatcherReadyListHead[32];
- SINGLE_LIST_ENTRY DeferredReadyListHead;
- ULONG PrcbPad72[11];
++ 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
- 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;
++ UCHAR PrcbPad8[13];
+ #endif
- ULONG CachedCommit;
- ULONG CachedResidentAvailable;
- PVOID HyperPte;
- UCHAR CpuVendor;
- UCHAR PrcbPad9[3];
- #else
- ULONG SpareFields0[1];
++ struct _KNODE *ParentNode;
++ UINT64 MultiThreadProcessorSet;
++ struct _KPRCB *MultiThreadSetMaster;
+ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
- CHAR VendorString[13];
- UCHAR InitialApicId;
- UCHAR LogicalProcessorsPerPhysicalProcessor;
- ULONG MHz;
++ UINT64 StartCycles;
++ LONG MmSpinLockOrdering;
++ ULONG PageColor;
++ ULONG NodeColor;
++ ULONG NodeShiftedColor;
++ ULONG SecondaryColorMask;
+ #endif
- volatile LARGE_INTEGER IsrTime;
- LARGE_INTEGER SpareField1;
- FX_SAVE_AREA NpxSaveArea;
- PROCESSOR_POWER_STATE PowerState;
- #if (NTDDI_VERSION >= NTDDI_LONGHORN)
- KDPC DpcWatchdogDoc;
++ 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;
- LARGE_INTEGER HyperCallPagePhysical;
- LARGE_INTEGER HyperCallPageVirtual;
++ KDPC DpcWatchdogDpc;
+ KTIMER DpcWatchdogTimer;
++ CACHE_DESCRIPTOR Cache[5];
++ ULONG CacheCount;
++ ULONG CachedCommit;
++ ULONG CachedResidentAvailable;
++ PVOID HyperPte;
+ PVOID WheaInfo;
+ PVOID EtwSupport;
+ SLIST_HEADER InterruptObjectPool;
- ULONG CacheProcessorMask[5];
- UCHAR LogicalProcessorsPerCore;
- UCHAR PrcbPad8[3];
- ULONG PackageProcessorSet;
- ULONG CoreProcessorSet;
++ 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;
- } KPRCB, *PKPRCB;
+ #endif
- struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
- PVOID Used_StackBase;
- PVOID PerfGlobalGroupMask;
- PVOID TssCopy;
- ULONG ContextSwitches;
- KAFFINITY SetMemberCopy;
++ }
++ KPRCB, *PKPRCB;
+
+ //
+ // Processor Control Region
+ //
+ typedef struct _KIPCR
+ {
+ union
+ {
+ NT_TIB NtTib;
+ struct
+ {
- struct _KPCR *Self;
- struct _KPRCB *Prcb;
++ union _KGDTENTRY64 *GdtBase;
++ struct _KTSS64 *TssBase;
++ ULONG64 UserRsp;
++ struct _KPCR *Self;
++ struct _KPRCB *CurrentPrcb;
++ PKSPIN_LOCK_QUEUE LockArray;
+ PVOID Used_Self;
+ };
+ };
- ULONG IRR;
- ULONG IrrActive;
- ULONG IDR;
- PVOID KdVersionBlock;
- PKIDTENTRY IDT;
- PKGDTENTRY GDT;
- struct _KTSS *TSS;
++ union _KIDTENTRY64 *IdtBase;
++ ULONG64 Unused[2];
+ KIRQL Irql;
- KAFFINITY SetMember;
++ UCHAR SecondLevelCacheAssociativity;
++ UCHAR ObsoleteNumber;
++ UCHAR Fill0;
++ ULONG Unused0[3];
+ USHORT MajorVersion;
+ USHORT MinorVersion;
- UCHAR SparedUnused;
- UCHAR Number;
- UCHAR Reserved;
- UCHAR L2CacheAssociativity;
- ULONG VdmAlert;
- ULONG KernelReserved[14];
+ ULONG StallScaleFactor;
- ULONG InterruptMode;
- UCHAR Spare1;
- ULONG KernelReserved2[17];
- KPRCB PrcbData;
++ PVOID Unused1[3];
++ ULONG KernelReserved[15];
+ ULONG SecondLevelCacheSize;
+ ULONG HalReserved[16];
- typedef struct _KTSS
++ 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)
+
+ //
+ // TSS Definition
+ //
+ typedef struct _KiIoAccessMap
+ {
+ UCHAR DirectionMap[32];
+ UCHAR IoMap[8196];
+ } KIIO_ACCESS_MAP;
+
- 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;
++
++ #pragma pack(push,4)
++ typedef struct _KTSS64
+ {
++ /* 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
--- /dev/null
- mmtypes.h (X86)
+ /*++ NDK Version: 0095
+
+ Copyright (c) Alex Ionescu. All rights reserved.
++ Copyright (c) Timo Kreuzer All rights reserved.
+
+ Header Name:
+
- i386 Type definitions for the Memory Manager
++ mmtypes.h (AMD64)
+
+ Abstract:
+
- //
- // PAE SEG0 Base?
- //
- #define KSEG0_BASE_PAE 0xE0000000
-
++ AMD64 Type definitions for the Memory Manager
+
+ Author:
+
+ Alex Ionescu (alex.ionescu@reactos.com) 06-Oct-2004
++ Timo Kreuzer (timo.kreuzer@reactos.com) 15-Aug-2008
+
+ --*/
+
+ #ifndef _AMD64_MMTYPES_H
+ #define _AMD64_MMTYPES_H
+
+ //
+ // Dependencies
+ //
+
+ //
+ // Page-related Macros
+ //
+ #define PAGE_SIZE 0x1000
+ #define PAGE_SHIFT 12L
+ #define MM_ALLOCATION_GRANULARITY 0x10000
+ #define MM_ALLOCATION_GRANULARITY_SHIFT 16L
+
+ //
+ // Sanity checks for Paging Macros
+ //
+ #ifdef C_ASSERT
+ C_ASSERT(PAGE_SIZE == (1 << PAGE_SHIFT));
+ C_ASSERT(MM_ALLOCATION_GRANULARITY == (1 << MM_ALLOCATION_GRANULARITY_SHIFT));
+ C_ASSERT(MM_ALLOCATION_GRANULARITY &&
+ !(MM_ALLOCATION_GRANULARITY & (MM_ALLOCATION_GRANULARITY - 1)));
+ C_ASSERT(MM_ALLOCATION_GRANULARITY >= PAGE_SIZE);
+ #endif
+
- typedef struct _HARDWARE_PTE_X86
+ //
+ // Page Table Entry Definitions
+ //
- 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;
-- ULONG64 Valid:1;
-- ULONG64 Write:1;
-- ULONG64 Owner:1;
-- ULONG64 WriteThrough:1;
-- ULONG64 CacheDisable:1;
-- ULONG64 Accessed:1;
-- ULONG64 Dirty:1;
-- ULONG64 LargePage:1;
-- ULONG64 Global:1;
-- ULONG64 CopyOnWrite:1;
-- ULONG64 Prototype:1;
-- ULONG64 reserved0:1;
-- ULONG64 PageFrameNumber:28;
-- ULONG64 reserved1:12;
-- ULONG64 SoftwareWsIndex:11;
-- ULONG64 NoExecute:1;
++ typedef struct _HARDWARE_PTE
+ {
- ULONG Valid:1;
- ULONG PageFileLow:4;
- ULONG Protection:5;
- ULONG Prototype:1;
- ULONG Transition:1;
- ULONG PageFileHigh:20;
- } MMPTE_SOFTWARE;
++++ ULONG64 Valid:1;
++++ ULONG64 Write:1;
++++ ULONG64 Owner:1;
++++ ULONG64 WriteThrough:1;
++++ ULONG64 CacheDisable:1;
++++ ULONG64 Accessed:1;
++++ ULONG64 Dirty:1;
++++ ULONG64 LargePage:1;
++++ ULONG64 Global:1;
++++ ULONG64 CopyOnWrite:1;
++++ ULONG64 Prototype:1;
++++ ULONG64 reserved0:1;
++++ ULONG64 PageFrameNumber:28;
++++ ULONG64 reserved1:12;
++++ ULONG64 SoftwareWsIndex:11;
++++ ULONG64 NoExecute:1;
++ } HARDWARE_PTE, *PHARDWARE_PTE;
+
+ typedef struct _MMPTE_SOFTWARE
+ {
- ULONG Valid:1;
- ULONG Write:1;
- ULONG Owner:1;
- ULONG WriteThrough:1;
- ULONG CacheDisable:1;
- ULONG Protection:5;
- ULONG Prototype:1;
- ULONG Transition:1;
- ULONG PageFrameNumber:20;
++ ULONG64 Valid:1;
++ ULONG64 PageFileLow:4;
++ ULONG64 Protection:5;
++ ULONG64 Prototype:1;
++ ULONG64 Transition:1;
++ ULONG64 UsedPageTableEntries:10;
++ ULONG64 Reserved:10;
++ ULONG64 PageFileHigh:32;
++ } MMPTE_SOFTWARE, *PMMPTE_SOFTWARE;
+
+ typedef struct _MMPTE_TRANSITION
+ {
- ULONG Valid:1;
- ULONG ProtoAddressLow:7;
- ULONG ReadOnly:1;
- ULONG WhichPool:1;
- ULONG Prototype:1;
- ULONG ProtoAddressHigh:21;
++ ULONG64 Valid:1;
++ ULONG64 Write:1;
++ ULONG64 Owner:1;
++ ULONG64 WriteThrough:1;
++ ULONG64 CacheDisable:1;
++ ULONG64 Protection:5;
++ ULONG64 Prototype:1;
++ ULONG64 Transition:1;
++ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
++ ULONG64 PageFrameNumber:36;
++ ULONG64 Unused:16;
++ #else
++ ULONG64 PageFrameNumber:28;
++ ULONG64 Unused:24;
++ #endif
+ } MMPTE_TRANSITION;
+
+ typedef struct _MMPTE_PROTOTYPE
+ {
- ULONG Valid:1;
- ULONG SubsectionAddressLow:4;
- ULONG Protection:5;
- ULONG Prototype:1;
- ULONG SubsectionAddressHigh:20;
- ULONG WhichPool:1;
++ ULONG64 Valid:1;
++ ULONG64 Unused0:7;
++ ULONG64 ReadOnly:1;
++ ULONG64 Unused1:1;
++ ULONG64 Prototype:1;
++ ULONG64 Protection:5;
++ LONG64 ProtoAddress:48;
+ } MMPTE_PROTOTYPE;
+
+ typedef struct _MMPTE_SUBSECTION
+ {
- ULONG Valid:1;
- ULONG OneEntry:1;
- ULONG filler0:8;
- ULONG NextEntry:20;
- ULONG Prototype:1;
- ULONG filler1:1;
++ ULONG64 Valid:1;
++ ULONG64 Unused0:4;
++ ULONG64 Protection:5;
++ ULONG64 Prototype:1;
++ ULONG64 Unused1:5;
++ LONG64 SubsectionAddress:48;
+ } MMPTE_SUBSECTION;
+
+ typedef struct _MMPTE_LIST
+ {
---#ifndef CONFIG_SMP
--
--typedef struct _MMPTE_HARDWARE
--{
-- ULONG64 Valid:1;
-- ULONG64 Write:1;
-- ULONG64 Owner:1;
-- ULONG64 WriteThrough:1;
-- ULONG64 CacheDisable:1;
-- ULONG64 Accessed:1;
-- ULONG64 Dirty:1;
-- ULONG64 LargePage:1;
-- ULONG64 Global:1;
-- ULONG64 CopyOnWrite:1;
-- ULONG64 Prototype:1;
-- ULONG64 reserved0:1;
-- ULONG64 PageFrameNumber:28;
-- ULONG64 reserved1:12;
-- ULONG64 SoftwareWsIndex:11;
-- ULONG64 NoExecute:1;
--} MMPTE_HARDWARE, *PMMPTE_HARDWARE;
--
--#else
---
++ ULONG64 Valid:1;
++ ULONG64 OneEntry:1;
++ ULONG64 filler0:3;
++ ULONG64 Protection:5;
++ ULONG64 Prototype:1;
++ ULONG64 Transition:1;
++ ULONG64 filler1:20;
++ ULONG64 NextEntry:32;
+ } MMPTE_LIST;
+
- 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;
- } MMPTE_HARDWARE, *PMMPTE_HARDWARE;
-
+ typedef struct _MMPTE_HARDWARE
+ {
-
- typedef struct _MMPTE_HARDWARE
- {
- ULONG Valid:1;
- ULONG Writable: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 Write:1;
- ULONG PageFrameNumber:20;
++ ULONG64 Valid:1;
++ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
++ ULONG64 Dirty1:1;
+ #else
-- ULONG64 Write:1;
++++#ifdef CONFIG_SMP
++ ULONG64 Writable:1;
++++#else
++++ ULONG64 Write:1;
++++#endif
++ #endif
++ ULONG64 Owner:1;
++ ULONG64 WriteThrough:1;
++ ULONG64 CacheDisable:1;
++ ULONG64 Accessed:1;
++ ULONG64 Dirty:1;
++ ULONG64 LargePage:1;
++ ULONG64 Global:1;
++ ULONG64 CopyOnWrite:1;
++ ULONG64 Prototype:1;
--#endif
--
++ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
++++ ULONG64 Write:1;
++ ULONG64 PageFrameNumber:36;
++ ULONG64 reserved1:4;
++ #else
++++#ifdef CONFIG_SMP
++++ ULONG64 Write:1;
++++#else
++++ ULONG64 reserved0:1;
++++#endif
++ ULONG64 PageFrameNumber:28;
++ ULONG64 reserved1:12;
++ #endif
++ ULONG64 SoftwareWsIndex:11;
++ ULONG64 NoExecute:1;
+ } MMPTE_HARDWARE, *PMMPTE_HARDWARE;
+
- //
- // Use the right PTE structure
- //
- #define HARDWARE_PTE HARDWARE_PTE_X86
- #define PHARDWARE_PTE PHARDWARE_PTE_X86
++ typedef struct _MMPTE_HARDWARE_LARGEPAGE
++ {
++ ULONG64 Valid:1;
++ ULONG64 Write:1;
++ ULONG64 Owner:1;
++ ULONG64 WriteThrough:1;
++ ULONG64 CacheDisable:1;
++ ULONG64 Accessed:1;
++ ULONG64 Dirty:1;
++ ULONG64 LargePage:1;
++ ULONG64 Global:1;
++ ULONG64 CopyOnWrite:1;
++ ULONG64 Prototype:1;
++ ULONG64 reserved0:1;
++ ULONG64 PAT:1;
++ ULONG64 reserved1:8;
++ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
++ ULONG64 PageFrameNumber:27;
++ ULONG64 reserved2:16;
++ #else
++ ULONG64 PageFrameNumber:19;
++ ULONG64 reserved2:24;
+ #endif
++ } MMPTE_HARDWARE_LARGEPAGE, *PMMPTE_HARDWARE_LARGEPAGE;
+
- #endif
+
++ #endif // !AMD64_MMTYPES_H