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 // Object Type Mask for Kernel Dispatcher Objects
45 #define KOBJECT_TYPE_MASK 0x7F
46 #define KOBJECT_LOCK_BIT 0x80
49 // Dispatcher Priority increments
51 #define THREAD_ALERT_INCREMENT 2
54 // User Shared Data in Kernel-Mode
56 #define KI_USER_SHARED_DATA 0xffdf0000
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
91 // KPCR Access for non-IA64 builds
93 #define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
94 #define PCR ((volatile KPCR * const)K0IPCR)
95 #define KeGetPcr() PCR
98 // Number of dispatch codes supported by KINTERRUPT
100 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
101 #define KINTERRUPT_DISPATCH_CODES 135
103 #define KINTERRUPT_DISPATCH_CODES 106
106 #ifdef NTOS_MODE_USER
109 // KPROCESSOR_MODE Type
111 typedef CCHAR KPROCESSOR_MODE
;
114 // Dereferencable pointer to KUSER_SHARED_DATA in User-Mode
116 #define SharedUserData ((KUSER_SHARED_DATA *CONST)USER_SHARED_DATA)
119 // Maximum WOW64 Entries in KUSER_SHARED_DATA
121 #define MAX_WOW64_SHARED_ENTRIES 16
124 // Maximum Processor Features supported in KUSER_SHARED_DATA
126 #define PROCESSOR_FEATURE_MAX 64
131 typedef enum _EVENT_TYPE
140 typedef enum _TIMER_TYPE
149 typedef enum _WAIT_TYPE
156 // Processor Execution Modes
168 typedef enum _KWAIT_REASON
210 typedef enum _KPROFILE_SOURCE
213 ProfileAlignmentFixup
,
216 ProfileLoadInstructions
,
217 ProfilePipelineFrozen
,
218 ProfileBranchInstructions
,
219 ProfileTotalNonissues
,
223 ProfileBranchMispredictions
,
224 ProfileStoreInstructions
,
225 ProfileFpInstructions
,
226 ProfileIntegerInstructions
,
230 ProfileSpecialInstructions
,
233 ProfileDcacheAccesses
,
234 ProfileMemoryBarrierCycles
,
235 ProfileLoadLinkedIssues
,
240 // NT Product and Architecture Types
242 typedef enum _NT_PRODUCT_TYPE
247 } NT_PRODUCT_TYPE
, *PNT_PRODUCT_TYPE
;
249 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
254 } ALTERNATIVE_ARCHITECTURE_TYPE
;
261 typedef enum _KTHREAD_STATE
271 #if (NTDDI_VERSION >= NTDDI_WS03)
274 } KTHREAD_STATE
, *PKTHREAD_STATE
;
279 typedef enum _KPROCESS_STATE
286 } KPROCESS_STATE
, *PKPROCESS_STATE
;
289 // NtVdmControl Classes
291 typedef enum _VDMSERVICECLASS
293 VdmStartExecution
= 0,
294 VdmQueueInterrupt
= 1,
295 VdmDelayInterrupt
= 2,
298 VdmSetInt21Handler
= 5,
300 VdmPrinterDirectIoOpen
= 7,
301 VdmPrinterDirectIoClose
= 8,
302 VdmPrinterInitialize
= 9,
303 VdmSetLdtEntries
= 10,
304 VdmSetProcessLdtInfo
= 11,
305 VdmAdlibEmulation
= 12,
306 VdmPMCliControl
= 13,
307 VdmQueryVdmProcess
= 14,
310 #ifdef NTOS_MODE_USER
313 // APC Normal Routine
316 (NTAPI
*PKNORMAL_ROUTINE
)(
317 IN PVOID NormalContext
,
318 IN PVOID SystemArgument1
,
319 IN PVOID SystemArgument2
326 (NTAPI
*PTIMER_APC_ROUTINE
)(
327 IN PVOID TimerContext
,
328 IN ULONG TimerLowValue
,
329 IN LONG TimerHighValue
333 // System Time Structure
335 typedef struct _KSYSTEM_TIME
340 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
343 // Shared Kernel User Data
345 typedef struct _KUSER_SHARED_DATA
347 ULONG TickCountLowDeprecated
;
348 ULONG TickCountMultiplier
;
349 volatile KSYSTEM_TIME InterruptTime
;
350 volatile KSYSTEM_TIME SystemTime
;
351 volatile KSYSTEM_TIME TimeZoneBias
;
352 USHORT ImageNumberLow
;
353 USHORT ImageNumberHigh
;
354 WCHAR NtSystemRoot
[260];
355 ULONG MaxStackTraceDepth
;
356 ULONG CryptoExponent
;
358 ULONG LargePageMinimum
;
360 NT_PRODUCT_TYPE NtProductType
;
361 BOOLEAN ProductTypeIsValid
;
362 ULONG NtMajorVersion
;
363 ULONG NtMinorVersion
;
364 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
367 volatile ULONG TimeSlip
;
368 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
369 LARGE_INTEGER SystemExpirationDate
;
371 BOOLEAN KdDebuggerEnabled
;
372 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
373 UCHAR NXSupportPolicy
;
375 volatile ULONG ActiveConsoleId
;
376 volatile ULONG DismountCount
;
377 ULONG ComPlusPackage
;
378 ULONG LastSystemRITEventTickCount
;
379 ULONG NumberOfPhysicalPages
;
380 BOOLEAN SafeBootMode
;
383 ULONGLONG TestRetInstruction
;
385 ULONG SystemCallReturn
;
386 ULONGLONG SystemCallPad
[3];
388 volatile KSYSTEM_TIME TickCount
;
389 volatile ULONG64 TickCountQuad
;
392 #if (NTDDI_VERSION >= NTDDI_WS03)
393 LONGLONG ConsoleSessionForegroundProcessId
;
394 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
396 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
397 USHORT UserModeGlobalLogger
[8];
398 ULONG HeapTracingPid
[2];
399 ULONG CritSecTracingPid
[2];
402 ULONG SharedDataFlags
;
405 ULONG DbgErrorPortPresent
:1;
406 ULONG DbgElevationEnabled
:1;
407 ULONG DbgVirtEnabled
:1;
408 ULONG DbgInstallerDetectEnabled
:1;
412 ULONG ImageFileExecutionOptions
;
413 KAFFINITY ActiveProcessorAffinity
;
415 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
420 #include "pshpack1.h"
421 typedef struct _VdmVirtualIca
434 } VDMVIRTUALICA
, *PVDMVIRTUALICA
;
437 typedef struct _VdmIcaUserData
440 PVDMVIRTUALICA pIcaMaster
;
441 PVDMVIRTUALICA pIcaSlave
;
446 PULONG pAddrIretBopTable
;
447 PHANDLE phWowIdleEvent
;
448 PLARGE_INTEGER pIcaTimeout
;
449 PHANDLE phMainThreadSuspended
;
450 } VDMICAUSERDATA
, *PVDMICAUSERDATA
;
452 typedef struct _VDM_INITIALIZE_DATA
455 PVDMICAUSERDATA IcaUserData
;
456 } VDM_INITIALIZE_DATA
, *PVDM_INITIALIZE_DATA
;
461 // System Thread Start Routine
465 (NTAPI
*PKSYSTEM_ROUTINE
)(
466 PKSTART_ROUTINE StartRoutine
,
471 // APC Environment Types
473 typedef enum _KAPC_ENVIRONMENT
475 OriginalApcEnvironment
,
476 AttachedApcEnvironment
,
477 CurrentApcEnvironment
,
484 typedef enum _PROCESSOR_CACHE_TYPE
490 } PROCESSOR_CACHE_TYPE
;
495 typedef struct _KDPC_DATA
497 LIST_ENTRY DpcListHead
;
499 volatile ULONG DpcQueueDepth
;
501 } KDPC_DATA
, *PKDPC_DATA
;
504 // Per-Processor Lookaside List
506 typedef struct _PP_LOOKASIDE_LIST
508 struct _GENERAL_LOOKASIDE
*P
;
509 struct _GENERAL_LOOKASIDE
*L
;
510 } PP_LOOKASIDE_LIST
, *PPP_LOOKASIDE_LIST
;
513 // CPU Cache Descriptor
515 typedef struct _CACHE_DESCRIPTOR
521 PROCESSOR_CACHE_TYPE Type
;
522 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
525 // Architectural Types
527 #include <arch/ketypes.h>
530 // Kernel Memory Node
532 #include <pshpack1.h>
533 typedef struct _KNODE
535 SLIST_HEADER DeadStackList
;
536 SLIST_HEADER PfnDereferenceSListHead
;
537 KAFFINITY ProcessorMask
;
542 ULONG MmShiftedColor
;
544 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
549 // Kernel Profile Object
551 typedef struct _KPROFILE
555 LIST_ENTRY ProfileListEntry
;
556 struct _KPROCESS
*Process
;
563 KPROFILE_SOURCE Source
;
565 } KPROFILE
, *PKPROFILE
;
568 // Kernel Interrupt Object
570 typedef struct _KINTERRUPT
574 LIST_ENTRY InterruptListEntry
;
575 PKSERVICE_ROUTINE ServiceRoutine
;
576 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
577 PKSERVICE_ROUTINE MessageServiceRoutine
;
580 PVOID ServiceContext
;
583 PKSPIN_LOCK ActualLock
;
584 PVOID DispatchAddress
;
587 KIRQL SynchronizeIrql
;
588 BOOLEAN FloatingSave
;
592 KINTERRUPT_MODE Mode
;
593 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
594 KINTERRUPT_POLARITY Polarity
;
598 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
601 ULONG DispatchCode
[KINTERRUPT_DISPATCH_CODES
];
602 } KINTERRUPT
, *PKINTERRUPT
;
605 // Kernel Event Pair Object
607 typedef struct _KEVENT_PAIR
613 } KEVENT_PAIR
, *PKEVENT_PAIR
;
616 // Kernel No Execute Options
618 typedef struct _KEXECUTE_OPTIONS
620 UCHAR ExecuteDisable
:1;
621 UCHAR ExecuteEnable
:1;
622 UCHAR DisableThunkEmulation
:1;
624 UCHAR ExecuteDispatchEnable
:1;
625 UCHAR ImageDispatchEnable
:1;
627 } KEXECUTE_OPTIONS
, *PKEXECUTE_OPTIONS
;
630 // Kernel Object Types
632 typedef enum _KOBJECTS
634 EventNotificationObject
= 0,
635 EventSynchronizationObject
= 1,
642 TimerNotificationObject
= 8,
643 TimerSynchronizationObject
= 9,
654 DeviceQueueObject
= 20,
655 EventPairObject
= 21,
656 InterruptObject
= 22,
658 ThreadedDpcObject
= 24,
659 MaximumKernelObject
= 25
663 // Kernel Thread (KTHREAD)
665 #include <pshpack1.h>
666 typedef struct _KTHREAD
668 DISPATCHER_HEADER DispatcherHeader
;
669 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
673 LIST_ENTRY MutantListHead
;
676 ULONG_PTR StackLimit
;
678 KSPIN_LOCK ThreadLock
;
684 UCHAR ApcStateFill
[23];
688 volatile UCHAR NextProcessor
;
689 volatile UCHAR DeferredProcessor
;
691 SCHAR AdjustIncrement
;
692 KSPIN_LOCK ApcQueueLock
;
693 ULONG ContextSwitches
;
694 volatile UCHAR State
;
701 PKWAIT_BLOCK WaitBlockList
;
708 UCHAR EnableStackSwap
;
709 volatile UCHAR SwapBusy
;
713 LIST_ENTRY WaitListEntry
;
714 SINGLE_LIST_ENTRY SwapListEntry
;
722 SHORT KernelApcDisable
;
723 SHORT SpecialApcDisable
;
725 ULONG CombinedApcDisable
;
737 LONG AutoAlignment
:1;
739 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
740 LONG EtwStackTrace1ApcInserted
:1;
741 LONG EtwStackTrace2ApcInserted
:1;
742 LONG CycleChargePending
:1;
743 LONG ReservedFlags
:27;
745 LONG ReservedFlags
:30;
753 KWAIT_BLOCK WaitBlock
[4];
758 UCHAR WaitBlockFill0
[23];
759 UCHAR SystemAffinityActive
;
763 UCHAR WaitBlockFill1
[47];
768 UCHAR WaitBlockFill2
[71];
773 UCHAR WaitBlockFill3
[95];
778 LIST_ENTRY QueueListEntry
;
779 PKTRAP_FRAME TrapFrame
;
780 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
786 UCHAR IdealProcessor
;
788 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
791 UCHAR ProcessReadyQueue
;
793 UCHAR KernelStackResident
;
795 CHAR PriorityDecrement
;
797 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
798 ULONG SystemCallNumber
;
804 ULONG ReadyTransition
:1;
805 ULONG ProcessReadyQueue
:1;
812 KAFFINITY UserAffinity
;
813 struct _KPROCESS
*Process
;
815 PKAPC_STATE ApcStatePointer
[2];
818 KAPC_STATE SavedApcState
;
821 UCHAR SavedApcStateFill
[23];
826 UCHAR UserIdealProcessor
;
827 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
832 UCHAR ReservedBits0
:1;
833 UCHAR SegmentsPresent
:1;
834 UCHAR Reservedbits1
:1;
836 UCHAR NestedStateFlags
;
849 UCHAR SuspendApcFill0
[1];
854 UCHAR SuspendApcFill1
[3];
859 UCHAR SuspendApcFill2
[4];
864 UCHAR SuspendApcFill3
[36];
865 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
873 UCHAR SuspendApcFill4
[40];
878 UCHAR SuspendApcFill5
[47];
885 KSEMAPHORE SuspendSemaphore
;
886 UCHAR SuspendSemaphorefill
[20];
888 ULONG SListFaultCount
;
889 LIST_ENTRY ThreadListEntry
;
890 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
891 LIST_ENTRY MutantListHead
;
893 PVOID SListFaultAddress
;
894 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
895 PVOID MdlForLockedteb
;
900 #define ASSERT_THREAD(object) \
901 ASSERT((((object)->DispatcherHeader.Type & KOBJECT_TYPE_MASK) == ThreadObject))
904 // Kernel Process (KPROCESS)
906 typedef struct _KPROCESS
908 DISPATCHER_HEADER Header
;
909 LIST_ENTRY ProfileListHead
;
910 LARGE_INTEGER DirectoryTableBase
;
912 KGDTENTRY LdtDescriptor
;
913 KIDTENTRY Int21Descriptor
;
918 volatile ULONG ActiveProcessors
;
921 LIST_ENTRY ReadyListHead
;
922 SINGLE_LIST_ENTRY SwapListEntry
;
923 PVOID VdmTrapcHandler
;
924 LIST_ENTRY ThreadListHead
;
925 KSPIN_LOCK ProcessLock
;
931 LONG AutoAlignment
:1;
933 LONG DisableQuantum
:1;
934 LONG ReservedFlags
:29;
947 KEXECUTE_OPTIONS Flags
;
948 UCHAR ExecuteOptions
;
951 LIST_ENTRY ProcessListEntry
;
952 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
955 } KPROCESS
, *PKPROCESS
;
957 #define ASSERT_PROCESS(object) \
958 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ProcessObject))
961 // System Service Table Descriptor
963 typedef struct _KSERVICE_TABLE_DESCRIPTOR
969 LONG TableBaseGpOffset
;
972 } KSERVICE_TABLE_DESCRIPTOR
, *PKSERVICE_TABLE_DESCRIPTOR
;
975 // Exported Loader Parameter Block
977 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI
*KeLoaderBlock
;
980 // Exported Hardware Data
982 extern KAFFINITY NTSYSAPI KeActiveProcessors
;
983 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
984 extern volatile CCHAR NTSYSAPI KeNumberProcessors
;
986 #if (NTDDI_VERSION >= NTDDI_WINXP)
987 extern CCHAR NTSYSAPI KeNumberProcessors
;
989 //extern PCCHAR KeNumberProcessors;
990 extern NTSYSAPI CCHAR KeNumberProcessors
; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
993 extern ULONG NTSYSAPI KiDmaIoCoherency
;
994 extern ULONG NTSYSAPI KeMaximumIncrement
;
995 extern ULONG NTSYSAPI KeMinimumIncrement
;
996 extern ULONG NTSYSAPI KeDcacheFlushCount
;
997 extern ULONG NTSYSAPI KeIcacheFlushCount
;
1000 // Exported System Service Descriptor Tables
1002 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable
[SSDT_MAX_ENTRIES
];
1003 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow
[SSDT_MAX_ENTRIES
];
1005 #endif // !NTOS_MODE_USER
1007 #endif // _KETYPES_H