3 Copyright (c) Alex Ionescu. All rights reserved.
11 i386 Type definitions for the Kernel services.
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
19 #ifndef _I386_KETYPES_H
20 #define _I386_KETYPES_H
27 // KPCR Access for non-IA64 builds
29 #define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
30 #define PCR ((KPCR *)K0IPCR)
31 #if defined(CONFIG_SMP) || defined(NT_BUILD)
33 #define KeGetPcr() ((KPCR *)__readfsdword(FIELD_OFFSET(KPCR, SelfPcr)))
47 CPU_CENTAUR
= CPU_VIA
,
55 #define MACHINE_TYPE_ISA 0x0000
56 #define MACHINE_TYPE_EISA 0x0001
57 #define MACHINE_TYPE_MCA 0x0002
60 // X86 80386 Segment Types
62 #define I386_TASK_GATE 0x5
64 #define I386_ACTIVE_TSS 0xB
65 #define I386_CALL_GATE 0xC
66 #define I386_INTERRUPT_GATE 0xE
67 #define I386_TRAP_GATE 0xF
72 #define RPL_MASK 0x0003
73 #define MODE_MASK 0x0001
74 #define KGDT_R0_CODE 0x8
75 #define KGDT_R0_DATA 0x10
76 #define KGDT_R3_CODE 0x18
77 #define KGDT_R3_DATA 0x20
79 #define KGDT_R0_PCR 0x30
80 #define KGDT_R3_TEB 0x38
82 #define KGDT_DF_TSS 0x50
83 #define KGDT_NMI_TSS 0x58
86 // Define the number of GDTs that can be queried by user mode
88 #define KGDT_NUMBER 10
101 #define CR4_FXSR 0x200
102 #define CR4_XMMEXCPT 0x400
107 #define EFLAGS_CF 0x01L
108 #define EFLAGS_ZF 0x40L
109 #define EFLAGS_TF 0x100L
110 #define EFLAGS_INTERRUPT_MASK 0x200L
111 #define EFLAGS_DF 0x400L
112 #define EFLAGS_IOPL 0x3000L
113 #define EFLAGS_NESTED_TASK 0x4000L
114 #define EFLAGS_RF 0x10000
115 #define EFLAGS_V86_MASK 0x20000
116 #define EFLAGS_ALIGN_CHECK 0x40000
117 #define EFLAGS_VIF 0x80000
118 #define EFLAGS_VIP 0x100000
119 #define EFLAGS_ID 0x200000
120 #define EFLAGS_USER_SANITIZE 0x3F4DD7
121 #define EFLAG_SIGN 0x8000
122 #define EFLAG_ZERO 0x4000
125 // Legacy floating status word bit masks.
127 #define FSW_INVALID_OPERATION 0x1
128 #define FSW_DENORMAL 0x2
129 #define FSW_ZERO_DIVIDE 0x4
130 #define FSW_OVERFLOW 0x8
131 #define FSW_UNDERFLOW 0x10
132 #define FSW_PRECISION 0x20
133 #define FSW_STACK_FAULT 0x40
136 // Machine Specific Registers
138 #define MSR_AMD_ACCESS 0x9C5A203A
139 #define MSR_IA32_MISC_ENABLE 0x01A0
140 #define MSR_EFER 0xC0000080
143 // MSR internal Values
145 #define MSR_NXE 0x0800
146 #define XHF_NOEXECUTE 0x100000
147 #define MSR_XD_ENABLE_MASK 0xFFFFFFFB
155 #define IPI_PACKET_READY 8
156 #define IPI_SYNCH_REQUEST 16
161 #define PRCB_MAJOR_VERSION 1
162 #define PRCB_BUILD_DEBUG 1
163 #define PRCB_BUILD_UNIPROCESSOR 2
168 #define INITIAL_STALL_COUNT 100
170 #define HYPERSPACE_BASE 0xc0400000
172 #define HYPERSPACE_BASE 0xc0800000
174 #define MM_HAL_VA_START 0xFFC00000
175 #define MM_HAL_VA_END 0xFFFFFFFF
176 #define APIC_BASE 0xFFFE0000
182 #define IOPM_SIZE 8192
183 #define IOPM_FULL_SIZE 8196
184 #define IO_ACCESS_MAP_NONE 0
185 #define IOPM_DIRECTION_MAP_SIZE 32
186 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
187 #define KiComputeIopmOffset(MapNumber) \
188 (MapNumber == IO_ACCESS_MAP_NONE) ? \
189 (USHORT)(sizeof(KTSS)) : \
190 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
192 typedef UCHAR KIO_ACCESS_MAP
[IOPM_SIZE
];
194 typedef KIO_ACCESS_MAP
*PKIO_ACCESS_MAP
;
197 // Size of the XMM register save area in the FXSAVE format
199 #define SIZE_OF_FX_REGISTERS 128
202 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
204 #define KSEG0_BASE 0x80000000
207 // Synchronization-level IRQL
210 #define SYNCH_LEVEL DISPATCH_LEVEL
212 #if (NTDDI_VERSION < NTDDI_WS03)
213 #define SYNCH_LEVEL (IPI_LEVEL - 1)
215 #define SYNCH_LEVEL (IPI_LEVEL - 2)
220 // Number of pool lookaside lists per pool in the PRCB
222 #define NUMBER_POOL_LOOKASIDE_LISTS 32
225 // Structure for CPUID
227 typedef union _CPU_INFO
237 } CPU_INFO
, *PCPU_INFO
;
240 // Trap Frame Definition
242 typedef struct _KTRAP_FRAME
262 ULONG PreviousPreviousMode
;
263 struct _EXCEPTION_REGISTRATION_RECORD FAR
*ExceptionList
;
279 } KTRAP_FRAME
, *PKTRAP_FRAME
;
282 // Defines the Callback Stack Layout for User Mode Callbacks
284 typedef struct _KCALLOUT_FRAME
296 } KCALLOUT_FRAME
, *PKCALLOUT_FRAME
;
299 // LDT Entry Definition
301 #ifndef _LDT_ENTRY_DEFINED
302 #define _LDT_ENTRY_DEFINED
303 typedef struct _LDT_ENTRY
330 } LDT_ENTRY
, *PLDT_ENTRY
, *LPLDT_ENTRY
;
334 // GDT Entry Definition
336 typedef struct _KGDTENTRY
363 } KGDTENTRY
, *PKGDTENTRY
;
366 // IDT Entry Access Definition
368 typedef struct _KIDT_ACCESS
376 UCHAR SystemSegmentFlag
:1;
382 } KIDT_ACCESS
, *PKIDT_ACCESS
;
385 // IDT Entry Definition
387 typedef struct _KIDTENTRY
392 USHORT ExtendedOffset
;
393 } KIDTENTRY
, *PKIDTENTRY
;
395 typedef struct _DESCRIPTOR
400 } KDESCRIPTOR
, *PKDESCRIPTOR
;
402 #ifndef NTOS_MODE_USER
404 // Macro to get current KPRCB
408 KeGetCurrentPrcb(VOID
)
410 return (struct _KPRCB
*)(ULONG_PTR
)__readfsdword(FIELD_OFFSET(KPCR
, Prcb
));
414 // FN/FX (FPU) Save Area Structures
416 typedef struct _FNSAVE_FORMAT
425 UCHAR RegisterArea
[80];
426 } FNSAVE_FORMAT
, *PFNSAVE_FORMAT
;
428 typedef struct _FXSAVE_FORMAT
440 UCHAR RegisterArea
[SIZE_OF_FX_REGISTERS
];
441 UCHAR Reserved3
[128];
442 UCHAR Reserved4
[224];
443 UCHAR Align16Byte
[8];
444 } FXSAVE_FORMAT
, *PFXSAVE_FORMAT
;
446 typedef struct _FX_SAVE_AREA
450 FNSAVE_FORMAT FnArea
;
451 FXSAVE_FORMAT FxArea
;
455 } FX_SAVE_AREA
, *PFX_SAVE_AREA
;
458 // Special Registers Structure (outside of CONTEXT)
460 typedef struct _KSPECIAL_REGISTERS
477 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
480 // Processor State Data
482 typedef struct _KPROCESSOR_STATE
484 CONTEXT ContextFrame
;
485 KSPECIAL_REGISTERS SpecialRegisters
;
486 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
489 // Processor Region Control Block
492 typedef struct _KPRCB
496 struct _KTHREAD
*CurrentThread
;
497 struct _KTHREAD
*NextThread
;
498 struct _KTHREAD
*IdleThread
;
506 KPROCESSOR_STATE ProcessorState
;
507 ULONG KernelReserved
[16];
508 ULONG HalReserved
[16];
509 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
515 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
516 struct _KTHREAD
*NpxThread
;
517 ULONG InterruptCount
;
523 ULONG AdjustDpcThreshold
;
526 UCHAR DebuggerSavedIRQL
;
527 #if (NTDDI_VERSION >= NTDDI_WS03)
529 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
534 ULONG NodeShiftedColor
;
538 struct _KNODE
*ParentNode
;
539 ULONG MultiThreadProcessorSet
;
540 struct _KPRCB
*MultiThreadSetMaster
;
541 #if (NTDDI_VERSION >= NTDDI_WS03)
542 ULONG SecondaryColorMask
;
543 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
549 ULONG ThreadStartCount
[2];
551 ULONG CcFastReadNoWait
;
552 ULONG CcFastReadWait
;
553 ULONG CcFastReadNotPossible
;
554 ULONG CcCopyReadNoWait
;
555 ULONG CcCopyReadWait
;
556 ULONG CcCopyReadNoWaitMiss
;
557 #if (NTDDI_VERSION < NTDDI_LONGHORN)
558 ULONG KeAlignmentFixupCount
;
561 #if (NTDDI_VERSION < NTDDI_LONGHORN)
562 ULONG KeDcacheFlushCount
;
563 ULONG KeExceptionDispatchCount
;
564 ULONG KeFirstLevelTbFills
;
565 ULONG KeFloatingEmulationCount
;
566 ULONG KeIcacheFlushCount
;
567 ULONG KeSecondLevelTbFills
;
570 volatile ULONG IoReadOperationCount
;
571 volatile ULONG IoWriteOperationCount
;
572 volatile ULONG IoOtherOperationCount
;
573 LARGE_INTEGER IoReadTransferCount
;
574 LARGE_INTEGER IoWriteTransferCount
;
575 LARGE_INTEGER IoOtherTransferCount
;
576 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
577 ULONG CcFastMdlReadNoWait
;
578 ULONG CcFastMdlReadWait
;
579 ULONG CcFastMdlReadNotPossible
;
580 ULONG CcMapDataNoWait
;
582 ULONG CcPinMappedDataCount
;
583 ULONG CcPinReadNoWait
;
585 ULONG CcMdlReadNoWait
;
587 ULONG CcLazyWriteHotSpots
;
588 ULONG CcLazyWriteIos
;
589 ULONG CcLazyWritePages
;
592 ULONG CcLostDelayedWrites
;
593 ULONG CcFastReadResourceMiss
;
594 ULONG CcCopyReadWaitMiss
;
595 ULONG CcFastMdlReadResourceMiss
;
596 ULONG CcMapDataNoWaitMiss
;
597 ULONG CcMapDataWaitMiss
;
598 ULONG CcPinReadNoWaitMiss
;
599 ULONG CcPinReadWaitMiss
;
600 ULONG CcMdlReadNoWaitMiss
;
601 ULONG CcMdlReadWaitMiss
;
602 ULONG CcReadAheadIos
;
603 ULONG KeAlignmentFixupCount
;
604 ULONG KeExceptionDispatchCount
;
608 ULONG SpareCounter1
[8];
610 PP_LOOKASIDE_LIST PPLookasideList
[16];
611 PP_LOOKASIDE_LIST PPNPagedLookasideList
[NUMBER_POOL_LOOKASIDE_LISTS
];
612 PP_LOOKASIDE_LIST PPPagedLookasideList
[NUMBER_POOL_LOOKASIDE_LISTS
];
613 volatile ULONG PacketBarrier
;
614 volatile ULONG ReverseStall
;
617 volatile PVOID CurrentPacket
[3];
618 volatile ULONG TargetSet
;
619 volatile PKIPI_WORKER WorkerRoutine
;
620 volatile ULONG IpiFrozen
;
622 volatile ULONG RequestSummary
;
623 volatile struct _KPRCB
*SignalDone
;
625 struct _KDPC_DATA DpcData
[2];
627 ULONG MaximumDpcQueueDepth
;
628 ULONG DpcRequestRate
;
629 ULONG MinimumDpcRate
;
630 volatile UCHAR DpcInterruptRequested
;
631 volatile UCHAR DpcThreadRequested
;
632 volatile UCHAR DpcRoutineActive
;
633 volatile UCHAR DpcThreadActive
;
636 volatile ULONG TimerHand
;
637 volatile ULONG TimerRequest
;
640 UCHAR ThreadDpcEnable
;
641 volatile BOOLEAN QuantumEnd
;
643 volatile UCHAR IdleSchedule
;
644 LONG DpcSetEventRequest
;
645 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
655 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
657 UCHAR ClockCheckSlot
;
658 UCHAR ClockPollCycle
;
660 LONG DpcWatchdogPeriod
;
661 LONG DpcWatchDogCount
;
662 LONG ThreadWatchdogPeriod
;
663 LONG ThreadWatchDogCount
;
668 LIST_ENTRY WaitListHead
;
671 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
672 SINGLE_LIST_ENTRY DeferredReadyListHead
;
673 ULONGLONG StartCycles
;
675 ULONGLONG PrcbPad71
[3];
676 LIST_ENTRY DispatcherReadyListHead
[32];
678 LIST_ENTRY DispatcherReadyListHead
[32];
679 SINGLE_LIST_ENTRY DeferredReadyListHead
;
682 PVOID ChainedInterruptList
;
683 LONG LookasideIrpFloat
;
684 volatile LONG MmPageFaultCount
;
685 volatile LONG MmCopyOnWriteCount
;
686 volatile LONG MmTransitionCount
;
687 volatile LONG MmCacheTransitionCount
;
688 volatile LONG MmDemandZeroCount
;
689 volatile LONG MmPageReadCount
;
690 volatile LONG MmPageReadIoCount
;
691 volatile LONG MmCacheReadCount
;
692 volatile LONG MmCacheIoCount
;
693 volatile LONG MmDirtyPagesWriteCount
;
694 volatile LONG MmDirtyWriteIoCount
;
695 volatile LONG MmMappedPagesWriteCount
;
696 volatile LONG MmMappedWriteIoCount
;
697 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
699 ULONG CachedResidentAvailable
;
704 ULONG SpareFields0
[1];
706 CHAR VendorString
[13];
708 UCHAR LogicalProcessorsPerPhysicalProcessor
;
711 LARGE_INTEGER UpdateSignature
;
712 volatile LARGE_INTEGER IsrTime
;
713 LARGE_INTEGER SpareField1
;
714 FX_SAVE_AREA NpxSaveArea
;
715 PROCESSOR_POWER_STATE PowerState
;
716 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
718 KTIMER DpcWatchdogTimer
;
721 SLIST_HEADER InterruptObjectPool
;
722 LARGE_INTEGER HyperCallPagePhysical
;
723 LARGE_INTEGER HyperCallPageVirtual
;
725 CACHE_DESCRIPTOR Cache
[5];
727 ULONG CacheProcessorMask
[5];
728 UCHAR LogicalProcessorsPerCore
;
730 ULONG PackageProcessorSet
;
731 ULONG CoreProcessorSet
;
736 // Processor Control Region
738 typedef struct _KIPCR
745 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
746 PVOID Used_StackBase
;
747 PVOID PerfGlobalGroupMask
;
749 ULONG ContextSwitches
;
750 KAFFINITY SetMemberCopy
;
760 PVOID KdVersionBlock
;
767 ULONG StallScaleFactor
;
771 UCHAR SecondLevelCacheAssociativity
;
773 ULONG KernelReserved
[14];
774 ULONG SecondLevelCacheSize
;
775 ULONG HalReserved
[16];
778 ULONG KernelReserved2
[17];
786 typedef struct _KiIoAccessMap
788 UCHAR DirectionMap
[IOPM_DIRECTION_MAP_SIZE
];
789 UCHAR IoMap
[IOPM_FULL_SIZE
];
827 KIIO_ACCESS_MAP IoMaps
[IOPM_COUNT
];
828 UCHAR IntDirectionMap
[IOPM_DIRECTION_MAP_SIZE
];
832 // i386 CPUs don't have exception frames
834 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;
836 #endif /* NTOS_MODE_USER */
838 typedef enum _WOW64_SERVICE_TYPES
840 ServiceNoTurbo
= 0x0000,
841 Service0Arg
= 0x0001,
842 Service0ArgReloadState
= 0x0002,
843 Service1ArgSp
= 0x0003,
844 Service1ArgNSp
= 0x0004,
845 Service2ArgNSpNSp
= 0x0005,
846 Service2ArgNSpNSpReloadState
= 0x0006,
847 Service2ArgSpNSp
= 0x0007,
848 Service2ArgSpSp
= 0x0008,
849 Service2ArgNSpSp
= 0x0009,
850 Service3ArgNSpNSpNSp
= 0x000A,
851 Service3ArgSpSpSp
= 0x000B,
852 Service3ArgSpNSpNSp
= 0x000C,
853 Service3ArgSpNSpNSpReloadState
= 0x000D,
854 Service3ArgSpSpNSp
= 0x000E,
855 Service3ArgNSpSpNSp
= 0x000F,
856 Service3ArgSpNSpSp
= 0x0010,
857 Service4ArgNSpNSpNSpNSp
= 0x0011,
858 Service4ArgSpSpNSpNSp
= 0x0012,
859 Service4ArgSpSpNSpNSpReloadState
= 0x0013,
860 Service4ArgSpNSpNSpNSp
= 0x0014,
861 Service4ArgSpNSpNSpNSpReloadState
= 0x0015,
862 Service4ArgNSpSpNSpNSp
= 0x0016,
863 Service4ArgSpSpSpNSp
= 0x0017,
864 ServiceCpupTdQuerySystemTime
= 0x0018,
865 ServiceCpupTdGetCurrentProcessorNumber
= 0x0019,
866 ServiceCpupTdReadWriteFile
= 0x001A,
867 ServiceCpupTdDeviceIoControlFile
= 0x001B,
868 ServiceCpupTdRemoveIoCompletion
= 0x001C,
869 ServiceCpupTdWaitForMultipleObjects
= 0x001D,
870 ServiceCpupTdWaitForMultipleObjects32
= 0x001E,
871 Wow64ServiceTypesCount
// = 0x001F
872 } WOW64_SERVICE_TYPES
, *PWOW64_SERVICE_TYPES
;
874 typedef enum _VDM_INDEX
876 VDM_INDEX_Invalid
= 0,
884 VDM_INDEX_OPER32Prefix
,
885 VDM_INDEX_ADDR32Prefix
,
904 VDM_INDEX_LOCKPrefix
,
905 VDM_INDEX_REPNEPrefix
,
911 } VDM_INDEX
, *PVDM_INDEX
;
913 #endif /* _I386_KETYPES_H */