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
;
297 // Kernel Object Types
299 typedef enum _KOBJECTS
301 EventNotificationObject
= 0,
302 EventSynchronizationObject
= 1,
309 TimerNotificationObject
= 8,
310 TimerSynchronizationObject
= 9,
321 DeviceQueueObject
= 20,
322 EventPairObject
= 21,
323 InterruptObject
= 22,
325 ThreadedDpcObject
= 24,
326 MaximumKernelObject
= 25
332 typedef enum _ADJUST_REASON
342 typedef enum _KCONTINUE_STATUS
346 ContinueProcessorReselected
,
347 ContinueNextProcessor
353 typedef enum _KPROCESS_STATE
360 } KPROCESS_STATE
, *PKPROCESS_STATE
;
363 // NtVdmControl Classes
365 typedef enum _VDMSERVICECLASS
367 VdmStartExecution
= 0,
368 VdmQueueInterrupt
= 1,
369 VdmDelayInterrupt
= 2,
372 VdmSetInt21Handler
= 5,
374 VdmPrinterDirectIoOpen
= 7,
375 VdmPrinterDirectIoClose
= 8,
376 VdmPrinterInitialize
= 9,
377 VdmSetLdtEntries
= 10,
378 VdmSetProcessLdtInfo
= 11,
379 VdmAdlibEmulation
= 12,
380 VdmPMCliControl
= 13,
381 VdmQueryVdmProcess
= 14,
384 #ifdef NTOS_MODE_USER
387 // APC Normal Routine
390 (NTAPI
*PKNORMAL_ROUTINE
)(
391 IN PVOID NormalContext
,
392 IN PVOID SystemArgument1
,
393 IN PVOID SystemArgument2
400 (NTAPI
*PTIMER_APC_ROUTINE
)(
401 IN PVOID TimerContext
,
402 IN ULONG TimerLowValue
,
403 IN LONG TimerHighValue
407 // System Time Structure
409 typedef struct _KSYSTEM_TIME
414 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
417 // Shared Kernel User Data
419 typedef struct _KUSER_SHARED_DATA
421 ULONG TickCountLowDeprecated
;
422 ULONG TickCountMultiplier
;
423 volatile KSYSTEM_TIME InterruptTime
;
424 volatile KSYSTEM_TIME SystemTime
;
425 volatile KSYSTEM_TIME TimeZoneBias
;
426 USHORT ImageNumberLow
;
427 USHORT ImageNumberHigh
;
428 WCHAR NtSystemRoot
[260];
429 ULONG MaxStackTraceDepth
;
430 ULONG CryptoExponent
;
432 ULONG LargePageMinimum
;
434 NT_PRODUCT_TYPE NtProductType
;
435 BOOLEAN ProductTypeIsValid
;
436 ULONG NtMajorVersion
;
437 ULONG NtMinorVersion
;
438 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
441 volatile ULONG TimeSlip
;
442 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
443 LARGE_INTEGER SystemExpirationDate
;
445 BOOLEAN KdDebuggerEnabled
;
446 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
447 UCHAR NXSupportPolicy
;
449 volatile ULONG ActiveConsoleId
;
450 volatile ULONG DismountCount
;
451 ULONG ComPlusPackage
;
452 ULONG LastSystemRITEventTickCount
;
453 ULONG NumberOfPhysicalPages
;
454 BOOLEAN SafeBootMode
;
457 ULONGLONG TestRetInstruction
;
459 ULONG SystemCallReturn
;
460 ULONGLONG SystemCallPad
[3];
462 volatile KSYSTEM_TIME TickCount
;
463 volatile ULONG64 TickCountQuad
;
466 #if (NTDDI_VERSION >= NTDDI_WS03)
467 LONGLONG ConsoleSessionForegroundProcessId
;
468 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
470 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
471 USHORT UserModeGlobalLogger
[8];
472 ULONG HeapTracingPid
[2];
473 ULONG CritSecTracingPid
[2];
476 ULONG SharedDataFlags
;
479 ULONG DbgErrorPortPresent
:1;
480 ULONG DbgElevationEnabled
:1;
481 ULONG DbgVirtEnabled
:1;
482 ULONG DbgInstallerDetectEnabled
:1;
486 ULONG ImageFileExecutionOptions
;
487 KAFFINITY ActiveProcessorAffinity
;
489 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
494 #include "pshpack1.h"
495 typedef struct _VdmVirtualIca
508 } VDMVIRTUALICA
, *PVDMVIRTUALICA
;
511 typedef struct _VdmIcaUserData
514 PVDMVIRTUALICA pIcaMaster
;
515 PVDMVIRTUALICA pIcaSlave
;
520 PULONG pAddrIretBopTable
;
521 PHANDLE phWowIdleEvent
;
522 PLARGE_INTEGER pIcaTimeout
;
523 PHANDLE phMainThreadSuspended
;
524 } VDMICAUSERDATA
, *PVDMICAUSERDATA
;
526 typedef struct _VDM_INITIALIZE_DATA
529 PVDMICAUSERDATA IcaUserData
;
530 } VDM_INITIALIZE_DATA
, *PVDM_INITIALIZE_DATA
;
535 // System Thread Start Routine
539 (NTAPI
*PKSYSTEM_ROUTINE
)(
540 PKSTART_ROUTINE StartRoutine
,
545 // APC Environment Types
547 typedef enum _KAPC_ENVIRONMENT
549 OriginalApcEnvironment
,
550 AttachedApcEnvironment
,
551 CurrentApcEnvironment
,
558 typedef enum _PROCESSOR_CACHE_TYPE
564 } PROCESSOR_CACHE_TYPE
;
569 typedef struct _KDPC_DATA
571 LIST_ENTRY DpcListHead
;
573 volatile ULONG DpcQueueDepth
;
575 } KDPC_DATA
, *PKDPC_DATA
;
578 // Per-Processor Lookaside List
580 typedef struct _PP_LOOKASIDE_LIST
582 struct _GENERAL_LOOKASIDE
*P
;
583 struct _GENERAL_LOOKASIDE
*L
;
584 } PP_LOOKASIDE_LIST
, *PPP_LOOKASIDE_LIST
;
587 // CPU Cache Descriptor
589 typedef struct _CACHE_DESCRIPTOR
595 PROCESSOR_CACHE_TYPE Type
;
596 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
599 // Architectural Types
601 #include <arch/ketypes.h>
604 // Kernel Memory Node
606 #include <pshpack1.h>
607 typedef struct _KNODE
609 SLIST_HEADER DeadStackList
;
610 SLIST_HEADER PfnDereferenceSListHead
;
611 KAFFINITY ProcessorMask
;
616 ULONG MmShiftedColor
;
618 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
623 // Kernel Profile Object
625 typedef struct _KPROFILE
629 LIST_ENTRY ProfileListEntry
;
630 struct _KPROCESS
*Process
;
637 KPROFILE_SOURCE Source
;
639 } KPROFILE
, *PKPROFILE
;
642 // Kernel Interrupt Object
644 typedef struct _KINTERRUPT
648 LIST_ENTRY InterruptListEntry
;
649 PKSERVICE_ROUTINE ServiceRoutine
;
650 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
651 PKSERVICE_ROUTINE MessageServiceRoutine
;
654 PVOID ServiceContext
;
657 PKSPIN_LOCK ActualLock
;
658 PKINTERRUPT_ROUTINE DispatchAddress
;
661 KIRQL SynchronizeIrql
;
662 BOOLEAN FloatingSave
;
666 KINTERRUPT_MODE Mode
;
667 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
668 KINTERRUPT_POLARITY Polarity
;
672 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
675 ULONG DispatchCode
[KINTERRUPT_DISPATCH_CODES
];
676 } KINTERRUPT
, *PKINTERRUPT
;
679 // Kernel Event Pair Object
681 typedef struct _KEVENT_PAIR
687 } KEVENT_PAIR
, *PKEVENT_PAIR
;
690 // Kernel No Execute Options
692 typedef struct _KEXECUTE_OPTIONS
694 UCHAR ExecuteDisable
:1;
695 UCHAR ExecuteEnable
:1;
696 UCHAR DisableThunkEmulation
:1;
698 UCHAR ExecuteDispatchEnable
:1;
699 UCHAR ImageDispatchEnable
:1;
701 } KEXECUTE_OPTIONS
, *PKEXECUTE_OPTIONS
;
704 // Kernel Thread (KTHREAD)
706 typedef struct _KTHREAD
708 DISPATCHER_HEADER DispatcherHeader
;
709 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
712 ULONGLONG QuantumTarget
;
714 LIST_ENTRY MutantListHead
;
717 ULONG_PTR StackLimit
;
719 KSPIN_LOCK ThreadLock
;
725 UCHAR ApcStateFill
[23];
727 volatile UCHAR NextProcessor
;
728 volatile UCHAR DeferredProcessor
;
730 SCHAR AdjustIncrement
;
733 KSPIN_LOCK ApcQueueLock
;
734 ULONG ContextSwitches
;
735 volatile UCHAR State
;
738 KPROCESSOR_MODE WaitMode
;
742 PKWAIT_BLOCK WaitBlockList
;
745 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
750 ULONG KernelStackResident
:1;
751 ULONG ReadyTransition
:1;
752 ULONG ProcessReadyQueue
:1;
754 ULONG SystemAffinityActive
:1;
756 ULONG GdiFlushActive
:1;
767 BOOLEAN EnableStackSwap
;
768 volatile UCHAR SwapBusy
;
769 BOOLEAN Alerted
[MaximumMode
];
772 LIST_ENTRY WaitListEntry
;
773 SINGLE_LIST_ENTRY SwapListEntry
;
781 SHORT KernelApcDisable
;
782 SHORT SpecialApcDisable
;
784 ULONG CombinedApcDisable
;
797 LONG AutoAlignment
:1;
799 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
800 LONG EtwStackTrace1ApcInserted
:1;
801 LONG EtwStackTrace2ApcInserted
:1;
802 LONG CycleChargePending
:1;
803 LONG ReservedFlags
:27;
805 LONG ReservedFlags
:30;
814 KWAIT_BLOCK WaitBlock
[THREAD_WAIT_OBJECTS
+ 1];
817 UCHAR WaitBlockFill0
[23];
818 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
819 UCHAR IdealProcessor
;
821 BOOLEAN SystemAffinityActive
;
826 UCHAR WaitBlockFill1
[47];
831 UCHAR WaitBlockFill2
[71];
836 UCHAR WaitBlockFill3
[95];
840 LIST_ENTRY QueueListEntry
;
841 PKTRAP_FRAME TrapFrame
;
842 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
848 #if (NTDDI_VERSION < NTDDI_LONGHORN)
849 UCHAR IdealProcessor
;
852 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
853 BOOLEAN CalloutActive
;
855 BOOLEAN ProcessReadyQueue
;
856 BOOLEAN KernelStackResident
;
859 SCHAR PriorityDecrement
;
861 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
862 ULONG SystemCallNumber
;
865 KAFFINITY UserAffinity
;
866 struct _KPROCESS
*Process
;
868 PKAPC_STATE ApcStatePointer
[2];
871 KAPC_STATE SavedApcState
;
874 UCHAR SavedApcStateFill
[23];
877 UCHAR UserIdealProcessor
;
878 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
883 UCHAR ReservedBits0
:1;
884 UCHAR SegmentsPresent
:1;
885 UCHAR Reservedbits1
:1;
887 UCHAR NestedStateFlags
;
902 UCHAR SuspendApcFill0
[1];
907 UCHAR SuspendApcFill1
[3];
912 UCHAR SuspendApcFill2
[4];
917 UCHAR SuspendApcFill3
[36];
918 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
926 UCHAR SuspendApcFill4
[40];
931 UCHAR SuspendApcFill5
[47];
938 KSEMAPHORE SuspendSemaphore
;
941 UCHAR SuspendSemaphorefill
[20];
942 ULONG SListFaultCount
;
945 LIST_ENTRY ThreadListEntry
;
946 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
947 LIST_ENTRY MutantListHead
;
949 PVOID SListFaultAddress
;
950 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
951 PVOID MdlForLockedteb
;
953 } KTHREAD
, *PKTHREAD
;
955 #define ASSERT_THREAD(object) \
956 ASSERT((((object)->DispatcherHeader.Type & KOBJECT_TYPE_MASK) == ThreadObject))
959 // Kernel Process (KPROCESS)
961 typedef struct _KPROCESS
963 DISPATCHER_HEADER Header
;
964 LIST_ENTRY ProfileListHead
;
965 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
966 ULONG DirectoryTableBase
;
969 LARGE_INTEGER DirectoryTableBase
;
972 KGDTENTRY LdtDescriptor
;
973 KIDTENTRY Int21Descriptor
;
978 volatile ULONG ActiveProcessors
;
981 LIST_ENTRY ReadyListHead
;
982 SINGLE_LIST_ENTRY SwapListEntry
;
983 PVOID VdmTrapcHandler
;
984 LIST_ENTRY ThreadListHead
;
985 KSPIN_LOCK ProcessLock
;
991 LONG AutoAlignment
:1;
993 LONG DisableQuantum
:1;
994 LONG ReservedFlags
:29;
1007 KEXECUTE_OPTIONS Flags
;
1008 UCHAR ExecuteOptions
;
1011 LIST_ENTRY ProcessListEntry
;
1012 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1013 ULONGLONG CycleTime
;
1015 } KPROCESS
, *PKPROCESS
;
1017 #define ASSERT_PROCESS(object) \
1018 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ProcessObject))
1021 // System Service Table Descriptor
1023 typedef struct _KSERVICE_TABLE_DESCRIPTOR
1029 LONG TableBaseGpOffset
;
1032 } KSERVICE_TABLE_DESCRIPTOR
, *PKSERVICE_TABLE_DESCRIPTOR
;
1035 // Exported Loader Parameter Block
1037 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI
*KeLoaderBlock
;
1040 // Exported Hardware Data
1042 extern KAFFINITY NTSYSAPI KeActiveProcessors
;
1043 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1044 extern volatile CCHAR NTSYSAPI KeNumberProcessors
;
1046 #if (NTDDI_VERSION >= NTDDI_WINXP)
1047 extern CCHAR NTSYSAPI KeNumberProcessors
;
1049 //extern PCCHAR KeNumberProcessors;
1050 extern NTSYSAPI CCHAR KeNumberProcessors
; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
1053 extern ULONG NTSYSAPI KiDmaIoCoherency
;
1054 extern ULONG NTSYSAPI KeMaximumIncrement
;
1055 extern ULONG NTSYSAPI KeMinimumIncrement
;
1056 extern ULONG NTSYSAPI KeDcacheFlushCount
;
1057 extern ULONG NTSYSAPI KeIcacheFlushCount
;
1060 // Exported System Service Descriptor Tables
1062 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable
[SSDT_MAX_ENTRIES
];
1063 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow
[SSDT_MAX_ENTRIES
];
1065 #endif // !NTOS_MODE_USER
1067 #endif // _KETYPES_H