3 Copyright (c) Alex Ionescu. All rights reserved.
11 Type definitions for the Loader.
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
26 #ifndef NTOS_MODE_USER
33 // Context Record Flags
35 #define CONTEXT_DEBUGGER (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
38 // Maximum System Descriptor Table Entries
40 #define SSDT_MAX_ENTRIES 2
43 // Processor Architectures
45 #define PROCESSOR_ARCHITECTURE_INTEL 0
46 #define PROCESSOR_ARCHITECTURE_MIPS 1
47 #define PROCESSOR_ARCHITECTURE_ALPHA 2
48 #define PROCESSOR_ARCHITECTURE_PPC 3
49 #define PROCESSOR_ARCHITECTURE_SHX 4
50 #define PROCESSOR_ARCHITECTURE_ARM 5
51 #define PROCESSOR_ARCHITECTURE_IA64 6
52 #define PROCESSOR_ARCHITECTURE_ALPHA64 7
53 #define PROCESSOR_ARCHITECTURE_MSIL 8
54 #define PROCESSOR_ARCHITECTURE_AMD64 9
55 #define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
58 // Object Type Mask for Kernel Dispatcher Objects
60 #define KOBJECT_TYPE_MASK 0x7F
61 #define KOBJECT_LOCK_BIT 0x80
64 // Dispatcher Priority increments
66 #define THREAD_ALERT_INCREMENT 2
69 // Physical memory offset of KUSER_SHARED_DATA
71 #define KI_USER_SHARED_DATA_PHYSICAL 0x41000
74 // Quantum values and decrements
76 #define MAX_QUANTUM 0x7F
77 #define WAIT_QUANTUM_DECREMENT 1
78 #define CLOCK_QUANTUM_DECREMENT 3
81 // Kernel Feature Bits
83 #define KF_V86_VIS 0x00000001
84 #define KF_RDTSC 0x00000002
85 #define KF_CR4 0x00000004
86 #define KF_CMOV 0x00000008
87 #define KF_GLOBAL_PAGE 0x00000010
88 #define KF_LARGE_PAGE 0x00000020
89 #define KF_MTRR 0x00000040
90 #define KF_CMPXCHG8B 0x00000080
91 #define KF_MMX 0x00000100
92 #define KF_WORKING_PTE 0x00000200
93 #define KF_PAT 0x00000400
94 #define KF_FXSR 0x00000800
95 #define KF_FAST_SYSCALL 0x00001000
96 #define KF_XMMI 0x00002000
97 #define KF_3DNOW 0x00004000
98 #define KF_AMDK6MTRR 0x00008000
99 #define KF_XMMI64 0x00010000
100 #define KF_DTS 0x00020000
101 #define KF_NX_BIT 0x20000000
102 #define KF_NX_DISABLED 0x40000000
103 #define KF_NX_ENABLED 0x80000000
106 // Internal Exception Codes
108 #define KI_EXCEPTION_INTERNAL 0x10000000
109 #define KI_EXCEPTION_ACCESS_VIOLATION (KI_EXCEPTION_INTERNAL | 0x04)
112 // Number of dispatch codes supported by KINTERRUPT
114 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
115 #define KINTERRUPT_DISPATCH_CODES 135
117 #define KINTERRUPT_DISPATCH_CODES 106
120 #ifdef NTOS_MODE_USER
123 // KPROCESSOR_MODE Type
125 typedef CCHAR KPROCESSOR_MODE
;
128 // Dereferencable pointer to KUSER_SHARED_DATA in User-Mode
130 #define SharedUserData ((KUSER_SHARED_DATA *CONST)USER_SHARED_DATA)
133 // Maximum WOW64 Entries in KUSER_SHARED_DATA
135 #define MAX_WOW64_SHARED_ENTRIES 16
138 // Maximum Processor Features supported in KUSER_SHARED_DATA
140 #define PROCESSOR_FEATURE_MAX 64
145 typedef enum _EVENT_TYPE
154 typedef enum _TIMER_TYPE
163 typedef enum _WAIT_TYPE
170 // Processor Execution Modes
182 typedef enum _KWAIT_REASON
224 typedef enum _KPROFILE_SOURCE
227 ProfileAlignmentFixup
,
230 ProfileLoadInstructions
,
231 ProfilePipelineFrozen
,
232 ProfileBranchInstructions
,
233 ProfileTotalNonissues
,
237 ProfileBranchMispredictions
,
238 ProfileStoreInstructions
,
239 ProfileFpInstructions
,
240 ProfileIntegerInstructions
,
244 ProfileSpecialInstructions
,
247 ProfileDcacheAccesses
,
248 ProfileMemoryBarrierCycles
,
249 ProfileLoadLinkedIssues
,
254 // NT Product and Architecture Types
256 typedef enum _NT_PRODUCT_TYPE
261 } NT_PRODUCT_TYPE
, *PNT_PRODUCT_TYPE
;
263 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
268 } ALTERNATIVE_ARCHITECTURE_TYPE
;
275 typedef enum _KTHREAD_STATE
285 #if (NTDDI_VERSION >= NTDDI_WS03)
288 } KTHREAD_STATE
, *PKTHREAD_STATE
;
291 // Kernel Object Types
293 typedef enum _KOBJECTS
295 EventNotificationObject
= 0,
296 EventSynchronizationObject
= 1,
303 TimerNotificationObject
= 8,
304 TimerSynchronizationObject
= 9,
315 DeviceQueueObject
= 20,
316 EventPairObject
= 21,
317 InterruptObject
= 22,
319 ThreadedDpcObject
= 24,
320 MaximumKernelObject
= 25
326 typedef enum _ADJUST_REASON
336 typedef enum _KCONTINUE_STATUS
340 ContinueProcessorReselected
,
341 ContinueNextProcessor
347 typedef enum _KPROCESS_STATE
354 } KPROCESS_STATE
, *PKPROCESS_STATE
;
357 // NtVdmControl Classes
359 typedef enum _VDMSERVICECLASS
361 VdmStartExecution
= 0,
362 VdmQueueInterrupt
= 1,
363 VdmDelayInterrupt
= 2,
366 VdmSetInt21Handler
= 5,
368 VdmPrinterDirectIoOpen
= 7,
369 VdmPrinterDirectIoClose
= 8,
370 VdmPrinterInitialize
= 9,
371 VdmSetLdtEntries
= 10,
372 VdmSetProcessLdtInfo
= 11,
373 VdmAdlibEmulation
= 12,
374 VdmPMCliControl
= 13,
375 VdmQueryVdmProcess
= 14,
378 #ifdef NTOS_MODE_USER
381 // APC Normal Routine
384 (NTAPI
*PKNORMAL_ROUTINE
)(
385 IN PVOID NormalContext
,
386 IN PVOID SystemArgument1
,
387 IN PVOID SystemArgument2
394 (NTAPI
*PTIMER_APC_ROUTINE
)(
395 IN PVOID TimerContext
,
396 IN ULONG TimerLowValue
,
397 IN LONG TimerHighValue
401 // System Time Structure
403 typedef struct _KSYSTEM_TIME
408 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
411 // Shared Kernel User Data
413 typedef struct _KUSER_SHARED_DATA
415 ULONG TickCountLowDeprecated
;
416 ULONG TickCountMultiplier
;
417 volatile KSYSTEM_TIME InterruptTime
;
418 volatile KSYSTEM_TIME SystemTime
;
419 volatile KSYSTEM_TIME TimeZoneBias
;
420 USHORT ImageNumberLow
;
421 USHORT ImageNumberHigh
;
422 WCHAR NtSystemRoot
[260];
423 ULONG MaxStackTraceDepth
;
424 ULONG CryptoExponent
;
426 ULONG LargePageMinimum
;
428 NT_PRODUCT_TYPE NtProductType
;
429 BOOLEAN ProductTypeIsValid
;
430 ULONG NtMajorVersion
;
431 ULONG NtMinorVersion
;
432 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
435 volatile ULONG TimeSlip
;
436 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
437 LARGE_INTEGER SystemExpirationDate
;
439 BOOLEAN KdDebuggerEnabled
;
440 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
441 UCHAR NXSupportPolicy
;
443 volatile ULONG ActiveConsoleId
;
444 volatile ULONG DismountCount
;
445 ULONG ComPlusPackage
;
446 ULONG LastSystemRITEventTickCount
;
447 ULONG NumberOfPhysicalPages
;
448 BOOLEAN SafeBootMode
;
451 ULONGLONG TestRetInstruction
;
453 ULONG SystemCallReturn
;
454 ULONGLONG SystemCallPad
[3];
456 volatile KSYSTEM_TIME TickCount
;
457 volatile ULONG64 TickCountQuad
;
460 #if (NTDDI_VERSION >= NTDDI_WS03)
461 LONGLONG ConsoleSessionForegroundProcessId
;
462 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
464 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
465 USHORT UserModeGlobalLogger
[8];
466 ULONG HeapTracingPid
[2];
467 ULONG CritSecTracingPid
[2];
470 ULONG SharedDataFlags
;
473 ULONG DbgErrorPortPresent
:1;
474 ULONG DbgElevationEnabled
:1;
475 ULONG DbgVirtEnabled
:1;
476 ULONG DbgInstallerDetectEnabled
:1;
480 ULONG ImageFileExecutionOptions
;
481 KAFFINITY ActiveProcessorAffinity
;
483 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
488 #include "pshpack1.h"
489 typedef struct _VdmVirtualIca
502 } VDMVIRTUALICA
, *PVDMVIRTUALICA
;
505 typedef struct _VdmIcaUserData
508 PVDMVIRTUALICA pIcaMaster
;
509 PVDMVIRTUALICA pIcaSlave
;
514 PULONG pAddrIretBopTable
;
515 PHANDLE phWowIdleEvent
;
516 PLARGE_INTEGER pIcaTimeout
;
517 PHANDLE phMainThreadSuspended
;
518 } VDMICAUSERDATA
, *PVDMICAUSERDATA
;
520 typedef struct _VDM_INITIALIZE_DATA
523 PVDMICAUSERDATA IcaUserData
;
524 } VDM_INITIALIZE_DATA
, *PVDM_INITIALIZE_DATA
;
529 // System Thread Start Routine
533 (NTAPI
*PKSYSTEM_ROUTINE
)(
534 PKSTART_ROUTINE StartRoutine
,
539 // APC Environment Types
541 typedef enum _KAPC_ENVIRONMENT
543 OriginalApcEnvironment
,
544 AttachedApcEnvironment
,
545 CurrentApcEnvironment
,
552 typedef struct _KDPC_DATA
554 LIST_ENTRY DpcListHead
;
556 volatile ULONG DpcQueueDepth
;
558 } KDPC_DATA
, *PKDPC_DATA
;
561 // Per-Processor Lookaside List
563 typedef struct _PP_LOOKASIDE_LIST
565 struct _GENERAL_LOOKASIDE
*P
;
566 struct _GENERAL_LOOKASIDE
*L
;
567 } PP_LOOKASIDE_LIST
, *PPP_LOOKASIDE_LIST
;
570 // Architectural Types
572 #include <arch/ketypes.h>
575 // Kernel Memory Node
577 #include <pshpack1.h>
578 typedef struct _KNODE
580 SLIST_HEADER DeadStackList
;
581 SLIST_HEADER PfnDereferenceSListHead
;
582 KAFFINITY ProcessorMask
;
587 ULONG MmShiftedColor
;
589 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
594 // Kernel Profile Object
596 typedef struct _KPROFILE
600 LIST_ENTRY ProfileListEntry
;
601 struct _KPROCESS
*Process
;
608 KPROFILE_SOURCE Source
;
610 } KPROFILE
, *PKPROFILE
;
613 // Kernel Interrupt Object
615 typedef struct _KINTERRUPT
619 LIST_ENTRY InterruptListEntry
;
620 PKSERVICE_ROUTINE ServiceRoutine
;
621 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
622 PKSERVICE_ROUTINE MessageServiceRoutine
;
625 PVOID ServiceContext
;
628 PKSPIN_LOCK ActualLock
;
629 PKINTERRUPT_ROUTINE DispatchAddress
;
632 KIRQL SynchronizeIrql
;
633 BOOLEAN FloatingSave
;
637 KINTERRUPT_MODE Mode
;
638 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
639 KINTERRUPT_POLARITY Polarity
;
643 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
646 ULONG DispatchCode
[KINTERRUPT_DISPATCH_CODES
];
650 // Kernel Event Pair Object
652 typedef struct _KEVENT_PAIR
658 } KEVENT_PAIR
, *PKEVENT_PAIR
;
661 // Kernel No Execute Options
663 typedef struct _KEXECUTE_OPTIONS
665 UCHAR ExecuteDisable
:1;
666 UCHAR ExecuteEnable
:1;
667 UCHAR DisableThunkEmulation
:1;
669 UCHAR ExecuteDispatchEnable
:1;
670 UCHAR ImageDispatchEnable
:1;
672 } KEXECUTE_OPTIONS
, *PKEXECUTE_OPTIONS
;
675 // Kernel Thread (KTHREAD)
677 typedef struct _KTHREAD
679 DISPATCHER_HEADER DispatcherHeader
;
680 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
683 ULONGLONG QuantumTarget
;
685 LIST_ENTRY MutantListHead
;
688 ULONG_PTR StackLimit
;
690 KSPIN_LOCK ThreadLock
;
696 UCHAR ApcStateFill
[23];
698 volatile UCHAR NextProcessor
;
699 volatile UCHAR DeferredProcessor
;
701 SCHAR AdjustIncrement
;
704 KSPIN_LOCK ApcQueueLock
;
705 ULONG ContextSwitches
;
706 volatile UCHAR State
;
709 KPROCESSOR_MODE WaitMode
;
713 PKWAIT_BLOCK WaitBlockList
;
716 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
721 ULONG KernelStackResident
:1;
722 ULONG ReadyTransition
:1;
723 ULONG ProcessReadyQueue
:1;
725 ULONG SystemAffinityActive
:1;
727 ULONG GdiFlushActive
:1;
738 BOOLEAN EnableStackSwap
;
739 volatile UCHAR SwapBusy
;
740 BOOLEAN Alerted
[MaximumMode
];
743 LIST_ENTRY WaitListEntry
;
744 SINGLE_LIST_ENTRY SwapListEntry
;
752 SHORT KernelApcDisable
;
753 SHORT SpecialApcDisable
;
755 ULONG CombinedApcDisable
;
768 LONG AutoAlignment
:1;
770 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
771 LONG EtwStackTrace1ApcInserted
:1;
772 LONG EtwStackTrace2ApcInserted
:1;
773 LONG CycleChargePending
:1;
774 LONG ReservedFlags
:27;
776 LONG ReservedFlags
:30;
785 KWAIT_BLOCK WaitBlock
[THREAD_WAIT_OBJECTS
+ 1];
788 UCHAR WaitBlockFill0
[23];
789 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
790 UCHAR IdealProcessor
;
792 BOOLEAN SystemAffinityActive
;
797 UCHAR WaitBlockFill1
[47];
802 UCHAR WaitBlockFill2
[71];
807 UCHAR WaitBlockFill3
[95];
811 LIST_ENTRY QueueListEntry
;
812 PKTRAP_FRAME TrapFrame
;
813 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
819 #if (NTDDI_VERSION < NTDDI_LONGHORN)
820 UCHAR IdealProcessor
;
823 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
824 BOOLEAN CalloutActive
;
826 BOOLEAN ProcessReadyQueue
;
827 BOOLEAN KernelStackResident
;
830 SCHAR PriorityDecrement
;
832 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
833 ULONG SystemCallNumber
;
836 KAFFINITY UserAffinity
;
837 struct _KPROCESS
*Process
;
839 PKAPC_STATE ApcStatePointer
[2];
842 KAPC_STATE SavedApcState
;
845 UCHAR SavedApcStateFill
[23];
848 UCHAR UserIdealProcessor
;
849 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
854 UCHAR ReservedBits0
:1;
855 UCHAR SegmentsPresent
:1;
856 UCHAR Reservedbits1
:1;
858 UCHAR NestedStateFlags
;
873 UCHAR SuspendApcFill0
[1];
878 UCHAR SuspendApcFill1
[3];
883 UCHAR SuspendApcFill2
[4];
888 UCHAR SuspendApcFill3
[36];
889 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
897 UCHAR SuspendApcFill4
[40];
902 UCHAR SuspendApcFill5
[47];
909 KSEMAPHORE SuspendSemaphore
;
912 UCHAR SuspendSemaphorefill
[20];
913 ULONG SListFaultCount
;
916 LIST_ENTRY ThreadListEntry
;
917 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
918 LIST_ENTRY MutantListHead
;
920 PVOID SListFaultAddress
;
921 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
922 PVOID MdlForLockedteb
;
926 #define ASSERT_THREAD(object) \
927 ASSERT((((object)->DispatcherHeader.Type & KOBJECT_TYPE_MASK) == ThreadObject))
930 // Kernel Process (KPROCESS)
932 typedef struct _KPROCESS
934 DISPATCHER_HEADER Header
;
935 LIST_ENTRY ProfileListHead
;
936 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
937 ULONG DirectoryTableBase
;
940 ULONG DirectoryTableBase
[2];
943 KGDTENTRY LdtDescriptor
;
944 KIDTENTRY Int21Descriptor
;
949 volatile ULONG ActiveProcessors
;
952 LIST_ENTRY ReadyListHead
;
953 SINGLE_LIST_ENTRY SwapListEntry
;
954 PVOID VdmTrapcHandler
;
955 LIST_ENTRY ThreadListHead
;
956 KSPIN_LOCK ProcessLock
;
962 LONG AutoAlignment
:1;
964 LONG DisableQuantum
:1;
965 LONG ReservedFlags
:29;
978 KEXECUTE_OPTIONS Flags
;
979 UCHAR ExecuteOptions
;
982 LIST_ENTRY ProcessListEntry
;
983 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
988 #define ASSERT_PROCESS(object) \
989 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ProcessObject))
992 // System Service Table Descriptor
994 typedef struct _KSERVICE_TABLE_DESCRIPTOR
1000 LONG TableBaseGpOffset
;
1003 } KSERVICE_TABLE_DESCRIPTOR
, *PKSERVICE_TABLE_DESCRIPTOR
;
1006 // Exported Loader Parameter Block
1008 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI
*KeLoaderBlock
;
1011 // Exported Hardware Data
1013 extern KAFFINITY NTSYSAPI KeActiveProcessors
;
1014 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1015 extern volatile CCHAR NTSYSAPI KeNumberProcessors
;
1017 #if (NTDDI_VERSION >= NTDDI_WINXP)
1018 extern CCHAR NTSYSAPI KeNumberProcessors
;
1020 //extern PCCHAR KeNumberProcessors;
1021 extern NTSYSAPI CCHAR KeNumberProcessors
; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
1024 extern ULONG NTSYSAPI KiDmaIoCoherency
;
1025 extern ULONG NTSYSAPI KeMaximumIncrement
;
1026 extern ULONG NTSYSAPI KeMinimumIncrement
;
1027 extern ULONG NTSYSAPI KeDcacheFlushCount
;
1028 extern ULONG NTSYSAPI KeIcacheFlushCount
;
1031 // Exported System Service Descriptor Tables
1033 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable
[SSDT_MAX_ENTRIES
];
1034 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow
[SSDT_MAX_ENTRIES
];
1036 #endif // !NTOS_MODE_USER
1038 #endif // _KETYPES_H