Sync to trunk r38250
[reactos.git] / reactos / include / ndk / ketypes.h
1 /*++ NDK Version: 0098
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4
5 Header Name:
6
7 lpctypes.h
8
9 Abstract:
10
11 Type definitions for the Loader.
12
13 Author:
14
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
16
17 --*/
18
19 #ifndef _KETYPES_H
20 #define _KETYPES_H
21
22 //
23 // Dependencies
24 //
25 #include <umtypes.h>
26 #ifndef NTOS_MODE_USER
27 #include <haltypes.h>
28 #include <potypes.h>
29 #include <ifssupp.h>
30 #endif
31
32 //
33 // Context Record Flags
34 //
35 #define CONTEXT_DEBUGGER (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
36
37 //
38 // Maximum System Descriptor Table Entries
39 //
40 #define SSDT_MAX_ENTRIES 2
41
42 //
43 // Processor Architectures
44 //
45 #define PROCESSOR_ARCHITECTURE_INTEL 0
46
47 //
48 // Object Type Mask for Kernel Dispatcher Objects
49 //
50 #define KOBJECT_TYPE_MASK 0x7F
51 #define KOBJECT_LOCK_BIT 0x80
52
53 //
54 // Dispatcher Priority increments
55 //
56 #define THREAD_ALERT_INCREMENT 2
57
58 //
59 // Physical memory offset of KUSER_SHARED_DATA
60 //
61 #define KI_USER_SHARED_DATA_PHYSICAL 0x41000
62
63 //
64 // Quantum values and decrements
65 //
66 #define MAX_QUANTUM 0x7F
67 #define WAIT_QUANTUM_DECREMENT 1
68 #define CLOCK_QUANTUM_DECREMENT 3
69
70 //
71 // Kernel Feature Bits
72 //
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
94
95 //
96 // Internal Exception Codes
97 //
98 #define KI_EXCEPTION_INTERNAL 0x10000000
99 #define KI_EXCEPTION_ACCESS_VIOLATION (KI_EXCEPTION_INTERNAL | 0x04)
100
101 //
102 // Number of dispatch codes supported by KINTERRUPT
103 //
104 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
105 #define KINTERRUPT_DISPATCH_CODES 135
106 #else
107 #define KINTERRUPT_DISPATCH_CODES 106
108 #endif
109
110 #ifdef NTOS_MODE_USER
111
112 //
113 // KPROCESSOR_MODE Type
114 //
115 typedef CCHAR KPROCESSOR_MODE;
116
117 //
118 // Dereferencable pointer to KUSER_SHARED_DATA in User-Mode
119 //
120 #define SharedUserData ((KUSER_SHARED_DATA *CONST)USER_SHARED_DATA)
121
122 //
123 // Maximum WOW64 Entries in KUSER_SHARED_DATA
124 //
125 #define MAX_WOW64_SHARED_ENTRIES 16
126
127 //
128 // Maximum Processor Features supported in KUSER_SHARED_DATA
129 //
130 #define PROCESSOR_FEATURE_MAX 64
131
132 //
133 // Event Types
134 //
135 typedef enum _EVENT_TYPE
136 {
137 NotificationEvent,
138 SynchronizationEvent
139 } EVENT_TYPE;
140
141 //
142 // Timer Types
143 //
144 typedef enum _TIMER_TYPE
145 {
146 NotificationTimer,
147 SynchronizationTimer
148 } TIMER_TYPE;
149
150 //
151 // Wait Types
152 //
153 typedef enum _WAIT_TYPE
154 {
155 WaitAll,
156 WaitAny
157 } WAIT_TYPE;
158
159 //
160 // Processor Execution Modes
161 //
162 typedef enum _MODE
163 {
164 KernelMode,
165 UserMode,
166 MaximumMode
167 } MODE;
168
169 //
170 // Wait Reasons
171 //
172 typedef enum _KWAIT_REASON
173 {
174 Executive,
175 FreePage,
176 PageIn,
177 PoolAllocation,
178 DelayExecution,
179 Suspended,
180 UserRequest,
181 WrExecutive,
182 WrFreePage,
183 WrPageIn,
184 WrPoolAllocation,
185 WrDelayExecution,
186 WrSuspended,
187 WrUserRequest,
188 WrEventPair,
189 WrQueue,
190 WrLpcReceive,
191 WrLpcReply,
192 WrVirtualMemory,
193 WrPageOut,
194 WrRendezvous,
195 Spare2,
196 WrGuardedMutex,
197 Spare4,
198 Spare5,
199 Spare6,
200 WrKernel,
201 WrResource,
202 WrPushLock,
203 WrMutex,
204 WrQuantumEnd,
205 WrDispatchInt,
206 WrPreempted,
207 WrYieldExecution,
208 MaximumWaitReason
209 } KWAIT_REASON;
210
211 //
212 // Profiling Sources
213 //
214 typedef enum _KPROFILE_SOURCE
215 {
216 ProfileTime,
217 ProfileAlignmentFixup,
218 ProfileTotalIssues,
219 ProfilePipelineDry,
220 ProfileLoadInstructions,
221 ProfilePipelineFrozen,
222 ProfileBranchInstructions,
223 ProfileTotalNonissues,
224 ProfileDcacheMisses,
225 ProfileIcacheMisses,
226 ProfileCacheMisses,
227 ProfileBranchMispredictions,
228 ProfileStoreInstructions,
229 ProfileFpInstructions,
230 ProfileIntegerInstructions,
231 Profile2Issue,
232 Profile3Issue,
233 Profile4Issue,
234 ProfileSpecialInstructions,
235 ProfileTotalCycles,
236 ProfileIcacheIssues,
237 ProfileDcacheAccesses,
238 ProfileMemoryBarrierCycles,
239 ProfileLoadLinkedIssues,
240 ProfileMaximum
241 } KPROFILE_SOURCE;
242
243 //
244 // NT Product and Architecture Types
245 //
246 typedef enum _NT_PRODUCT_TYPE
247 {
248 NtProductWinNt = 1,
249 NtProductLanManNt,
250 NtProductServer
251 } NT_PRODUCT_TYPE, *PNT_PRODUCT_TYPE;
252
253 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
254 {
255 StandardDesign,
256 NEC98x86,
257 EndAlternatives
258 } ALTERNATIVE_ARCHITECTURE_TYPE;
259
260 #endif
261
262 //
263 // Thread States
264 //
265 typedef enum _KTHREAD_STATE
266 {
267 Initialized,
268 Ready,
269 Running,
270 Standby,
271 Terminated,
272 Waiting,
273 Transition,
274 DeferredReady,
275 #if (NTDDI_VERSION >= NTDDI_WS03)
276 GateWait
277 #endif
278 } KTHREAD_STATE, *PKTHREAD_STATE;
279
280 //
281 // Kernel Object Types
282 //
283 typedef enum _KOBJECTS
284 {
285 EventNotificationObject = 0,
286 EventSynchronizationObject = 1,
287 MutantObject = 2,
288 ProcessObject = 3,
289 QueueObject = 4,
290 SemaphoreObject = 5,
291 ThreadObject = 6,
292 GateObject = 7,
293 TimerNotificationObject = 8,
294 TimerSynchronizationObject = 9,
295 Spare2Object = 10,
296 Spare3Object = 11,
297 Spare4Object = 12,
298 Spare5Object = 13,
299 Spare6Object = 14,
300 Spare7Object = 15,
301 Spare8Object = 16,
302 Spare9Object = 17,
303 ApcObject = 18,
304 DpcObject = 19,
305 DeviceQueueObject = 20,
306 EventPairObject = 21,
307 InterruptObject = 22,
308 ProfileObject = 23,
309 ThreadedDpcObject = 24,
310 MaximumKernelObject = 25
311 } KOBJECTS;
312
313 //
314 // Adjust reasons
315 //
316 typedef enum _ADJUST_REASON
317 {
318 AdjustNone = 0,
319 AdjustUnwait = 1,
320 AdjustBoost = 2
321 } ADJUST_REASON;
322
323 //
324 // Continue Status
325 //
326 typedef enum _KCONTINUE_STATUS
327 {
328 ContinueError = 0,
329 ContinueSuccess,
330 ContinueProcessorReselected,
331 ContinueNextProcessor
332 } KCONTINUE_STATUS;
333
334 //
335 // Process States
336 //
337 typedef enum _KPROCESS_STATE
338 {
339 ProcessInMemory,
340 ProcessOutOfMemory,
341 ProcessInTransition,
342 ProcessInSwap,
343 ProcessOutSwap,
344 } KPROCESS_STATE, *PKPROCESS_STATE;
345
346 //
347 // NtVdmControl Classes
348 //
349 typedef enum _VDMSERVICECLASS
350 {
351 VdmStartExecution = 0,
352 VdmQueueInterrupt = 1,
353 VdmDelayInterrupt = 2,
354 VdmInitialize = 3,
355 VdmFeatures = 4,
356 VdmSetInt21Handler = 5,
357 VdmQueryDir = 6,
358 VdmPrinterDirectIoOpen = 7,
359 VdmPrinterDirectIoClose = 8,
360 VdmPrinterInitialize = 9,
361 VdmSetLdtEntries = 10,
362 VdmSetProcessLdtInfo = 11,
363 VdmAdlibEmulation = 12,
364 VdmPMCliControl = 13,
365 VdmQueryVdmProcess = 14,
366 } VDMSERVICECLASS;
367
368 #ifdef NTOS_MODE_USER
369
370 //
371 // APC Normal Routine
372 //
373 typedef VOID
374 (NTAPI *PKNORMAL_ROUTINE)(
375 IN PVOID NormalContext,
376 IN PVOID SystemArgument1,
377 IN PVOID SystemArgument2
378 );
379
380 //
381 // Timer Routine
382 //
383 typedef VOID
384 (NTAPI *PTIMER_APC_ROUTINE)(
385 IN PVOID TimerContext,
386 IN ULONG TimerLowValue,
387 IN LONG TimerHighValue
388 );
389
390 //
391 // System Time Structure
392 //
393 typedef struct _KSYSTEM_TIME
394 {
395 ULONG LowPart;
396 LONG High1Time;
397 LONG High2Time;
398 } KSYSTEM_TIME, *PKSYSTEM_TIME;
399
400 //
401 // Shared Kernel User Data
402 //
403 typedef struct _KUSER_SHARED_DATA
404 {
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;
415 ULONG TimeZoneId;
416 ULONG LargePageMinimum;
417 ULONG Reserved2[7];
418 NT_PRODUCT_TYPE NtProductType;
419 BOOLEAN ProductTypeIsValid;
420 ULONG NtMajorVersion;
421 ULONG NtMinorVersion;
422 BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
423 ULONG Reserved1;
424 ULONG Reserved3;
425 volatile ULONG TimeSlip;
426 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
427 LARGE_INTEGER SystemExpirationDate;
428 ULONG SuiteMask;
429 BOOLEAN KdDebuggerEnabled;
430 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
431 UCHAR NXSupportPolicy;
432 #endif
433 volatile ULONG ActiveConsoleId;
434 volatile ULONG DismountCount;
435 ULONG ComPlusPackage;
436 ULONG LastSystemRITEventTickCount;
437 ULONG NumberOfPhysicalPages;
438 BOOLEAN SafeBootMode;
439 ULONG TraceLogging;
440 ULONG Fill0;
441 ULONGLONG TestRetInstruction;
442 ULONG SystemCall;
443 ULONG SystemCallReturn;
444 ULONGLONG SystemCallPad[3];
445 union {
446 volatile KSYSTEM_TIME TickCount;
447 volatile ULONG64 TickCountQuad;
448 };
449 ULONG Cookie;
450 #if (NTDDI_VERSION >= NTDDI_WS03)
451 LONGLONG ConsoleSessionForegroundProcessId;
452 ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
453 #endif
454 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
455 USHORT UserModeGlobalLogger[8];
456 ULONG HeapTracingPid[2];
457 ULONG CritSecTracingPid[2];
458 union
459 {
460 ULONG SharedDataFlags;
461 struct
462 {
463 ULONG DbgErrorPortPresent:1;
464 ULONG DbgElevationEnabled:1;
465 ULONG DbgVirtEnabled:1;
466 ULONG DbgInstallerDetectEnabled:1;
467 ULONG SpareBits:28;
468 };
469 };
470 ULONG ImageFileExecutionOptions;
471 KAFFINITY ActiveProcessorAffinity;
472 #endif
473 } KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
474
475 //
476 // VDM Structures
477 //
478 #include "pshpack1.h"
479 typedef struct _VdmVirtualIca
480 {
481 LONG ica_count[8];
482 LONG ica_int_line;
483 LONG ica_cpu_int;
484 USHORT ica_base;
485 USHORT ica_hipiri;
486 USHORT ica_mode;
487 UCHAR ica_master;
488 UCHAR ica_irr;
489 UCHAR ica_isr;
490 UCHAR ica_imr;
491 UCHAR ica_ssr;
492 } VDMVIRTUALICA, *PVDMVIRTUALICA;
493 #include "poppack.h"
494
495 typedef struct _VdmIcaUserData
496 {
497 PVOID pIcaLock;
498 PVDMVIRTUALICA pIcaMaster;
499 PVDMVIRTUALICA pIcaSlave;
500 PULONG pDelayIrq;
501 PULONG pUndelayIrq;
502 PULONG pDelayIret;
503 PULONG pIretHooked;
504 PULONG pAddrIretBopTable;
505 PHANDLE phWowIdleEvent;
506 PLARGE_INTEGER pIcaTimeout;
507 PHANDLE phMainThreadSuspended;
508 } VDMICAUSERDATA, *PVDMICAUSERDATA;
509
510 typedef struct _VDM_INITIALIZE_DATA
511 {
512 PVOID TrapcHandler;
513 PVDMICAUSERDATA IcaUserData;
514 } VDM_INITIALIZE_DATA, *PVDM_INITIALIZE_DATA;
515
516 #else
517
518 //
519 // System Thread Start Routine
520 //
521 typedef
522 VOID
523 (NTAPI *PKSYSTEM_ROUTINE)(
524 PKSTART_ROUTINE StartRoutine,
525 PVOID StartContext
526 );
527
528 //
529 // APC Environment Types
530 //
531 typedef enum _KAPC_ENVIRONMENT
532 {
533 OriginalApcEnvironment,
534 AttachedApcEnvironment,
535 CurrentApcEnvironment,
536 InsertApcEnvironment
537 } KAPC_ENVIRONMENT;
538
539 //
540 // CPU Cache Types
541 //
542 typedef enum _PROCESSOR_CACHE_TYPE
543 {
544 CacheUnified,
545 CacheInstruction,
546 CacheData,
547 CacheTrace,
548 } PROCESSOR_CACHE_TYPE;
549
550 //
551 // PRCB DPC Data
552 //
553 typedef struct _KDPC_DATA
554 {
555 LIST_ENTRY DpcListHead;
556 ULONG_PTR DpcLock;
557 volatile ULONG DpcQueueDepth;
558 ULONG DpcCount;
559 } KDPC_DATA, *PKDPC_DATA;
560
561 //
562 // Per-Processor Lookaside List
563 //
564 typedef struct _PP_LOOKASIDE_LIST
565 {
566 struct _GENERAL_LOOKASIDE *P;
567 struct _GENERAL_LOOKASIDE *L;
568 } PP_LOOKASIDE_LIST, *PPP_LOOKASIDE_LIST;
569
570 //
571 // CPU Cache Descriptor
572 //
573 typedef struct _CACHE_DESCRIPTOR
574 {
575 UCHAR Level;
576 UCHAR Associativity;
577 USHORT LineSize;
578 ULONG Size;
579 PROCESSOR_CACHE_TYPE Type;
580 } CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;
581
582 //
583 // Architectural Types
584 //
585 #include <arch/ketypes.h>
586
587 //
588 // Kernel Memory Node
589 //
590 #include <pshpack1.h>
591 typedef struct _KNODE
592 {
593 SLIST_HEADER DeadStackList;
594 SLIST_HEADER PfnDereferenceSListHead;
595 KAFFINITY ProcessorMask;
596 ULONG Color;
597 UCHAR Seed;
598 UCHAR NodeNumber;
599 ULONG Flags;
600 ULONG MmShiftedColor;
601 ULONG FreeCount[2];
602 struct _SINGLE_LIST_ENTRY *PfnDeferredList;
603 } KNODE, *PKNODE;
604 #include <poppack.h>
605
606 //
607 // Kernel Profile Object
608 //
609 typedef struct _KPROFILE
610 {
611 CSHORT Type;
612 CSHORT Size;
613 LIST_ENTRY ProfileListEntry;
614 struct _KPROCESS *Process;
615 PVOID RangeBase;
616 PVOID RangeLimit;
617 ULONG BucketShift;
618 PVOID Buffer;
619 PVOID Segment;
620 KAFFINITY Affinity;
621 KPROFILE_SOURCE Source;
622 BOOLEAN Started;
623 } KPROFILE, *PKPROFILE;
624
625 //
626 // Kernel Interrupt Object
627 //
628 typedef struct _KINTERRUPT
629 {
630 CSHORT Type;
631 CSHORT Size;
632 LIST_ENTRY InterruptListEntry;
633 PKSERVICE_ROUTINE ServiceRoutine;
634 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
635 PKSERVICE_ROUTINE MessageServiceRoutine;
636 ULONG MessageIndex;
637 #endif
638 PVOID ServiceContext;
639 KSPIN_LOCK SpinLock;
640 ULONG TickCount;
641 PKSPIN_LOCK ActualLock;
642 PKINTERRUPT_ROUTINE DispatchAddress;
643 ULONG Vector;
644 KIRQL Irql;
645 KIRQL SynchronizeIrql;
646 BOOLEAN FloatingSave;
647 BOOLEAN Connected;
648 CCHAR Number;
649 BOOLEAN ShareVector;
650 KINTERRUPT_MODE Mode;
651 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
652 KINTERRUPT_POLARITY Polarity;
653 #endif
654 ULONG ServiceCount;
655 ULONG DispatchCount;
656 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
657 ULONGLONG Rsvd1;
658 #endif
659 ULONG DispatchCode[KINTERRUPT_DISPATCH_CODES];
660 } KINTERRUPT;
661
662 //
663 // Kernel Event Pair Object
664 //
665 typedef struct _KEVENT_PAIR
666 {
667 CSHORT Type;
668 CSHORT Size;
669 KEVENT LowEvent;
670 KEVENT HighEvent;
671 } KEVENT_PAIR, *PKEVENT_PAIR;
672
673 //
674 // Kernel No Execute Options
675 //
676 typedef struct _KEXECUTE_OPTIONS
677 {
678 UCHAR ExecuteDisable:1;
679 UCHAR ExecuteEnable:1;
680 UCHAR DisableThunkEmulation:1;
681 UCHAR Permanent:1;
682 UCHAR ExecuteDispatchEnable:1;
683 UCHAR ImageDispatchEnable:1;
684 UCHAR Spare:2;
685 } KEXECUTE_OPTIONS, *PKEXECUTE_OPTIONS;
686
687 //
688 // Kernel Thread (KTHREAD)
689 //
690 typedef struct _KTHREAD
691 {
692 DISPATCHER_HEADER DispatcherHeader;
693 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
694 ULONGLONG CycleTime;
695 ULONG HighCycleTime;
696 ULONGLONG QuantumTarget;
697 #else
698 LIST_ENTRY MutantListHead;
699 #endif
700 PVOID InitialStack;
701 ULONG_PTR StackLimit;
702 PVOID KernelStack;
703 KSPIN_LOCK ThreadLock;
704 union
705 {
706 KAPC_STATE ApcState;
707 struct
708 {
709 UCHAR ApcStateFill[23];
710 UCHAR ApcQueueable;
711 volatile UCHAR NextProcessor;
712 volatile UCHAR DeferredProcessor;
713 UCHAR AdjustReason;
714 SCHAR AdjustIncrement;
715 };
716 };
717 KSPIN_LOCK ApcQueueLock;
718 ULONG ContextSwitches;
719 volatile UCHAR State;
720 UCHAR NpxState;
721 KIRQL WaitIrql;
722 KPROCESSOR_MODE WaitMode;
723 LONG_PTR WaitStatus;
724 union
725 {
726 PKWAIT_BLOCK WaitBlockList;
727 PKGATE GateObject;
728 };
729 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
730 union
731 {
732 struct
733 {
734 ULONG KernelStackResident:1;
735 ULONG ReadyTransition:1;
736 ULONG ProcessReadyQueue:1;
737 ULONG WaitNext:1;
738 ULONG SystemAffinityActive:1;
739 ULONG Alertable:1;
740 ULONG GdiFlushActive:1;
741 ULONG Reserved:25;
742 };
743 LONG MiscFlags;
744 };
745 #else
746 BOOLEAN Alertable;
747 BOOLEAN WaitNext;
748 #endif
749 UCHAR WaitReason;
750 SCHAR Priority;
751 BOOLEAN EnableStackSwap;
752 volatile UCHAR SwapBusy;
753 BOOLEAN Alerted[MaximumMode];
754 union
755 {
756 LIST_ENTRY WaitListEntry;
757 SINGLE_LIST_ENTRY SwapListEntry;
758 };
759 PKQUEUE Queue;
760 ULONG WaitTime;
761 union
762 {
763 struct
764 {
765 SHORT KernelApcDisable;
766 SHORT SpecialApcDisable;
767 };
768 ULONG CombinedApcDisable;
769 };
770 struct _TEB *Teb;
771 union
772 {
773 KTIMER Timer;
774 struct
775 {
776 UCHAR TimerFill[40];
777 union
778 {
779 struct
780 {
781 LONG AutoAlignment:1;
782 LONG DisableBoost:1;
783 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
784 LONG EtwStackTrace1ApcInserted:1;
785 LONG EtwStackTrace2ApcInserted:1;
786 LONG CycleChargePending:1;
787 LONG ReservedFlags:27;
788 #else
789 LONG ReservedFlags:30;
790 #endif
791 };
792 LONG ThreadFlags;
793 };
794 };
795 };
796 union
797 {
798 KWAIT_BLOCK WaitBlock[THREAD_WAIT_OBJECTS + 1];
799 struct
800 {
801 UCHAR WaitBlockFill0[23];
802 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
803 UCHAR IdealProcessor;
804 #else
805 BOOLEAN SystemAffinityActive;
806 #endif
807 };
808 struct
809 {
810 UCHAR WaitBlockFill1[47];
811 CCHAR PreviousMode;
812 };
813 struct
814 {
815 UCHAR WaitBlockFill2[71];
816 UCHAR ResourceIndex;
817 };
818 struct
819 {
820 UCHAR WaitBlockFill3[95];
821 UCHAR LargeStack;
822 };
823 };
824 LIST_ENTRY QueueListEntry;
825 PKTRAP_FRAME TrapFrame;
826 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
827 PVOID FirstArgument;
828 #endif
829 PVOID CallbackStack;
830 PVOID ServiceTable;
831 UCHAR ApcStateIndex;
832 #if (NTDDI_VERSION < NTDDI_LONGHORN)
833 UCHAR IdealProcessor;
834 #endif
835 BOOLEAN Preempted;
836 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
837 BOOLEAN CalloutActive;
838 #else
839 BOOLEAN ProcessReadyQueue;
840 BOOLEAN KernelStackResident;
841 #endif
842 SCHAR BasePriority;
843 SCHAR PriorityDecrement;
844 CHAR Saturation;
845 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
846 ULONG SystemCallNumber;
847 ULONG Spare2;
848 #endif
849 KAFFINITY UserAffinity;
850 struct _KPROCESS *Process;
851 KAFFINITY Affinity;
852 PKAPC_STATE ApcStatePointer[2];
853 union
854 {
855 KAPC_STATE SavedApcState;
856 struct
857 {
858 UCHAR SavedApcStateFill[23];
859 CCHAR FreezeCount;
860 CCHAR SuspendCount;
861 UCHAR UserIdealProcessor;
862 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
863 union
864 {
865 struct
866 {
867 UCHAR ReservedBits0:1;
868 UCHAR SegmentsPresent:1;
869 UCHAR Reservedbits1:1;
870 };
871 UCHAR NestedStateFlags;
872 };
873 #else
874 UCHAR CalloutActive;
875 #endif
876 UCHAR Iopl;
877 };
878 };
879 PVOID Win32Thread;
880 PVOID StackBase;
881 union
882 {
883 KAPC SuspendApc;
884 struct
885 {
886 UCHAR SuspendApcFill0[1];
887 SCHAR Quantum;
888 };
889 struct
890 {
891 UCHAR SuspendApcFill1[3];
892 UCHAR QuantumReset;
893 };
894 struct
895 {
896 UCHAR SuspendApcFill2[4];
897 ULONG KernelTime;
898 };
899 struct
900 {
901 UCHAR SuspendApcFill3[36];
902 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
903 PKPRCB WaitPrcb;
904 #else
905 PVOID TlsArray;
906 #endif
907 };
908 struct
909 {
910 UCHAR SuspendApcFill4[40];
911 PVOID LegoData;
912 };
913 struct
914 {
915 UCHAR SuspendApcFill5[47];
916 UCHAR PowerState;
917 ULONG UserTime;
918 };
919 };
920 union
921 {
922 KSEMAPHORE SuspendSemaphore;
923 struct
924 {
925 UCHAR SuspendSemaphorefill[20];
926 ULONG SListFaultCount;
927 };
928 };
929 LIST_ENTRY ThreadListEntry;
930 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
931 LIST_ENTRY MutantListHead;
932 #endif
933 PVOID SListFaultAddress;
934 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
935 PVOID MdlForLockedteb;
936 #endif
937 } KTHREAD;
938
939 #define ASSERT_THREAD(object) \
940 ASSERT((((object)->DispatcherHeader.Type & KOBJECT_TYPE_MASK) == ThreadObject))
941
942 //
943 // Kernel Process (KPROCESS)
944 //
945 typedef struct _KPROCESS
946 {
947 DISPATCHER_HEADER Header;
948 LIST_ENTRY ProfileListHead;
949 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
950 ULONG_PTR DirectoryTableBase;
951 ULONG_PTR Unused0;
952 #else
953 ULONG_PTR DirectoryTableBase[2];
954 #endif
955 #if defined(_M_IX86)
956 KGDTENTRY LdtDescriptor;
957 KIDTENTRY Int21Descriptor;
958 USHORT IopmOffset;
959 UCHAR Iopl;
960 UCHAR Unused;
961 #endif
962 volatile ULONG ActiveProcessors;
963 ULONG KernelTime;
964 ULONG UserTime;
965 LIST_ENTRY ReadyListHead;
966 SINGLE_LIST_ENTRY SwapListEntry;
967 PVOID VdmTrapcHandler;
968 LIST_ENTRY ThreadListHead;
969 KSPIN_LOCK ProcessLock;
970 KAFFINITY Affinity;
971 union
972 {
973 struct
974 {
975 LONG AutoAlignment:1;
976 LONG DisableBoost:1;
977 LONG DisableQuantum:1;
978 LONG ReservedFlags:29;
979 };
980 LONG ProcessFlags;
981 };
982 SCHAR BasePriority;
983 SCHAR QuantumReset;
984 UCHAR State;
985 UCHAR ThreadSeed;
986 UCHAR PowerState;
987 UCHAR IdealNode;
988 UCHAR Visited;
989 union
990 {
991 KEXECUTE_OPTIONS Flags;
992 UCHAR ExecuteOptions;
993 };
994 ULONG StackCount;
995 LIST_ENTRY ProcessListEntry;
996 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
997 ULONGLONG CycleTime;
998 #endif
999 } KPROCESS;
1000
1001 #define ASSERT_PROCESS(object) \
1002 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ProcessObject))
1003
1004 //
1005 // System Service Table Descriptor
1006 //
1007 typedef struct _KSERVICE_TABLE_DESCRIPTOR
1008 {
1009 PULONG_PTR Base;
1010 PULONG Count;
1011 ULONG Limit;
1012 #if defined(_IA64_)
1013 LONG TableBaseGpOffset;
1014 #endif
1015 PUCHAR Number;
1016 } KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;
1017
1018 //
1019 // Exported Loader Parameter Block
1020 //
1021 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI *KeLoaderBlock;
1022
1023 //
1024 // Exported Hardware Data
1025 //
1026 extern KAFFINITY NTSYSAPI KeActiveProcessors;
1027 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1028 extern volatile CCHAR NTSYSAPI KeNumberProcessors;
1029 #else
1030 #if (NTDDI_VERSION >= NTDDI_WINXP)
1031 extern CCHAR NTSYSAPI KeNumberProcessors;
1032 #else
1033 //extern PCCHAR KeNumberProcessors;
1034 extern NTSYSAPI CCHAR KeNumberProcessors; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
1035 #endif
1036 #endif
1037 extern ULONG NTSYSAPI KiDmaIoCoherency;
1038 extern ULONG NTSYSAPI KeMaximumIncrement;
1039 extern ULONG NTSYSAPI KeMinimumIncrement;
1040 extern ULONG NTSYSAPI KeDcacheFlushCount;
1041 extern ULONG NTSYSAPI KeIcacheFlushCount;
1042
1043 //
1044 // Exported System Service Descriptor Tables
1045 //
1046 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable[SSDT_MAX_ENTRIES];
1047 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow[SSDT_MAX_ENTRIES];
1048
1049 #endif // !NTOS_MODE_USER
1050
1051 #endif // _KETYPES_H