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 // 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_DTS 0x00020000
91 #define KF_NX_BIT 0x20000000
92 #define KF_NX_DISABLED 0x40000000
93 #define KF_NX_ENABLED 0x80000000
96 // Internal Exception Codes
98 #define KI_EXCEPTION_INTERNAL 0x10000000
99 #define KI_EXCEPTION_ACCESS_VIOLATION (KI_EXCEPTION_INTERNAL | 0x04)
102 // Number of dispatch codes supported by KINTERRUPT
104 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
105 #define KINTERRUPT_DISPATCH_CODES 135
107 #define KINTERRUPT_DISPATCH_CODES 106
110 #ifdef NTOS_MODE_USER
113 // KPROCESSOR_MODE Type
115 typedef CCHAR KPROCESSOR_MODE
;
118 // Dereferencable pointer to KUSER_SHARED_DATA in User-Mode
120 #define SharedUserData ((KUSER_SHARED_DATA *CONST)USER_SHARED_DATA)
123 // Maximum WOW64 Entries in KUSER_SHARED_DATA
125 #define MAX_WOW64_SHARED_ENTRIES 16
128 // Maximum Processor Features supported in KUSER_SHARED_DATA
130 #define PROCESSOR_FEATURE_MAX 64
135 typedef enum _EVENT_TYPE
144 typedef enum _TIMER_TYPE
153 typedef enum _WAIT_TYPE
160 // Processor Execution Modes
172 typedef enum _KWAIT_REASON
214 typedef enum _KPROFILE_SOURCE
217 ProfileAlignmentFixup
,
220 ProfileLoadInstructions
,
221 ProfilePipelineFrozen
,
222 ProfileBranchInstructions
,
223 ProfileTotalNonissues
,
227 ProfileBranchMispredictions
,
228 ProfileStoreInstructions
,
229 ProfileFpInstructions
,
230 ProfileIntegerInstructions
,
234 ProfileSpecialInstructions
,
237 ProfileDcacheAccesses
,
238 ProfileMemoryBarrierCycles
,
239 ProfileLoadLinkedIssues
,
244 // NT Product and Architecture Types
246 typedef enum _NT_PRODUCT_TYPE
251 } NT_PRODUCT_TYPE
, *PNT_PRODUCT_TYPE
;
253 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
258 } ALTERNATIVE_ARCHITECTURE_TYPE
;
265 typedef enum _KTHREAD_STATE
275 #if (NTDDI_VERSION >= NTDDI_WS03)
278 } KTHREAD_STATE
, *PKTHREAD_STATE
;
281 // Kernel Object Types
283 typedef enum _KOBJECTS
285 EventNotificationObject
= 0,
286 EventSynchronizationObject
= 1,
293 TimerNotificationObject
= 8,
294 TimerSynchronizationObject
= 9,
305 DeviceQueueObject
= 20,
306 EventPairObject
= 21,
307 InterruptObject
= 22,
309 ThreadedDpcObject
= 24,
310 MaximumKernelObject
= 25
316 typedef enum _ADJUST_REASON
326 typedef enum _KCONTINUE_STATUS
330 ContinueProcessorReselected
,
331 ContinueNextProcessor
337 typedef enum _KPROCESS_STATE
344 } KPROCESS_STATE
, *PKPROCESS_STATE
;
347 // NtVdmControl Classes
349 typedef enum _VDMSERVICECLASS
351 VdmStartExecution
= 0,
352 VdmQueueInterrupt
= 1,
353 VdmDelayInterrupt
= 2,
356 VdmSetInt21Handler
= 5,
358 VdmPrinterDirectIoOpen
= 7,
359 VdmPrinterDirectIoClose
= 8,
360 VdmPrinterInitialize
= 9,
361 VdmSetLdtEntries
= 10,
362 VdmSetProcessLdtInfo
= 11,
363 VdmAdlibEmulation
= 12,
364 VdmPMCliControl
= 13,
365 VdmQueryVdmProcess
= 14,
368 #ifdef NTOS_MODE_USER
371 // APC Normal Routine
374 (NTAPI
*PKNORMAL_ROUTINE
)(
375 IN PVOID NormalContext
,
376 IN PVOID SystemArgument1
,
377 IN PVOID SystemArgument2
384 (NTAPI
*PTIMER_APC_ROUTINE
)(
385 IN PVOID TimerContext
,
386 IN ULONG TimerLowValue
,
387 IN LONG TimerHighValue
391 // System Time Structure
393 typedef struct _KSYSTEM_TIME
398 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
401 // Shared Kernel User Data
403 typedef struct _KUSER_SHARED_DATA
405 ULONG TickCountLowDeprecated
;
406 ULONG TickCountMultiplier
;
407 volatile KSYSTEM_TIME InterruptTime
;
408 volatile KSYSTEM_TIME SystemTime
;
409 volatile KSYSTEM_TIME TimeZoneBias
;
410 USHORT ImageNumberLow
;
411 USHORT ImageNumberHigh
;
412 WCHAR NtSystemRoot
[260];
413 ULONG MaxStackTraceDepth
;
414 ULONG CryptoExponent
;
416 ULONG LargePageMinimum
;
418 NT_PRODUCT_TYPE NtProductType
;
419 BOOLEAN ProductTypeIsValid
;
420 ULONG NtMajorVersion
;
421 ULONG NtMinorVersion
;
422 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
425 volatile ULONG TimeSlip
;
426 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
427 LARGE_INTEGER SystemExpirationDate
;
429 BOOLEAN KdDebuggerEnabled
;
430 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
431 UCHAR NXSupportPolicy
;
433 volatile ULONG ActiveConsoleId
;
434 volatile ULONG DismountCount
;
435 ULONG ComPlusPackage
;
436 ULONG LastSystemRITEventTickCount
;
437 ULONG NumberOfPhysicalPages
;
438 BOOLEAN SafeBootMode
;
441 ULONGLONG TestRetInstruction
;
443 ULONG SystemCallReturn
;
444 ULONGLONG SystemCallPad
[3];
446 volatile KSYSTEM_TIME TickCount
;
447 volatile ULONG64 TickCountQuad
;
450 #if (NTDDI_VERSION >= NTDDI_WS03)
451 LONGLONG ConsoleSessionForegroundProcessId
;
452 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
454 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
455 USHORT UserModeGlobalLogger
[8];
456 ULONG HeapTracingPid
[2];
457 ULONG CritSecTracingPid
[2];
460 ULONG SharedDataFlags
;
463 ULONG DbgErrorPortPresent
:1;
464 ULONG DbgElevationEnabled
:1;
465 ULONG DbgVirtEnabled
:1;
466 ULONG DbgInstallerDetectEnabled
:1;
470 ULONG ImageFileExecutionOptions
;
471 KAFFINITY ActiveProcessorAffinity
;
473 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
478 #include "pshpack1.h"
479 typedef struct _VdmVirtualIca
492 } VDMVIRTUALICA
, *PVDMVIRTUALICA
;
495 typedef struct _VdmIcaUserData
498 PVDMVIRTUALICA pIcaMaster
;
499 PVDMVIRTUALICA pIcaSlave
;
504 PULONG pAddrIretBopTable
;
505 PHANDLE phWowIdleEvent
;
506 PLARGE_INTEGER pIcaTimeout
;
507 PHANDLE phMainThreadSuspended
;
508 } VDMICAUSERDATA
, *PVDMICAUSERDATA
;
510 typedef struct _VDM_INITIALIZE_DATA
513 PVDMICAUSERDATA IcaUserData
;
514 } VDM_INITIALIZE_DATA
, *PVDM_INITIALIZE_DATA
;
519 // System Thread Start Routine
523 (NTAPI
*PKSYSTEM_ROUTINE
)(
524 PKSTART_ROUTINE StartRoutine
,
529 // APC Environment Types
531 typedef enum _KAPC_ENVIRONMENT
533 OriginalApcEnvironment
,
534 AttachedApcEnvironment
,
535 CurrentApcEnvironment
,
542 typedef enum _PROCESSOR_CACHE_TYPE
548 } PROCESSOR_CACHE_TYPE
;
553 typedef struct _KDPC_DATA
555 LIST_ENTRY DpcListHead
;
557 volatile ULONG DpcQueueDepth
;
559 } KDPC_DATA
, *PKDPC_DATA
;
562 // Per-Processor Lookaside List
564 typedef struct _PP_LOOKASIDE_LIST
566 struct _GENERAL_LOOKASIDE
*P
;
567 struct _GENERAL_LOOKASIDE
*L
;
568 } PP_LOOKASIDE_LIST
, *PPP_LOOKASIDE_LIST
;
571 // CPU Cache Descriptor
573 typedef struct _CACHE_DESCRIPTOR
579 PROCESSOR_CACHE_TYPE Type
;
580 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
583 // Architectural Types
585 #include <arch/ketypes.h>
588 // Kernel Memory Node
590 #include <pshpack1.h>
591 typedef struct _KNODE
593 SLIST_HEADER DeadStackList
;
594 SLIST_HEADER PfnDereferenceSListHead
;
595 KAFFINITY ProcessorMask
;
600 ULONG MmShiftedColor
;
602 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
607 // Kernel Profile Object
609 typedef struct _KPROFILE
613 LIST_ENTRY ProfileListEntry
;
614 struct _KPROCESS
*Process
;
621 KPROFILE_SOURCE Source
;
623 } KPROFILE
, *PKPROFILE
;
626 // Kernel Interrupt Object
628 typedef struct _KINTERRUPT
632 LIST_ENTRY InterruptListEntry
;
633 PKSERVICE_ROUTINE ServiceRoutine
;
634 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
635 PKSERVICE_ROUTINE MessageServiceRoutine
;
638 PVOID ServiceContext
;
641 PKSPIN_LOCK ActualLock
;
642 PKINTERRUPT_ROUTINE DispatchAddress
;
645 KIRQL SynchronizeIrql
;
646 BOOLEAN FloatingSave
;
650 KINTERRUPT_MODE Mode
;
651 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
652 KINTERRUPT_POLARITY Polarity
;
656 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
659 ULONG DispatchCode
[KINTERRUPT_DISPATCH_CODES
];
663 // Kernel Event Pair Object
665 typedef struct _KEVENT_PAIR
671 } KEVENT_PAIR
, *PKEVENT_PAIR
;
674 // Kernel No Execute Options
676 typedef struct _KEXECUTE_OPTIONS
678 UCHAR ExecuteDisable
:1;
679 UCHAR ExecuteEnable
:1;
680 UCHAR DisableThunkEmulation
:1;
682 UCHAR ExecuteDispatchEnable
:1;
683 UCHAR ImageDispatchEnable
:1;
685 } KEXECUTE_OPTIONS
, *PKEXECUTE_OPTIONS
;
688 // Kernel Thread (KTHREAD)
690 typedef struct _KTHREAD
692 DISPATCHER_HEADER DispatcherHeader
;
693 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
696 ULONGLONG QuantumTarget
;
698 LIST_ENTRY MutantListHead
;
701 ULONG_PTR StackLimit
;
703 KSPIN_LOCK ThreadLock
;
709 UCHAR ApcStateFill
[23];
711 volatile UCHAR NextProcessor
;
712 volatile UCHAR DeferredProcessor
;
714 SCHAR AdjustIncrement
;
717 KSPIN_LOCK ApcQueueLock
;
718 ULONG ContextSwitches
;
719 volatile UCHAR State
;
722 KPROCESSOR_MODE WaitMode
;
726 PKWAIT_BLOCK WaitBlockList
;
729 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
734 ULONG KernelStackResident
:1;
735 ULONG ReadyTransition
:1;
736 ULONG ProcessReadyQueue
:1;
738 ULONG SystemAffinityActive
:1;
740 ULONG GdiFlushActive
:1;
751 BOOLEAN EnableStackSwap
;
752 volatile UCHAR SwapBusy
;
753 BOOLEAN Alerted
[MaximumMode
];
756 LIST_ENTRY WaitListEntry
;
757 SINGLE_LIST_ENTRY SwapListEntry
;
765 SHORT KernelApcDisable
;
766 SHORT SpecialApcDisable
;
768 ULONG CombinedApcDisable
;
781 LONG AutoAlignment
:1;
783 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
784 LONG EtwStackTrace1ApcInserted
:1;
785 LONG EtwStackTrace2ApcInserted
:1;
786 LONG CycleChargePending
:1;
787 LONG ReservedFlags
:27;
789 LONG ReservedFlags
:30;
798 KWAIT_BLOCK WaitBlock
[THREAD_WAIT_OBJECTS
+ 1];
801 UCHAR WaitBlockFill0
[23];
802 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
803 UCHAR IdealProcessor
;
805 BOOLEAN SystemAffinityActive
;
810 UCHAR WaitBlockFill1
[47];
815 UCHAR WaitBlockFill2
[71];
820 UCHAR WaitBlockFill3
[95];
824 LIST_ENTRY QueueListEntry
;
825 PKTRAP_FRAME TrapFrame
;
826 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
832 #if (NTDDI_VERSION < NTDDI_LONGHORN)
833 UCHAR IdealProcessor
;
836 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
837 BOOLEAN CalloutActive
;
839 BOOLEAN ProcessReadyQueue
;
840 BOOLEAN KernelStackResident
;
843 SCHAR PriorityDecrement
;
845 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
846 ULONG SystemCallNumber
;
849 KAFFINITY UserAffinity
;
850 struct _KPROCESS
*Process
;
852 PKAPC_STATE ApcStatePointer
[2];
855 KAPC_STATE SavedApcState
;
858 UCHAR SavedApcStateFill
[23];
861 UCHAR UserIdealProcessor
;
862 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
867 UCHAR ReservedBits0
:1;
868 UCHAR SegmentsPresent
:1;
869 UCHAR Reservedbits1
:1;
871 UCHAR NestedStateFlags
;
886 UCHAR SuspendApcFill0
[1];
891 UCHAR SuspendApcFill1
[3];
896 UCHAR SuspendApcFill2
[4];
901 UCHAR SuspendApcFill3
[36];
902 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
910 UCHAR SuspendApcFill4
[40];
915 UCHAR SuspendApcFill5
[47];
922 KSEMAPHORE SuspendSemaphore
;
925 UCHAR SuspendSemaphorefill
[20];
926 ULONG SListFaultCount
;
929 LIST_ENTRY ThreadListEntry
;
930 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
931 LIST_ENTRY MutantListHead
;
933 PVOID SListFaultAddress
;
934 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
935 PVOID MdlForLockedteb
;
939 #define ASSERT_THREAD(object) \
940 ASSERT((((object)->DispatcherHeader.Type & KOBJECT_TYPE_MASK) == ThreadObject))
943 // Kernel Process (KPROCESS)
945 typedef struct _KPROCESS
947 DISPATCHER_HEADER Header
;
948 LIST_ENTRY ProfileListHead
;
949 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
950 ULONG_PTR DirectoryTableBase
;
953 ULONG_PTR DirectoryTableBase
[2];
956 KGDTENTRY LdtDescriptor
;
957 KIDTENTRY Int21Descriptor
;
962 volatile ULONG ActiveProcessors
;
965 LIST_ENTRY ReadyListHead
;
966 SINGLE_LIST_ENTRY SwapListEntry
;
967 PVOID VdmTrapcHandler
;
968 LIST_ENTRY ThreadListHead
;
969 KSPIN_LOCK ProcessLock
;
975 LONG AutoAlignment
:1;
977 LONG DisableQuantum
:1;
978 LONG ReservedFlags
:29;
991 KEXECUTE_OPTIONS Flags
;
992 UCHAR ExecuteOptions
;
995 LIST_ENTRY ProcessListEntry
;
996 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1001 #define ASSERT_PROCESS(object) \
1002 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ProcessObject))
1005 // System Service Table Descriptor
1007 typedef struct _KSERVICE_TABLE_DESCRIPTOR
1013 LONG TableBaseGpOffset
;
1016 } KSERVICE_TABLE_DESCRIPTOR
, *PKSERVICE_TABLE_DESCRIPTOR
;
1019 // Exported Loader Parameter Block
1021 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI
*KeLoaderBlock
;
1024 // Exported Hardware Data
1026 extern KAFFINITY NTSYSAPI KeActiveProcessors
;
1027 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1028 extern volatile CCHAR NTSYSAPI KeNumberProcessors
;
1030 #if (NTDDI_VERSION >= NTDDI_WINXP)
1031 extern CCHAR NTSYSAPI KeNumberProcessors
;
1033 //extern PCCHAR KeNumberProcessors;
1034 extern NTSYSAPI CCHAR KeNumberProcessors
; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
1037 extern ULONG NTSYSAPI KiDmaIoCoherency
;
1038 extern ULONG NTSYSAPI KeMaximumIncrement
;
1039 extern ULONG NTSYSAPI KeMinimumIncrement
;
1040 extern ULONG NTSYSAPI KeDcacheFlushCount
;
1041 extern ULONG NTSYSAPI KeIcacheFlushCount
;
1044 // Exported System Service Descriptor Tables
1046 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable
[SSDT_MAX_ENTRIES
];
1047 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow
[SSDT_MAX_ENTRIES
];
1049 #endif // !NTOS_MODE_USER
1051 #endif // _KETYPES_H