3 Copyright (c) Alex Ionescu. All rights reserved.
11 Type definitions for the Loader.
15 Alex Ionescu (alex.ionescu@reactos.com) 06-Oct-2004
26 #ifndef NTOS_MODE_USER
34 // Context Record Flags
36 #define CONTEXT_DEBUGGER (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
39 // Maximum System Descriptor Table Entries
41 #define SSDT_MAX_ENTRIES 4
46 // KPROCESSOR_MODE Type
48 typedef CCHAR KPROCESSOR_MODE
;
51 // Dereferencable pointer to KUSER_SHARED_DATA in User-Mode
53 #define SharedUserData ((KUSER_SHARED_DATA *CONST)USER_SHARED_DATA)
56 // Maximum WOW64 Entries in KUSER_SHARED_DATA
58 #define MAX_WOW64_SHARED_ENTRIES 16
61 // Maximum Processor Features supported in KUSER_SHARED_DATA
63 #define PROCESSOR_FEATURE_MAX 64
68 typedef enum _EVENT_TYPE
77 typedef enum _TIMER_TYPE
86 typedef enum _WAIT_TYPE
93 // Processor Execution Modes
105 typedef enum _KWAIT_REASON
147 typedef enum _KPROFILE_SOURCE
150 ProfileAlignmentFixup
,
153 ProfileLoadInstructions
,
154 ProfilePipelineFrozen
,
155 ProfileBranchInstructions
,
156 ProfileTotalNonissues
,
160 ProfileBranchMispredictions
,
161 ProfileStoreInstructions
,
162 ProfileFpInstructions
,
163 ProfileIntegerInstructions
,
167 ProfileSpecialInstructions
,
170 ProfileDcacheAccesses
,
171 ProfileMemoryBarrierCycles
,
172 ProfileLoadLinkedIssues
,
177 // NT Product and Architecture Types
179 typedef enum _NT_PRODUCT_TYPE
184 } NT_PRODUCT_TYPE
, *PNT_PRODUCT_TYPE
;
186 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
191 } ALTERNATIVE_ARCHITECTURE_TYPE
;
198 typedef enum _KTHREAD_STATE
208 } KTHREAD_STATE
, *PKTHREAD_STATE
;
213 typedef enum _KPROCESS_STATE
218 } KPROCESS_STATE
, *PKPROCESS_STATE
;
220 #ifdef NTOS_MODE_USER
223 // APC Normal Routine
226 (NTAPI
*PKNORMAL_ROUTINE
)(
227 IN PVOID NormalContext
,
228 IN PVOID SystemArgument1
,
229 IN PVOID SystemArgument2
236 (NTAPI
*PTIMER_APC_ROUTINE
)(
237 IN PVOID TimerContext
,
238 IN ULONG TimerLowValue
,
239 IN LONG TimerHighValue
243 // System Time Structure
245 typedef struct _KSYSTEM_TIME
250 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
253 // Shared Kernel User Data
255 typedef struct _KUSER_SHARED_DATA
257 ULONG TickCountLowDeprecated
;
258 ULONG TickCountMultiplier
;
259 volatile KSYSTEM_TIME InterruptTime
;
260 volatile KSYSTEM_TIME SystemTime
;
261 volatile KSYSTEM_TIME TimeZoneBias
;
262 USHORT ImageNumberLow
;
263 USHORT ImageNumberHigh
;
264 WCHAR NtSystemRoot
[260];
265 ULONG MaxStackTraceDepth
;
266 ULONG CryptoExponent
;
268 ULONG LargePageMinimum
;
270 NT_PRODUCT_TYPE NtProductType
;
271 BOOLEAN ProductTypeIsValid
;
272 ULONG NtMajorVersion
;
273 ULONG NtMinorVersion
;
274 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
277 volatile ULONG TimeSlip
;
278 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
279 LARGE_INTEGER SystemExpirationDate
;
281 BOOLEAN KdDebuggerEnabled
;
282 volatile ULONG ActiveConsoleId
;
283 volatile ULONG DismountCount
;
284 ULONG ComPlusPackage
;
285 ULONG LastSystemRITEventTickCount
;
286 ULONG NumberOfPhysicalPages
;
287 BOOLEAN SafeBootMode
;
290 ULONGLONG TestRetInstruction
;
292 ULONG SystemCallReturn
;
293 ULONGLONG SystemCallPad
[3];
295 volatile KSYSTEM_TIME TickCount
;
296 volatile ULONG64 TickCountQuad
;
299 LONGLONG ConsoleSessionForegroundProcessId
;
300 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
301 ULONG UserModeGlobalLogging
;
302 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
307 // APC Environment Types
309 typedef enum _KAPC_ENVIRONMENT
311 OriginalApcEnvironment
,
312 AttachedApcEnvironment
,
313 CurrentApcEnvironment
319 typedef struct _KDPC_DATA
321 LIST_ENTRY DpcListHead
;
325 } KDPC_DATA
, *PKDPC_DATA
;
328 // Per-Processor Lookaside List
330 typedef struct _PP_LOOKASIDE_LIST
332 struct _GENERAL_LOOKASIDE
*P
;
333 struct _GENERAL_LOOKASIDE
*L
;
334 } PP_LOOKASIDE_LIST
, *PPP_LOOKASIDE_LIST
;
337 // Architectural Types
339 #include <arch/ketypes.h>
342 // ARC Component Data
344 typedef struct _CONFIGURATION_COMPONENT_DATA
346 struct _CONFIGURATION_COMPONENT_DATA
*Parent
;
347 struct _CONFIGURATION_COMPONENT_DATA
*Child
;
348 struct _CONFIGURATION_COMPONENT_DATA
*Sibling
;
349 CONFIGURATION_COMPONENT Component
;
350 } CONFIGURATION_COMPONENT_DATA
, *PCONFIGURATION_COMPONENT_DATA
;
353 // Kernel Memory Node (FIXME: mmtypes?
355 typedef struct _KNODE
357 SLIST_HEADER DeadStackList
;
358 SLIST_HEADER PfnDereferenceSListHead
;
364 ULONG MmShiftedColor
;
366 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
370 // Kernel Profile Object (FIXME: Fix with new defs)
372 typedef struct _KPROFILE
376 LIST_ENTRY ListEntry
;
381 KPROFILE_SOURCE Source
;
384 struct _KPROCESS
*Process
;
385 } KPROFILE
, *PKPROFILE
;
388 // Kernel Interrupt Object (FIXME: Verify)
390 typedef struct _KINTERRUPT
394 LIST_ENTRY InterruptListEntry
;
395 PKSERVICE_ROUTINE ServiceRoutine
;
396 PVOID ServiceContext
;
399 PKSPIN_LOCK ActualLock
;
400 PVOID DispatchAddress
;
403 KIRQL SynchronizeIrql
;
404 BOOLEAN FloatingSave
;
408 KINTERRUPT_MODE Mode
;
411 ULONG DispatchCode
[106];
412 } KINTERRUPT
, *PKINTERRUPT
;
415 // Kernel Event Pair Object
417 typedef struct _KEVENT_PAIR
423 } KEVENT_PAIR
, *PKEVENT_PAIR
;
426 // Kernel No Execute Options
428 typedef struct _KEXECUTE_OPTIONS
430 UCHAR ExecuteDisable
:1;
431 UCHAR ExecuteEnable
:1;
432 UCHAR DisableThunkEmulation
:1;
434 UCHAR ExecuteDispatchEnable
:1;
435 UCHAR ImageDispatchEnable
:1;
437 } KEXECUTE_OPTIONS
, *PKEXECUTE_OPTIONS
;
440 // Kernel Object Types
442 typedef enum _KOBJECTS
444 EventNotificationObject
= 0,
445 EventSynchronizationObject
= 1,
452 TimerNotificationObject
= 8,
453 TimerSynchronizationObject
= 9,
464 DeviceQueueObject
= 20,
465 EventPairObject
= 21,
466 InterruptObject
= 22,
468 ThreadedDpcObject
= 24,
469 MaximumKernelObject
= 25
473 // Kernel Thread (KTHREAD)
475 #include <pshpack1.h>
476 typedef struct _KTHREAD
478 DISPATCHER_HEADER DispatcherHeader
; /* 00 */
479 LIST_ENTRY MutantListHead
; /* 10 */
480 PVOID InitialStack
; /* 18 */
481 ULONG_PTR StackLimit
; /* 1C */
482 PVOID KernelStack
; /* 20 */
483 KSPIN_LOCK ThreadLock
; /* 24 */
486 KAPC_STATE ApcState
; /* 34 */
489 UCHAR ApcStateFill
[23]; /* 34 */
490 UCHAR ApcQueueable
; /* 3F */
493 UCHAR NextProcessor
; /* 40 */
494 UCHAR DeferredProcessor
; /* 41 */
495 UCHAR AdjustReason
; /* 42 */
496 UCHAR AdjustIncrement
; /* 43 */
497 KSPIN_LOCK ApcQueueLock
; /* 44 */
498 ULONG ContextSwitches
; /* 48 */
499 UCHAR State
; /* 4C */
500 UCHAR NpxState
; /* 4D */
501 UCHAR WaitIrql
; /* 4E */
502 UCHAR WaitMode
; /* 4F */
503 LONG WaitStatus
; /* 50 */
506 PKWAIT_BLOCK WaitBlockList
; /* 54 */
507 PKGATE GateObject
; /* 54 */
509 UCHAR Alertable
; /* 58 */
510 UCHAR WaitNext
; /* 59 */
511 UCHAR WaitReason
; /* 5A */
512 UCHAR Priority
; /* 5B */
513 UCHAR EnableStackSwap
; /* 5C */
514 UCHAR SwapBusy
; /* 5D */
515 UCHAR Alerted
[2]; /* 5E */
518 LIST_ENTRY WaitListEntry
; /* 60 */
519 SINGLE_LIST_ENTRY SwapListEntry
; /* 60 */
521 PKQUEUE Queue
; /* 68 */
522 ULONG WaitTime
; /* 6C */
527 USHORT KernelApcDisable
; /* 70 */
528 USHORT SpecialApcDisable
; /* 72 */
530 ULONG CombinedApcDisable
; /* 70 */
532 struct _TEB
*Teb
; /* 74 */
535 KTIMER Timer
; /* 78 */
536 UCHAR TimerFill
[40]; /* 78 */
542 LONG AutoAlignment
:1; /* A0 */
543 LONG DisableBoost
:1; /* A0 */
544 LONG ReservedFlags
:30; /* A0 */
546 LONG ThreadFlags
; /* A0 */
548 PVOID Padding
; /* A4 */
551 KWAIT_BLOCK WaitBlock
[4]; /* A8 */
556 UCHAR WaitBlockFill0
[23]; /* A8 */
557 UCHAR SystemAffinityActive
; /* BF */
561 UCHAR WaitBlockFill1
[47]; /* A8 */
562 UCHAR PreviousMode
; /* D7 */
566 UCHAR WaitBlockFill2
[71]; /* A8 */
567 UCHAR ResourceIndex
; /* EF */
571 UCHAR WaitBlockFill3
[95]; /* A8 */
572 UCHAR LargeStack
; /* 107 */
576 LIST_ENTRY QueueListEntry
; /* 108 */
577 PKTRAP_FRAME TrapFrame
; /* 110 */
578 PVOID CallbackStack
; /* 114 */
579 PVOID ServiceTable
; /* 118 */
580 UCHAR ApcStateIndex
; /* 11C */
581 UCHAR IdealProcessor
; /* 11D */
582 UCHAR Preempted
; /* 11E */
583 UCHAR ProcessReadyQueue
; /* 11F */
584 UCHAR KernelStackResident
; /* 120 */
585 CHAR BasePriority
; /* 121 */
586 CHAR PriorityDecrement
; /* 122 */
587 CHAR Saturation
; /* 123 */
588 KAFFINITY UserAffinity
; /* 124 */
589 struct _KPROCESS
*Process
; /* 128 */
590 KAFFINITY Affinity
; /* 12C */
591 PKAPC_STATE ApcStatePointer
[2]; /* 130 */
594 KAPC_STATE SavedApcState
; /* 138 */
597 UCHAR SavedApcStateFill
[23]; /* 138 */
598 CHAR FreezeCount
; /* 14F */
601 CHAR SuspendCount
; /* 150 */
602 UCHAR UserIdealProcessor
; /* 151 */
603 UCHAR CalloutActive
; /* 152 */
604 UCHAR Iopl
; /* 153 */
605 PVOID Win32Thread
; /* 154 */
606 PVOID StackBase
; /* 158 */
609 KAPC SuspendApc
; /* 15C */
612 UCHAR SuspendApcFill0
[1]; /* 15C */
613 CHAR Quantum
; /* 15D */
617 UCHAR SuspendApcFill1
[3]; /* 15C */
618 UCHAR QuantumReset
; /* 15F */
622 UCHAR SuspendApcFill2
[4]; /* 15C */
623 ULONG KernelTime
; /* 160 */
627 UCHAR SuspendApcFill3
[36]; /* 15C */
628 PVOID TlsArray
; /* 180 */
632 UCHAR SuspendApcFill4
[40]; /* 15C */
633 PVOID LegoData
; /* 184 */
637 UCHAR SuspendApcFill5
[47]; /* 15C */
638 UCHAR PowerState
; /* 18B */
641 ULONG UserTime
; /* 18C */
644 KSEMAPHORE SuspendSemaphore
; /* 190 */
645 UCHAR SuspendSemaphorefill
[20]; /* 190 */
647 ULONG SListFaultCount
; /* 1A4 */
648 LIST_ENTRY ThreadListEntry
; /* 1A8 */
649 PVOID SListFaultAddress
; /* 1B0 */
650 } KTHREAD
; /* sizeof: 1B4 */
654 // Kernel Process (KPROCESS)
656 typedef struct _KPROCESS
658 DISPATCHER_HEADER Header
; /* 000 */
659 LIST_ENTRY ProfileListHead
; /* 010 */
660 PHYSICAL_ADDRESS DirectoryTableBase
; /* 018 */
662 KGDTENTRY LdtDescriptor
; /* 020 */
663 KIDTENTRY Int21Descriptor
; /* 028 */
664 USHORT IopmOffset
; /* 030 */
665 UCHAR Iopl
; /* 032 */
666 UCHAR Unused
; /* 033 */
668 ULONG ActiveProcessors
; /* 034 */
669 ULONG KernelTime
; /* 038 */
670 ULONG UserTime
; /* 03C */
671 LIST_ENTRY ReadyListHead
; /* 040 */
672 LIST_ENTRY SwapListEntry
; /* 048 */
673 PVOID VdmTrapcHandler
; /* 04C */
674 LIST_ENTRY ThreadListHead
; /* 050 */
675 KSPIN_LOCK ProcessLock
; /* 058 */
676 KAFFINITY Affinity
; /* 05C */
681 ULONG AutoAlignment
:1; /* 060.0 */
682 ULONG DisableBoost
:1; /* 060.1 */
683 ULONG DisableQuantum
:1; /* 060.2 */
684 ULONG ReservedFlags
:29; /* 060.3 */
686 ULONG ProcessFlags
; /* 060 */
688 CHAR BasePriority
; /* 064 */
689 CHAR QuantumReset
; /* 065 */
690 UCHAR State
; /* 066 */
691 UCHAR ThreadSeed
; /* 067 */
692 UCHAR PowerState
; /* 068 */
693 UCHAR IdealNode
; /* 069 */
694 UCHAR Visited
; /* 06A */
695 KEXECUTE_OPTIONS Flags
; /* 06B */
696 ULONG StackCount
; /* 06C */
697 LIST_ENTRY ProcessListEntry
; /* 070 */
701 // System Service Table Descriptor
703 typedef struct _KSERVICE_TABLE_DESCRIPTOR
709 LONG TableBaseGpOffset
;
712 } KSERVICE_TABLE_DESCRIPTOR
, *PKSERVICE_TABLE_DESCRIPTOR
;
715 // Exported Loader Parameter Block
717 extern LOADER_PARAMETER_BLOCK NTSYSAPI KeLoaderBlock
;
720 // Exported Hardware Data
722 extern KAFFINITY NTSYSAPI KeActiveProcessors
;
723 extern CHAR NTSYSAPI KeNumberProcessors
;
724 extern ULONG NTSYSAPI KiDmaIoCoherency
;
725 extern ULONG NTSYSAPI KeMaximumIncrement
;
726 extern ULONG NTSYSAPI KeMinimumIncrement
;
727 extern ULONG NTSYSAPI KeDcacheFlushCount
;
728 extern ULONG NTSYSAPI KeIcacheFlushCount
;
731 // Exported System Service Descriptor Tables
733 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable
[SSDT_MAX_ENTRIES
];
734 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow
[SSDT_MAX_ENTRIES
];
736 #endif // !NTOS_MODE_USER