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 // Object Type Mask for Kernel Dispatcher Objects
45 #define KOBJECT_TYPE_MASK 0x7F
46 #define KOBJECT_LOCK_BIT 0x80
49 // Dispatcher Priority increments
51 #define THREAD_ALERT_INCREMENT 2
54 // User Shared Data in Kernel-Mode
56 #define KI_USER_SHARED_DATA 0xffdf0000
59 // Physical memory offset of KUSER_SHARED_DATA
61 #define KI_USER_SHARED_DATA_PHYSICAL 0x41000
64 // Quantum values and decrements
66 #define MAX_QUANTUM 0x7F
67 #define WAIT_QUANTUM_DECREMENT 1
68 #define CLOCK_QUANTUM_DECREMENT 3
71 // Kernel Feature Bits
73 #define KF_V86_VIS 0x00000001
74 #define KF_RDTSC 0x00000002
75 #define KF_CR4 0x00000004
76 #define KF_CMOV 0x00000008
77 #define KF_GLOBAL_PAGE 0x00000010
78 #define KF_LARGE_PAGE 0x00000020
79 #define KF_MTRR 0x00000040
80 #define KF_CMPXCHG8B 0x00000080
81 #define KF_MMX 0x00000100
82 #define KF_WORKING_PTE 0x00000200
83 #define KF_PAT 0x00000400
84 #define KF_FXSR 0x00000800
85 #define KF_FAST_SYSCALL 0x00001000
86 #define KF_XMMI 0x00002000
87 #define KF_3DNOW 0x00004000
88 #define KF_AMDK6MTRR 0x00008000
89 #define KF_XMMI64 0x00010000
90 #define KF_NX_DISABLED 0x00400000
91 #define KF_NX_ENABLED 0x00800000
94 // KPCR Access for non-IA64 builds
96 #define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
97 #define PCR ((volatile KPCR * const)K0IPCR)
98 #if !defined(CONFIG_SMP) && !defined(NT_BUILD)
99 #define KeGetPcr() PCR
101 #define KeGetPcr() ((volatile KPCR * const)__readfsdword(0x1C))
105 // Number of dispatch codes supported by KINTERRUPT
107 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
108 #define KINTERRUPT_DISPATCH_CODES 135
110 #define KINTERRUPT_DISPATCH_CODES 106
113 #ifdef NTOS_MODE_USER
116 // KPROCESSOR_MODE Type
118 typedef CCHAR KPROCESSOR_MODE
;
121 // Dereferencable pointer to KUSER_SHARED_DATA in User-Mode
123 #define SharedUserData ((KUSER_SHARED_DATA *CONST)USER_SHARED_DATA)
126 // Maximum WOW64 Entries in KUSER_SHARED_DATA
128 #define MAX_WOW64_SHARED_ENTRIES 16
131 // Maximum Processor Features supported in KUSER_SHARED_DATA
133 #define PROCESSOR_FEATURE_MAX 64
138 typedef enum _EVENT_TYPE
147 typedef enum _TIMER_TYPE
156 typedef enum _WAIT_TYPE
163 // Processor Execution Modes
175 typedef enum _KWAIT_REASON
217 typedef enum _KPROFILE_SOURCE
220 ProfileAlignmentFixup
,
223 ProfileLoadInstructions
,
224 ProfilePipelineFrozen
,
225 ProfileBranchInstructions
,
226 ProfileTotalNonissues
,
230 ProfileBranchMispredictions
,
231 ProfileStoreInstructions
,
232 ProfileFpInstructions
,
233 ProfileIntegerInstructions
,
237 ProfileSpecialInstructions
,
240 ProfileDcacheAccesses
,
241 ProfileMemoryBarrierCycles
,
242 ProfileLoadLinkedIssues
,
247 // NT Product and Architecture Types
249 typedef enum _NT_PRODUCT_TYPE
254 } NT_PRODUCT_TYPE
, *PNT_PRODUCT_TYPE
;
256 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
261 } ALTERNATIVE_ARCHITECTURE_TYPE
;
268 typedef enum _KTHREAD_STATE
278 #if (NTDDI_VERSION >= NTDDI_WS03)
281 } KTHREAD_STATE
, *PKTHREAD_STATE
;
286 typedef enum _KPROCESS_STATE
293 } KPROCESS_STATE
, *PKPROCESS_STATE
;
296 // NtVdmControl Classes
298 typedef enum _VDMSERVICECLASS
300 VdmStartExecution
= 0,
301 VdmQueueInterrupt
= 1,
302 VdmDelayInterrupt
= 2,
305 VdmSetInt21Handler
= 5,
307 VdmPrinterDirectIoOpen
= 7,
308 VdmPrinterDirectIoClose
= 8,
309 VdmPrinterInitialize
= 9,
310 VdmSetLdtEntries
= 10,
311 VdmSetProcessLdtInfo
= 11,
312 VdmAdlibEmulation
= 12,
313 VdmPMCliControl
= 13,
314 VdmQueryVdmProcess
= 14,
317 #ifdef NTOS_MODE_USER
320 // APC Normal Routine
323 (NTAPI
*PKNORMAL_ROUTINE
)(
324 IN PVOID NormalContext
,
325 IN PVOID SystemArgument1
,
326 IN PVOID SystemArgument2
333 (NTAPI
*PTIMER_APC_ROUTINE
)(
334 IN PVOID TimerContext
,
335 IN ULONG TimerLowValue
,
336 IN LONG TimerHighValue
340 // System Time Structure
342 typedef struct _KSYSTEM_TIME
347 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
350 // Shared Kernel User Data
352 typedef struct _KUSER_SHARED_DATA
354 ULONG TickCountLowDeprecated
;
355 ULONG TickCountMultiplier
;
356 volatile KSYSTEM_TIME InterruptTime
;
357 volatile KSYSTEM_TIME SystemTime
;
358 volatile KSYSTEM_TIME TimeZoneBias
;
359 USHORT ImageNumberLow
;
360 USHORT ImageNumberHigh
;
361 WCHAR NtSystemRoot
[260];
362 ULONG MaxStackTraceDepth
;
363 ULONG CryptoExponent
;
365 ULONG LargePageMinimum
;
367 NT_PRODUCT_TYPE NtProductType
;
368 BOOLEAN ProductTypeIsValid
;
369 ULONG NtMajorVersion
;
370 ULONG NtMinorVersion
;
371 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
374 volatile ULONG TimeSlip
;
375 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
376 LARGE_INTEGER SystemExpirationDate
;
378 BOOLEAN KdDebuggerEnabled
;
379 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
380 UCHAR NXSupportPolicy
;
382 volatile ULONG ActiveConsoleId
;
383 volatile ULONG DismountCount
;
384 ULONG ComPlusPackage
;
385 ULONG LastSystemRITEventTickCount
;
386 ULONG NumberOfPhysicalPages
;
387 BOOLEAN SafeBootMode
;
390 ULONGLONG TestRetInstruction
;
392 ULONG SystemCallReturn
;
393 ULONGLONG SystemCallPad
[3];
395 volatile KSYSTEM_TIME TickCount
;
396 volatile ULONG64 TickCountQuad
;
399 #if (NTDDI_VERSION >= NTDDI_WS03)
400 LONGLONG ConsoleSessionForegroundProcessId
;
401 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
403 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
404 USHORT UserModeGlobalLogger
[8];
405 ULONG HeapTracingPid
[2];
406 ULONG CritSecTracingPid
[2];
409 ULONG SharedDataFlags
;
412 ULONG DbgErrorPortPresent
:1;
413 ULONG DbgElevationEnabled
:1;
414 ULONG DbgVirtEnabled
:1;
415 ULONG DbgInstallerDetectEnabled
:1;
419 ULONG ImageFileExecutionOptions
;
420 KAFFINITY ActiveProcessorAffinity
;
422 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
427 #include "pshpack1.h"
428 typedef struct _VdmVirtualIca
441 } VDMVIRTUALICA
, *PVDMVIRTUALICA
;
444 typedef struct _VdmIcaUserData
447 PVDMVIRTUALICA pIcaMaster
;
448 PVDMVIRTUALICA pIcaSlave
;
453 PULONG pAddrIretBopTable
;
454 PHANDLE phWowIdleEvent
;
455 PLARGE_INTEGER pIcaTimeout
;
456 PHANDLE phMainThreadSuspended
;
457 } VDMICAUSERDATA
, *PVDMICAUSERDATA
;
459 typedef struct _VDM_INITIALIZE_DATA
462 PVDMICAUSERDATA IcaUserData
;
463 } VDM_INITIALIZE_DATA
, *PVDM_INITIALIZE_DATA
;
468 // System Thread Start Routine
472 (NTAPI
*PKSYSTEM_ROUTINE
)(
473 PKSTART_ROUTINE StartRoutine
,
478 // APC Environment Types
480 typedef enum _KAPC_ENVIRONMENT
482 OriginalApcEnvironment
,
483 AttachedApcEnvironment
,
484 CurrentApcEnvironment
,
491 typedef enum _PROCESSOR_CACHE_TYPE
497 } PROCESSOR_CACHE_TYPE
;
502 typedef struct _KDPC_DATA
504 LIST_ENTRY DpcListHead
;
506 volatile ULONG DpcQueueDepth
;
508 } KDPC_DATA
, *PKDPC_DATA
;
511 // Per-Processor Lookaside List
513 typedef struct _PP_LOOKASIDE_LIST
515 struct _GENERAL_LOOKASIDE
*P
;
516 struct _GENERAL_LOOKASIDE
*L
;
517 } PP_LOOKASIDE_LIST
, *PPP_LOOKASIDE_LIST
;
520 // CPU Cache Descriptor
522 typedef struct _CACHE_DESCRIPTOR
528 PROCESSOR_CACHE_TYPE Type
;
529 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
532 // Architectural Types
534 #include <arch/ketypes.h>
537 // Kernel Memory Node
539 #include <pshpack1.h>
540 typedef struct _KNODE
542 SLIST_HEADER DeadStackList
;
543 SLIST_HEADER PfnDereferenceSListHead
;
544 KAFFINITY ProcessorMask
;
549 ULONG MmShiftedColor
;
551 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
556 // Kernel Profile Object
558 typedef struct _KPROFILE
562 LIST_ENTRY ProfileListEntry
;
563 struct _KPROCESS
*Process
;
570 KPROFILE_SOURCE Source
;
572 } KPROFILE
, *PKPROFILE
;
575 // Kernel Interrupt Object
577 typedef struct _KINTERRUPT
581 LIST_ENTRY InterruptListEntry
;
582 PKSERVICE_ROUTINE ServiceRoutine
;
583 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
584 PKSERVICE_ROUTINE MessageServiceRoutine
;
587 PVOID ServiceContext
;
590 PKSPIN_LOCK ActualLock
;
591 PVOID DispatchAddress
;
594 KIRQL SynchronizeIrql
;
595 BOOLEAN FloatingSave
;
599 KINTERRUPT_MODE Mode
;
600 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
601 KINTERRUPT_POLARITY Polarity
;
605 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
608 ULONG DispatchCode
[KINTERRUPT_DISPATCH_CODES
];
609 } KINTERRUPT
, *PKINTERRUPT
;
612 // Kernel Event Pair Object
614 typedef struct _KEVENT_PAIR
620 } KEVENT_PAIR
, *PKEVENT_PAIR
;
623 // Kernel No Execute Options
625 typedef struct _KEXECUTE_OPTIONS
627 UCHAR ExecuteDisable
:1;
628 UCHAR ExecuteEnable
:1;
629 UCHAR DisableThunkEmulation
:1;
631 UCHAR ExecuteDispatchEnable
:1;
632 UCHAR ImageDispatchEnable
:1;
634 } KEXECUTE_OPTIONS
, *PKEXECUTE_OPTIONS
;
637 // Kernel Object Types
639 typedef enum _KOBJECTS
641 EventNotificationObject
= 0,
642 EventSynchronizationObject
= 1,
649 TimerNotificationObject
= 8,
650 TimerSynchronizationObject
= 9,
661 DeviceQueueObject
= 20,
662 EventPairObject
= 21,
663 InterruptObject
= 22,
665 ThreadedDpcObject
= 24,
666 MaximumKernelObject
= 25
670 // Kernel Thread (KTHREAD)
672 #include <pshpack1.h>
673 typedef struct _KTHREAD
675 DISPATCHER_HEADER DispatcherHeader
;
676 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
680 LIST_ENTRY MutantListHead
;
683 ULONG_PTR StackLimit
;
685 KSPIN_LOCK ThreadLock
;
691 UCHAR ApcStateFill
[23];
695 volatile UCHAR NextProcessor
;
696 volatile UCHAR DeferredProcessor
;
698 SCHAR AdjustIncrement
;
699 KSPIN_LOCK ApcQueueLock
;
700 ULONG ContextSwitches
;
701 volatile UCHAR State
;
708 PKWAIT_BLOCK WaitBlockList
;
715 UCHAR EnableStackSwap
;
716 volatile UCHAR SwapBusy
;
720 LIST_ENTRY WaitListEntry
;
721 SINGLE_LIST_ENTRY SwapListEntry
;
729 SHORT KernelApcDisable
;
730 SHORT SpecialApcDisable
;
732 ULONG CombinedApcDisable
;
744 LONG AutoAlignment
:1;
746 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
747 LONG EtwStackTrace1ApcInserted
:1;
748 LONG EtwStackTrace2ApcInserted
:1;
749 LONG CycleChargePending
:1;
750 LONG ReservedFlags
:27;
752 LONG ReservedFlags
:30;
760 KWAIT_BLOCK WaitBlock
[4];
765 UCHAR WaitBlockFill0
[23];
766 UCHAR SystemAffinityActive
;
770 UCHAR WaitBlockFill1
[47];
775 UCHAR WaitBlockFill2
[71];
780 UCHAR WaitBlockFill3
[95];
785 LIST_ENTRY QueueListEntry
;
786 PKTRAP_FRAME TrapFrame
;
787 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
793 UCHAR IdealProcessor
;
795 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
798 UCHAR ProcessReadyQueue
;
800 UCHAR KernelStackResident
;
802 CHAR PriorityDecrement
;
804 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
805 ULONG SystemCallNumber
;
811 ULONG ReadyTransition
:1;
812 ULONG ProcessReadyQueue
:1;
819 KAFFINITY UserAffinity
;
820 struct _KPROCESS
*Process
;
822 PKAPC_STATE ApcStatePointer
[2];
825 KAPC_STATE SavedApcState
;
828 UCHAR SavedApcStateFill
[23];
833 UCHAR UserIdealProcessor
;
834 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
839 UCHAR ReservedBits0
:1;
840 UCHAR SegmentsPresent
:1;
841 UCHAR Reservedbits1
:1;
843 UCHAR NestedStateFlags
;
856 UCHAR SuspendApcFill0
[1];
861 UCHAR SuspendApcFill1
[3];
866 UCHAR SuspendApcFill2
[4];
871 UCHAR SuspendApcFill3
[36];
872 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
880 UCHAR SuspendApcFill4
[40];
885 UCHAR SuspendApcFill5
[47];
892 KSEMAPHORE SuspendSemaphore
;
893 UCHAR SuspendSemaphorefill
[20];
895 ULONG SListFaultCount
;
896 LIST_ENTRY ThreadListEntry
;
897 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
898 LIST_ENTRY MutantListHead
;
900 PVOID SListFaultAddress
;
901 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
902 PVOID MdlForLockedteb
;
907 #define ASSERT_THREAD(object) \
908 ASSERT((((object)->DispatcherHeader.Type & KOBJECT_TYPE_MASK) == ThreadObject))
911 // Kernel Process (KPROCESS)
913 typedef struct _KPROCESS
915 DISPATCHER_HEADER Header
;
916 LIST_ENTRY ProfileListHead
;
917 LARGE_INTEGER DirectoryTableBase
;
919 KGDTENTRY LdtDescriptor
;
920 KIDTENTRY Int21Descriptor
;
925 volatile ULONG ActiveProcessors
;
928 LIST_ENTRY ReadyListHead
;
929 SINGLE_LIST_ENTRY SwapListEntry
;
930 PVOID VdmTrapcHandler
;
931 LIST_ENTRY ThreadListHead
;
932 KSPIN_LOCK ProcessLock
;
938 LONG AutoAlignment
:1;
940 LONG DisableQuantum
:1;
941 LONG ReservedFlags
:29;
954 KEXECUTE_OPTIONS Flags
;
955 UCHAR ExecuteOptions
;
958 LIST_ENTRY ProcessListEntry
;
959 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
962 } KPROCESS
, *PKPROCESS
;
964 #define ASSERT_PROCESS(object) \
965 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ProcessObject))
968 // System Service Table Descriptor
970 typedef struct _KSERVICE_TABLE_DESCRIPTOR
976 LONG TableBaseGpOffset
;
979 } KSERVICE_TABLE_DESCRIPTOR
, *PKSERVICE_TABLE_DESCRIPTOR
;
982 // Exported Loader Parameter Block
984 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI
*KeLoaderBlock
;
987 // Exported Hardware Data
989 extern KAFFINITY NTSYSAPI KeActiveProcessors
;
990 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
991 extern volatile CCHAR NTSYSAPI KeNumberProcessors
;
993 #if (NTDDI_VERSION >= NTDDI_WINXP)
994 extern CCHAR NTSYSAPI KeNumberProcessors
;
996 //extern PCCHAR KeNumberProcessors;
997 extern NTSYSAPI CCHAR KeNumberProcessors
; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
1000 extern ULONG NTSYSAPI KiDmaIoCoherency
;
1001 extern ULONG NTSYSAPI KeMaximumIncrement
;
1002 extern ULONG NTSYSAPI KeMinimumIncrement
;
1003 extern ULONG NTSYSAPI KeDcacheFlushCount
;
1004 extern ULONG NTSYSAPI KeIcacheFlushCount
;
1007 // Exported System Service Descriptor Tables
1009 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable
[SSDT_MAX_ENTRIES
];
1010 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow
[SSDT_MAX_ENTRIES
];
1012 #endif // !NTOS_MODE_USER
1014 #endif // _KETYPES_H