mirror of
https://github.com/reactos/reactos.git
synced 2024-08-19 18:02:55 +00:00
![Hermès Bélusca-Maïto](/assets/img/avatar_default.png)
Add KGDT_NULL and KGDT_VDM_TILE to the list of known GDT name defines. See https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/dg--display-selector-
911 lines
21 KiB
C
911 lines
21 KiB
C
/*++ 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 ((KPCR *)K0IPCR)
|
|
#if defined(CONFIG_SMP) || defined(NT_BUILD)
|
|
#undef KeGetPcr
|
|
#define KeGetPcr() ((KPCR *)__readfsdword(FIELD_OFFSET(KPCR, SelfPcr)))
|
|
#endif
|
|
|
|
//
|
|
// CPU Vendors
|
|
//
|
|
typedef enum
|
|
{
|
|
CPU_NONE = 0,
|
|
CPU_INTEL = 1,
|
|
CPU_AMD = 2,
|
|
CPU_CYRIX = 3,
|
|
CPU_TRANSMETA = 4,
|
|
CPU_VIA = 5,
|
|
CPU_CENTAUR = CPU_VIA,
|
|
CPU_RISE = 6,
|
|
CPU_UNKNOWN = 7
|
|
} CPU_VENDORS;
|
|
|
|
//
|
|
// 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_NULL 0x00
|
|
#define KGDT_R0_CODE 0x08
|
|
#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_VDM_TILE 0x40
|
|
#define KGDT_LDT 0x48
|
|
#define KGDT_DF_TSS 0x50
|
|
#define KGDT_NMI_TSS 0x58
|
|
|
|
//
|
|
// Define the number of GDTs that can be queried by user mode
|
|
//
|
|
#define KGDT_NUMBER 10
|
|
|
|
//
|
|
// 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
|
|
|
|
//
|
|
// Legacy floating status word bit masks.
|
|
//
|
|
#define FSW_INVALID_OPERATION 0x1
|
|
#define FSW_DENORMAL 0x2
|
|
#define FSW_ZERO_DIVIDE 0x4
|
|
#define FSW_OVERFLOW 0x8
|
|
#define FSW_UNDERFLOW 0x10
|
|
#define FSW_PRECISION 0x20
|
|
#define FSW_STACK_FAULT 0x40
|
|
|
|
//
|
|
// Machine Specific Registers
|
|
//
|
|
#define MSR_AMD_ACCESS 0x9C5A203A
|
|
#define MSR_IA32_MISC_ENABLE 0x01A0
|
|
#define MSR_EFER 0xC0000080
|
|
|
|
//
|
|
// MSR internal Values
|
|
//
|
|
#define MSR_NXE 0x0800
|
|
#define XHF_NOEXECUTE 0x100000
|
|
#define MSR_XD_ENABLE_MASK 0xFFFFFFFB
|
|
|
|
//
|
|
// 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 100
|
|
#define MM_HAL_VA_START 0xFFC00000
|
|
#define MM_HAL_VA_END 0xFFFFFFFF
|
|
#define APIC_BASE 0xFFFE0000
|
|
|
|
//
|
|
// IOPM Definitions
|
|
//
|
|
#define IOPM_COUNT 1
|
|
#define IOPM_SIZE 8192
|
|
#define IOPM_FULL_SIZE 8196
|
|
#define IO_ACCESS_MAP_NONE 0
|
|
#define IOPM_DIRECTION_MAP_SIZE 32
|
|
#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))
|
|
|
|
typedef UCHAR KIO_ACCESS_MAP[IOPM_SIZE];
|
|
|
|
typedef KIO_ACCESS_MAP *PKIO_ACCESS_MAP;
|
|
|
|
//
|
|
// 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
|
|
|
|
//
|
|
// Number of pool lookaside lists per pool in the PRCB
|
|
//
|
|
#define NUMBER_POOL_LOOKASIDE_LISTS 32
|
|
|
|
//
|
|
// Structure for CPUID
|
|
//
|
|
typedef union _CPU_INFO
|
|
{
|
|
UINT32 AsUINT32[4];
|
|
struct
|
|
{
|
|
ULONG Eax;
|
|
ULONG Ebx;
|
|
ULONG Ecx;
|
|
ULONG Edx;
|
|
};
|
|
} CPU_INFO, *PCPU_INFO;
|
|
|
|
//
|
|
// 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;
|
|
|
|
//
|
|
// Defines the Callback Stack Layout for User Mode Callbacks
|
|
//
|
|
typedef struct _KCALLOUT_FRAME
|
|
{
|
|
ULONG InitialStack;
|
|
ULONG TrapFrame;
|
|
ULONG CallbackStack;
|
|
ULONG Edi;
|
|
ULONG Esi;
|
|
ULONG Ebx;
|
|
ULONG Ebp;
|
|
ULONG ReturnAddress;
|
|
ULONG Result;
|
|
ULONG ResultLength;
|
|
} KCALLOUT_FRAME, *PKCALLOUT_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[NUMBER_POOL_LOOKASIDE_LISTS];
|
|
PP_LOOKASIDE_LIST PPPagedLookasideList[NUMBER_POOL_LOOKASIDE_LISTS];
|
|
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
|
|
CHAR 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 *SelfPcr;
|
|
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 Spare0;
|
|
UCHAR SecondLevelCacheAssociativity;
|
|
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[IOPM_DIRECTION_MAP_SIZE];
|
|
UCHAR IoMap[IOPM_FULL_SIZE];
|
|
} 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[IOPM_COUNT];
|
|
UCHAR IntDirectionMap[IOPM_DIRECTION_MAP_SIZE];
|
|
} KTSS, *PKTSS;
|
|
|
|
//
|
|
// i386 CPUs don't have exception frames
|
|
//
|
|
typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
|
|
|
|
#endif /* NTOS_MODE_USER */
|
|
|
|
typedef enum _WOW64_SERVICE_TYPES
|
|
{
|
|
ServiceNoTurbo = 0x0000,
|
|
Service0Arg = 0x0001,
|
|
Service0ArgReloadState = 0x0002,
|
|
Service1ArgSp = 0x0003,
|
|
Service1ArgNSp = 0x0004,
|
|
Service2ArgNSpNSp = 0x0005,
|
|
Service2ArgNSpNSpReloadState = 0x0006,
|
|
Service2ArgSpNSp = 0x0007,
|
|
Service2ArgSpSp = 0x0008,
|
|
Service2ArgNSpSp = 0x0009,
|
|
Service3ArgNSpNSpNSp = 0x000A,
|
|
Service3ArgSpSpSp = 0x000B,
|
|
Service3ArgSpNSpNSp = 0x000C,
|
|
Service3ArgSpNSpNSpReloadState = 0x000D,
|
|
Service3ArgSpSpNSp = 0x000E,
|
|
Service3ArgNSpSpNSp = 0x000F,
|
|
Service3ArgSpNSpSp = 0x0010,
|
|
Service4ArgNSpNSpNSpNSp = 0x0011,
|
|
Service4ArgSpSpNSpNSp = 0x0012,
|
|
Service4ArgSpSpNSpNSpReloadState = 0x0013,
|
|
Service4ArgSpNSpNSpNSp = 0x0014,
|
|
Service4ArgSpNSpNSpNSpReloadState = 0x0015,
|
|
Service4ArgNSpSpNSpNSp = 0x0016,
|
|
Service4ArgSpSpSpNSp = 0x0017,
|
|
ServiceCpupTdQuerySystemTime = 0x0018,
|
|
ServiceCpupTdGetCurrentProcessorNumber = 0x0019,
|
|
ServiceCpupTdReadWriteFile = 0x001A,
|
|
ServiceCpupTdDeviceIoControlFile = 0x001B,
|
|
ServiceCpupTdRemoveIoCompletion = 0x001C,
|
|
ServiceCpupTdWaitForMultipleObjects = 0x001D,
|
|
ServiceCpupTdWaitForMultipleObjects32 = 0x001E,
|
|
Wow64ServiceTypesCount // = 0x001F
|
|
} WOW64_SERVICE_TYPES, *PWOW64_SERVICE_TYPES;
|
|
|
|
typedef enum _VDM_INDEX
|
|
{
|
|
VDM_INDEX_Invalid = 0,
|
|
VDM_INDEX_0F,
|
|
VDM_INDEX_ESPrefix,
|
|
VDM_INDEX_CSPrefix,
|
|
VDM_INDEX_SSPrefix,
|
|
VDM_INDEX_DSPrefix,
|
|
VDM_INDEX_FSPrefix,
|
|
VDM_INDEX_GSPrefix,
|
|
VDM_INDEX_OPER32Prefix,
|
|
VDM_INDEX_ADDR32Prefix,
|
|
VDM_INDEX_INSB,
|
|
VDM_INDEX_INSW,
|
|
VDM_INDEX_OUTSB,
|
|
VDM_INDEX_OUTSW,
|
|
VDM_INDEX_PUSHF,
|
|
VDM_INDEX_POPF,
|
|
VDM_INDEX_INTnn,
|
|
VDM_INDEX_INTO,
|
|
VDM_INDEX_IRET,
|
|
VDM_INDEX_NPX,
|
|
VDM_INDEX_INBimm,
|
|
VDM_INDEX_INWimm,
|
|
VDM_INDEX_OUTBimm,
|
|
VDM_INDEX_OUTWimm,
|
|
VDM_INDEX_INB,
|
|
VDM_INDEX_INW,
|
|
VDM_INDEX_OUTB,
|
|
VDM_INDEX_OUTW,
|
|
VDM_INDEX_LOCKPrefix,
|
|
VDM_INDEX_REPNEPrefix,
|
|
VDM_INDEX_REPPrefix,
|
|
VDM_INDEX_CLI,
|
|
VDM_INDEX_STI,
|
|
VDM_INDEX_HLT,
|
|
MAX_VDM_INDEX
|
|
} VDM_INDEX, *PVDM_INDEX;
|
|
|
|
#endif /* _I386_KETYPES_H */
|