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 // KPCR Access for non-IA64 builds
103 #define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
104 #define PCR ((volatile KPCR * const)K0IPCR)
105 #if !defined(CONFIG_SMP) && !defined(NT_BUILD)
106 #define KeGetPcr() PCR
108 #define KeGetPcr() ((volatile KPCR * const)__readfsdword(0x1C))
112 // Number of dispatch codes supported by KINTERRUPT
114 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
115 #define KINTERRUPT_DISPATCH_CODES 135
117 #define KINTERRUPT_DISPATCH_CODES 106
120 #ifdef NTOS_MODE_USER
123 // KPROCESSOR_MODE Type
125 typedef CCHAR KPROCESSOR_MODE
;
128 // Dereferencable pointer to KUSER_SHARED_DATA in User-Mode
130 #define SharedUserData ((KUSER_SHARED_DATA *CONST)USER_SHARED_DATA)
133 // Maximum WOW64 Entries in KUSER_SHARED_DATA
135 #define MAX_WOW64_SHARED_ENTRIES 16
138 // Maximum Processor Features supported in KUSER_SHARED_DATA
140 #define PROCESSOR_FEATURE_MAX 64
145 typedef enum _EVENT_TYPE
154 typedef enum _TIMER_TYPE
163 typedef enum _WAIT_TYPE
170 // Processor Execution Modes
182 typedef enum _KWAIT_REASON
224 typedef enum _KPROFILE_SOURCE
227 ProfileAlignmentFixup
,
230 ProfileLoadInstructions
,
231 ProfilePipelineFrozen
,
232 ProfileBranchInstructions
,
233 ProfileTotalNonissues
,
237 ProfileBranchMispredictions
,
238 ProfileStoreInstructions
,
239 ProfileFpInstructions
,
240 ProfileIntegerInstructions
,
244 ProfileSpecialInstructions
,
247 ProfileDcacheAccesses
,
248 ProfileMemoryBarrierCycles
,
249 ProfileLoadLinkedIssues
,
254 // NT Product and Architecture Types
256 typedef enum _NT_PRODUCT_TYPE
261 } NT_PRODUCT_TYPE
, *PNT_PRODUCT_TYPE
;
263 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
268 } ALTERNATIVE_ARCHITECTURE_TYPE
;
275 typedef enum _KTHREAD_STATE
285 #if (NTDDI_VERSION >= NTDDI_WS03)
288 } KTHREAD_STATE
, *PKTHREAD_STATE
;
293 typedef enum _ADJUST_REASON
303 typedef enum _KPROCESS_STATE
310 } KPROCESS_STATE
, *PKPROCESS_STATE
;
313 // NtVdmControl Classes
315 typedef enum _VDMSERVICECLASS
317 VdmStartExecution
= 0,
318 VdmQueueInterrupt
= 1,
319 VdmDelayInterrupt
= 2,
322 VdmSetInt21Handler
= 5,
324 VdmPrinterDirectIoOpen
= 7,
325 VdmPrinterDirectIoClose
= 8,
326 VdmPrinterInitialize
= 9,
327 VdmSetLdtEntries
= 10,
328 VdmSetProcessLdtInfo
= 11,
329 VdmAdlibEmulation
= 12,
330 VdmPMCliControl
= 13,
331 VdmQueryVdmProcess
= 14,
334 #ifdef NTOS_MODE_USER
337 // APC Normal Routine
340 (NTAPI
*PKNORMAL_ROUTINE
)(
341 IN PVOID NormalContext
,
342 IN PVOID SystemArgument1
,
343 IN PVOID SystemArgument2
350 (NTAPI
*PTIMER_APC_ROUTINE
)(
351 IN PVOID TimerContext
,
352 IN ULONG TimerLowValue
,
353 IN LONG TimerHighValue
357 // System Time Structure
359 typedef struct _KSYSTEM_TIME
364 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
367 // Shared Kernel User Data
369 typedef struct _KUSER_SHARED_DATA
371 ULONG TickCountLowDeprecated
;
372 ULONG TickCountMultiplier
;
373 volatile KSYSTEM_TIME InterruptTime
;
374 volatile KSYSTEM_TIME SystemTime
;
375 volatile KSYSTEM_TIME TimeZoneBias
;
376 USHORT ImageNumberLow
;
377 USHORT ImageNumberHigh
;
378 WCHAR NtSystemRoot
[260];
379 ULONG MaxStackTraceDepth
;
380 ULONG CryptoExponent
;
382 ULONG LargePageMinimum
;
384 NT_PRODUCT_TYPE NtProductType
;
385 BOOLEAN ProductTypeIsValid
;
386 ULONG NtMajorVersion
;
387 ULONG NtMinorVersion
;
388 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
391 volatile ULONG TimeSlip
;
392 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
393 LARGE_INTEGER SystemExpirationDate
;
395 BOOLEAN KdDebuggerEnabled
;
396 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
397 UCHAR NXSupportPolicy
;
399 volatile ULONG ActiveConsoleId
;
400 volatile ULONG DismountCount
;
401 ULONG ComPlusPackage
;
402 ULONG LastSystemRITEventTickCount
;
403 ULONG NumberOfPhysicalPages
;
404 BOOLEAN SafeBootMode
;
407 ULONGLONG TestRetInstruction
;
409 ULONG SystemCallReturn
;
410 ULONGLONG SystemCallPad
[3];
412 volatile KSYSTEM_TIME TickCount
;
413 volatile ULONG64 TickCountQuad
;
416 #if (NTDDI_VERSION >= NTDDI_WS03)
417 LONGLONG ConsoleSessionForegroundProcessId
;
418 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
420 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
421 USHORT UserModeGlobalLogger
[8];
422 ULONG HeapTracingPid
[2];
423 ULONG CritSecTracingPid
[2];
426 ULONG SharedDataFlags
;
429 ULONG DbgErrorPortPresent
:1;
430 ULONG DbgElevationEnabled
:1;
431 ULONG DbgVirtEnabled
:1;
432 ULONG DbgInstallerDetectEnabled
:1;
436 ULONG ImageFileExecutionOptions
;
437 KAFFINITY ActiveProcessorAffinity
;
439 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
444 #include "pshpack1.h"
445 typedef struct _VdmVirtualIca
458 } VDMVIRTUALICA
, *PVDMVIRTUALICA
;
461 typedef struct _VdmIcaUserData
464 PVDMVIRTUALICA pIcaMaster
;
465 PVDMVIRTUALICA pIcaSlave
;
470 PULONG pAddrIretBopTable
;
471 PHANDLE phWowIdleEvent
;
472 PLARGE_INTEGER pIcaTimeout
;
473 PHANDLE phMainThreadSuspended
;
474 } VDMICAUSERDATA
, *PVDMICAUSERDATA
;
476 typedef struct _VDM_INITIALIZE_DATA
479 PVDMICAUSERDATA IcaUserData
;
480 } VDM_INITIALIZE_DATA
, *PVDM_INITIALIZE_DATA
;
485 // System Thread Start Routine
489 (NTAPI
*PKSYSTEM_ROUTINE
)(
490 PKSTART_ROUTINE StartRoutine
,
495 // APC Environment Types
497 typedef enum _KAPC_ENVIRONMENT
499 OriginalApcEnvironment
,
500 AttachedApcEnvironment
,
501 CurrentApcEnvironment
,
508 typedef enum _PROCESSOR_CACHE_TYPE
514 } PROCESSOR_CACHE_TYPE
;
519 typedef struct _KDPC_DATA
521 LIST_ENTRY DpcListHead
;
523 volatile ULONG DpcQueueDepth
;
525 } KDPC_DATA
, *PKDPC_DATA
;
528 // Per-Processor Lookaside List
530 typedef struct _PP_LOOKASIDE_LIST
532 struct _GENERAL_LOOKASIDE
*P
;
533 struct _GENERAL_LOOKASIDE
*L
;
534 } PP_LOOKASIDE_LIST
, *PPP_LOOKASIDE_LIST
;
537 // CPU Cache Descriptor
539 typedef struct _CACHE_DESCRIPTOR
545 PROCESSOR_CACHE_TYPE Type
;
546 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
549 // Architectural Types
551 #include <arch/ketypes.h>
554 // Kernel Memory Node
556 #include <pshpack1.h>
557 typedef struct _KNODE
559 SLIST_HEADER DeadStackList
;
560 SLIST_HEADER PfnDereferenceSListHead
;
561 KAFFINITY ProcessorMask
;
566 ULONG MmShiftedColor
;
568 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
573 // Kernel Profile Object
575 typedef struct _KPROFILE
579 LIST_ENTRY ProfileListEntry
;
580 struct _KPROCESS
*Process
;
587 KPROFILE_SOURCE Source
;
589 } KPROFILE
, *PKPROFILE
;
592 // Kernel Interrupt Object
594 typedef struct _KINTERRUPT
598 LIST_ENTRY InterruptListEntry
;
599 PKSERVICE_ROUTINE ServiceRoutine
;
600 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
601 PKSERVICE_ROUTINE MessageServiceRoutine
;
604 PVOID ServiceContext
;
607 PKSPIN_LOCK ActualLock
;
608 PVOID DispatchAddress
;
611 KIRQL SynchronizeIrql
;
612 BOOLEAN FloatingSave
;
616 KINTERRUPT_MODE Mode
;
617 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
618 KINTERRUPT_POLARITY Polarity
;
622 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
625 ULONG DispatchCode
[KINTERRUPT_DISPATCH_CODES
];
626 } KINTERRUPT
, *PKINTERRUPT
;
629 // Kernel Event Pair Object
631 typedef struct _KEVENT_PAIR
637 } KEVENT_PAIR
, *PKEVENT_PAIR
;
640 // Kernel No Execute Options
642 typedef struct _KEXECUTE_OPTIONS
644 UCHAR ExecuteDisable
:1;
645 UCHAR ExecuteEnable
:1;
646 UCHAR DisableThunkEmulation
:1;
648 UCHAR ExecuteDispatchEnable
:1;
649 UCHAR ImageDispatchEnable
:1;
651 } KEXECUTE_OPTIONS
, *PKEXECUTE_OPTIONS
;
654 // Kernel Object Types
656 typedef enum _KOBJECTS
658 EventNotificationObject
= 0,
659 EventSynchronizationObject
= 1,
666 TimerNotificationObject
= 8,
667 TimerSynchronizationObject
= 9,
678 DeviceQueueObject
= 20,
679 EventPairObject
= 21,
680 InterruptObject
= 22,
682 ThreadedDpcObject
= 24,
683 MaximumKernelObject
= 25
687 // Kernel Thread (KTHREAD)
689 typedef struct _KTHREAD
691 DISPATCHER_HEADER DispatcherHeader
;
692 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
696 LIST_ENTRY MutantListHead
;
699 ULONG_PTR StackLimit
;
701 KSPIN_LOCK ThreadLock
;
707 UCHAR ApcStateFill
[23];
709 volatile UCHAR NextProcessor
;
710 volatile UCHAR DeferredProcessor
;
712 SCHAR AdjustIncrement
;
715 KSPIN_LOCK ApcQueueLock
;
716 ULONG ContextSwitches
;
717 volatile UCHAR State
;
720 KPROCESSOR_MODE WaitMode
;
724 PKWAIT_BLOCK WaitBlockList
;
731 BOOLEAN EnableStackSwap
;
732 volatile UCHAR SwapBusy
;
733 BOOLEAN Alerted
[MaximumMode
];
736 LIST_ENTRY WaitListEntry
;
737 SINGLE_LIST_ENTRY SwapListEntry
;
745 SHORT KernelApcDisable
;
746 SHORT SpecialApcDisable
;
748 ULONG CombinedApcDisable
;
761 LONG AutoAlignment
:1;
763 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
764 LONG EtwStackTrace1ApcInserted
:1;
765 LONG EtwStackTrace2ApcInserted
:1;
766 LONG CycleChargePending
:1;
767 LONG ReservedFlags
:27;
769 LONG ReservedFlags
:30;
778 KWAIT_BLOCK WaitBlock
[THREAD_WAIT_OBJECTS
+ 1];
781 UCHAR WaitBlockFill0
[23];
782 BOOLEAN SystemAffinityActive
;
786 UCHAR WaitBlockFill1
[47];
791 UCHAR WaitBlockFill2
[71];
796 UCHAR WaitBlockFill3
[95];
800 LIST_ENTRY QueueListEntry
;
801 PKTRAP_FRAME TrapFrame
;
802 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
808 UCHAR IdealProcessor
;
810 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
811 BOOLEAN CalloutActive
;
813 BOOLEAN ProcessReadyQueue
;
815 BOOLEAN KernelStackResident
;
817 SCHAR PriorityDecrement
;
819 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
820 ULONG SystemCallNumber
;
826 ULONG ReadyTransition
:1;
827 ULONG ProcessReadyQueue
:1;
834 KAFFINITY UserAffinity
;
835 struct _KPROCESS
*Process
;
837 PKAPC_STATE ApcStatePointer
[2];
840 KAPC_STATE SavedApcState
;
843 UCHAR SavedApcStateFill
[23];
846 UCHAR UserIdealProcessor
;
847 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
852 UCHAR ReservedBits0
:1;
853 UCHAR SegmentsPresent
:1;
854 UCHAR Reservedbits1
:1;
856 UCHAR NestedStateFlags
;
871 UCHAR SuspendApcFill0
[1];
876 UCHAR SuspendApcFill1
[3];
881 UCHAR SuspendApcFill2
[4];
886 UCHAR SuspendApcFill3
[36];
887 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
895 UCHAR SuspendApcFill4
[40];
900 UCHAR SuspendApcFill5
[47];
907 KSEMAPHORE SuspendSemaphore
;
910 UCHAR SuspendSemaphorefill
[20];
911 ULONG SListFaultCount
;
914 LIST_ENTRY ThreadListEntry
;
915 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
916 LIST_ENTRY MutantListHead
;
918 PVOID SListFaultAddress
;
919 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
920 PVOID MdlForLockedteb
;
924 #define ASSERT_THREAD(object) \
925 ASSERT((((object)->DispatcherHeader.Type & KOBJECT_TYPE_MASK) == ThreadObject))
928 // Kernel Process (KPROCESS)
930 typedef struct _KPROCESS
932 DISPATCHER_HEADER Header
;
933 LIST_ENTRY ProfileListHead
;
934 LARGE_INTEGER DirectoryTableBase
;
936 KGDTENTRY LdtDescriptor
;
937 KIDTENTRY Int21Descriptor
;
942 volatile ULONG ActiveProcessors
;
945 LIST_ENTRY ReadyListHead
;
946 SINGLE_LIST_ENTRY SwapListEntry
;
947 PVOID VdmTrapcHandler
;
948 LIST_ENTRY ThreadListHead
;
949 KSPIN_LOCK ProcessLock
;
955 LONG AutoAlignment
:1;
957 LONG DisableQuantum
:1;
958 LONG ReservedFlags
:29;
971 KEXECUTE_OPTIONS Flags
;
972 UCHAR ExecuteOptions
;
975 LIST_ENTRY ProcessListEntry
;
976 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
979 } KPROCESS
, *PKPROCESS
;
981 #define ASSERT_PROCESS(object) \
982 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ProcessObject))
985 // System Service Table Descriptor
987 typedef struct _KSERVICE_TABLE_DESCRIPTOR
993 LONG TableBaseGpOffset
;
996 } KSERVICE_TABLE_DESCRIPTOR
, *PKSERVICE_TABLE_DESCRIPTOR
;
999 // Exported Loader Parameter Block
1001 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI
*KeLoaderBlock
;
1004 // Exported Hardware Data
1006 extern KAFFINITY NTSYSAPI KeActiveProcessors
;
1007 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1008 extern volatile CCHAR NTSYSAPI KeNumberProcessors
;
1010 #if (NTDDI_VERSION >= NTDDI_WINXP)
1011 extern CCHAR NTSYSAPI KeNumberProcessors
;
1013 //extern PCCHAR KeNumberProcessors;
1014 extern NTSYSAPI CCHAR KeNumberProcessors
; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
1017 extern ULONG NTSYSAPI KiDmaIoCoherency
;
1018 extern ULONG NTSYSAPI KeMaximumIncrement
;
1019 extern ULONG NTSYSAPI KeMinimumIncrement
;
1020 extern ULONG NTSYSAPI KeDcacheFlushCount
;
1021 extern ULONG NTSYSAPI KeIcacheFlushCount
;
1024 // Exported System Service Descriptor Tables
1026 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable
[SSDT_MAX_ENTRIES
];
1027 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow
[SSDT_MAX_ENTRIES
];
1029 #endif // !NTOS_MODE_USER
1031 #endif // _KETYPES_H