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 // KPCR Access for non-IA64 builds
109 #define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
110 #define PCR ((volatile KPCR * const)K0IPCR)
111 #if !defined(CONFIG_SMP) && !defined(NT_BUILD)
112 #define KeGetPcr() PCR
114 #define KeGetPcr() ((volatile KPCR * const)__readfsdword(0x1C))
118 // Number of dispatch codes supported by KINTERRUPT
120 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
121 #define KINTERRUPT_DISPATCH_CODES 135
123 #define KINTERRUPT_DISPATCH_CODES 106
126 #ifdef NTOS_MODE_USER
129 // KPROCESSOR_MODE Type
131 typedef CCHAR KPROCESSOR_MODE
;
134 // Dereferencable pointer to KUSER_SHARED_DATA in User-Mode
136 #define SharedUserData ((KUSER_SHARED_DATA *CONST)USER_SHARED_DATA)
139 // Maximum WOW64 Entries in KUSER_SHARED_DATA
141 #define MAX_WOW64_SHARED_ENTRIES 16
144 // Maximum Processor Features supported in KUSER_SHARED_DATA
146 #define PROCESSOR_FEATURE_MAX 64
151 typedef enum _EVENT_TYPE
160 typedef enum _TIMER_TYPE
169 typedef enum _WAIT_TYPE
176 // Processor Execution Modes
188 typedef enum _KWAIT_REASON
230 typedef enum _KPROFILE_SOURCE
233 ProfileAlignmentFixup
,
236 ProfileLoadInstructions
,
237 ProfilePipelineFrozen
,
238 ProfileBranchInstructions
,
239 ProfileTotalNonissues
,
243 ProfileBranchMispredictions
,
244 ProfileStoreInstructions
,
245 ProfileFpInstructions
,
246 ProfileIntegerInstructions
,
250 ProfileSpecialInstructions
,
253 ProfileDcacheAccesses
,
254 ProfileMemoryBarrierCycles
,
255 ProfileLoadLinkedIssues
,
260 // NT Product and Architecture Types
262 typedef enum _NT_PRODUCT_TYPE
267 } NT_PRODUCT_TYPE
, *PNT_PRODUCT_TYPE
;
269 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
274 } ALTERNATIVE_ARCHITECTURE_TYPE
;
281 typedef enum _KTHREAD_STATE
291 #if (NTDDI_VERSION >= NTDDI_WS03)
294 } KTHREAD_STATE
, *PKTHREAD_STATE
;
299 typedef enum _ADJUST_REASON
309 typedef enum _KCONTINUE_STATUS
313 ContinueProcessorReselected
,
314 ContinueNextProcessor
320 typedef enum _KPROCESS_STATE
327 } KPROCESS_STATE
, *PKPROCESS_STATE
;
330 // NtVdmControl Classes
332 typedef enum _VDMSERVICECLASS
334 VdmStartExecution
= 0,
335 VdmQueueInterrupt
= 1,
336 VdmDelayInterrupt
= 2,
339 VdmSetInt21Handler
= 5,
341 VdmPrinterDirectIoOpen
= 7,
342 VdmPrinterDirectIoClose
= 8,
343 VdmPrinterInitialize
= 9,
344 VdmSetLdtEntries
= 10,
345 VdmSetProcessLdtInfo
= 11,
346 VdmAdlibEmulation
= 12,
347 VdmPMCliControl
= 13,
348 VdmQueryVdmProcess
= 14,
351 #ifdef NTOS_MODE_USER
354 // APC Normal Routine
357 (NTAPI
*PKNORMAL_ROUTINE
)(
358 IN PVOID NormalContext
,
359 IN PVOID SystemArgument1
,
360 IN PVOID SystemArgument2
367 (NTAPI
*PTIMER_APC_ROUTINE
)(
368 IN PVOID TimerContext
,
369 IN ULONG TimerLowValue
,
370 IN LONG TimerHighValue
374 // System Time Structure
376 typedef struct _KSYSTEM_TIME
381 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
384 // Shared Kernel User Data
386 typedef struct _KUSER_SHARED_DATA
388 ULONG TickCountLowDeprecated
;
389 ULONG TickCountMultiplier
;
390 volatile KSYSTEM_TIME InterruptTime
;
391 volatile KSYSTEM_TIME SystemTime
;
392 volatile KSYSTEM_TIME TimeZoneBias
;
393 USHORT ImageNumberLow
;
394 USHORT ImageNumberHigh
;
395 WCHAR NtSystemRoot
[260];
396 ULONG MaxStackTraceDepth
;
397 ULONG CryptoExponent
;
399 ULONG LargePageMinimum
;
401 NT_PRODUCT_TYPE NtProductType
;
402 BOOLEAN ProductTypeIsValid
;
403 ULONG NtMajorVersion
;
404 ULONG NtMinorVersion
;
405 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
408 volatile ULONG TimeSlip
;
409 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
410 LARGE_INTEGER SystemExpirationDate
;
412 BOOLEAN KdDebuggerEnabled
;
413 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
414 UCHAR NXSupportPolicy
;
416 volatile ULONG ActiveConsoleId
;
417 volatile ULONG DismountCount
;
418 ULONG ComPlusPackage
;
419 ULONG LastSystemRITEventTickCount
;
420 ULONG NumberOfPhysicalPages
;
421 BOOLEAN SafeBootMode
;
424 ULONGLONG TestRetInstruction
;
426 ULONG SystemCallReturn
;
427 ULONGLONG SystemCallPad
[3];
429 volatile KSYSTEM_TIME TickCount
;
430 volatile ULONG64 TickCountQuad
;
433 #if (NTDDI_VERSION >= NTDDI_WS03)
434 LONGLONG ConsoleSessionForegroundProcessId
;
435 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
437 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
438 USHORT UserModeGlobalLogger
[8];
439 ULONG HeapTracingPid
[2];
440 ULONG CritSecTracingPid
[2];
443 ULONG SharedDataFlags
;
446 ULONG DbgErrorPortPresent
:1;
447 ULONG DbgElevationEnabled
:1;
448 ULONG DbgVirtEnabled
:1;
449 ULONG DbgInstallerDetectEnabled
:1;
453 ULONG ImageFileExecutionOptions
;
454 KAFFINITY ActiveProcessorAffinity
;
456 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
461 #include "pshpack1.h"
462 typedef struct _VdmVirtualIca
475 } VDMVIRTUALICA
, *PVDMVIRTUALICA
;
478 typedef struct _VdmIcaUserData
481 PVDMVIRTUALICA pIcaMaster
;
482 PVDMVIRTUALICA pIcaSlave
;
487 PULONG pAddrIretBopTable
;
488 PHANDLE phWowIdleEvent
;
489 PLARGE_INTEGER pIcaTimeout
;
490 PHANDLE phMainThreadSuspended
;
491 } VDMICAUSERDATA
, *PVDMICAUSERDATA
;
493 typedef struct _VDM_INITIALIZE_DATA
496 PVDMICAUSERDATA IcaUserData
;
497 } VDM_INITIALIZE_DATA
, *PVDM_INITIALIZE_DATA
;
502 // System Thread Start Routine
506 (NTAPI
*PKSYSTEM_ROUTINE
)(
507 PKSTART_ROUTINE StartRoutine
,
512 // APC Environment Types
514 typedef enum _KAPC_ENVIRONMENT
516 OriginalApcEnvironment
,
517 AttachedApcEnvironment
,
518 CurrentApcEnvironment
,
525 typedef enum _PROCESSOR_CACHE_TYPE
531 } PROCESSOR_CACHE_TYPE
;
536 typedef struct _KDPC_DATA
538 LIST_ENTRY DpcListHead
;
540 volatile ULONG DpcQueueDepth
;
542 } KDPC_DATA
, *PKDPC_DATA
;
545 // Per-Processor Lookaside List
547 typedef struct _PP_LOOKASIDE_LIST
549 struct _GENERAL_LOOKASIDE
*P
;
550 struct _GENERAL_LOOKASIDE
*L
;
551 } PP_LOOKASIDE_LIST
, *PPP_LOOKASIDE_LIST
;
554 // CPU Cache Descriptor
556 typedef struct _CACHE_DESCRIPTOR
562 PROCESSOR_CACHE_TYPE Type
;
563 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
566 // Architectural Types
568 #include <arch/ketypes.h>
571 // Kernel Memory Node
573 #include <pshpack1.h>
574 typedef struct _KNODE
576 SLIST_HEADER DeadStackList
;
577 SLIST_HEADER PfnDereferenceSListHead
;
578 KAFFINITY ProcessorMask
;
583 ULONG MmShiftedColor
;
585 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
590 // Kernel Profile Object
592 typedef struct _KPROFILE
596 LIST_ENTRY ProfileListEntry
;
597 struct _KPROCESS
*Process
;
604 KPROFILE_SOURCE Source
;
606 } KPROFILE
, *PKPROFILE
;
609 // Kernel Interrupt Object
611 typedef struct _KINTERRUPT
615 LIST_ENTRY InterruptListEntry
;
616 PKSERVICE_ROUTINE ServiceRoutine
;
617 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
618 PKSERVICE_ROUTINE MessageServiceRoutine
;
621 PVOID ServiceContext
;
624 PKSPIN_LOCK ActualLock
;
625 PKINTERRUPT_ROUTINE DispatchAddress
;
628 KIRQL SynchronizeIrql
;
629 BOOLEAN FloatingSave
;
633 KINTERRUPT_MODE Mode
;
634 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
635 KINTERRUPT_POLARITY Polarity
;
639 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
642 ULONG DispatchCode
[KINTERRUPT_DISPATCH_CODES
];
643 } KINTERRUPT
, *PKINTERRUPT
;
646 // Kernel Event Pair Object
648 typedef struct _KEVENT_PAIR
654 } KEVENT_PAIR
, *PKEVENT_PAIR
;
657 // Kernel No Execute Options
659 typedef struct _KEXECUTE_OPTIONS
661 UCHAR ExecuteDisable
:1;
662 UCHAR ExecuteEnable
:1;
663 UCHAR DisableThunkEmulation
:1;
665 UCHAR ExecuteDispatchEnable
:1;
666 UCHAR ImageDispatchEnable
:1;
668 } KEXECUTE_OPTIONS
, *PKEXECUTE_OPTIONS
;
671 // Kernel Object Types
673 typedef enum _KOBJECTS
675 EventNotificationObject
= 0,
676 EventSynchronizationObject
= 1,
683 TimerNotificationObject
= 8,
684 TimerSynchronizationObject
= 9,
695 DeviceQueueObject
= 20,
696 EventPairObject
= 21,
697 InterruptObject
= 22,
699 ThreadedDpcObject
= 24,
700 MaximumKernelObject
= 25
704 // Kernel Thread (KTHREAD)
706 typedef struct _KTHREAD
708 DISPATCHER_HEADER DispatcherHeader
;
709 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
713 LIST_ENTRY MutantListHead
;
716 ULONG_PTR StackLimit
;
718 KSPIN_LOCK ThreadLock
;
724 UCHAR ApcStateFill
[23];
726 volatile UCHAR NextProcessor
;
727 volatile UCHAR DeferredProcessor
;
729 SCHAR AdjustIncrement
;
732 KSPIN_LOCK ApcQueueLock
;
733 ULONG ContextSwitches
;
734 volatile UCHAR State
;
737 KPROCESSOR_MODE WaitMode
;
741 PKWAIT_BLOCK WaitBlockList
;
748 BOOLEAN EnableStackSwap
;
749 volatile UCHAR SwapBusy
;
750 BOOLEAN Alerted
[MaximumMode
];
753 LIST_ENTRY WaitListEntry
;
754 SINGLE_LIST_ENTRY SwapListEntry
;
762 SHORT KernelApcDisable
;
763 SHORT SpecialApcDisable
;
765 ULONG CombinedApcDisable
;
778 LONG AutoAlignment
:1;
780 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
781 LONG EtwStackTrace1ApcInserted
:1;
782 LONG EtwStackTrace2ApcInserted
:1;
783 LONG CycleChargePending
:1;
784 LONG ReservedFlags
:27;
786 LONG ReservedFlags
:30;
795 KWAIT_BLOCK WaitBlock
[THREAD_WAIT_OBJECTS
+ 1];
798 UCHAR WaitBlockFill0
[23];
799 BOOLEAN SystemAffinityActive
;
803 UCHAR WaitBlockFill1
[47];
808 UCHAR WaitBlockFill2
[71];
813 UCHAR WaitBlockFill3
[95];
817 LIST_ENTRY QueueListEntry
;
818 PKTRAP_FRAME TrapFrame
;
819 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
825 UCHAR IdealProcessor
;
827 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
828 BOOLEAN CalloutActive
;
830 BOOLEAN ProcessReadyQueue
;
832 BOOLEAN KernelStackResident
;
834 SCHAR PriorityDecrement
;
836 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
837 ULONG SystemCallNumber
;
843 ULONG ReadyTransition
:1;
844 ULONG ProcessReadyQueue
:1;
851 KAFFINITY UserAffinity
;
852 struct _KPROCESS
*Process
;
854 PKAPC_STATE ApcStatePointer
[2];
857 KAPC_STATE SavedApcState
;
860 UCHAR SavedApcStateFill
[23];
863 UCHAR UserIdealProcessor
;
864 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
869 UCHAR ReservedBits0
:1;
870 UCHAR SegmentsPresent
:1;
871 UCHAR Reservedbits1
:1;
873 UCHAR NestedStateFlags
;
888 UCHAR SuspendApcFill0
[1];
893 UCHAR SuspendApcFill1
[3];
898 UCHAR SuspendApcFill2
[4];
903 UCHAR SuspendApcFill3
[36];
904 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
912 UCHAR SuspendApcFill4
[40];
917 UCHAR SuspendApcFill5
[47];
924 KSEMAPHORE SuspendSemaphore
;
927 UCHAR SuspendSemaphorefill
[20];
928 ULONG SListFaultCount
;
931 LIST_ENTRY ThreadListEntry
;
932 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
933 LIST_ENTRY MutantListHead
;
935 PVOID SListFaultAddress
;
936 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
937 PVOID MdlForLockedteb
;
941 #define ASSERT_THREAD(object) \
942 ASSERT((((object)->DispatcherHeader.Type & KOBJECT_TYPE_MASK) == ThreadObject))
945 // Kernel Process (KPROCESS)
947 typedef struct _KPROCESS
949 DISPATCHER_HEADER Header
;
950 LIST_ENTRY ProfileListHead
;
951 LARGE_INTEGER DirectoryTableBase
;
953 KGDTENTRY LdtDescriptor
;
954 KIDTENTRY Int21Descriptor
;
959 volatile ULONG ActiveProcessors
;
962 LIST_ENTRY ReadyListHead
;
963 SINGLE_LIST_ENTRY SwapListEntry
;
964 PVOID VdmTrapcHandler
;
965 LIST_ENTRY ThreadListHead
;
966 KSPIN_LOCK ProcessLock
;
972 LONG AutoAlignment
:1;
974 LONG DisableQuantum
:1;
975 LONG ReservedFlags
:29;
988 KEXECUTE_OPTIONS Flags
;
989 UCHAR ExecuteOptions
;
992 LIST_ENTRY ProcessListEntry
;
993 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
996 } KPROCESS
, *PKPROCESS
;
998 #define ASSERT_PROCESS(object) \
999 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ProcessObject))
1002 // System Service Table Descriptor
1004 typedef struct _KSERVICE_TABLE_DESCRIPTOR
1010 LONG TableBaseGpOffset
;
1013 } KSERVICE_TABLE_DESCRIPTOR
, *PKSERVICE_TABLE_DESCRIPTOR
;
1016 // Exported Loader Parameter Block
1018 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI
*KeLoaderBlock
;
1021 // Exported Hardware Data
1023 extern KAFFINITY NTSYSAPI KeActiveProcessors
;
1024 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1025 extern volatile CCHAR NTSYSAPI KeNumberProcessors
;
1027 #if (NTDDI_VERSION >= NTDDI_WINXP)
1028 extern CCHAR NTSYSAPI KeNumberProcessors
;
1030 //extern PCCHAR KeNumberProcessors;
1031 extern NTSYSAPI CCHAR KeNumberProcessors
; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
1034 extern ULONG NTSYSAPI KiDmaIoCoherency
;
1035 extern ULONG NTSYSAPI KeMaximumIncrement
;
1036 extern ULONG NTSYSAPI KeMinimumIncrement
;
1037 extern ULONG NTSYSAPI KeDcacheFlushCount
;
1038 extern ULONG NTSYSAPI KeIcacheFlushCount
;
1041 // Exported System Service Descriptor Tables
1043 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable
[SSDT_MAX_ENTRIES
];
1044 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow
[SSDT_MAX_ENTRIES
];
1046 #endif // !NTOS_MODE_USER
1048 #endif // _KETYPES_H