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
48 // Object Type Mask for Kernel Dispatcher Objects
50 #define KOBJECT_TYPE_MASK 0x7F
51 #define KOBJECT_LOCK_BIT 0x80
54 // Dispatcher Priority increments
56 #define THREAD_ALERT_INCREMENT 2
59 // User Shared Data in Kernel-Mode
61 #define KI_USER_SHARED_DATA 0xffdf0000
64 // Physical memory offset of KUSER_SHARED_DATA
66 #define KI_USER_SHARED_DATA_PHYSICAL 0x41000
69 // Quantum values and decrements
71 #define MAX_QUANTUM 0x7F
72 #define WAIT_QUANTUM_DECREMENT 1
73 #define CLOCK_QUANTUM_DECREMENT 3
76 // Kernel Feature Bits
78 #define KF_V86_VIS 0x00000001
79 #define KF_RDTSC 0x00000002
80 #define KF_CR4 0x00000004
81 #define KF_CMOV 0x00000008
82 #define KF_GLOBAL_PAGE 0x00000010
83 #define KF_LARGE_PAGE 0x00000020
84 #define KF_MTRR 0x00000040
85 #define KF_CMPXCHG8B 0x00000080
86 #define KF_MMX 0x00000100
87 #define KF_WORKING_PTE 0x00000200
88 #define KF_PAT 0x00000400
89 #define KF_FXSR 0x00000800
90 #define KF_FAST_SYSCALL 0x00001000
91 #define KF_XMMI 0x00002000
92 #define KF_3DNOW 0x00004000
93 #define KF_AMDK6MTRR 0x00008000
94 #define KF_XMMI64 0x00010000
95 #define KF_DTS 0x00020000
96 #define KF_NX_BIT 0x20000000
97 #define KF_NX_DISABLED 0x40000000
98 #define KF_NX_ENABLED 0x80000000
101 // KPCR Access for non-IA64 builds
103 #define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
104 #define PCR ((volatile KPCR * const)K0IPCR)
105 #if !defined(CONFIG_SMP) && !defined(NT_BUILD)
106 #define KeGetPcr() PCR
108 #define KeGetPcr() ((volatile KPCR * const)__readfsdword(0x1C))
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
;
293 typedef enum _ADJUST_REASON
303 typedef enum _KCONTINUE_STATUS
307 ContinueProcessorReselected
,
308 ContinueNextProcessor
314 typedef enum _KPROCESS_STATE
321 } KPROCESS_STATE
, *PKPROCESS_STATE
;
324 // NtVdmControl Classes
326 typedef enum _VDMSERVICECLASS
328 VdmStartExecution
= 0,
329 VdmQueueInterrupt
= 1,
330 VdmDelayInterrupt
= 2,
333 VdmSetInt21Handler
= 5,
335 VdmPrinterDirectIoOpen
= 7,
336 VdmPrinterDirectIoClose
= 8,
337 VdmPrinterInitialize
= 9,
338 VdmSetLdtEntries
= 10,
339 VdmSetProcessLdtInfo
= 11,
340 VdmAdlibEmulation
= 12,
341 VdmPMCliControl
= 13,
342 VdmQueryVdmProcess
= 14,
345 #ifdef NTOS_MODE_USER
348 // APC Normal Routine
351 (NTAPI
*PKNORMAL_ROUTINE
)(
352 IN PVOID NormalContext
,
353 IN PVOID SystemArgument1
,
354 IN PVOID SystemArgument2
361 (NTAPI
*PTIMER_APC_ROUTINE
)(
362 IN PVOID TimerContext
,
363 IN ULONG TimerLowValue
,
364 IN LONG TimerHighValue
368 // System Time Structure
370 typedef struct _KSYSTEM_TIME
375 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
378 // Shared Kernel User Data
380 typedef struct _KUSER_SHARED_DATA
382 ULONG TickCountLowDeprecated
;
383 ULONG TickCountMultiplier
;
384 volatile KSYSTEM_TIME InterruptTime
;
385 volatile KSYSTEM_TIME SystemTime
;
386 volatile KSYSTEM_TIME TimeZoneBias
;
387 USHORT ImageNumberLow
;
388 USHORT ImageNumberHigh
;
389 WCHAR NtSystemRoot
[260];
390 ULONG MaxStackTraceDepth
;
391 ULONG CryptoExponent
;
393 ULONG LargePageMinimum
;
395 NT_PRODUCT_TYPE NtProductType
;
396 BOOLEAN ProductTypeIsValid
;
397 ULONG NtMajorVersion
;
398 ULONG NtMinorVersion
;
399 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
402 volatile ULONG TimeSlip
;
403 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
404 LARGE_INTEGER SystemExpirationDate
;
406 BOOLEAN KdDebuggerEnabled
;
407 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
408 UCHAR NXSupportPolicy
;
410 volatile ULONG ActiveConsoleId
;
411 volatile ULONG DismountCount
;
412 ULONG ComPlusPackage
;
413 ULONG LastSystemRITEventTickCount
;
414 ULONG NumberOfPhysicalPages
;
415 BOOLEAN SafeBootMode
;
418 ULONGLONG TestRetInstruction
;
420 ULONG SystemCallReturn
;
421 ULONGLONG SystemCallPad
[3];
423 volatile KSYSTEM_TIME TickCount
;
424 volatile ULONG64 TickCountQuad
;
427 #if (NTDDI_VERSION >= NTDDI_WS03)
428 LONGLONG ConsoleSessionForegroundProcessId
;
429 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
431 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
432 USHORT UserModeGlobalLogger
[8];
433 ULONG HeapTracingPid
[2];
434 ULONG CritSecTracingPid
[2];
437 ULONG SharedDataFlags
;
440 ULONG DbgErrorPortPresent
:1;
441 ULONG DbgElevationEnabled
:1;
442 ULONG DbgVirtEnabled
:1;
443 ULONG DbgInstallerDetectEnabled
:1;
447 ULONG ImageFileExecutionOptions
;
448 KAFFINITY ActiveProcessorAffinity
;
450 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
455 #include "pshpack1.h"
456 typedef struct _VdmVirtualIca
469 } VDMVIRTUALICA
, *PVDMVIRTUALICA
;
472 typedef struct _VdmIcaUserData
475 PVDMVIRTUALICA pIcaMaster
;
476 PVDMVIRTUALICA pIcaSlave
;
481 PULONG pAddrIretBopTable
;
482 PHANDLE phWowIdleEvent
;
483 PLARGE_INTEGER pIcaTimeout
;
484 PHANDLE phMainThreadSuspended
;
485 } VDMICAUSERDATA
, *PVDMICAUSERDATA
;
487 typedef struct _VDM_INITIALIZE_DATA
490 PVDMICAUSERDATA IcaUserData
;
491 } VDM_INITIALIZE_DATA
, *PVDM_INITIALIZE_DATA
;
496 // System Thread Start Routine
500 (NTAPI
*PKSYSTEM_ROUTINE
)(
501 PKSTART_ROUTINE StartRoutine
,
506 // APC Environment Types
508 typedef enum _KAPC_ENVIRONMENT
510 OriginalApcEnvironment
,
511 AttachedApcEnvironment
,
512 CurrentApcEnvironment
,
519 typedef enum _PROCESSOR_CACHE_TYPE
525 } PROCESSOR_CACHE_TYPE
;
530 typedef struct _KDPC_DATA
532 LIST_ENTRY DpcListHead
;
534 volatile ULONG DpcQueueDepth
;
536 } KDPC_DATA
, *PKDPC_DATA
;
539 // Per-Processor Lookaside List
541 typedef struct _PP_LOOKASIDE_LIST
543 struct _GENERAL_LOOKASIDE
*P
;
544 struct _GENERAL_LOOKASIDE
*L
;
545 } PP_LOOKASIDE_LIST
, *PPP_LOOKASIDE_LIST
;
548 // CPU Cache Descriptor
550 typedef struct _CACHE_DESCRIPTOR
556 PROCESSOR_CACHE_TYPE Type
;
557 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
560 // Architectural Types
562 #include <arch/ketypes.h>
565 // Kernel Memory Node
567 #include <pshpack1.h>
568 typedef struct _KNODE
570 SLIST_HEADER DeadStackList
;
571 SLIST_HEADER PfnDereferenceSListHead
;
572 KAFFINITY ProcessorMask
;
577 ULONG MmShiftedColor
;
579 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
584 // Kernel Profile Object
586 typedef struct _KPROFILE
590 LIST_ENTRY ProfileListEntry
;
591 struct _KPROCESS
*Process
;
598 KPROFILE_SOURCE Source
;
600 } KPROFILE
, *PKPROFILE
;
603 // Kernel Interrupt Object
605 typedef struct _KINTERRUPT
609 LIST_ENTRY InterruptListEntry
;
610 PKSERVICE_ROUTINE ServiceRoutine
;
611 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
612 PKSERVICE_ROUTINE MessageServiceRoutine
;
615 PVOID ServiceContext
;
618 PKSPIN_LOCK ActualLock
;
619 PVOID DispatchAddress
;
622 KIRQL SynchronizeIrql
;
623 BOOLEAN FloatingSave
;
627 KINTERRUPT_MODE Mode
;
628 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
629 KINTERRUPT_POLARITY Polarity
;
633 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
636 ULONG DispatchCode
[KINTERRUPT_DISPATCH_CODES
];
637 } KINTERRUPT
, *PKINTERRUPT
;
640 // Kernel Event Pair Object
642 typedef struct _KEVENT_PAIR
648 } KEVENT_PAIR
, *PKEVENT_PAIR
;
651 // Kernel No Execute Options
653 typedef struct _KEXECUTE_OPTIONS
655 UCHAR ExecuteDisable
:1;
656 UCHAR ExecuteEnable
:1;
657 UCHAR DisableThunkEmulation
:1;
659 UCHAR ExecuteDispatchEnable
:1;
660 UCHAR ImageDispatchEnable
:1;
662 } KEXECUTE_OPTIONS
, *PKEXECUTE_OPTIONS
;
665 // Kernel Object Types
667 typedef enum _KOBJECTS
669 EventNotificationObject
= 0,
670 EventSynchronizationObject
= 1,
677 TimerNotificationObject
= 8,
678 TimerSynchronizationObject
= 9,
689 DeviceQueueObject
= 20,
690 EventPairObject
= 21,
691 InterruptObject
= 22,
693 ThreadedDpcObject
= 24,
694 MaximumKernelObject
= 25
698 // Kernel Thread (KTHREAD)
700 typedef struct _KTHREAD
702 DISPATCHER_HEADER DispatcherHeader
;
703 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
707 LIST_ENTRY MutantListHead
;
710 ULONG_PTR StackLimit
;
712 KSPIN_LOCK ThreadLock
;
718 UCHAR ApcStateFill
[23];
720 volatile UCHAR NextProcessor
;
721 volatile UCHAR DeferredProcessor
;
723 SCHAR AdjustIncrement
;
726 KSPIN_LOCK ApcQueueLock
;
727 ULONG ContextSwitches
;
728 volatile UCHAR State
;
731 KPROCESSOR_MODE WaitMode
;
735 PKWAIT_BLOCK WaitBlockList
;
742 BOOLEAN EnableStackSwap
;
743 volatile UCHAR SwapBusy
;
744 BOOLEAN Alerted
[MaximumMode
];
747 LIST_ENTRY WaitListEntry
;
748 SINGLE_LIST_ENTRY SwapListEntry
;
756 SHORT KernelApcDisable
;
757 SHORT SpecialApcDisable
;
759 ULONG CombinedApcDisable
;
772 LONG AutoAlignment
:1;
774 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
775 LONG EtwStackTrace1ApcInserted
:1;
776 LONG EtwStackTrace2ApcInserted
:1;
777 LONG CycleChargePending
:1;
778 LONG ReservedFlags
:27;
780 LONG ReservedFlags
:30;
789 KWAIT_BLOCK WaitBlock
[THREAD_WAIT_OBJECTS
+ 1];
792 UCHAR WaitBlockFill0
[23];
793 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 UCHAR IdealProcessor
;
821 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
822 BOOLEAN CalloutActive
;
824 BOOLEAN ProcessReadyQueue
;
826 BOOLEAN KernelStackResident
;
828 SCHAR PriorityDecrement
;
830 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
831 ULONG SystemCallNumber
;
837 ULONG ReadyTransition
:1;
838 ULONG ProcessReadyQueue
:1;
845 KAFFINITY UserAffinity
;
846 struct _KPROCESS
*Process
;
848 PKAPC_STATE ApcStatePointer
[2];
851 KAPC_STATE SavedApcState
;
854 UCHAR SavedApcStateFill
[23];
857 UCHAR UserIdealProcessor
;
858 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
863 UCHAR ReservedBits0
:1;
864 UCHAR SegmentsPresent
:1;
865 UCHAR Reservedbits1
:1;
867 UCHAR NestedStateFlags
;
882 UCHAR SuspendApcFill0
[1];
887 UCHAR SuspendApcFill1
[3];
892 UCHAR SuspendApcFill2
[4];
897 UCHAR SuspendApcFill3
[36];
898 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
906 UCHAR SuspendApcFill4
[40];
911 UCHAR SuspendApcFill5
[47];
918 KSEMAPHORE SuspendSemaphore
;
921 UCHAR SuspendSemaphorefill
[20];
922 ULONG SListFaultCount
;
925 LIST_ENTRY ThreadListEntry
;
926 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
927 LIST_ENTRY MutantListHead
;
929 PVOID SListFaultAddress
;
930 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
931 PVOID MdlForLockedteb
;
935 #define ASSERT_THREAD(object) \
936 ASSERT((((object)->DispatcherHeader.Type & KOBJECT_TYPE_MASK) == ThreadObject))
939 // Kernel Process (KPROCESS)
941 typedef struct _KPROCESS
943 DISPATCHER_HEADER Header
;
944 LIST_ENTRY ProfileListHead
;
945 LARGE_INTEGER DirectoryTableBase
;
947 KGDTENTRY LdtDescriptor
;
948 KIDTENTRY Int21Descriptor
;
953 volatile ULONG ActiveProcessors
;
956 LIST_ENTRY ReadyListHead
;
957 SINGLE_LIST_ENTRY SwapListEntry
;
958 PVOID VdmTrapcHandler
;
959 LIST_ENTRY ThreadListHead
;
960 KSPIN_LOCK ProcessLock
;
966 LONG AutoAlignment
:1;
968 LONG DisableQuantum
:1;
969 LONG ReservedFlags
:29;
982 KEXECUTE_OPTIONS Flags
;
983 UCHAR ExecuteOptions
;
986 LIST_ENTRY ProcessListEntry
;
987 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
990 } KPROCESS
, *PKPROCESS
;
992 #define ASSERT_PROCESS(object) \
993 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ProcessObject))
996 // System Service Table Descriptor
998 typedef struct _KSERVICE_TABLE_DESCRIPTOR
1004 LONG TableBaseGpOffset
;
1007 } KSERVICE_TABLE_DESCRIPTOR
, *PKSERVICE_TABLE_DESCRIPTOR
;
1010 // Exported Loader Parameter Block
1012 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI
*KeLoaderBlock
;
1015 // Exported Hardware Data
1017 extern KAFFINITY NTSYSAPI KeActiveProcessors
;
1018 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1019 extern volatile CCHAR NTSYSAPI KeNumberProcessors
;
1021 #if (NTDDI_VERSION >= NTDDI_WINXP)
1022 extern CCHAR NTSYSAPI KeNumberProcessors
;
1024 //extern PCCHAR KeNumberProcessors;
1025 extern NTSYSAPI CCHAR KeNumberProcessors
; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
1028 extern ULONG NTSYSAPI KiDmaIoCoherency
;
1029 extern ULONG NTSYSAPI KeMaximumIncrement
;
1030 extern ULONG NTSYSAPI KeMinimumIncrement
;
1031 extern ULONG NTSYSAPI KeDcacheFlushCount
;
1032 extern ULONG NTSYSAPI KeIcacheFlushCount
;
1035 // Exported System Service Descriptor Tables
1037 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable
[SSDT_MAX_ENTRIES
];
1038 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow
[SSDT_MAX_ENTRIES
];
1040 #endif // !NTOS_MODE_USER
1042 #endif // _KETYPES_H