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
169 #define MM_HAL_VA_START 0xFFC00000
170 #define MM_HAL_VA_END 0xFFFFFFFF
171 #define APIC_BASE 0xFFFE0000
177 #define IOPM_SIZE 8192
178 #define IOPM_FULL_SIZE 8196
179 #define IO_ACCESS_MAP_NONE 0
180 #define IOPM_DIRECTION_MAP_SIZE 32
181 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
182 #define KiComputeIopmOffset(MapNumber) \
183 (MapNumber == IO_ACCESS_MAP_NONE) ? \
184 (USHORT)(sizeof(KTSS)) : \
185 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
187 typedef UCHAR KIO_ACCESS_MAP
[IOPM_SIZE
];
189 typedef KIO_ACCESS_MAP
*PKIO_ACCESS_MAP
;
192 // Size of the XMM register save area in the FXSAVE format
194 #define SIZE_OF_FX_REGISTERS 128
197 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
199 #define KSEG0_BASE 0x80000000
202 // Synchronization-level IRQL
205 #define SYNCH_LEVEL DISPATCH_LEVEL
207 #if (NTDDI_VERSION < NTDDI_WS03)
208 #define SYNCH_LEVEL (IPI_LEVEL - 1)
210 #define SYNCH_LEVEL (IPI_LEVEL - 2)
215 // Number of pool lookaside lists per pool in the PRCB
217 #define NUMBER_POOL_LOOKASIDE_LISTS 32
220 // Structure for CPUID
222 typedef union _CPU_INFO
232 } CPU_INFO
, *PCPU_INFO
;
235 // Trap Frame Definition
237 typedef struct _KTRAP_FRAME
257 ULONG PreviousPreviousMode
;
258 struct _EXCEPTION_REGISTRATION_RECORD FAR
*ExceptionList
;
274 } KTRAP_FRAME
, *PKTRAP_FRAME
;
277 // Defines the Callback Stack Layout for User Mode Callbacks
279 typedef struct _KCALLOUT_FRAME
291 } KCALLOUT_FRAME
, *PKCALLOUT_FRAME
;
294 // LDT Entry Definition
296 #ifndef _LDT_ENTRY_DEFINED
297 #define _LDT_ENTRY_DEFINED
298 typedef struct _LDT_ENTRY
325 } LDT_ENTRY
, *PLDT_ENTRY
, *LPLDT_ENTRY
;
329 // GDT Entry Definition
331 typedef struct _KGDTENTRY
358 } KGDTENTRY
, *PKGDTENTRY
;
361 // IDT Entry Access Definition
363 typedef struct _KIDT_ACCESS
371 UCHAR SystemSegmentFlag
:1;
377 } KIDT_ACCESS
, *PKIDT_ACCESS
;
380 // IDT Entry Definition
382 typedef struct _KIDTENTRY
387 USHORT ExtendedOffset
;
388 } KIDTENTRY
, *PKIDTENTRY
;
390 typedef struct _DESCRIPTOR
395 } KDESCRIPTOR
, *PKDESCRIPTOR
;
397 #ifndef NTOS_MODE_USER
399 // Macro to get current KPRCB
403 KeGetCurrentPrcb(VOID
)
405 return (struct _KPRCB
*)(ULONG_PTR
)__readfsdword(FIELD_OFFSET(KPCR
, Prcb
));
409 // FN/FX (FPU) Save Area Structures
411 typedef struct _FNSAVE_FORMAT
420 UCHAR RegisterArea
[80];
421 } FNSAVE_FORMAT
, *PFNSAVE_FORMAT
;
423 typedef struct _FXSAVE_FORMAT
435 UCHAR RegisterArea
[SIZE_OF_FX_REGISTERS
];
436 UCHAR Reserved3
[128];
437 UCHAR Reserved4
[224];
438 UCHAR Align16Byte
[8];
439 } FXSAVE_FORMAT
, *PFXSAVE_FORMAT
;
441 typedef struct _FX_SAVE_AREA
445 FNSAVE_FORMAT FnArea
;
446 FXSAVE_FORMAT FxArea
;
450 } FX_SAVE_AREA
, *PFX_SAVE_AREA
;
453 // Special Registers Structure (outside of CONTEXT)
455 typedef struct _KSPECIAL_REGISTERS
472 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
475 // Processor State Data
477 typedef struct _KPROCESSOR_STATE
479 CONTEXT ContextFrame
;
480 KSPECIAL_REGISTERS SpecialRegisters
;
481 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
484 // Processor Region Control Block
487 typedef struct _KPRCB
491 struct _KTHREAD
*CurrentThread
;
492 struct _KTHREAD
*NextThread
;
493 struct _KTHREAD
*IdleThread
;
501 KPROCESSOR_STATE ProcessorState
;
502 ULONG KernelReserved
[16];
503 ULONG HalReserved
[16];
504 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
510 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
511 struct _KTHREAD
*NpxThread
;
512 ULONG InterruptCount
;
518 ULONG AdjustDpcThreshold
;
521 UCHAR DebuggerSavedIRQL
;
522 #if (NTDDI_VERSION >= NTDDI_WS03)
524 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
529 ULONG NodeShiftedColor
;
533 struct _KNODE
*ParentNode
;
534 ULONG MultiThreadProcessorSet
;
535 struct _KPRCB
*MultiThreadSetMaster
;
536 #if (NTDDI_VERSION >= NTDDI_WS03)
537 ULONG SecondaryColorMask
;
538 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
544 ULONG ThreadStartCount
[2];
546 ULONG CcFastReadNoWait
;
547 ULONG CcFastReadWait
;
548 ULONG CcFastReadNotPossible
;
549 ULONG CcCopyReadNoWait
;
550 ULONG CcCopyReadWait
;
551 ULONG CcCopyReadNoWaitMiss
;
552 #if (NTDDI_VERSION < NTDDI_LONGHORN)
553 ULONG KeAlignmentFixupCount
;
556 #if (NTDDI_VERSION < NTDDI_LONGHORN)
557 ULONG KeDcacheFlushCount
;
558 ULONG KeExceptionDispatchCount
;
559 ULONG KeFirstLevelTbFills
;
560 ULONG KeFloatingEmulationCount
;
561 ULONG KeIcacheFlushCount
;
562 ULONG KeSecondLevelTbFills
;
565 volatile ULONG IoReadOperationCount
;
566 volatile ULONG IoWriteOperationCount
;
567 volatile ULONG IoOtherOperationCount
;
568 LARGE_INTEGER IoReadTransferCount
;
569 LARGE_INTEGER IoWriteTransferCount
;
570 LARGE_INTEGER IoOtherTransferCount
;
571 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
572 ULONG CcFastMdlReadNoWait
;
573 ULONG CcFastMdlReadWait
;
574 ULONG CcFastMdlReadNotPossible
;
575 ULONG CcMapDataNoWait
;
577 ULONG CcPinMappedDataCount
;
578 ULONG CcPinReadNoWait
;
580 ULONG CcMdlReadNoWait
;
582 ULONG CcLazyWriteHotSpots
;
583 ULONG CcLazyWriteIos
;
584 ULONG CcLazyWritePages
;
587 ULONG CcLostDelayedWrites
;
588 ULONG CcFastReadResourceMiss
;
589 ULONG CcCopyReadWaitMiss
;
590 ULONG CcFastMdlReadResourceMiss
;
591 ULONG CcMapDataNoWaitMiss
;
592 ULONG CcMapDataWaitMiss
;
593 ULONG CcPinReadNoWaitMiss
;
594 ULONG CcPinReadWaitMiss
;
595 ULONG CcMdlReadNoWaitMiss
;
596 ULONG CcMdlReadWaitMiss
;
597 ULONG CcReadAheadIos
;
598 ULONG KeAlignmentFixupCount
;
599 ULONG KeExceptionDispatchCount
;
603 ULONG SpareCounter1
[8];
605 PP_LOOKASIDE_LIST PPLookasideList
[16];
606 PP_LOOKASIDE_LIST PPNPagedLookasideList
[NUMBER_POOL_LOOKASIDE_LISTS
];
607 PP_LOOKASIDE_LIST PPPagedLookasideList
[NUMBER_POOL_LOOKASIDE_LISTS
];
608 volatile ULONG PacketBarrier
;
609 volatile ULONG ReverseStall
;
612 volatile PVOID CurrentPacket
[3];
613 volatile ULONG TargetSet
;
614 volatile PKIPI_WORKER WorkerRoutine
;
615 volatile ULONG IpiFrozen
;
617 volatile ULONG RequestSummary
;
618 volatile struct _KPRCB
*SignalDone
;
620 struct _KDPC_DATA DpcData
[2];
622 ULONG MaximumDpcQueueDepth
;
623 ULONG DpcRequestRate
;
624 ULONG MinimumDpcRate
;
625 volatile UCHAR DpcInterruptRequested
;
626 volatile UCHAR DpcThreadRequested
;
627 volatile UCHAR DpcRoutineActive
;
628 volatile UCHAR DpcThreadActive
;
631 volatile ULONG TimerHand
;
632 volatile ULONG TimerRequest
;
635 UCHAR ThreadDpcEnable
;
636 volatile BOOLEAN QuantumEnd
;
638 volatile UCHAR IdleSchedule
;
639 LONG DpcSetEventRequest
;
640 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
650 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
652 UCHAR ClockCheckSlot
;
653 UCHAR ClockPollCycle
;
655 LONG DpcWatchdogPeriod
;
656 LONG DpcWatchDogCount
;
657 LONG ThreadWatchdogPeriod
;
658 LONG ThreadWatchDogCount
;
663 LIST_ENTRY WaitListHead
;
666 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
667 SINGLE_LIST_ENTRY DeferredReadyListHead
;
668 ULONGLONG StartCycles
;
670 ULONGLONG PrcbPad71
[3];
671 LIST_ENTRY DispatcherReadyListHead
[32];
673 LIST_ENTRY DispatcherReadyListHead
[32];
674 SINGLE_LIST_ENTRY DeferredReadyListHead
;
677 PVOID ChainedInterruptList
;
678 LONG LookasideIrpFloat
;
679 volatile LONG MmPageFaultCount
;
680 volatile LONG MmCopyOnWriteCount
;
681 volatile LONG MmTransitionCount
;
682 volatile LONG MmCacheTransitionCount
;
683 volatile LONG MmDemandZeroCount
;
684 volatile LONG MmPageReadCount
;
685 volatile LONG MmPageReadIoCount
;
686 volatile LONG MmCacheReadCount
;
687 volatile LONG MmCacheIoCount
;
688 volatile LONG MmDirtyPagesWriteCount
;
689 volatile LONG MmDirtyWriteIoCount
;
690 volatile LONG MmMappedPagesWriteCount
;
691 volatile LONG MmMappedWriteIoCount
;
692 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
694 ULONG CachedResidentAvailable
;
699 ULONG SpareFields0
[1];
701 CHAR VendorString
[13];
703 UCHAR LogicalProcessorsPerPhysicalProcessor
;
706 LARGE_INTEGER UpdateSignature
;
707 volatile LARGE_INTEGER IsrTime
;
708 LARGE_INTEGER SpareField1
;
709 FX_SAVE_AREA NpxSaveArea
;
710 PROCESSOR_POWER_STATE PowerState
;
711 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
713 KTIMER DpcWatchdogTimer
;
716 SLIST_HEADER InterruptObjectPool
;
717 LARGE_INTEGER HyperCallPagePhysical
;
718 LARGE_INTEGER HyperCallPageVirtual
;
720 CACHE_DESCRIPTOR Cache
[5];
722 ULONG CacheProcessorMask
[5];
723 UCHAR LogicalProcessorsPerCore
;
725 ULONG PackageProcessorSet
;
726 ULONG CoreProcessorSet
;
731 // Processor Control Region
733 typedef struct _KIPCR
740 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
741 PVOID Used_StackBase
;
742 PVOID PerfGlobalGroupMask
;
744 ULONG ContextSwitches
;
745 KAFFINITY SetMemberCopy
;
749 struct _KPCR
*SelfPcr
;
755 PVOID KdVersionBlock
;
762 ULONG StallScaleFactor
;
766 UCHAR SecondLevelCacheAssociativity
;
768 ULONG KernelReserved
[14];
769 ULONG SecondLevelCacheSize
;
770 ULONG HalReserved
[16];
773 ULONG KernelReserved2
[17];
781 typedef struct _KiIoAccessMap
783 UCHAR DirectionMap
[IOPM_DIRECTION_MAP_SIZE
];
784 UCHAR IoMap
[IOPM_FULL_SIZE
];
822 KIIO_ACCESS_MAP IoMaps
[IOPM_COUNT
];
823 UCHAR IntDirectionMap
[IOPM_DIRECTION_MAP_SIZE
];
827 // i386 CPUs don't have exception frames
829 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;
831 #endif /* NTOS_MODE_USER */
833 typedef enum _WOW64_SERVICE_TYPES
835 ServiceNoTurbo
= 0x0000,
836 Service0Arg
= 0x0001,
837 Service0ArgReloadState
= 0x0002,
838 Service1ArgSp
= 0x0003,
839 Service1ArgNSp
= 0x0004,
840 Service2ArgNSpNSp
= 0x0005,
841 Service2ArgNSpNSpReloadState
= 0x0006,
842 Service2ArgSpNSp
= 0x0007,
843 Service2ArgSpSp
= 0x0008,
844 Service2ArgNSpSp
= 0x0009,
845 Service3ArgNSpNSpNSp
= 0x000A,
846 Service3ArgSpSpSp
= 0x000B,
847 Service3ArgSpNSpNSp
= 0x000C,
848 Service3ArgSpNSpNSpReloadState
= 0x000D,
849 Service3ArgSpSpNSp
= 0x000E,
850 Service3ArgNSpSpNSp
= 0x000F,
851 Service3ArgSpNSpSp
= 0x0010,
852 Service4ArgNSpNSpNSpNSp
= 0x0011,
853 Service4ArgSpSpNSpNSp
= 0x0012,
854 Service4ArgSpSpNSpNSpReloadState
= 0x0013,
855 Service4ArgSpNSpNSpNSp
= 0x0014,
856 Service4ArgSpNSpNSpNSpReloadState
= 0x0015,
857 Service4ArgNSpSpNSpNSp
= 0x0016,
858 Service4ArgSpSpSpNSp
= 0x0017,
859 ServiceCpupTdQuerySystemTime
= 0x0018,
860 ServiceCpupTdGetCurrentProcessorNumber
= 0x0019,
861 ServiceCpupTdReadWriteFile
= 0x001A,
862 ServiceCpupTdDeviceIoControlFile
= 0x001B,
863 ServiceCpupTdRemoveIoCompletion
= 0x001C,
864 ServiceCpupTdWaitForMultipleObjects
= 0x001D,
865 ServiceCpupTdWaitForMultipleObjects32
= 0x001E,
866 Wow64ServiceTypesCount
// = 0x001F
867 } WOW64_SERVICE_TYPES
, *PWOW64_SERVICE_TYPES
;
869 typedef enum _VDM_INDEX
871 VDM_INDEX_Invalid
= 0,
879 VDM_INDEX_OPER32Prefix
,
880 VDM_INDEX_ADDR32Prefix
,
899 VDM_INDEX_LOCKPrefix
,
900 VDM_INDEX_REPNEPrefix
,
906 } VDM_INDEX
, *PVDM_INDEX
;
908 #endif /* _I386_KETYPES_H */