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 struct _KDPC_DATA
544 LIST_ENTRY DpcListHead
;
546 volatile ULONG DpcQueueDepth
;
548 } KDPC_DATA
, *PKDPC_DATA
;
551 // Per-Processor Lookaside List
553 typedef struct _PP_LOOKASIDE_LIST
555 struct _GENERAL_LOOKASIDE
*P
;
556 struct _GENERAL_LOOKASIDE
*L
;
557 } PP_LOOKASIDE_LIST
, *PPP_LOOKASIDE_LIST
;
560 // Architectural Types
562 #include <arch/ketypes.h>
565 // Kernel Memory Node
567 #include <pshpack1.h>
568 typedef struct _KNODE
570 SLIST_HEADER DeadStackList
;
571 SLIST_HEADER PfnDereferenceSListHead
;
572 KAFFINITY ProcessorMask
;
577 ULONG MmShiftedColor
;
579 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
584 // Kernel Profile Object
586 typedef struct _KPROFILE
590 LIST_ENTRY ProfileListEntry
;
591 struct _KPROCESS
*Process
;
598 KPROFILE_SOURCE Source
;
600 } KPROFILE
, *PKPROFILE
;
603 // Kernel Interrupt Object
605 typedef struct _KINTERRUPT
609 LIST_ENTRY InterruptListEntry
;
610 PKSERVICE_ROUTINE ServiceRoutine
;
611 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
612 PKSERVICE_ROUTINE MessageServiceRoutine
;
615 PVOID ServiceContext
;
618 PKSPIN_LOCK ActualLock
;
619 PKINTERRUPT_ROUTINE DispatchAddress
;
622 KIRQL SynchronizeIrql
;
623 BOOLEAN FloatingSave
;
627 KINTERRUPT_MODE Mode
;
628 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
629 KINTERRUPT_POLARITY Polarity
;
633 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
636 ULONG DispatchCode
[KINTERRUPT_DISPATCH_CODES
];
637 } KINTERRUPT
, *PKINTERRUPT
;
640 // Kernel Event Pair Object
642 typedef struct _KEVENT_PAIR
648 } KEVENT_PAIR
, *PKEVENT_PAIR
;
651 // Kernel No Execute Options
653 typedef struct _KEXECUTE_OPTIONS
655 UCHAR ExecuteDisable
:1;
656 UCHAR ExecuteEnable
:1;
657 UCHAR DisableThunkEmulation
:1;
659 UCHAR ExecuteDispatchEnable
:1;
660 UCHAR ImageDispatchEnable
:1;
662 } KEXECUTE_OPTIONS
, *PKEXECUTE_OPTIONS
;
665 // Kernel Thread (KTHREAD)
667 typedef struct _KTHREAD
669 DISPATCHER_HEADER DispatcherHeader
;
670 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
673 ULONGLONG QuantumTarget
;
675 LIST_ENTRY MutantListHead
;
678 ULONG_PTR StackLimit
;
680 KSPIN_LOCK ThreadLock
;
686 UCHAR ApcStateFill
[23];
688 volatile UCHAR NextProcessor
;
689 volatile UCHAR DeferredProcessor
;
691 SCHAR AdjustIncrement
;
694 KSPIN_LOCK ApcQueueLock
;
695 ULONG ContextSwitches
;
696 volatile UCHAR State
;
699 KPROCESSOR_MODE WaitMode
;
703 PKWAIT_BLOCK WaitBlockList
;
706 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
711 ULONG KernelStackResident
:1;
712 ULONG ReadyTransition
:1;
713 ULONG ProcessReadyQueue
:1;
715 ULONG SystemAffinityActive
:1;
717 ULONG GdiFlushActive
:1;
728 BOOLEAN EnableStackSwap
;
729 volatile UCHAR SwapBusy
;
730 BOOLEAN Alerted
[MaximumMode
];
733 LIST_ENTRY WaitListEntry
;
734 SINGLE_LIST_ENTRY SwapListEntry
;
742 SHORT KernelApcDisable
;
743 SHORT SpecialApcDisable
;
745 ULONG CombinedApcDisable
;
758 LONG AutoAlignment
:1;
760 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
761 LONG EtwStackTrace1ApcInserted
:1;
762 LONG EtwStackTrace2ApcInserted
:1;
763 LONG CycleChargePending
:1;
764 LONG ReservedFlags
:27;
766 LONG ReservedFlags
:30;
775 KWAIT_BLOCK WaitBlock
[THREAD_WAIT_OBJECTS
+ 1];
778 UCHAR WaitBlockFill0
[23];
779 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
780 UCHAR IdealProcessor
;
782 BOOLEAN SystemAffinityActive
;
787 UCHAR WaitBlockFill1
[47];
792 UCHAR WaitBlockFill2
[71];
797 UCHAR WaitBlockFill3
[95];
801 LIST_ENTRY QueueListEntry
;
802 PKTRAP_FRAME TrapFrame
;
803 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
809 #if (NTDDI_VERSION < NTDDI_LONGHORN)
810 UCHAR IdealProcessor
;
813 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
814 BOOLEAN CalloutActive
;
816 BOOLEAN ProcessReadyQueue
;
817 BOOLEAN KernelStackResident
;
820 SCHAR PriorityDecrement
;
822 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
823 ULONG SystemCallNumber
;
826 KAFFINITY UserAffinity
;
827 struct _KPROCESS
*Process
;
829 PKAPC_STATE ApcStatePointer
[2];
832 KAPC_STATE SavedApcState
;
835 UCHAR SavedApcStateFill
[23];
838 UCHAR UserIdealProcessor
;
839 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
844 UCHAR ReservedBits0
:1;
845 UCHAR SegmentsPresent
:1;
846 UCHAR Reservedbits1
:1;
848 UCHAR NestedStateFlags
;
863 UCHAR SuspendApcFill0
[1];
868 UCHAR SuspendApcFill1
[3];
873 UCHAR SuspendApcFill2
[4];
878 UCHAR SuspendApcFill3
[36];
879 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
887 UCHAR SuspendApcFill4
[40];
892 UCHAR SuspendApcFill5
[47];
899 KSEMAPHORE SuspendSemaphore
;
902 UCHAR SuspendSemaphorefill
[20];
903 ULONG SListFaultCount
;
906 LIST_ENTRY ThreadListEntry
;
907 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
908 LIST_ENTRY MutantListHead
;
910 PVOID SListFaultAddress
;
911 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
912 PVOID MdlForLockedteb
;
914 } KTHREAD
, *PKTHREAD
;
916 #define ASSERT_THREAD(object) \
917 ASSERT((((object)->DispatcherHeader.Type & KOBJECT_TYPE_MASK) == ThreadObject))
920 // Kernel Process (KPROCESS)
922 typedef struct _KPROCESS
924 DISPATCHER_HEADER Header
;
925 LIST_ENTRY ProfileListHead
;
926 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
927 ULONG_PTR DirectoryTableBase
;
930 ULONG_PTR DirectoryTableBase
[2];
933 KGDTENTRY LdtDescriptor
;
934 KIDTENTRY Int21Descriptor
;
939 volatile ULONG ActiveProcessors
;
942 LIST_ENTRY ReadyListHead
;
943 SINGLE_LIST_ENTRY SwapListEntry
;
944 PVOID VdmTrapcHandler
;
945 LIST_ENTRY ThreadListHead
;
946 KSPIN_LOCK ProcessLock
;
952 LONG AutoAlignment
:1;
954 LONG DisableQuantum
:1;
955 LONG ReservedFlags
:29;
968 KEXECUTE_OPTIONS Flags
;
969 UCHAR ExecuteOptions
;
972 LIST_ENTRY ProcessListEntry
;
973 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
976 } KPROCESS
, *PKPROCESS
;
978 #define ASSERT_PROCESS(object) \
979 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ProcessObject))
982 // System Service Table Descriptor
984 typedef struct _KSERVICE_TABLE_DESCRIPTOR
990 LONG TableBaseGpOffset
;
993 } KSERVICE_TABLE_DESCRIPTOR
, *PKSERVICE_TABLE_DESCRIPTOR
;
996 // Exported Loader Parameter Block
998 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI
*KeLoaderBlock
;
1001 // Exported Hardware Data
1003 extern KAFFINITY NTSYSAPI KeActiveProcessors
;
1004 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1005 extern volatile CCHAR NTSYSAPI KeNumberProcessors
;
1007 #if (NTDDI_VERSION >= NTDDI_WINXP)
1008 extern CCHAR NTSYSAPI KeNumberProcessors
;
1010 //extern PCCHAR KeNumberProcessors;
1011 extern NTSYSAPI CCHAR KeNumberProcessors
; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
1014 extern ULONG NTSYSAPI KiDmaIoCoherency
;
1015 extern ULONG NTSYSAPI KeMaximumIncrement
;
1016 extern ULONG NTSYSAPI KeMinimumIncrement
;
1017 extern ULONG NTSYSAPI KeDcacheFlushCount
;
1018 extern ULONG NTSYSAPI KeIcacheFlushCount
;
1021 // Exported System Service Descriptor Tables
1023 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable
[SSDT_MAX_ENTRIES
];
1024 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow
[SSDT_MAX_ENTRIES
];
1026 #endif // !NTOS_MODE_USER
1028 #endif // _KETYPES_H