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
29 #define MACHINE_TYPE_ISA 0x0000
30 #define MACHINE_TYPE_EISA 0x0001
31 #define MACHINE_TYPE_MCA 0x0002
34 // X86 80386 Segment Types
36 #define I386_TASK_GATE 0x5
38 #define I386_ACTIVE_TSS 0xB
39 #define I386_CALL_GATE 0xC
40 #define I386_INTERRUPT_GATE 0xE
41 #define I386_TRAP_GATE 0xF
46 #define RPL_MASK 0x0003
47 #define MODE_MASK 0x0001
48 #define KGDT_R0_CODE 0x8
49 #define KGDT_R0_DATA 0x10
50 #define KGDT_R3_CODE 0x18
51 #define KGDT_R3_DATA 0x20
53 #define KGDT_R0_PCR 0x30
54 #define KGDT_R3_TEB 0x38
56 #define KGDT_DF_TSS 0x50
57 #define KGDT_NMI_TSS 0x58
70 #define CR4_FXSR 0x200
71 #define CR4_XMMEXCPT 0x400
76 #define EFLAGS_CF 0x01L
77 #define EFLAGS_ZF 0x40L
78 #define EFLAGS_TF 0x100L
79 #define EFLAGS_INTERRUPT_MASK 0x200L
80 #define EFLAGS_DF 0x400L
81 #define EFLAGS_NESTED_TASK 0x4000L
82 #define EFLAGS_V86_MASK 0x20000
83 #define EFLAGS_ALIGN_CHECK 0x40000
84 #define EFLAGS_VIF 0x80000
85 #define EFLAGS_VIP 0x100000
86 #define EFLAGS_USER_SANITIZE 0x3F4DD7
87 #define EFLAG_SIGN 0x8000
88 #define EFLAG_ZERO 0x4000
96 #define IPI_PACKET_READY 8
97 #define IPI_SYNCH_REQUEST 16
102 #define PRCB_MAJOR_VERSION 1
103 #define PRCB_BUILD_DEBUG 1
104 #define PRCB_BUILD_UNIPROCESSOR 2
109 #define INITIAL_STALL_COUNT 0x64
114 #define IO_ACCESS_MAP_NONE 0
115 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
116 #define KiComputeIopmOffset(MapNumber) \
117 (MapNumber == IO_ACCESS_MAP_NONE) ? \
118 (USHORT)(sizeof(KTSS)) : \
119 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
122 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
124 #define KSEG0_BASE 0x80000000
127 // Synchronization-level IRQL
130 #define SYNCH_LEVEL DISPATCH_LEVEL
132 #define SYNCH_LEVEL (IPI_LEVEL - 1)
136 // Trap Frame Definition
138 typedef struct _KTRAP_FRAME
158 ULONG PreviousPreviousMode
;
159 struct _EXCEPTION_REGISTRATION_RECORD FAR
*ExceptionList
;
175 } KTRAP_FRAME
, *PKTRAP_FRAME
;
178 // LDT Entry Definition
180 #ifndef _LDT_ENTRY_DEFINED
181 #define _LDT_ENTRY_DEFINED
182 typedef struct _LDT_ENTRY
209 } LDT_ENTRY
, *PLDT_ENTRY
, *LPLDT_ENTRY
;
213 // GDT Entry Definition
215 typedef struct _KGDTENTRY
242 } KGDTENTRY
, *PKGDTENTRY
;
245 // IDT Entry Access Definition
247 typedef struct _KIDT_ACCESS
255 UCHAR SystemSegmentFlag
:1;
261 } KIDT_ACCESS
, *PKIDT_ACCESS
;
264 // IDT Entry Definition
266 typedef struct _KIDTENTRY
271 USHORT ExtendedOffset
;
272 } KIDTENTRY
, *PKIDTENTRY
;
274 typedef struct _DESCRIPTOR
279 } KDESCRIPTOR
, *PKDESCRIPTOR
;
281 #ifndef NTOS_MODE_USER
283 // Macro to get current KPRCB
287 KeGetCurrentPrcb(VOID
)
289 return (struct _KPRCB
*)(ULONG_PTR
)__readfsdword(FIELD_OFFSET(KPCR
, Prcb
));
293 // FN/FX (FPU) Save Area Structures
295 typedef struct _FNSAVE_FORMAT
304 UCHAR RegisterArea
[80];
305 } FNSAVE_FORMAT
, *PFNSAVE_FORMAT
;
307 typedef struct _FXSAVE_FORMAT
319 UCHAR RegisterArea
[128];
320 UCHAR Reserved3
[128];
321 UCHAR Reserved4
[224];
322 UCHAR Align16Byte
[8];
323 } FXSAVE_FORMAT
, *PFXSAVE_FORMAT
;
325 typedef struct _FX_SAVE_AREA
329 FNSAVE_FORMAT FnArea
;
330 FXSAVE_FORMAT FxArea
;
334 } FX_SAVE_AREA
, *PFX_SAVE_AREA
;
337 // Special Registers Structure (outside of CONTEXT)
339 typedef struct _KSPECIAL_REGISTERS
356 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
359 // Processor State Data
361 typedef struct _KPROCESSOR_STATE
363 CONTEXT ContextFrame
;
364 KSPECIAL_REGISTERS SpecialRegisters
;
365 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
368 // Processor Region Control Block
371 typedef struct _KPRCB
375 struct _KTHREAD
*CurrentThread
;
376 struct _KTHREAD
*NextThread
;
377 struct _KTHREAD
*IdleThread
;
385 KPROCESSOR_STATE ProcessorState
;
386 ULONG KernelReserved
[16];
387 ULONG HalReserved
[16];
388 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
394 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
395 struct _KTHREAD
*NpxThread
;
396 ULONG InterruptCount
;
402 ULONG AdjustDpcThreshold
;
405 UCHAR DebuggerSavedIRQL
;
406 #if (NTDDI_VERSION >= NTDDI_WS03)
408 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
413 ULONG NodeShiftedColor
;
417 struct _KNODE
*ParentNode
;
418 ULONG MultiThreadProcessorSet
;
419 struct _KPRCB
*MultiThreadSetMaster
;
420 #if (NTDDI_VERSION >= NTDDI_WS03)
421 ULONG SecondaryColorMask
;
422 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
428 ULONG ThreadStartCount
[2];
430 ULONG CcFastReadNoWait
;
431 ULONG CcFastReadWait
;
432 ULONG CcFastReadNotPossible
;
433 ULONG CcCopyReadNoWait
;
434 ULONG CcCopyReadWait
;
435 ULONG CcCopyReadNoWaitMiss
;
436 #if (NTDDI_VERSION < NTDDI_LONGHORN)
437 ULONG KeAlignmentFixupCount
;
440 #if (NTDDI_VERSION < NTDDI_LONGHORN)
441 ULONG KeDcacheFlushCount
;
442 ULONG KeExceptionDispatchCount
;
443 ULONG KeFirstLevelTbFills
;
444 ULONG KeFloatingEmulationCount
;
445 ULONG KeIcacheFlushCount
;
446 ULONG KeSecondLevelTbFills
;
449 volatile ULONG IoReadOperationCount
;
450 volatile ULONG IoWriteOperationCount
;
451 volatile ULONG IoOtherOperationCount
;
452 LARGE_INTEGER IoReadTransferCount
;
453 LARGE_INTEGER IoWriteTransferCount
;
454 LARGE_INTEGER IoOtherTransferCount
;
455 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
456 ULONG CcFastMdlReadNoWait
;
457 ULONG CcFastMdlReadWait
;
458 ULONG CcFastMdlReadNotPossible
;
459 ULONG CcMapDataNoWait
;
461 ULONG CcPinMappedDataCount
;
462 ULONG CcPinReadNoWait
;
464 ULONG CcMdlReadNoWait
;
466 ULONG CcLazyWriteHotSpots
;
467 ULONG CcLazyWriteIos
;
468 ULONG CcLazyWritePages
;
471 ULONG CcLostDelayedWrites
;
472 ULONG CcFastReadResourceMiss
;
473 ULONG CcCopyReadWaitMiss
;
474 ULONG CcFastMdlReadResourceMiss
;
475 ULONG CcMapDataNoWaitMiss
;
476 ULONG CcMapDataWaitMiss
;
477 ULONG CcPinReadNoWaitMiss
;
478 ULONG CcPinReadWaitMiss
;
479 ULONG CcMdlReadNoWaitMiss
;
480 ULONG CcMdlReadWaitMiss
;
481 ULONG CcReadAheadIos
;
482 ULONG KeAlignmentFixupCount
;
483 ULONG KeExceptionDispatchCount
;
487 ULONG SpareCounter1
[8];
489 PP_LOOKASIDE_LIST PPLookasideList
[16];
490 PP_LOOKASIDE_LIST PPNPagedLookasideList
[32];
491 PP_LOOKASIDE_LIST PPPagedLookasideList
[32];
492 volatile ULONG PacketBarrier
;
493 volatile ULONG ReverseStall
;
496 volatile PVOID CurrentPacket
[3];
497 volatile ULONG TargetSet
;
498 volatile PKIPI_WORKER WorkerRoutine
;
499 volatile ULONG IpiFrozen
;
501 volatile ULONG RequestSummary
;
502 volatile struct _KPRCB
*SignalDone
;
504 struct _KDPC_DATA DpcData
[2];
506 ULONG MaximumDpcQueueDepth
;
507 ULONG DpcRequestRate
;
508 ULONG MinimumDpcRate
;
509 volatile UCHAR DpcInterruptRequested
;
510 volatile UCHAR DpcThreadRequested
;
511 volatile UCHAR DpcRoutineActive
;
512 volatile UCHAR DpcThreadActive
;
515 volatile ULONG TimerHand
;
516 volatile ULONG TimerRequest
;
519 UCHAR ThreadDpcEnable
;
520 volatile BOOLEAN QuantumEnd
;
522 volatile UCHAR IdleSchedule
;
523 LONG DpcSetEventRequest
;
524 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
534 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
536 UCHAR ClockCheckSlot
;
537 UCHAR ClockPollCycle
;
539 LONG DpcWatchdogPeriod
;
540 LONG DpcWatchDogCount
;
541 LONG ThreadWatchdogPeriod
;
542 LONG ThreadWatchDogCount
;
547 LIST_ENTRY WaitListHead
;
550 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
551 SINGLE_LIST_ENTRY DeferredReadyListHead
;
552 ULONGLONG StartCycles
;
554 ULONGLONG PrcbPad71
[3];
555 LIST_ENTRY DispatcherReadyListHead
[32];
557 LIST_ENTRY DispatcherReadyListHead
[32];
558 SINGLE_LIST_ENTRY DeferredReadyListHead
;
561 PVOID ChainedInterruptList
;
562 LONG LookasideIrpFloat
;
563 volatile LONG MmPageFaultCount
;
564 volatile LONG MmCopyOnWriteCount
;
565 volatile LONG MmTransitionCount
;
566 volatile LONG MmCacheTransitionCount
;
567 volatile LONG MmDemandZeroCount
;
568 volatile LONG MmPageReadCount
;
569 volatile LONG MmPageReadIoCount
;
570 volatile LONG MmCacheReadCount
;
571 volatile LONG MmCacheIoCount
;
572 volatile LONG MmDirtyPagesWriteCount
;
573 volatile LONG MmDirtyWriteIoCount
;
574 volatile LONG MmMappedPagesWriteCount
;
575 volatile LONG MmMappedWriteIoCount
;
576 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
578 ULONG CachedResidentAvailable
;
583 ULONG SpareFields0
[1];
585 CHAR VendorString
[13];
587 UCHAR LogicalProcessorsPerPhysicalProcessor
;
590 LARGE_INTEGER UpdateSignature
;
591 volatile LARGE_INTEGER IsrTime
;
592 LARGE_INTEGER SpareField1
;
593 FX_SAVE_AREA NpxSaveArea
;
594 PROCESSOR_POWER_STATE PowerState
;
595 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
597 KTIMER DpcWatchdogTimer
;
600 SLIST_HEADER InterruptObjectPool
;
601 LARGE_INTEGER HyperCallPagePhysical
;
602 LARGE_INTEGER HyperCallPageVirtual
;
604 CACHE_DESCRIPTOR Cache
[5];
606 ULONG CacheProcessorMask
[5];
607 UCHAR LogicalProcessorsPerCore
;
609 ULONG PackageProcessorSet
;
610 ULONG CoreProcessorSet
;
615 // Processor Control Region
617 typedef struct _KIPCR
624 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
625 PVOID Used_StackBase
;
626 PVOID PerfGlobalGroupMask
;
628 ULONG ContextSwitches
;
629 KAFFINITY SetMemberCopy
;
639 PVOID KdVersionBlock
;
650 ULONG StallScaleFactor
;
654 UCHAR L2CacheAssociativity
;
656 ULONG KernelReserved
[14];
657 ULONG SecondLevelCacheSize
;
658 ULONG HalReserved
[16];
661 ULONG KernelReserved2
[17];
669 typedef struct _KiIoAccessMap
671 UCHAR DirectionMap
[32];
710 KIIO_ACCESS_MAP IoMaps
[1];
711 UCHAR IntDirectionMap
[32];
715 // i386 CPUs don't have exception frames
717 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;