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 // Internal Exception Codes
103 #define KI_EXCEPTION_INTERNAL 0x10000000
104 #define KI_EXCEPTION_ACCESS_VIOLATION (KI_EXCEPTION_INTERNAL | 0x04)
107 // Number of dispatch codes supported by KINTERRUPT
109 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
110 #define KINTERRUPT_DISPATCH_CODES 135
112 #define KINTERRUPT_DISPATCH_CODES 106
118 #define KeGetPcr() PCR
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 enum _PROCESSOR_CACHE_TYPE
558 } PROCESSOR_CACHE_TYPE
;
563 typedef struct _KDPC_DATA
565 LIST_ENTRY DpcListHead
;
567 volatile ULONG DpcQueueDepth
;
569 } KDPC_DATA
, *PKDPC_DATA
;
572 // Per-Processor Lookaside List
574 typedef struct _PP_LOOKASIDE_LIST
576 struct _GENERAL_LOOKASIDE
*P
;
577 struct _GENERAL_LOOKASIDE
*L
;
578 } PP_LOOKASIDE_LIST
, *PPP_LOOKASIDE_LIST
;
581 // CPU Cache Descriptor
583 typedef struct _CACHE_DESCRIPTOR
589 PROCESSOR_CACHE_TYPE Type
;
590 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
593 // Architectural Types
595 #include <arch/ketypes.h>
598 // Kernel Memory Node
600 #include <pshpack1.h>
601 typedef struct _KNODE
603 SLIST_HEADER DeadStackList
;
604 SLIST_HEADER PfnDereferenceSListHead
;
605 KAFFINITY ProcessorMask
;
610 ULONG MmShiftedColor
;
612 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
617 // Kernel Profile Object
619 typedef struct _KPROFILE
623 LIST_ENTRY ProfileListEntry
;
624 struct _KPROCESS
*Process
;
631 KPROFILE_SOURCE Source
;
633 } KPROFILE
, *PKPROFILE
;
636 // Kernel Interrupt Object
638 typedef struct _KINTERRUPT
642 LIST_ENTRY InterruptListEntry
;
643 PKSERVICE_ROUTINE ServiceRoutine
;
644 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
645 PKSERVICE_ROUTINE MessageServiceRoutine
;
648 PVOID ServiceContext
;
651 PKSPIN_LOCK ActualLock
;
652 PKINTERRUPT_ROUTINE DispatchAddress
;
655 KIRQL SynchronizeIrql
;
656 BOOLEAN FloatingSave
;
660 KINTERRUPT_MODE Mode
;
661 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
662 KINTERRUPT_POLARITY Polarity
;
666 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
669 ULONG DispatchCode
[KINTERRUPT_DISPATCH_CODES
];
670 } KINTERRUPT
, *PKINTERRUPT
;
673 // Kernel Event Pair Object
675 typedef struct _KEVENT_PAIR
681 } KEVENT_PAIR
, *PKEVENT_PAIR
;
684 // Kernel No Execute Options
686 typedef struct _KEXECUTE_OPTIONS
688 UCHAR ExecuteDisable
:1;
689 UCHAR ExecuteEnable
:1;
690 UCHAR DisableThunkEmulation
:1;
692 UCHAR ExecuteDispatchEnable
:1;
693 UCHAR ImageDispatchEnable
:1;
695 } KEXECUTE_OPTIONS
, *PKEXECUTE_OPTIONS
;
698 // Kernel Thread (KTHREAD)
700 typedef struct _KTHREAD
702 DISPATCHER_HEADER DispatcherHeader
;
703 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
706 ULONGLONG QuantumTarget
;
708 LIST_ENTRY MutantListHead
;
711 ULONG_PTR StackLimit
;
713 KSPIN_LOCK ThreadLock
;
719 UCHAR ApcStateFill
[23];
721 volatile UCHAR NextProcessor
;
722 volatile UCHAR DeferredProcessor
;
724 SCHAR AdjustIncrement
;
727 KSPIN_LOCK ApcQueueLock
;
728 ULONG ContextSwitches
;
729 volatile UCHAR State
;
732 KPROCESSOR_MODE WaitMode
;
736 PKWAIT_BLOCK WaitBlockList
;
739 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
744 ULONG KernelStackResident
:1;
745 ULONG ReadyTransition
:1;
746 ULONG ProcessReadyQueue
:1;
748 ULONG SystemAffinityActive
:1;
750 ULONG GdiFlushActive
:1;
761 BOOLEAN EnableStackSwap
;
762 volatile UCHAR SwapBusy
;
763 BOOLEAN Alerted
[MaximumMode
];
766 LIST_ENTRY WaitListEntry
;
767 SINGLE_LIST_ENTRY SwapListEntry
;
775 SHORT KernelApcDisable
;
776 SHORT SpecialApcDisable
;
778 ULONG CombinedApcDisable
;
791 LONG AutoAlignment
:1;
793 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
794 LONG EtwStackTrace1ApcInserted
:1;
795 LONG EtwStackTrace2ApcInserted
:1;
796 LONG CycleChargePending
:1;
797 LONG ReservedFlags
:27;
799 LONG ReservedFlags
:30;
808 KWAIT_BLOCK WaitBlock
[THREAD_WAIT_OBJECTS
+ 1];
811 UCHAR WaitBlockFill0
[23];
812 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
813 UCHAR IdealProcessor
;
815 BOOLEAN SystemAffinityActive
;
820 UCHAR WaitBlockFill1
[47];
825 UCHAR WaitBlockFill2
[71];
830 UCHAR WaitBlockFill3
[95];
834 LIST_ENTRY QueueListEntry
;
835 PKTRAP_FRAME TrapFrame
;
836 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
842 #if (NTDDI_VERSION < NTDDI_LONGHORN)
843 UCHAR IdealProcessor
;
846 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
847 BOOLEAN CalloutActive
;
849 BOOLEAN ProcessReadyQueue
;
850 BOOLEAN KernelStackResident
;
853 SCHAR PriorityDecrement
;
855 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
856 ULONG SystemCallNumber
;
859 KAFFINITY UserAffinity
;
860 struct _KPROCESS
*Process
;
862 PKAPC_STATE ApcStatePointer
[2];
865 KAPC_STATE SavedApcState
;
868 UCHAR SavedApcStateFill
[23];
871 UCHAR UserIdealProcessor
;
872 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
877 UCHAR ReservedBits0
:1;
878 UCHAR SegmentsPresent
:1;
879 UCHAR Reservedbits1
:1;
881 UCHAR NestedStateFlags
;
896 UCHAR SuspendApcFill0
[1];
901 UCHAR SuspendApcFill1
[3];
906 UCHAR SuspendApcFill2
[4];
911 UCHAR SuspendApcFill3
[36];
912 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
920 UCHAR SuspendApcFill4
[40];
925 UCHAR SuspendApcFill5
[47];
932 KSEMAPHORE SuspendSemaphore
;
935 UCHAR SuspendSemaphorefill
[20];
936 ULONG SListFaultCount
;
939 LIST_ENTRY ThreadListEntry
;
940 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
941 LIST_ENTRY MutantListHead
;
943 PVOID SListFaultAddress
;
944 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
945 PVOID MdlForLockedteb
;
947 } KTHREAD
, *PKTHREAD
;
949 #define ASSERT_THREAD(object) \
950 ASSERT((((object)->DispatcherHeader.Type & KOBJECT_TYPE_MASK) == ThreadObject))
953 // Kernel Process (KPROCESS)
955 typedef struct _KPROCESS
957 DISPATCHER_HEADER Header
;
958 LIST_ENTRY ProfileListHead
;
959 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
960 ULONG DirectoryTableBase
;
963 LARGE_INTEGER DirectoryTableBase
;
966 KGDTENTRY LdtDescriptor
;
967 KIDTENTRY Int21Descriptor
;
972 volatile ULONG ActiveProcessors
;
975 LIST_ENTRY ReadyListHead
;
976 SINGLE_LIST_ENTRY SwapListEntry
;
977 PVOID VdmTrapcHandler
;
978 LIST_ENTRY ThreadListHead
;
979 KSPIN_LOCK ProcessLock
;
985 LONG AutoAlignment
:1;
987 LONG DisableQuantum
:1;
988 LONG ReservedFlags
:29;
1001 KEXECUTE_OPTIONS Flags
;
1002 UCHAR ExecuteOptions
;
1005 LIST_ENTRY ProcessListEntry
;
1006 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1007 ULONGLONG CycleTime
;
1009 } KPROCESS
, *PKPROCESS
;
1011 #define ASSERT_PROCESS(object) \
1012 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ProcessObject))
1015 // System Service Table Descriptor
1017 typedef struct _KSERVICE_TABLE_DESCRIPTOR
1023 LONG TableBaseGpOffset
;
1026 } KSERVICE_TABLE_DESCRIPTOR
, *PKSERVICE_TABLE_DESCRIPTOR
;
1029 // Exported Loader Parameter Block
1031 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI
*KeLoaderBlock
;
1034 // Exported Hardware Data
1036 extern KAFFINITY NTSYSAPI KeActiveProcessors
;
1037 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1038 extern volatile CCHAR NTSYSAPI KeNumberProcessors
;
1040 #if (NTDDI_VERSION >= NTDDI_WINXP)
1041 extern CCHAR NTSYSAPI KeNumberProcessors
;
1043 //extern PCCHAR KeNumberProcessors;
1044 extern NTSYSAPI CCHAR KeNumberProcessors
; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
1047 extern ULONG NTSYSAPI KiDmaIoCoherency
;
1048 extern ULONG NTSYSAPI KeMaximumIncrement
;
1049 extern ULONG NTSYSAPI KeMinimumIncrement
;
1050 extern ULONG NTSYSAPI KeDcacheFlushCount
;
1051 extern ULONG NTSYSAPI KeIcacheFlushCount
;
1054 // Exported System Service Descriptor Tables
1056 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable
[SSDT_MAX_ENTRIES
];
1057 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow
[SSDT_MAX_ENTRIES
];
1059 #endif // !NTOS_MODE_USER
1061 #endif // _KETYPES_H