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
48 // Dispatcher Priority increments
50 #define THREAD_ALERT_INCREMENT 2
53 // User Shared Data in Kernel-Mode
55 #define KI_USER_SHARED_DATA 0xffdf0000
58 // Physical memory offset of KUSER_SHARED_DATA
60 #define KI_USER_SHARED_DATA_PHYSICAL 0x41000
63 // Kernel Feature Bits
65 #define KF_RDTSC 0x00000002
68 // KPCR Access for non-IA64 builds
70 #define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
71 #define PCR ((volatile KPCR * const)K0IPCR)
72 #define KeGetPcr() PCR
75 // Number of dispatch codes supported by KINTERRUPT
77 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
78 #define KINTERRUPT_DISPATCH_CODES 135
80 #define KINTERRUPT_DISPATCH_CODES 106
86 // KPROCESSOR_MODE Type
88 typedef CCHAR KPROCESSOR_MODE
;
91 // Dereferencable pointer to KUSER_SHARED_DATA in User-Mode
93 #define SharedUserData ((KUSER_SHARED_DATA *CONST)USER_SHARED_DATA)
96 // Maximum WOW64 Entries in KUSER_SHARED_DATA
98 #define MAX_WOW64_SHARED_ENTRIES 16
101 // Maximum Processor Features supported in KUSER_SHARED_DATA
103 #define PROCESSOR_FEATURE_MAX 64
108 typedef enum _EVENT_TYPE
117 typedef enum _TIMER_TYPE
126 typedef enum _WAIT_TYPE
133 // Processor Execution Modes
145 typedef enum _KWAIT_REASON
187 typedef enum _KPROFILE_SOURCE
190 ProfileAlignmentFixup
,
193 ProfileLoadInstructions
,
194 ProfilePipelineFrozen
,
195 ProfileBranchInstructions
,
196 ProfileTotalNonissues
,
200 ProfileBranchMispredictions
,
201 ProfileStoreInstructions
,
202 ProfileFpInstructions
,
203 ProfileIntegerInstructions
,
207 ProfileSpecialInstructions
,
210 ProfileDcacheAccesses
,
211 ProfileMemoryBarrierCycles
,
212 ProfileLoadLinkedIssues
,
217 // NT Product and Architecture Types
219 typedef enum _NT_PRODUCT_TYPE
224 } NT_PRODUCT_TYPE
, *PNT_PRODUCT_TYPE
;
226 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
231 } ALTERNATIVE_ARCHITECTURE_TYPE
;
238 typedef enum _KTHREAD_STATE
248 #if (NTDDI_VERSION >= NTDDI_WS03)
251 } KTHREAD_STATE
, *PKTHREAD_STATE
;
256 typedef enum _KPROCESS_STATE
263 } KPROCESS_STATE
, *PKPROCESS_STATE
;
266 // NtVdmControl Classes
268 typedef enum _VDMSERVICECLASS
270 VdmStartExecution
= 0,
271 VdmQueueInterrupt
= 1,
272 VdmDelayInterrupt
= 2,
275 VdmSetInt21Handler
= 5,
277 VdmPrinterDirectIoOpen
= 7,
278 VdmPrinterDirectIoClose
= 8,
279 VdmPrinterInitialize
= 9,
280 VdmSetLdtEntries
= 10,
281 VdmSetProcessLdtInfo
= 11,
282 VdmAdlibEmulation
= 12,
283 VdmPMCliControl
= 13,
284 VdmQueryVdmProcess
= 14,
287 #ifdef NTOS_MODE_USER
290 // APC Normal Routine
293 (NTAPI
*PKNORMAL_ROUTINE
)(
294 IN PVOID NormalContext
,
295 IN PVOID SystemArgument1
,
296 IN PVOID SystemArgument2
303 (NTAPI
*PTIMER_APC_ROUTINE
)(
304 IN PVOID TimerContext
,
305 IN ULONG TimerLowValue
,
306 IN LONG TimerHighValue
310 // System Time Structure
312 typedef struct _KSYSTEM_TIME
317 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
320 // Shared Kernel User Data
322 typedef struct _KUSER_SHARED_DATA
324 ULONG TickCountLowDeprecated
;
325 ULONG TickCountMultiplier
;
326 volatile KSYSTEM_TIME InterruptTime
;
327 volatile KSYSTEM_TIME SystemTime
;
328 volatile KSYSTEM_TIME TimeZoneBias
;
329 USHORT ImageNumberLow
;
330 USHORT ImageNumberHigh
;
331 WCHAR NtSystemRoot
[260];
332 ULONG MaxStackTraceDepth
;
333 ULONG CryptoExponent
;
335 ULONG LargePageMinimum
;
337 NT_PRODUCT_TYPE NtProductType
;
338 BOOLEAN ProductTypeIsValid
;
339 ULONG NtMajorVersion
;
340 ULONG NtMinorVersion
;
341 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
344 volatile ULONG TimeSlip
;
345 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
346 LARGE_INTEGER SystemExpirationDate
;
348 BOOLEAN KdDebuggerEnabled
;
349 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
350 UCHAR NXSupportPolicy
;
352 volatile ULONG ActiveConsoleId
;
353 volatile ULONG DismountCount
;
354 ULONG ComPlusPackage
;
355 ULONG LastSystemRITEventTickCount
;
356 ULONG NumberOfPhysicalPages
;
357 BOOLEAN SafeBootMode
;
360 ULONGLONG TestRetInstruction
;
362 ULONG SystemCallReturn
;
363 ULONGLONG SystemCallPad
[3];
365 volatile KSYSTEM_TIME TickCount
;
366 volatile ULONG64 TickCountQuad
;
369 #if (NTDDI_VERSION >= NTDDI_WS03)
370 LONGLONG ConsoleSessionForegroundProcessId
;
371 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
373 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
374 USHORT UserModeGlobalLogger
[8];
375 ULONG HeapTracingPid
[2];
376 ULONG CritSecTracingPid
[2];
379 ULONG SharedDataFlags
;
382 ULONG DbgErrorPortPresent
:1;
383 ULONG DbgElevationEnabled
:1;
384 ULONG DbgVirtEnabled
:1;
385 ULONG DbgInstallerDetectEnabled
:1;
389 ULONG ImageFileExecutionOptions
;
390 KAFFINITY ActiveProcessorAffinity
;
392 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
397 #include "pshpack1.h"
398 typedef struct _VdmVirtualIca
411 } VDMVIRTUALICA
, *PVDMVIRTUALICA
;
414 typedef struct _VdmIcaUserData
417 PVDMVIRTUALICA pIcaMaster
;
418 PVDMVIRTUALICA pIcaSlave
;
423 PULONG pAddrIretBopTable
;
424 PHANDLE phWowIdleEvent
;
425 PLARGE_INTEGER pIcaTimeout
;
426 PHANDLE phMainThreadSuspended
;
427 } VDMICAUSERDATA
, *PVDMICAUSERDATA
;
429 typedef struct _VDM_INITIALIZE_DATA
432 PVDMICAUSERDATA IcaUserData
;
433 } VDM_INITIALIZE_DATA
, *PVDM_INITIALIZE_DATA
;
438 // System Thread Start Routine
442 (NTAPI
*PKSYSTEM_ROUTINE
)(
443 PKSTART_ROUTINE StartRoutine
,
448 // APC Environment Types
450 typedef enum _KAPC_ENVIRONMENT
452 OriginalApcEnvironment
,
453 AttachedApcEnvironment
,
454 CurrentApcEnvironment
460 typedef enum _PROCESSOR_CACHE_TYPE
466 } PROCESSOR_CACHE_TYPE
;
471 typedef struct _KDPC_DATA
473 LIST_ENTRY DpcListHead
;
477 } KDPC_DATA
, *PKDPC_DATA
;
480 // Per-Processor Lookaside List
482 typedef struct _PP_LOOKASIDE_LIST
484 struct _GENERAL_LOOKASIDE
*P
;
485 struct _GENERAL_LOOKASIDE
*L
;
486 } PP_LOOKASIDE_LIST
, *PPP_LOOKASIDE_LIST
;
489 // CPU Cache Descriptor
491 typedef struct _CACHE_DESCRIPTOR
497 PROCESSOR_CACHE_TYPE Type
;
498 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
501 // Architectural Types
503 #include <arch/ketypes.h>
506 // Kernel Memory Node
508 #include <pshpack1.h>
509 typedef struct _KNODE
511 SLIST_HEADER DeadStackList
;
512 SLIST_HEADER PfnDereferenceSListHead
;
513 KAFFINITY ProcessorMask
;
518 ULONG MmShiftedColor
;
520 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
525 // Kernel Profile Object
527 typedef struct _KPROFILE
531 LIST_ENTRY ProfileListEntry
;
532 struct _KPROCESS
*Process
;
539 KPROFILE_SOURCE Source
;
541 } KPROFILE
, *PKPROFILE
;
544 // Kernel Interrupt Object
546 typedef struct _KINTERRUPT
550 LIST_ENTRY InterruptListEntry
;
551 PKSERVICE_ROUTINE ServiceRoutine
;
552 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
553 PKSERVICE_ROUTINE MessageServiceRoutine
;
556 PVOID ServiceContext
;
559 PKSPIN_LOCK ActualLock
;
560 PVOID DispatchAddress
;
563 KIRQL SynchronizeIrql
;
564 BOOLEAN FloatingSave
;
568 KINTERRUPT_MODE Mode
;
569 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
570 KINTERRUPT_POLARITY Polarity
;
574 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
577 ULONG DispatchCode
[KINTERRUPT_DISPATCH_CODES
];
578 } KINTERRUPT
, *PKINTERRUPT
;
581 // Kernel Event Pair Object
583 typedef struct _KEVENT_PAIR
589 } KEVENT_PAIR
, *PKEVENT_PAIR
;
592 // Kernel No Execute Options
594 typedef struct _KEXECUTE_OPTIONS
596 UCHAR ExecuteDisable
:1;
597 UCHAR ExecuteEnable
:1;
598 UCHAR DisableThunkEmulation
:1;
600 UCHAR ExecuteDispatchEnable
:1;
601 UCHAR ImageDispatchEnable
:1;
603 } KEXECUTE_OPTIONS
, *PKEXECUTE_OPTIONS
;
606 // Kernel Object Types
608 typedef enum _KOBJECTS
610 EventNotificationObject
= 0,
611 EventSynchronizationObject
= 1,
618 TimerNotificationObject
= 8,
619 TimerSynchronizationObject
= 9,
630 DeviceQueueObject
= 20,
631 EventPairObject
= 21,
632 InterruptObject
= 22,
634 ThreadedDpcObject
= 24,
635 MaximumKernelObject
= 25
639 // Kernel Thread (KTHREAD)
641 #include <pshpack1.h>
642 typedef struct _KTHREAD
644 DISPATCHER_HEADER DispatcherHeader
;
645 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
649 LIST_ENTRY MutantListHead
;
652 ULONG_PTR StackLimit
;
654 KSPIN_LOCK ThreadLock
;
660 UCHAR ApcStateFill
[23];
665 UCHAR DeferredProcessor
;
667 UCHAR AdjustIncrement
;
668 KSPIN_LOCK ApcQueueLock
;
669 ULONG ContextSwitches
;
677 PKWAIT_BLOCK WaitBlockList
;
684 UCHAR EnableStackSwap
;
689 LIST_ENTRY WaitListEntry
;
690 SINGLE_LIST_ENTRY SwapListEntry
;
698 USHORT KernelApcDisable
;
699 USHORT SpecialApcDisable
;
701 ULONG CombinedApcDisable
;
713 LONG AutoAlignment
:1;
715 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
716 LONG EtwStackTrace1ApcInserted
:1;
717 LONG EtwStackTrace2ApcInserted
:1;
718 LONG CycleChargePending
:1;
719 LONG ReservedFlags
:27;
721 LONG ReservedFlags
:30;
729 KWAIT_BLOCK WaitBlock
[4];
734 UCHAR WaitBlockFill0
[23];
735 UCHAR SystemAffinityActive
;
739 UCHAR WaitBlockFill1
[47];
744 UCHAR WaitBlockFill2
[71];
749 UCHAR WaitBlockFill3
[95];
754 LIST_ENTRY QueueListEntry
;
755 PKTRAP_FRAME TrapFrame
;
756 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
762 UCHAR IdealProcessor
;
764 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
767 UCHAR ProcessReadyQueue
;
769 UCHAR KernelStackResident
;
771 CHAR PriorityDecrement
;
773 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
774 ULONG SystemCallNumber
;
780 ULONG ReadyTransition
:1;
781 ULONG ProcessReadyQueue
:1;
788 KAFFINITY UserAffinity
;
789 struct _KPROCESS
*Process
;
791 PKAPC_STATE ApcStatePointer
[2];
794 KAPC_STATE SavedApcState
;
797 UCHAR SavedApcStateFill
[23];
802 UCHAR UserIdealProcessor
;
803 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
808 UCHAR ReservedBits0
:1;
809 UCHAR SegmentsPresent
:1;
810 UCHAR Reservedbits1
:1;
812 UCHAR NestedStateFlags
;
825 UCHAR SuspendApcFill0
[1];
830 UCHAR SuspendApcFill1
[3];
835 UCHAR SuspendApcFill2
[4];
840 UCHAR SuspendApcFill3
[36];
841 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
849 UCHAR SuspendApcFill4
[40];
854 UCHAR SuspendApcFill5
[47];
861 KSEMAPHORE SuspendSemaphore
;
862 UCHAR SuspendSemaphorefill
[20];
864 ULONG SListFaultCount
;
865 LIST_ENTRY ThreadListEntry
;
866 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
867 LIST_ENTRY MutantListHead
;
869 PVOID SListFaultAddress
;
870 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
871 PVOID MdlForLockedteb
;
877 // Kernel Process (KPROCESS)
879 typedef struct _KPROCESS
881 DISPATCHER_HEADER Header
;
882 LIST_ENTRY ProfileListHead
;
883 PHYSICAL_ADDRESS DirectoryTableBase
;
885 KGDTENTRY LdtDescriptor
;
886 KIDTENTRY Int21Descriptor
;
891 ULONG ActiveProcessors
;
894 LIST_ENTRY ReadyListHead
;
895 SINGLE_LIST_ENTRY SwapListEntry
;
896 PVOID VdmTrapcHandler
;
897 LIST_ENTRY ThreadListHead
;
898 KSPIN_LOCK ProcessLock
;
904 ULONG AutoAlignment
:1;
905 ULONG DisableBoost
:1;
906 ULONG DisableQuantum
:1;
907 ULONG ReservedFlags
:29;
920 KEXECUTE_OPTIONS Flags
;
921 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
922 UCHAR ExecuteOptions
;
926 LIST_ENTRY ProcessListEntry
;
927 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
930 } KPROCESS
, *PKPROCESS
;
933 // System Service Table Descriptor
935 typedef struct _KSERVICE_TABLE_DESCRIPTOR
941 LONG TableBaseGpOffset
;
944 } KSERVICE_TABLE_DESCRIPTOR
, *PKSERVICE_TABLE_DESCRIPTOR
;
947 // Exported Loader Parameter Block
950 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI
*KeLoaderBlock
;
952 extern struct _ROS_LOADER_PARAMETER_BLOCK NTSYSAPI KeLoaderBlock
;
956 // Exported Hardware Data
958 extern KAFFINITY NTSYSAPI KeActiveProcessors
;
959 extern CHAR NTSYSAPI KeNumberProcessors
;
960 extern ULONG NTSYSAPI KiDmaIoCoherency
;
961 extern ULONG NTSYSAPI KeMaximumIncrement
;
962 extern ULONG NTSYSAPI KeMinimumIncrement
;
963 extern ULONG NTSYSAPI KeDcacheFlushCount
;
964 extern ULONG NTSYSAPI KeIcacheFlushCount
;
967 // Exported System Service Descriptor Tables
969 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable
[SSDT_MAX_ENTRIES
];
970 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow
[SSDT_MAX_ENTRIES
];
972 #endif // !NTOS_MODE_USER