2f89577550e954b3977009d129f72de1575ac97b
[reactos.git] / reactos / include / ndk / ketypes.h
1 /*
2 * PROJECT: ReactOS Native Headers
3 * FILE: include/ndk/ketypes.h
4 * PURPOSE: Definitions for Kernel Types not defined in DDK/IFS
5 * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
6 * UPDATE HISTORY:
7 * Created 06/10/04
8 */
9 #ifndef _KETYPES_H
10 #define _KETYPES_H
11
12 /* DEPENDENCIES **************************************************************/
13 #ifndef NTOS_MODE_USER
14 #include <arc/arc.h>
15 #include "arch/ketypes.h"
16 #endif
17
18 /* CONSTANTS *****************************************************************/
19 #define SSDT_MAX_ENTRIES 4
20 #define CONTEXT_DEBUGGER (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
21
22 #ifdef NTOS_MODE_USER
23 #define SharedUserData ((KUSER_SHARED_DATA * CONST) USER_SHARED_DATA)
24 #define MAX_WOW64_SHARED_ENTRIES 16
25 #define PROCESSOR_FEATURE_MAX 64
26 #endif
27
28 /* ENUMERATIONS **************************************************************/
29
30 #ifdef NTOS_MODE_USER
31 typedef enum _EVENT_TYPE
32 {
33 NotificationEvent,
34 SynchronizationEvent
35 } EVENT_TYPE;
36
37 typedef enum _TIMER_TYPE
38 {
39 NotificationTimer,
40 SynchronizationTimer
41 } TIMER_TYPE;
42
43 typedef enum _WAIT_TYPE
44 {
45 WaitAll,
46 WaitAny
47 } WAIT_TYPE;
48
49 typedef enum _MODE
50 {
51 KernelMode,
52 UserMode,
53 MaximumMode
54 } MODE;
55
56 typedef enum _KWAIT_REASON
57 {
58 Executive,
59 FreePage,
60 PageIn,
61 PoolAllocation,
62 DelayExecution,
63 Suspended,
64 UserRequest,
65 WrExecutive,
66 WrFreePage,
67 WrPageIn,
68 WrPoolAllocation,
69 WrDelayExecution,
70 WrSuspended,
71 WrUserRequest,
72 WrEventPair,
73 WrQueue,
74 WrLpcReceive,
75 WrLpcReply,
76 WrVirtualMemory,
77 WrPageOut,
78 WrRendezvous,
79 Spare2,
80 WrGuardedMutex,
81 Spare4,
82 Spare5,
83 Spare6,
84 WrKernel,
85 WrResource,
86 WrPushLock,
87 WrMutex,
88 WrQuantumEnd,
89 WrDispatchInt,
90 WrPreempted,
91 WrYieldExecution,
92 MaximumWaitReason
93 } KWAIT_REASON;
94
95 typedef enum _KPROFILE_SOURCE
96 {
97 ProfileTime,
98 ProfileAlignmentFixup,
99 ProfileTotalIssues,
100 ProfilePipelineDry,
101 ProfileLoadInstructions,
102 ProfilePipelineFrozen,
103 ProfileBranchInstructions,
104 ProfileTotalNonissues,
105 ProfileDcacheMisses,
106 ProfileIcacheMisses,
107 ProfileCacheMisses,
108 ProfileBranchMispredictions,
109 ProfileStoreInstructions,
110 ProfileFpInstructions,
111 ProfileIntegerInstructions,
112 Profile2Issue,
113 Profile3Issue,
114 Profile4Issue,
115 ProfileSpecialInstructions,
116 ProfileTotalCycles,
117 ProfileIcacheIssues,
118 ProfileDcacheAccesses,
119 ProfileMemoryBarrierCycles,
120 ProfileLoadLinkedIssues,
121 ProfileMaximum
122 } KPROFILE_SOURCE;
123
124 typedef enum _NT_PRODUCT_TYPE
125 {
126 NtProductWinNt = 1,
127 NtProductLanManNt,
128 NtProductServer
129 } NT_PRODUCT_TYPE, *PNT_PRODUCT_TYPE;
130
131 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
132 {
133 StandardDesign,
134 NEC98x86,
135 EndAlternatives
136 } ALTERNATIVE_ARCHITECTURE_TYPE;
137 #endif
138
139 typedef enum _KTHREAD_STATE
140 {
141 Initialized,
142 Ready,
143 Running,
144 Standby,
145 Terminated,
146 Waiting,
147 Transition,
148 DeferredReady,
149 } KTHREAD_STATE, *PKTHREAD_STATE;
150
151 typedef enum _KPROCESS_STATE
152 {
153 ProcessInMemory,
154 ProcessOutOfMemory,
155 ProcessInTransition,
156 } KPROCESS_STATE, *PKPROCESS_STATE;
157
158 /* FUNCTION TYPES ************************************************************/
159
160 #ifdef NTOS_MODE_USER
161 typedef VOID
162 (NTAPI *PKNORMAL_ROUTINE)(
163 IN PVOID NormalContext,
164 IN PVOID SystemArgument1,
165 IN PVOID SystemArgument2);
166
167 typedef VOID
168 (NTAPI *PTIMER_APC_ROUTINE)(
169 IN PVOID TimerContext,
170 IN ULONG TimerLowValue,
171 IN LONG TimerHighValue);
172 #endif
173
174 /* TYPES *********************************************************************/
175
176 #ifdef NTOS_MODE_USER
177 typedef CCHAR KPROCESSOR_MODE;
178
179 typedef struct _KSYSTEM_TIME
180 {
181 ULONG LowPart;
182 LONG High1Time;
183 LONG High2Time;
184 } KSYSTEM_TIME, *PKSYSTEM_TIME;
185
186 typedef struct _KUSER_SHARED_DATA
187 {
188 ULONG TickCountLowDeprecated;
189 ULONG TickCountMultiplier;
190 volatile KSYSTEM_TIME InterruptTime;
191 volatile KSYSTEM_TIME SystemTime;
192 volatile KSYSTEM_TIME TimeZoneBias;
193 USHORT ImageNumberLow;
194 USHORT ImageNumberHigh;
195 WCHAR NtSystemRoot[260];
196 ULONG MaxStackTraceDepth;
197 ULONG CryptoExponent;
198 ULONG TimeZoneId;
199 ULONG LargePageMinimum;
200 ULONG Reserved2[7];
201 NT_PRODUCT_TYPE NtProductType;
202 BOOLEAN ProductTypeIsValid;
203 ULONG NtMajorVersion;
204 ULONG NtMinorVersion;
205 BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
206 ULONG Reserved1;
207 ULONG Reserved3;
208 volatile ULONG TimeSlip;
209 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
210 LARGE_INTEGER SystemExpirationDate;
211 ULONG SuiteMask;
212 BOOLEAN KdDebuggerEnabled;
213 volatile ULONG ActiveConsoleId;
214 volatile ULONG DismountCount;
215 ULONG ComPlusPackage;
216 ULONG LastSystemRITEventTickCount;
217 ULONG NumberOfPhysicalPages;
218 BOOLEAN SafeBootMode;
219 ULONG TraceLogging;
220 ULONG Fill0;
221 ULONGLONG TestRetInstruction;
222 ULONG SystemCall;
223 ULONG SystemCallReturn;
224 ULONGLONG SystemCallPad[3];
225 union {
226 volatile KSYSTEM_TIME TickCount;
227 volatile ULONG64 TickCountQuad;
228 };
229 ULONG Cookie;
230 LONGLONG ConsoleSessionForegroundProcessId;
231 ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
232 ULONG UserModeGlobalLogging;
233 } KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
234 #endif
235
236 #ifndef NTOS_MODE_USER
237 typedef struct _CONFIGURATION_COMPONENT_DATA
238 {
239 struct _CONFIGURATION_COMPONENT_DATA *Parent;
240 struct _CONFIGURATION_COMPONENT_DATA *Child;
241 struct _CONFIGURATION_COMPONENT_DATA *Sibling;
242 CONFIGURATION_COMPONENT Component;
243 } CONFIGURATION_COMPONENT_DATA, *PCONFIGURATION_COMPONENT_DATA;
244
245 typedef enum _KAPC_ENVIRONMENT
246 {
247 OriginalApcEnvironment,
248 AttachedApcEnvironment,
249 CurrentApcEnvironment
250 } KAPC_ENVIRONMENT;
251
252 typedef struct _KNODE
253 {
254 SLIST_HEADER DeadStackList;
255 SLIST_HEADER PfnDereferenceSListHead;
256 ULONG ProcessorMask;
257 ULONG Color;
258 UCHAR Seed;
259 UCHAR NodeNumber;
260 ULONG Flags;
261 ULONG MmShiftedColor;
262 ULONG FreeCount[2];
263 struct _SINGLE_LIST_ENTRY *PfnDeferredList;
264 } KNODE, *PKNODE;
265
266 typedef struct _KPROFILE
267 {
268 CSHORT Type;
269 CSHORT Size;
270 LIST_ENTRY ListEntry;
271 PVOID RegionStart;
272 PVOID RegionEnd;
273 ULONG BucketShift;
274 PVOID Buffer;
275 KPROFILE_SOURCE Source;
276 ULONG Affinity;
277 BOOLEAN Active;
278 struct _KPROCESS *Process;
279 } KPROFILE, *PKPROFILE;
280
281 typedef struct _KINTERRUPT
282 {
283 CSHORT Type;
284 CSHORT Size;
285 LIST_ENTRY InterruptListEntry;
286 PKSERVICE_ROUTINE ServiceRoutine;
287 PVOID ServiceContext;
288 KSPIN_LOCK SpinLock;
289 ULONG TickCount;
290 PKSPIN_LOCK ActualLock;
291 PVOID DispatchAddress;
292 ULONG Vector;
293 KIRQL Irql;
294 KIRQL SynchronizeIrql;
295 BOOLEAN FloatingSave;
296 BOOLEAN Connected;
297 CHAR Number;
298 UCHAR ShareVector;
299 KINTERRUPT_MODE Mode;
300 ULONG ServiceCount;
301 ULONG DispatchCount;
302 ULONG DispatchCode[106];
303 } KINTERRUPT, *PKINTERRUPT;
304
305 typedef struct _KEVENT_PAIR
306 {
307 CSHORT Type;
308 CSHORT Size;
309 KEVENT LowEvent;
310 KEVENT HighEvent;
311 } KEVENT_PAIR, *PKEVENT_PAIR;
312
313 typedef struct _KEXECUTE_OPTIONS
314 {
315 UCHAR ExecuteDisable:1;
316 UCHAR ExecuteEnable:1;
317 UCHAR DisableThunkEmulation:1;
318 UCHAR Permanent:1;
319 UCHAR ExecuteDispatchEnable:1;
320 UCHAR ImageDispatchEnable:1;
321 UCHAR Spare:2;
322 } KEXECUTE_OPTIONS, *PKEXECUTE_OPTIONS;
323
324 typedef enum _KOBJECTS
325 {
326 EventNotificationObject = 0,
327 EventSynchronizationObject = 1,
328 MutantObject = 2,
329 ProcessObject = 3,
330 QueueObject = 4,
331 SemaphoreObject = 5,
332 ThreadObject = 6,
333 GateObject = 7,
334 TimerNotificationObject = 8,
335 TimerSynchronizationObject = 9,
336 Spare2Object = 10,
337 Spare3Object = 11,
338 Spare4Object = 12,
339 Spare5Object = 13,
340 Spare6Object = 14,
341 Spare7Object = 15,
342 Spare8Object = 16,
343 Spare9Object = 17,
344 ApcObject = 18,
345 DpcObject = 19,
346 DeviceQueueObject = 20,
347 EventPairObject = 21,
348 InterruptObject = 22,
349 ProfileObject = 23,
350 ThreadedDpcObject = 24,
351 MaximumKernelObject = 25
352 } KOBJECTS;
353
354 #include <pshpack1.h>
355
356 typedef struct _KTHREAD
357 {
358 DISPATCHER_HEADER DispatcherHeader; /* 00 */
359 LIST_ENTRY MutantListHead; /* 10 */
360 PVOID InitialStack; /* 18 */
361 ULONG_PTR StackLimit; /* 1C */
362 PVOID KernelStack; /* 20 */
363 KSPIN_LOCK ThreadLock; /* 24 */
364 union /* 28 */
365 { /* 28 */
366 KAPC_STATE ApcState; /* 34 */
367 struct /* 28 */
368 { /* 28 */
369 UCHAR ApcStateFill[23]; /* 34 */
370 UCHAR ApcQueueable; /* 3F */
371 }; /* 3F */
372 }; /* 3F */
373 UCHAR NextProcessor; /* 40 */
374 UCHAR DeferredProcessor; /* 41 */
375 UCHAR AdjustReason; /* 42 */
376 UCHAR AdjustIncrement; /* 43 */
377 KSPIN_LOCK ApcQueueLock; /* 44 */
378 ULONG ContextSwitches; /* 48 */
379 UCHAR State; /* 4C */
380 UCHAR NpxState; /* 4D */
381 UCHAR WaitIrql; /* 4E */
382 UCHAR WaitMode; /* 4F */
383 LONG WaitStatus; /* 50 */
384 union /* 54 */
385 { /* 54 */
386 PKWAIT_BLOCK WaitBlockList; /* 54 */
387 PKGATE GateObject; /* 54 */
388 }; /* 54 */
389 UCHAR Alertable; /* 58 */
390 UCHAR WaitNext; /* 59 */
391 UCHAR WaitReason; /* 5A */
392 UCHAR Priority; /* 5B */
393 UCHAR EnableStackSwap; /* 5C */
394 UCHAR SwapBusy; /* 5D */
395 UCHAR Alerted[2]; /* 5E */
396 union /* 60 */
397 { /* 60 */
398 LIST_ENTRY WaitListEntry; /* 60 */
399 SINGLE_LIST_ENTRY SwapListEntry; /* 60 */
400 }; /* 68 */
401 PKQUEUE Queue; /* 68 */
402 ULONG WaitTime; /* 6C */
403 union /* 70 */
404 { /* 70 */
405 struct /* 70 */
406 { /* 70 */
407 USHORT KernelApcDisable; /* 70 */
408 USHORT SpecialApcDisable; /* 72 */
409 }; /* 70 */
410 ULONG CombinedApcDisable; /* 70 */
411 }; /* 74 */
412 struct _TEB *Teb; /* 74 */
413 union /* 78 */
414 { /* 78 */
415 KTIMER Timer; /* 78 */
416 UCHAR TimerFill[40]; /* 78 */
417 }; /* 78 */
418 union /* A0 */
419 { /* A0 */
420 struct /* A0 */
421 { /* A0 */
422 LONG AutoAlignment:1; /* A0 */
423 LONG DisableBoost:1; /* A0 */
424 LONG ReservedFlags:30; /* A0 */
425 }; /* A0 */
426 LONG ThreadFlags; /* A0 */
427 }; /* A0 */
428 PVOID Padding; /* A4 */
429 union /* A8 */
430 { /* A8 */
431 KWAIT_BLOCK WaitBlock[4]; /* A8 */
432 union /* A8 */
433 { /* A8 */
434 struct /* A8 */
435 { /* A8 */
436 UCHAR WaitBlockFill0[23]; /* A8 */
437 UCHAR SystemAffinityActive; /* BF */
438 }; /* A8 */
439 struct /* A8 */
440 { /* A8 */
441 UCHAR WaitBlockFill1[47]; /* A8 */
442 UCHAR PreviousMode; /* D7 */
443 }; /* A8 */
444 struct /* A8 */
445 { /* A8 */
446 UCHAR WaitBlockFill2[71]; /* A8 */
447 UCHAR ResourceIndex; /* EF */
448 }; /* A8 */
449 struct /* A8 */
450 { /* A8 */
451 UCHAR WaitBlockFill3[95]; /* A8 */
452 UCHAR LargeStack; /* 107 */
453 }; /* A8 */
454 }; /* A8 */
455 }; /* A8 */
456 LIST_ENTRY QueueListEntry; /* 108 */
457 PKTRAP_FRAME TrapFrame; /* 110 */
458 PVOID CallbackStack; /* 114 */
459 PVOID ServiceTable; /* 118 */
460 UCHAR ApcStateIndex; /* 11C */
461 UCHAR IdealProcessor; /* 11D */
462 UCHAR Preempted; /* 11E */
463 UCHAR ProcessReadyQueue; /* 11F */
464 UCHAR KernelStackResident; /* 120 */
465 CHAR BasePriority; /* 121 */
466 CHAR PriorityDecrement; /* 122 */
467 CHAR Saturation; /* 123 */
468 KAFFINITY UserAffinity; /* 124 */
469 struct _KPROCESS *Process; /* 128 */
470 KAFFINITY Affinity; /* 12C */
471 PKAPC_STATE ApcStatePointer[2]; /* 130 */
472 union /* 138 */
473 { /* 138 */
474 KAPC_STATE SavedApcState; /* 138 */
475 union /* 138 */
476 { /* 138 */
477 UCHAR SavedApcStateFill[23]; /* 138 */
478 CHAR FreezeCount; /* 14F */
479 }; /* 138 */
480 }; /* 138 */
481 CHAR SuspendCount; /* 150 */
482 UCHAR UserIdealProcessor; /* 151 */
483 UCHAR CalloutActive; /* 152 */
484 UCHAR Iopl; /* 153 */
485 PVOID Win32Thread; /* 154 */
486 PVOID StackBase; /* 158 */
487 union /* 15C */
488 { /* 15C */
489 KAPC SuspendApc; /* 15C */
490 union /* 15C */
491 { /* 15C */
492 UCHAR SuspendApcFill0[1]; /* 15C */
493 CHAR Quantum; /* 15D */
494 }; /* 15C */
495 union /* 15C */
496 { /* 15C */
497 UCHAR SuspendApcFill1[3]; /* 15C */
498 UCHAR QuantumReset; /* 15F */
499 }; /* 15C */
500 union /* 15C */
501 { /* 15C */
502 UCHAR SuspendApcFill2[4]; /* 15C */
503 ULONG KernelTime; /* 160 */
504 }; /* 15C */
505 union /* 15C */
506 { /* 15C */
507 UCHAR SuspendApcFill3[36]; /* 15C */
508 PVOID TlsArray; /* 180 */
509 }; /* 15C */
510 union /* 15C */
511 { /* 15C */
512 UCHAR SuspendApcFill4[40]; /* 15C */
513 PVOID LegoData; /* 184 */
514 }; /* 15C */
515 union /* 15C */
516 { /* 15C */
517 UCHAR SuspendApcFill5[47]; /* 15C */
518 UCHAR PowerState; /* 18B */
519 }; /* 15C */
520 }; /* 15C */
521 ULONG UserTime; /* 18C */
522 union /* 190 */
523 { /* 190 */
524 KSEMAPHORE SuspendSemaphore; /* 190 */
525 UCHAR SuspendSemaphorefill[20]; /* 190 */
526 }; /* 190 */
527 ULONG SListFaultCount; /* 1A4 */
528 LIST_ENTRY ThreadListEntry; /* 1A8 */
529 PVOID SListFaultAddress; /* 1B0 */
530 } KTHREAD; /* sizeof: 1B4 */
531
532 #include <poppack.h>
533
534 typedef struct _KPROCESS
535 {
536 DISPATCHER_HEADER Header; /* 000 */
537 LIST_ENTRY ProfileListHead; /* 010 */
538 PHYSICAL_ADDRESS DirectoryTableBase; /* 018 */
539 #if defined(_M_IX86)
540 KGDTENTRY LdtDescriptor; /* 020 */
541 KIDTENTRY Int21Descriptor; /* 028 */
542 USHORT IopmOffset; /* 030 */
543 UCHAR Iopl; /* 032 */
544 UCHAR Unused; /* 033 */
545 #endif
546 ULONG ActiveProcessors; /* 034 */
547 ULONG KernelTime; /* 038 */
548 ULONG UserTime; /* 03C */
549 LIST_ENTRY ReadyListHead; /* 040 */
550 LIST_ENTRY SwapListEntry; /* 048 */
551 PVOID VdmTrapcHandler; /* 04C */
552 LIST_ENTRY ThreadListHead; /* 050 */
553 KSPIN_LOCK ProcessLock; /* 058 */
554 KAFFINITY Affinity; /* 05C */
555 union
556 {
557 struct
558 {
559 ULONG AutoAlignment:1; /* 060.0 */
560 ULONG DisableBoost:1; /* 060.1 */
561 ULONG DisableQuantum:1; /* 060.2 */
562 ULONG ReservedFlags:29; /* 060.3 */
563 };
564 ULONG ProcessFlags; /* 060 */
565 };
566 CHAR BasePriority; /* 064 */
567 CHAR QuantumReset; /* 065 */
568 UCHAR State; /* 066 */
569 UCHAR ThreadSeed; /* 067 */
570 UCHAR PowerState; /* 068 */
571 UCHAR IdealNode; /* 069 */
572 UCHAR Visited; /* 06A */
573 KEXECUTE_OPTIONS Flags; /* 06B */
574 ULONG StackCount; /* 06C */
575 LIST_ENTRY ProcessListEntry; /* 070 */
576 } KPROCESS;
577
578 typedef struct _KSERVICE_TABLE_DESCRIPTOR
579 {
580 PULONG_PTR Base;
581 PULONG Count;
582 ULONG Limit;
583 #if defined(_IA64_)
584 LONG TableBaseGpOffset;
585 #endif
586 PUCHAR Number;
587 } KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;
588 #endif /* !NTOS_MODE_USER */
589
590 /* EXPORTED DATA *************************************************************/
591 #ifndef NTOS_MODE_USER
592 extern CHAR NTSYSAPI KeNumberProcessors;
593 extern LOADER_PARAMETER_BLOCK NTSYSAPI KeLoaderBlock;
594 extern ULONG NTSYSAPI KeDcacheFlushCount;
595 extern ULONG NTSYSAPI KeIcacheFlushCount;
596 extern KAFFINITY NTSYSAPI KeActiveProcessors;
597 extern ULONG NTSYSAPI KiDmaIoCoherency; /* RISC Architectures only */
598 extern ULONG NTSYSAPI KeMaximumIncrement;
599 extern ULONG NTSYSAPI KeMinimumIncrement;
600 extern ULONG NTSYSAPI NtBuildNumber;
601 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable[SSDT_MAX_ENTRIES];
602 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow[SSDT_MAX_ENTRIES];
603 #endif
604
605 #endif