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
113 #define KeGetPcr() PCR
115 #ifdef NTOS_MODE_USER
118 // KPROCESSOR_MODE Type
120 typedef CCHAR KPROCESSOR_MODE
;
123 // Dereferencable pointer to KUSER_SHARED_DATA in User-Mode
125 #define SharedUserData ((KUSER_SHARED_DATA *CONST)USER_SHARED_DATA)
128 // Maximum WOW64 Entries in KUSER_SHARED_DATA
130 #define MAX_WOW64_SHARED_ENTRIES 16
133 // Maximum Processor Features supported in KUSER_SHARED_DATA
135 #define PROCESSOR_FEATURE_MAX 64
140 typedef enum _EVENT_TYPE
149 typedef enum _TIMER_TYPE
158 typedef enum _WAIT_TYPE
165 // Processor Execution Modes
177 typedef enum _KWAIT_REASON
219 typedef enum _KPROFILE_SOURCE
222 ProfileAlignmentFixup
,
225 ProfileLoadInstructions
,
226 ProfilePipelineFrozen
,
227 ProfileBranchInstructions
,
228 ProfileTotalNonissues
,
232 ProfileBranchMispredictions
,
233 ProfileStoreInstructions
,
234 ProfileFpInstructions
,
235 ProfileIntegerInstructions
,
239 ProfileSpecialInstructions
,
242 ProfileDcacheAccesses
,
243 ProfileMemoryBarrierCycles
,
244 ProfileLoadLinkedIssues
,
249 // NT Product and Architecture Types
251 typedef enum _NT_PRODUCT_TYPE
256 } NT_PRODUCT_TYPE
, *PNT_PRODUCT_TYPE
;
258 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
263 } ALTERNATIVE_ARCHITECTURE_TYPE
;
270 typedef enum _KTHREAD_STATE
280 #if (NTDDI_VERSION >= NTDDI_WS03)
283 } KTHREAD_STATE
, *PKTHREAD_STATE
;
286 // Kernel Object Types
288 typedef enum _KOBJECTS
290 EventNotificationObject
= 0,
291 EventSynchronizationObject
= 1,
298 TimerNotificationObject
= 8,
299 TimerSynchronizationObject
= 9,
310 DeviceQueueObject
= 20,
311 EventPairObject
= 21,
312 InterruptObject
= 22,
314 ThreadedDpcObject
= 24,
315 MaximumKernelObject
= 25
321 typedef enum _ADJUST_REASON
331 typedef enum _KCONTINUE_STATUS
335 ContinueProcessorReselected
,
336 ContinueNextProcessor
342 typedef enum _KPROCESS_STATE
349 } KPROCESS_STATE
, *PKPROCESS_STATE
;
352 // NtVdmControl Classes
354 typedef enum _VDMSERVICECLASS
356 VdmStartExecution
= 0,
357 VdmQueueInterrupt
= 1,
358 VdmDelayInterrupt
= 2,
361 VdmSetInt21Handler
= 5,
363 VdmPrinterDirectIoOpen
= 7,
364 VdmPrinterDirectIoClose
= 8,
365 VdmPrinterInitialize
= 9,
366 VdmSetLdtEntries
= 10,
367 VdmSetProcessLdtInfo
= 11,
368 VdmAdlibEmulation
= 12,
369 VdmPMCliControl
= 13,
370 VdmQueryVdmProcess
= 14,
373 #ifdef NTOS_MODE_USER
376 // APC Normal Routine
379 (NTAPI
*PKNORMAL_ROUTINE
)(
380 IN PVOID NormalContext
,
381 IN PVOID SystemArgument1
,
382 IN PVOID SystemArgument2
389 (NTAPI
*PTIMER_APC_ROUTINE
)(
390 IN PVOID TimerContext
,
391 IN ULONG TimerLowValue
,
392 IN LONG TimerHighValue
396 // System Time Structure
398 typedef struct _KSYSTEM_TIME
403 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
406 // Shared Kernel User Data
408 typedef struct _KUSER_SHARED_DATA
410 ULONG TickCountLowDeprecated
;
411 ULONG TickCountMultiplier
;
412 volatile KSYSTEM_TIME InterruptTime
;
413 volatile KSYSTEM_TIME SystemTime
;
414 volatile KSYSTEM_TIME TimeZoneBias
;
415 USHORT ImageNumberLow
;
416 USHORT ImageNumberHigh
;
417 WCHAR NtSystemRoot
[260];
418 ULONG MaxStackTraceDepth
;
419 ULONG CryptoExponent
;
421 ULONG LargePageMinimum
;
423 NT_PRODUCT_TYPE NtProductType
;
424 BOOLEAN ProductTypeIsValid
;
425 ULONG NtMajorVersion
;
426 ULONG NtMinorVersion
;
427 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
430 volatile ULONG TimeSlip
;
431 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
432 LARGE_INTEGER SystemExpirationDate
;
434 BOOLEAN KdDebuggerEnabled
;
435 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
436 UCHAR NXSupportPolicy
;
438 volatile ULONG ActiveConsoleId
;
439 volatile ULONG DismountCount
;
440 ULONG ComPlusPackage
;
441 ULONG LastSystemRITEventTickCount
;
442 ULONG NumberOfPhysicalPages
;
443 BOOLEAN SafeBootMode
;
446 ULONGLONG TestRetInstruction
;
448 ULONG SystemCallReturn
;
449 ULONGLONG SystemCallPad
[3];
451 volatile KSYSTEM_TIME TickCount
;
452 volatile ULONG64 TickCountQuad
;
455 #if (NTDDI_VERSION >= NTDDI_WS03)
456 LONGLONG ConsoleSessionForegroundProcessId
;
457 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
459 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
460 USHORT UserModeGlobalLogger
[8];
461 ULONG HeapTracingPid
[2];
462 ULONG CritSecTracingPid
[2];
465 ULONG SharedDataFlags
;
468 ULONG DbgErrorPortPresent
:1;
469 ULONG DbgElevationEnabled
:1;
470 ULONG DbgVirtEnabled
:1;
471 ULONG DbgInstallerDetectEnabled
:1;
475 ULONG ImageFileExecutionOptions
;
476 KAFFINITY ActiveProcessorAffinity
;
478 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
483 #include "pshpack1.h"
484 typedef struct _VdmVirtualIca
497 } VDMVIRTUALICA
, *PVDMVIRTUALICA
;
500 typedef struct _VdmIcaUserData
503 PVDMVIRTUALICA pIcaMaster
;
504 PVDMVIRTUALICA pIcaSlave
;
509 PULONG pAddrIretBopTable
;
510 PHANDLE phWowIdleEvent
;
511 PLARGE_INTEGER pIcaTimeout
;
512 PHANDLE phMainThreadSuspended
;
513 } VDMICAUSERDATA
, *PVDMICAUSERDATA
;
515 typedef struct _VDM_INITIALIZE_DATA
518 PVDMICAUSERDATA IcaUserData
;
519 } VDM_INITIALIZE_DATA
, *PVDM_INITIALIZE_DATA
;
524 // System Thread Start Routine
528 (NTAPI
*PKSYSTEM_ROUTINE
)(
529 PKSTART_ROUTINE StartRoutine
,
534 // APC Environment Types
536 typedef enum _KAPC_ENVIRONMENT
538 OriginalApcEnvironment
,
539 AttachedApcEnvironment
,
540 CurrentApcEnvironment
,
547 typedef enum _PROCESSOR_CACHE_TYPE
553 } PROCESSOR_CACHE_TYPE
;
558 typedef struct _KDPC_DATA
560 LIST_ENTRY DpcListHead
;
562 volatile ULONG DpcQueueDepth
;
564 } KDPC_DATA
, *PKDPC_DATA
;
567 // Per-Processor Lookaside List
569 typedef struct _PP_LOOKASIDE_LIST
571 struct _GENERAL_LOOKASIDE
*P
;
572 struct _GENERAL_LOOKASIDE
*L
;
573 } PP_LOOKASIDE_LIST
, *PPP_LOOKASIDE_LIST
;
576 // CPU Cache Descriptor
578 typedef struct _CACHE_DESCRIPTOR
584 PROCESSOR_CACHE_TYPE Type
;
585 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
588 // Architectural Types
590 #include <arch/ketypes.h>
593 // Kernel Memory Node
595 #include <pshpack1.h>
596 typedef struct _KNODE
598 SLIST_HEADER DeadStackList
;
599 SLIST_HEADER PfnDereferenceSListHead
;
600 KAFFINITY ProcessorMask
;
605 ULONG MmShiftedColor
;
607 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
612 // Kernel Profile Object
614 typedef struct _KPROFILE
618 LIST_ENTRY ProfileListEntry
;
619 struct _KPROCESS
*Process
;
626 KPROFILE_SOURCE Source
;
628 } KPROFILE
, *PKPROFILE
;
631 // Kernel Interrupt Object
633 typedef struct _KINTERRUPT
637 LIST_ENTRY InterruptListEntry
;
638 PKSERVICE_ROUTINE ServiceRoutine
;
639 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
640 PKSERVICE_ROUTINE MessageServiceRoutine
;
643 PVOID ServiceContext
;
646 PKSPIN_LOCK ActualLock
;
647 PKINTERRUPT_ROUTINE DispatchAddress
;
650 KIRQL SynchronizeIrql
;
651 BOOLEAN FloatingSave
;
655 KINTERRUPT_MODE Mode
;
656 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
657 KINTERRUPT_POLARITY Polarity
;
661 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
664 ULONG DispatchCode
[KINTERRUPT_DISPATCH_CODES
];
665 } KINTERRUPT
, *PKINTERRUPT
;
668 // Kernel Event Pair Object
670 typedef struct _KEVENT_PAIR
676 } KEVENT_PAIR
, *PKEVENT_PAIR
;
679 // Kernel No Execute Options
681 typedef struct _KEXECUTE_OPTIONS
683 UCHAR ExecuteDisable
:1;
684 UCHAR ExecuteEnable
:1;
685 UCHAR DisableThunkEmulation
:1;
687 UCHAR ExecuteDispatchEnable
:1;
688 UCHAR ImageDispatchEnable
:1;
690 } KEXECUTE_OPTIONS
, *PKEXECUTE_OPTIONS
;
693 // Kernel Thread (KTHREAD)
695 typedef struct _KTHREAD
697 DISPATCHER_HEADER DispatcherHeader
;
698 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
701 ULONGLONG QuantumTarget
;
703 LIST_ENTRY MutantListHead
;
706 ULONG_PTR StackLimit
;
708 KSPIN_LOCK ThreadLock
;
714 UCHAR ApcStateFill
[23];
716 volatile UCHAR NextProcessor
;
717 volatile UCHAR DeferredProcessor
;
719 SCHAR AdjustIncrement
;
722 KSPIN_LOCK ApcQueueLock
;
723 ULONG ContextSwitches
;
724 volatile UCHAR State
;
727 KPROCESSOR_MODE WaitMode
;
731 PKWAIT_BLOCK WaitBlockList
;
734 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
739 ULONG KernelStackResident
:1;
740 ULONG ReadyTransition
:1;
741 ULONG ProcessReadyQueue
:1;
743 ULONG SystemAffinityActive
:1;
745 ULONG GdiFlushActive
:1;
756 BOOLEAN EnableStackSwap
;
757 volatile UCHAR SwapBusy
;
758 BOOLEAN Alerted
[MaximumMode
];
761 LIST_ENTRY WaitListEntry
;
762 SINGLE_LIST_ENTRY SwapListEntry
;
770 SHORT KernelApcDisable
;
771 SHORT SpecialApcDisable
;
773 ULONG CombinedApcDisable
;
786 LONG AutoAlignment
:1;
788 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
789 LONG EtwStackTrace1ApcInserted
:1;
790 LONG EtwStackTrace2ApcInserted
:1;
791 LONG CycleChargePending
:1;
792 LONG ReservedFlags
:27;
794 LONG ReservedFlags
:30;
803 KWAIT_BLOCK WaitBlock
[THREAD_WAIT_OBJECTS
+ 1];
806 UCHAR WaitBlockFill0
[23];
807 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
808 UCHAR IdealProcessor
;
810 BOOLEAN SystemAffinityActive
;
815 UCHAR WaitBlockFill1
[47];
820 UCHAR WaitBlockFill2
[71];
825 UCHAR WaitBlockFill3
[95];
829 LIST_ENTRY QueueListEntry
;
830 PKTRAP_FRAME TrapFrame
;
831 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
837 #if (NTDDI_VERSION < NTDDI_LONGHORN)
838 UCHAR IdealProcessor
;
841 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
842 BOOLEAN CalloutActive
;
844 BOOLEAN ProcessReadyQueue
;
845 BOOLEAN KernelStackResident
;
848 SCHAR PriorityDecrement
;
850 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
851 ULONG SystemCallNumber
;
854 KAFFINITY UserAffinity
;
855 struct _KPROCESS
*Process
;
857 PKAPC_STATE ApcStatePointer
[2];
860 KAPC_STATE SavedApcState
;
863 UCHAR SavedApcStateFill
[23];
866 UCHAR UserIdealProcessor
;
867 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
872 UCHAR ReservedBits0
:1;
873 UCHAR SegmentsPresent
:1;
874 UCHAR Reservedbits1
:1;
876 UCHAR NestedStateFlags
;
891 UCHAR SuspendApcFill0
[1];
896 UCHAR SuspendApcFill1
[3];
901 UCHAR SuspendApcFill2
[4];
906 UCHAR SuspendApcFill3
[36];
907 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
915 UCHAR SuspendApcFill4
[40];
920 UCHAR SuspendApcFill5
[47];
927 KSEMAPHORE SuspendSemaphore
;
930 UCHAR SuspendSemaphorefill
[20];
931 ULONG SListFaultCount
;
934 LIST_ENTRY ThreadListEntry
;
935 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
936 LIST_ENTRY MutantListHead
;
938 PVOID SListFaultAddress
;
939 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
940 PVOID MdlForLockedteb
;
942 } KTHREAD
, *PKTHREAD
;
944 #define ASSERT_THREAD(object) \
945 ASSERT((((object)->DispatcherHeader.Type & KOBJECT_TYPE_MASK) == ThreadObject))
948 // Kernel Process (KPROCESS)
950 typedef struct _KPROCESS
952 DISPATCHER_HEADER Header
;
953 LIST_ENTRY ProfileListHead
;
954 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
955 ULONG DirectoryTableBase
;
958 ULONG DirectoryTableBase
[2];
961 KGDTENTRY LdtDescriptor
;
962 KIDTENTRY Int21Descriptor
;
967 volatile ULONG ActiveProcessors
;
970 LIST_ENTRY ReadyListHead
;
971 SINGLE_LIST_ENTRY SwapListEntry
;
972 PVOID VdmTrapcHandler
;
973 LIST_ENTRY ThreadListHead
;
974 KSPIN_LOCK ProcessLock
;
980 LONG AutoAlignment
:1;
982 LONG DisableQuantum
:1;
983 LONG ReservedFlags
:29;
996 KEXECUTE_OPTIONS Flags
;
997 UCHAR ExecuteOptions
;
1000 LIST_ENTRY ProcessListEntry
;
1001 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1002 ULONGLONG CycleTime
;
1004 } KPROCESS
, *PKPROCESS
;
1006 #define ASSERT_PROCESS(object) \
1007 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ProcessObject))
1010 // System Service Table Descriptor
1012 typedef struct _KSERVICE_TABLE_DESCRIPTOR
1018 LONG TableBaseGpOffset
;
1021 } KSERVICE_TABLE_DESCRIPTOR
, *PKSERVICE_TABLE_DESCRIPTOR
;
1024 // Exported Loader Parameter Block
1026 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI
*KeLoaderBlock
;
1029 // Exported Hardware Data
1031 extern KAFFINITY NTSYSAPI KeActiveProcessors
;
1032 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1033 extern volatile CCHAR NTSYSAPI KeNumberProcessors
;
1035 #if (NTDDI_VERSION >= NTDDI_WINXP)
1036 extern CCHAR NTSYSAPI KeNumberProcessors
;
1038 //extern PCCHAR KeNumberProcessors;
1039 extern NTSYSAPI CCHAR KeNumberProcessors
; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
1042 extern ULONG NTSYSAPI KiDmaIoCoherency
;
1043 extern ULONG NTSYSAPI KeMaximumIncrement
;
1044 extern ULONG NTSYSAPI KeMinimumIncrement
;
1045 extern ULONG NTSYSAPI KeDcacheFlushCount
;
1046 extern ULONG NTSYSAPI KeIcacheFlushCount
;
1049 // Exported System Service Descriptor Tables
1051 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable
[SSDT_MAX_ENTRIES
];
1052 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow
[SSDT_MAX_ENTRIES
];
1054 #endif // !NTOS_MODE_USER
1056 #endif // _KETYPES_H