[NDK]
[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 // A system call ID is formatted as such:
34 // .________________________________________________________________.
35 // | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
36 // |--------------|-------------------------------------------------|
37 // | TABLE NUMBER | TABLE OFFSET |
38 // \----------------------------------------------------------------/
39 //
40 // The table number is then used as an index into the service descriptor table.
41 #define TABLE_NUMBER_BITS 1
42 #define TABLE_OFFSET_BITS 12
43
44 //
45 // There are 2 tables (kernel and shadow, used by Win32K)
46 //
47 #define NUMBER_SERVICE_TABLES 2
48 #define NTOS_SERVICE_INDEX 0
49 #define WIN32K_SERVICE_INDEX 1
50
51 //
52 // NB. From assembly code, the table number must be computed as an offset into
53 // the service descriptor table.
54 //
55 // Each entry into the table is 16 bytes long on 32-bit architectures, and
56 // 32 bytes long on 64-bit architectures.
57 //
58 // Thus, Table Number 1 is offset 16 (0x10) on x86, and offset 32 (0x20) on
59 // x64.
60 //
61 #ifdef _WIN64
62 #define BITS_PER_ENTRY 5 // (1 << 5) = 32 bytes
63 #else
64 #define BITS_PER_ENTRY 4 // (1 << 4) = 16 bytes
65 #endif
66
67 //
68 // We want the table number, but leave some extra bits to we can have the offset
69 // into the descriptor table.
70 //
71 #define SERVICE_TABLE_SHIFT (12 - BITS_PER_ENTRY)
72
73 //
74 // Now the table number (as an offset) is corrupted with part of the table offset
75 // This mask will remove the extra unwanted bits, and give us the offset into the
76 // descriptor table proper.
77 //
78 #define SERVICE_TABLE_MASK (((1 << TABLE_NUMBER_BITS) - 1) << BITS_PER_ENTRY)
79
80 //
81 // To get the table offset (ie: the service call number), just keep the 12 bits
82 //
83 #define SERVICE_NUMBER_MASK ((1 << TABLE_OFFSET_BITS) - 1)
84
85 //
86 // We'll often need to check if this is a graphics call. This is done by comparing
87 // the table number offset with the known Win32K table number offset.
88 // This is usually index 1, so table number offset 0x10 (x86) or 0x20 (x64)
89 //
90 #define SERVICE_TABLE_TEST (WIN32K_SERVICE_INDEX << BITS_PER_ENTRY)
91
92 //
93 // Context Record Flags
94 //
95 #define CONTEXT_DEBUGGER (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
96
97 //
98 // Maximum System Descriptor Table Entries
99 //
100 #define SSDT_MAX_ENTRIES 2
101
102 //
103 // Processor Architectures
104 //
105 #define PROCESSOR_ARCHITECTURE_INTEL 0
106 #define PROCESSOR_ARCHITECTURE_MIPS 1
107 #define PROCESSOR_ARCHITECTURE_ALPHA 2
108 #define PROCESSOR_ARCHITECTURE_PPC 3
109 #define PROCESSOR_ARCHITECTURE_SHX 4
110 #define PROCESSOR_ARCHITECTURE_ARM 5
111 #define PROCESSOR_ARCHITECTURE_IA64 6
112 #define PROCESSOR_ARCHITECTURE_ALPHA64 7
113 #define PROCESSOR_ARCHITECTURE_MSIL 8
114 #define PROCESSOR_ARCHITECTURE_AMD64 9
115 #define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
116
117 //
118 // Object Type Mask for Kernel Dispatcher Objects
119 //
120 #define KOBJECT_TYPE_MASK 0x7F
121 #define KOBJECT_LOCK_BIT 0x80
122
123 //
124 // Dispatcher Priority increments
125 //
126 #define THREAD_ALERT_INCREMENT 2
127
128 //
129 // Physical memory offset of KUSER_SHARED_DATA
130 //
131 #define KI_USER_SHARED_DATA_PHYSICAL 0x41000
132
133 //
134 // Quantum values and decrements
135 //
136 #define MAX_QUANTUM 0x7F
137 #define WAIT_QUANTUM_DECREMENT 1
138 #define CLOCK_QUANTUM_DECREMENT 3
139
140 //
141 // Kernel Feature Bits
142 //
143 #define KF_V86_VIS 0x00000001
144 #define KF_RDTSC 0x00000002
145 #define KF_CR4 0x00000004
146 #define KF_CMOV 0x00000008
147 #define KF_GLOBAL_PAGE 0x00000010
148 #define KF_LARGE_PAGE 0x00000020
149 #define KF_MTRR 0x00000040
150 #define KF_CMPXCHG8B 0x00000080
151 #define KF_MMX 0x00000100
152 #define KF_WORKING_PTE 0x00000200
153 #define KF_PAT 0x00000400
154 #define KF_FXSR 0x00000800
155 #define KF_FAST_SYSCALL 0x00001000
156 #define KF_XMMI 0x00002000
157 #define KF_3DNOW 0x00004000
158 #define KF_AMDK6MTRR 0x00008000
159 #define KF_XMMI64 0x00010000
160 #define KF_DTS 0x00020000
161 #define KF_BRANCH 0x00020000 // from ksamd64.inc
162 #define KF_SSE3 0x00080000
163 #define KF_CMPXCHG16B 0x00100000
164 #define KF_XSTATE 0x00800000 // from ks386.inc, ksamd64.inc
165 #define KF_NX_BIT 0x20000000
166 #define KF_NX_DISABLED 0x40000000
167 #define KF_NX_ENABLED 0x80000000
168
169 #define KF_XSAVEOPT_BIT 15
170 #define KF_XSTATE_BIT 23
171 #define KF_RDWRFSGSBASE_BIT 28
172
173 //
174 // Internal Exception Codes
175 //
176 #define KI_EXCEPTION_INTERNAL 0x10000000
177 #define KI_EXCEPTION_ACCESS_VIOLATION (KI_EXCEPTION_INTERNAL | 0x04)
178
179 typedef struct _FIBER /* Field offsets: */
180 { /* i386 arm x64 */
181 PVOID FiberData; /* 0x000 0x000 0x000 */
182 struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;/* 0x004 0x004 0x008 */
183 PVOID StackBase; /* 0x008 0x008 0x010 */
184 PVOID StackLimit; /* 0x00C 0x00C 0x018 */
185 PVOID DeallocationStack; /* 0x010 0x010 0x020 */
186 CONTEXT FiberContext; /* 0x014 0x018 0x030 */
187 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
188 PVOID Wx86Tib; /* 0x2E0 0x1b8 0x500 */
189 struct _ACTIVATION_CONTEXT_STACK *ActivationContextStackPointer; /* 0x2E4 0x1bc 0x508 */
190 PVOID FlsData; /* 0x2E8 0x1c0 0x510 */
191 ULONG GuaranteedStackBytes; /* 0x2EC 0x1c4 0x518 */
192 ULONG TebFlags; /* 0x2F0 0x1c8 0x51C */
193 #else
194 ULONG GuaranteedStackBytes; /* 0x2E0 */
195 PVOID FlsData; /* 0x2E4 */
196 struct _ACTIVATION_CONTEXT_STACK *ActivationContextStackPointer;
197 #endif
198 } FIBER, *PFIBER;
199
200 #ifndef NTOS_MODE_USER
201 //
202 // Number of dispatch codes supported by KINTERRUPT
203 //
204 #ifdef _M_AMD64
205 #define DISPATCH_LENGTH 4
206 #elif (NTDDI_VERSION >= NTDDI_LONGHORN)
207 #define DISPATCH_LENGTH 135
208 #else
209 #define DISPATCH_LENGTH 106
210 #endif
211
212 #else
213
214 //
215 // KPROCESSOR_MODE Type
216 //
217 typedef CCHAR KPROCESSOR_MODE;
218
219 //
220 // Dereferencable pointer to KUSER_SHARED_DATA in User-Mode
221 //
222 #define SharedUserData ((KUSER_SHARED_DATA *)USER_SHARED_DATA)
223
224 //
225 // Maximum WOW64 Entries in KUSER_SHARED_DATA
226 //
227 #define MAX_WOW64_SHARED_ENTRIES 16
228
229 //
230 // Maximum Processor Features supported in KUSER_SHARED_DATA
231 //
232 #define PROCESSOR_FEATURE_MAX 64
233
234 //
235 // Event Types
236 //
237 typedef enum _EVENT_TYPE
238 {
239 NotificationEvent,
240 SynchronizationEvent
241 } EVENT_TYPE;
242
243 //
244 // Timer Types
245 //
246 typedef enum _TIMER_TYPE
247 {
248 NotificationTimer,
249 SynchronizationTimer
250 } TIMER_TYPE;
251
252 //
253 // Wait Types
254 //
255 typedef enum _WAIT_TYPE
256 {
257 WaitAll,
258 WaitAny
259 } WAIT_TYPE;
260
261 //
262 // Processor Execution Modes
263 //
264 typedef enum _MODE
265 {
266 KernelMode,
267 UserMode,
268 MaximumMode
269 } MODE;
270
271 //
272 // Wait Reasons
273 //
274 typedef enum _KWAIT_REASON
275 {
276 Executive,
277 FreePage,
278 PageIn,
279 PoolAllocation,
280 DelayExecution,
281 Suspended,
282 UserRequest,
283 WrExecutive,
284 WrFreePage,
285 WrPageIn,
286 WrPoolAllocation,
287 WrDelayExecution,
288 WrSuspended,
289 WrUserRequest,
290 WrEventPair,
291 WrQueue,
292 WrLpcReceive,
293 WrLpcReply,
294 WrVirtualMemory,
295 WrPageOut,
296 WrRendezvous,
297 Spare2,
298 WrGuardedMutex,
299 Spare4,
300 Spare5,
301 Spare6,
302 WrKernel,
303 WrResource,
304 WrPushLock,
305 WrMutex,
306 WrQuantumEnd,
307 WrDispatchInt,
308 WrPreempted,
309 WrYieldExecution,
310 MaximumWaitReason
311 } KWAIT_REASON;
312
313 //
314 // Profiling Sources
315 //
316 typedef enum _KPROFILE_SOURCE
317 {
318 ProfileTime,
319 ProfileAlignmentFixup,
320 ProfileTotalIssues,
321 ProfilePipelineDry,
322 ProfileLoadInstructions,
323 ProfilePipelineFrozen,
324 ProfileBranchInstructions,
325 ProfileTotalNonissues,
326 ProfileDcacheMisses,
327 ProfileIcacheMisses,
328 ProfileCacheMisses,
329 ProfileBranchMispredictions,
330 ProfileStoreInstructions,
331 ProfileFpInstructions,
332 ProfileIntegerInstructions,
333 Profile2Issue,
334 Profile3Issue,
335 Profile4Issue,
336 ProfileSpecialInstructions,
337 ProfileTotalCycles,
338 ProfileIcacheIssues,
339 ProfileDcacheAccesses,
340 ProfileMemoryBarrierCycles,
341 ProfileLoadLinkedIssues,
342 ProfileMaximum
343 } KPROFILE_SOURCE;
344
345 //
346 // NT Product and Architecture Types
347 //
348 typedef enum _NT_PRODUCT_TYPE
349 {
350 NtProductWinNt = 1,
351 NtProductLanManNt,
352 NtProductServer
353 } NT_PRODUCT_TYPE, *PNT_PRODUCT_TYPE;
354
355 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
356 {
357 StandardDesign,
358 NEC98x86,
359 EndAlternatives
360 } ALTERNATIVE_ARCHITECTURE_TYPE;
361
362 #endif
363
364 //
365 // Thread States
366 //
367 typedef enum _KTHREAD_STATE
368 {
369 Initialized,
370 Ready,
371 Running,
372 Standby,
373 Terminated,
374 Waiting,
375 Transition,
376 DeferredReady,
377 #if (NTDDI_VERSION >= NTDDI_WS03)
378 GateWait
379 #endif
380 } KTHREAD_STATE, *PKTHREAD_STATE;
381
382 //
383 // Kernel Object Types
384 //
385 typedef enum _KOBJECTS
386 {
387 EventNotificationObject = 0,
388 EventSynchronizationObject = 1,
389 MutantObject = 2,
390 ProcessObject = 3,
391 QueueObject = 4,
392 SemaphoreObject = 5,
393 ThreadObject = 6,
394 GateObject = 7,
395 TimerNotificationObject = 8,
396 TimerSynchronizationObject = 9,
397 Spare2Object = 10,
398 Spare3Object = 11,
399 Spare4Object = 12,
400 Spare5Object = 13,
401 Spare6Object = 14,
402 Spare7Object = 15,
403 Spare8Object = 16,
404 Spare9Object = 17,
405 ApcObject = 18,
406 DpcObject = 19,
407 DeviceQueueObject = 20,
408 EventPairObject = 21,
409 InterruptObject = 22,
410 ProfileObject = 23,
411 ThreadedDpcObject = 24,
412 MaximumKernelObject = 25
413 } KOBJECTS;
414
415 //
416 // Adjust reasons
417 //
418 typedef enum _ADJUST_REASON
419 {
420 AdjustNone = 0,
421 AdjustUnwait = 1,
422 AdjustBoost = 2
423 } ADJUST_REASON;
424
425 //
426 // Continue Status
427 //
428 typedef enum _KCONTINUE_STATUS
429 {
430 ContinueError = 0,
431 ContinueSuccess,
432 ContinueProcessorReselected,
433 ContinueNextProcessor
434 } KCONTINUE_STATUS;
435
436 //
437 // Process States
438 //
439 typedef enum _KPROCESS_STATE
440 {
441 ProcessInMemory,
442 ProcessOutOfMemory,
443 ProcessInTransition,
444 ProcessInSwap,
445 ProcessOutSwap,
446 } KPROCESS_STATE, *PKPROCESS_STATE;
447
448 //
449 // NtVdmControl Classes
450 //
451 typedef enum _VDMSERVICECLASS
452 {
453 VdmStartExecution = 0,
454 VdmQueueInterrupt = 1,
455 VdmDelayInterrupt = 2,
456 VdmInitialize = 3,
457 VdmFeatures = 4,
458 VdmSetInt21Handler = 5,
459 VdmQueryDir = 6,
460 VdmPrinterDirectIoOpen = 7,
461 VdmPrinterDirectIoClose = 8,
462 VdmPrinterInitialize = 9,
463 VdmSetLdtEntries = 10,
464 VdmSetProcessLdtInfo = 11,
465 VdmAdlibEmulation = 12,
466 VdmPMCliControl = 13,
467 VdmQueryVdmProcess = 14,
468 } VDMSERVICECLASS;
469
470 #ifdef NTOS_MODE_USER
471
472 //
473 // APC Normal Routine
474 //
475 typedef VOID
476 (NTAPI *PKNORMAL_ROUTINE)(
477 _In_ PVOID NormalContext,
478 _In_ PVOID SystemArgument1,
479 _In_ PVOID SystemArgument2
480 );
481
482 //
483 // Timer Routine
484 //
485 typedef VOID
486 (NTAPI *PTIMER_APC_ROUTINE)(
487 _In_ PVOID TimerContext,
488 _In_ ULONG TimerLowValue,
489 _In_ LONG TimerHighValue
490 );
491
492 //
493 // System Time Structure
494 //
495 typedef struct _KSYSTEM_TIME
496 {
497 ULONG LowPart;
498 LONG High1Time;
499 LONG High2Time;
500 } KSYSTEM_TIME, *PKSYSTEM_TIME;
501
502 //
503 // Shared Kernel User Data
504 //
505 typedef struct _KUSER_SHARED_DATA
506 {
507 ULONG TickCountLowDeprecated;
508 ULONG TickCountMultiplier;
509 volatile KSYSTEM_TIME InterruptTime;
510 volatile KSYSTEM_TIME SystemTime;
511 volatile KSYSTEM_TIME TimeZoneBias;
512 USHORT ImageNumberLow;
513 USHORT ImageNumberHigh;
514 WCHAR NtSystemRoot[260];
515 ULONG MaxStackTraceDepth;
516 ULONG CryptoExponent;
517 ULONG TimeZoneId;
518 ULONG LargePageMinimum;
519 ULONG Reserved2[7];
520 NT_PRODUCT_TYPE NtProductType;
521 BOOLEAN ProductTypeIsValid;
522 ULONG NtMajorVersion;
523 ULONG NtMinorVersion;
524 BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
525 ULONG Reserved1;
526 ULONG Reserved3;
527 volatile ULONG TimeSlip;
528 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
529 LARGE_INTEGER SystemExpirationDate;
530 ULONG SuiteMask;
531 BOOLEAN KdDebuggerEnabled;
532 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
533 UCHAR NXSupportPolicy;
534 #endif
535 volatile ULONG ActiveConsoleId;
536 volatile ULONG DismountCount;
537 ULONG ComPlusPackage;
538 ULONG LastSystemRITEventTickCount;
539 ULONG NumberOfPhysicalPages;
540 BOOLEAN SafeBootMode;
541 ULONG TraceLogging;
542 ULONG Fill0;
543 ULONGLONG TestRetInstruction;
544 ULONG SystemCall;
545 ULONG SystemCallReturn;
546 ULONGLONG SystemCallPad[3];
547 union {
548 volatile KSYSTEM_TIME TickCount;
549 volatile ULONG64 TickCountQuad;
550 };
551 ULONG Cookie;
552 #if (NTDDI_VERSION >= NTDDI_WS03)
553 LONGLONG ConsoleSessionForegroundProcessId;
554 ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
555 #endif
556 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
557 USHORT UserModeGlobalLogger[8];
558 ULONG HeapTracingPid[2];
559 ULONG CritSecTracingPid[2];
560 union
561 {
562 ULONG SharedDataFlags;
563 struct
564 {
565 ULONG DbgErrorPortPresent:1;
566 ULONG DbgElevationEnabled:1;
567 ULONG DbgVirtEnabled:1;
568 ULONG DbgInstallerDetectEnabled:1;
569 ULONG SpareBits:28;
570 };
571 };
572 ULONG ImageFileExecutionOptions;
573 KAFFINITY ActiveProcessorAffinity;
574 #endif
575 } KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
576
577 //
578 // VDM Structures
579 //
580 #include "pshpack1.h"
581 typedef struct _VdmVirtualIca
582 {
583 LONG ica_count[8];
584 LONG ica_int_line;
585 LONG ica_cpu_int;
586 USHORT ica_base;
587 USHORT ica_hipiri;
588 USHORT ica_mode;
589 UCHAR ica_master;
590 UCHAR ica_irr;
591 UCHAR ica_isr;
592 UCHAR ica_imr;
593 UCHAR ica_ssr;
594 } VDMVIRTUALICA, *PVDMVIRTUALICA;
595 #include "poppack.h"
596
597 typedef struct _VdmIcaUserData
598 {
599 PVOID pIcaLock;
600 PVDMVIRTUALICA pIcaMaster;
601 PVDMVIRTUALICA pIcaSlave;
602 PULONG pDelayIrq;
603 PULONG pUndelayIrq;
604 PULONG pDelayIret;
605 PULONG pIretHooked;
606 PULONG pAddrIretBopTable;
607 PHANDLE phWowIdleEvent;
608 PLARGE_INTEGER pIcaTimeout;
609 PHANDLE phMainThreadSuspended;
610 } VDMICAUSERDATA, *PVDMICAUSERDATA;
611
612 typedef struct _VDM_INITIALIZE_DATA
613 {
614 PVOID TrapcHandler;
615 PVDMICAUSERDATA IcaUserData;
616 } VDM_INITIALIZE_DATA, *PVDM_INITIALIZE_DATA;
617
618 #else
619
620 //
621 // System Thread Start Routine
622 //
623 typedef
624 VOID
625 (NTAPI *PKSYSTEM_ROUTINE)(
626 PKSTART_ROUTINE StartRoutine,
627 PVOID StartContext
628 );
629
630 #ifndef _NTSYSTEM_
631 typedef VOID
632 (NTAPI *PKNORMAL_ROUTINE)(
633 IN PVOID NormalContext OPTIONAL,
634 IN PVOID SystemArgument1 OPTIONAL,
635 IN PVOID SystemArgument2 OPTIONAL);
636
637 typedef VOID
638 (NTAPI *PKRUNDOWN_ROUTINE)(
639 IN struct _KAPC *Apc);
640
641 typedef VOID
642 (NTAPI *PKKERNEL_ROUTINE)(
643 IN struct _KAPC *Apc,
644 IN OUT PKNORMAL_ROUTINE *NormalRoutine OPTIONAL,
645 IN OUT PVOID *NormalContext OPTIONAL,
646 IN OUT PVOID *SystemArgument1 OPTIONAL,
647 IN OUT PVOID *SystemArgument2 OPTIONAL);
648 #endif
649
650 //
651 // APC Environment Types
652 //
653 typedef enum _KAPC_ENVIRONMENT
654 {
655 OriginalApcEnvironment,
656 AttachedApcEnvironment,
657 CurrentApcEnvironment,
658 InsertApcEnvironment
659 } KAPC_ENVIRONMENT;
660
661 typedef struct _KTIMER_TABLE_ENTRY
662 {
663 #if (NTDDI_VERSION >= NTDDI_LONGHORN) || defined(_M_ARM) || defined(_M_AMD64)
664 KSPIN_LOCK Lock;
665 #endif
666 LIST_ENTRY Entry;
667 ULARGE_INTEGER Time;
668 } KTIMER_TABLE_ENTRY, *PKTIMER_TABLE_ENTRY;
669
670 typedef struct _KTIMER_TABLE
671 {
672 PKTIMER TimerExpiry[64];
673 KTIMER_TABLE_ENTRY TimerEntries[256];
674 } KTIMER_TABLE, *PKTIMER_TABLE;
675
676 typedef struct _KDPC_LIST
677 {
678 SINGLE_LIST_ENTRY ListHead;
679 SINGLE_LIST_ENTRY* LastEntry;
680 } KDPC_LIST, *PKDPC_LIST;
681
682 typedef struct _SYNCH_COUNTERS
683 {
684 ULONG SpinLockAcquireCount;
685 ULONG SpinLockContentionCount;
686 ULONG SpinLockSpinCount;
687 ULONG IpiSendRequestBroadcastCount;
688 ULONG IpiSendRequestRoutineCount;
689 ULONG IpiSendSoftwareInterruptCount;
690 ULONG ExInitializeResourceCount;
691 ULONG ExReInitializeResourceCount;
692 ULONG ExDeleteResourceCount;
693 ULONG ExecutiveResourceAcquiresCount;
694 ULONG ExecutiveResourceContentionsCount;
695 ULONG ExecutiveResourceReleaseExclusiveCount;
696 ULONG ExecutiveResourceReleaseSharedCount;
697 ULONG ExecutiveResourceConvertsCount;
698 ULONG ExAcqResExclusiveAttempts;
699 ULONG ExAcqResExclusiveAcquiresExclusive;
700 ULONG ExAcqResExclusiveAcquiresExclusiveRecursive;
701 ULONG ExAcqResExclusiveWaits;
702 ULONG ExAcqResExclusiveNotAcquires;
703 ULONG ExAcqResSharedAttempts;
704 ULONG ExAcqResSharedAcquiresExclusive;
705 ULONG ExAcqResSharedAcquiresShared;
706 ULONG ExAcqResSharedAcquiresSharedRecursive;
707 ULONG ExAcqResSharedWaits;
708 ULONG ExAcqResSharedNotAcquires;
709 ULONG ExAcqResSharedStarveExclusiveAttempts;
710 ULONG ExAcqResSharedStarveExclusiveAcquiresExclusive;
711 ULONG ExAcqResSharedStarveExclusiveAcquiresShared;
712 ULONG ExAcqResSharedStarveExclusiveAcquiresSharedRecursive;
713 ULONG ExAcqResSharedStarveExclusiveWaits;
714 ULONG ExAcqResSharedStarveExclusiveNotAcquires;
715 ULONG ExAcqResSharedWaitForExclusiveAttempts;
716 ULONG ExAcqResSharedWaitForExclusiveAcquiresExclusive;
717 ULONG ExAcqResSharedWaitForExclusiveAcquiresShared;
718 ULONG ExAcqResSharedWaitForExclusiveAcquiresSharedRecursive;
719 ULONG ExAcqResSharedWaitForExclusiveWaits;
720 ULONG ExAcqResSharedWaitForExclusiveNotAcquires;
721 ULONG ExSetResOwnerPointerExclusive;
722 ULONG ExSetResOwnerPointerSharedNew;
723 ULONG ExSetResOwnerPointerSharedOld;
724 ULONG ExTryToAcqExclusiveAttempts;
725 ULONG ExTryToAcqExclusiveAcquires;
726 ULONG ExBoostExclusiveOwner;
727 ULONG ExBoostSharedOwners;
728 ULONG ExEtwSynchTrackingNotificationsCount;
729 ULONG ExEtwSynchTrackingNotificationsAccountedCount;
730 } SYNCH_COUNTERS, *PSYNCH_COUNTERS;
731
732 //
733 // PRCB DPC Data
734 //
735 typedef struct _KDPC_DATA
736 {
737 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
738 KDPC_LIST DpcList;
739 #else
740 LIST_ENTRY DpcListHead;
741 #endif
742 ULONG_PTR DpcLock;
743 #if defined(_M_AMD64) || defined(_M_ARM)
744 volatile LONG DpcQueueDepth;
745 #else
746 volatile ULONG DpcQueueDepth;
747 #endif
748 ULONG DpcCount;
749 #if (NTDDI_VERSION >= NTDDI_LONGHORN) || defined(_M_ARM)
750 PKDPC ActiveDpc;
751 #endif
752 } KDPC_DATA, *PKDPC_DATA;
753
754 //
755 // Per-Processor Lookaside List
756 //
757 typedef struct _PP_LOOKASIDE_LIST
758 {
759 struct _GENERAL_LOOKASIDE *P;
760 struct _GENERAL_LOOKASIDE *L;
761 } PP_LOOKASIDE_LIST, *PPP_LOOKASIDE_LIST;
762
763 //
764 // Architectural Types
765 //
766 #include <arch/ketypes.h>
767
768 //
769 // Kernel Memory Node
770 //
771 #include <pshpack1.h>
772 typedef struct _KNODE
773 {
774 SLIST_HEADER DeadStackList;
775 SLIST_HEADER PfnDereferenceSListHead;
776 KAFFINITY ProcessorMask;
777 UCHAR Color;
778 UCHAR Seed;
779 UCHAR NodeNumber;
780 struct _flags {
781 UCHAR Removable : 1;
782 UCHAR Fill : 7;
783 } Flags;
784 ULONG MmShiftedColor;
785 ULONG FreeCount[2];
786 struct _SINGLE_LIST_ENTRY *PfnDeferredList;
787 } KNODE, *PKNODE;
788 #include <poppack.h>
789
790 //
791 // Structure for Get/SetContext APC
792 //
793 typedef struct _GETSETCONTEXT
794 {
795 KAPC Apc;
796 KEVENT Event;
797 KPROCESSOR_MODE Mode;
798 CONTEXT Context;
799 } GETSETCONTEXT, *PGETSETCONTEXT;
800
801 //
802 // Kernel Profile Object
803 //
804 typedef struct _KPROFILE
805 {
806 CSHORT Type;
807 CSHORT Size;
808 LIST_ENTRY ProfileListEntry;
809 struct _KPROCESS *Process;
810 PVOID RangeBase;
811 PVOID RangeLimit;
812 ULONG BucketShift;
813 PVOID Buffer;
814 ULONG_PTR Segment;
815 KAFFINITY Affinity;
816 KPROFILE_SOURCE Source;
817 BOOLEAN Started;
818 } KPROFILE, *PKPROFILE;
819
820 //
821 // Kernel Interrupt Object
822 //
823 typedef struct _KINTERRUPT
824 {
825 CSHORT Type;
826 CSHORT Size;
827 LIST_ENTRY InterruptListEntry;
828 PKSERVICE_ROUTINE ServiceRoutine;
829 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
830 PKSERVICE_ROUTINE MessageServiceRoutine;
831 ULONG MessageIndex;
832 #endif
833 PVOID ServiceContext;
834 KSPIN_LOCK SpinLock;
835 ULONG TickCount;
836 PKSPIN_LOCK ActualLock;
837 PKINTERRUPT_ROUTINE DispatchAddress;
838 ULONG Vector;
839 KIRQL Irql;
840 KIRQL SynchronizeIrql;
841 BOOLEAN FloatingSave;
842 BOOLEAN Connected;
843 CCHAR Number;
844 BOOLEAN ShareVector;
845 KINTERRUPT_MODE Mode;
846 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
847 KINTERRUPT_POLARITY Polarity;
848 #endif
849 ULONG ServiceCount;
850 ULONG DispatchCount;
851 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
852 ULONGLONG Rsvd1;
853 #endif
854 #ifdef _M_AMD64
855 PKTRAP_FRAME TrapFrame;
856 PVOID Reserved;
857 #endif
858 ULONG DispatchCode[DISPATCH_LENGTH];
859 } KINTERRUPT;
860
861 //
862 // Kernel Event Pair Object
863 //
864 typedef struct _KEVENT_PAIR
865 {
866 CSHORT Type;
867 CSHORT Size;
868 KEVENT LowEvent;
869 KEVENT HighEvent;
870 } KEVENT_PAIR, *PKEVENT_PAIR;
871
872 //
873 // Kernel No Execute Options
874 //
875 typedef struct _KEXECUTE_OPTIONS
876 {
877 UCHAR ExecuteDisable:1;
878 UCHAR ExecuteEnable:1;
879 UCHAR DisableThunkEmulation:1;
880 UCHAR Permanent:1;
881 UCHAR ExecuteDispatchEnable:1;
882 UCHAR ImageDispatchEnable:1;
883 UCHAR Spare:2;
884 } KEXECUTE_OPTIONS, *PKEXECUTE_OPTIONS;
885
886 #if (NTDDI_VERSION >= NTDDI_WIN7)
887 typedef union _KWAIT_STATUS_REGISTER
888 {
889 UCHAR Flags;
890 struct
891 {
892 UCHAR State:2;
893 UCHAR Affinity:1;
894 UCHAR Priority:1;
895 UCHAR Apc:1;
896 UCHAR UserApc:1;
897 UCHAR Alert:1;
898 UCHAR Unused:1;
899 };
900 } KWAIT_STATUS_REGISTER, *PKWAIT_STATUS_REGISTER;
901
902 typedef struct _COUNTER_READING
903 {
904 enum _HARDWARE_COUNTER_TYPE Type;
905 ULONG Index;
906 ULONG64 Start;
907 ULONG64 Total;
908 }COUNTER_READING, *PCOUNTER_READING;
909
910 typedef struct _KTHREAD_COUNTERS
911 {
912 ULONG64 WaitReasonBitMap;
913 struct _THREAD_PERFORMANCE_DATA* UserData;
914 ULONG Flags;
915 ULONG ContextSwitches;
916 ULONG64 CycleTimeBias;
917 ULONG64 HardwareCounters;
918 COUNTER_READING HwCounter[16];
919 }KTHREAD_COUNTERS, *PKTHREAD_COUNTERS;
920 #endif
921
922 //
923 // Kernel Thread (KTHREAD)
924 //
925 typedef struct _KTHREAD
926 {
927 DISPATCHER_HEADER Header;
928 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
929 ULONGLONG CycleTime;
930 #ifndef _WIN64 // [
931 ULONG HighCycleTime;
932 #endif // ]
933 ULONGLONG QuantumTarget;
934 #else // ][
935 LIST_ENTRY MutantListHead;
936 #endif // ]
937 PVOID InitialStack;
938 ULONG_PTR StackLimit; // FIXME: PVOID
939 PVOID KernelStack;
940 KSPIN_LOCK ThreadLock;
941 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
942 KWAIT_STATUS_REGISTER WaitRegister;
943 BOOLEAN Running;
944 BOOLEAN Alerted[2];
945 union
946 {
947 struct
948 {
949 ULONG KernelStackResident:1;
950 ULONG ReadyTransition:1;
951 ULONG ProcessReadyQueue:1;
952 ULONG WaitNext:1;
953 ULONG SystemAffinityActive:1;
954 ULONG Alertable:1;
955 ULONG GdiFlushActive:1;
956 ULONG UserStackWalkActive:1;
957 ULONG ApcInterruptRequest:1;
958 ULONG ForceDeferSchedule:1;
959 ULONG QuantumEndMigrate:1;
960 ULONG UmsDirectedSwitchEnable:1;
961 ULONG TimerActive:1;
962 ULONG Reserved:19;
963 };
964 LONG MiscFlags;
965 };
966 #endif // ]
967 union
968 {
969 KAPC_STATE ApcState;
970 struct
971 {
972 UCHAR ApcStateFill[FIELD_OFFSET(KAPC_STATE, UserApcPending) + 1];
973 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
974 SCHAR Priority;
975 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
976 /* On x86, the following members "fall out" of the union */
977 volatile ULONG NextProcessor;
978 volatile ULONG DeferredProcessor;
979 #else // ][
980 /* On x86, the following members "fall out" of the union */
981 volatile USHORT NextProcessor;
982 volatile USHORT DeferredProcessor;
983 #endif // ]
984 #else // ][
985 UCHAR ApcQueueable;
986 /* On x86, the following members "fall out" of the union */
987 volatile UCHAR NextProcessor;
988 volatile UCHAR DeferredProcessor;
989 UCHAR AdjustReason;
990 SCHAR AdjustIncrement;
991 #endif // ]
992 };
993 };
994 KSPIN_LOCK ApcQueueLock;
995 #ifndef _M_AMD64 // [
996 ULONG ContextSwitches;
997 volatile UCHAR State;
998 UCHAR NpxState;
999 KIRQL WaitIrql;
1000 KPROCESSOR_MODE WaitMode;
1001 #endif // ]
1002 LONG_PTR WaitStatus;
1003 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1004 PKWAIT_BLOCK WaitBlockList;
1005 #else // ][
1006 union
1007 {
1008 PKWAIT_BLOCK WaitBlockList;
1009 PKGATE GateObject;
1010 };
1011 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1012 union
1013 {
1014 struct
1015 {
1016 ULONG KernelStackResident:1;
1017 ULONG ReadyTransition:1;
1018 ULONG ProcessReadyQueue:1;
1019 ULONG WaitNext:1;
1020 ULONG SystemAffinityActive:1;
1021 ULONG Alertable:1;
1022 ULONG GdiFlushActive:1;
1023 ULONG Reserved:25;
1024 };
1025 LONG MiscFlags;
1026 };
1027 #else // ][
1028 BOOLEAN Alertable;
1029 BOOLEAN WaitNext;
1030 #endif // ]
1031 UCHAR WaitReason;
1032 #if (NTDDI_VERSION < NTDDI_LONGHORN)
1033 SCHAR Priority;
1034 BOOLEAN EnableStackSwap;
1035 #endif // ]
1036 volatile UCHAR SwapBusy;
1037 BOOLEAN Alerted[MaximumMode];
1038 #endif // ]
1039 union
1040 {
1041 LIST_ENTRY WaitListEntry;
1042 SINGLE_LIST_ENTRY SwapListEntry;
1043 };
1044 PKQUEUE Queue;
1045 #ifndef _M_AMD64 // [
1046 ULONG WaitTime;
1047 union
1048 {
1049 struct
1050 {
1051 SHORT KernelApcDisable;
1052 SHORT SpecialApcDisable;
1053 };
1054 ULONG CombinedApcDisable;
1055 };
1056 #endif // ]
1057 struct _TEB *Teb;
1058
1059 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1060 KTIMER Timer;
1061 #else // ][
1062 union
1063 {
1064 KTIMER Timer;
1065 struct
1066 {
1067 UCHAR TimerFill[FIELD_OFFSET(KTIMER, Period) + sizeof(LONG)];
1068 #if !defined(_WIN64) // [
1069 };
1070 };
1071 #endif // ]
1072 #endif // ]
1073 union
1074 {
1075 struct
1076 {
1077 ULONG AutoAlignment:1;
1078 ULONG DisableBoost:1;
1079 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1080 ULONG EtwStackTraceApc1Inserted:1;
1081 ULONG EtwStackTraceApc2Inserted:1;
1082 ULONG CycleChargePending:1;
1083 ULONG CalloutActive:1;
1084 ULONG ApcQueueable:1;
1085 ULONG EnableStackSwap:1;
1086 ULONG GuiThread:1;
1087 ULONG ReservedFlags:23;
1088 #else // ][
1089 LONG ReservedFlags:30;
1090 #endif // ]
1091 };
1092 LONG ThreadFlags;
1093 };
1094 #if defined(_WIN64) && (NTDDI_VERSION < NTDDI_WIN7) // [
1095 };
1096 };
1097 #endif // ]
1098 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1099 #if defined(_WIN64) // [
1100 ULONG Spare0;
1101 #else // ][
1102 PVOID ServiceTable;
1103 #endif // ]
1104 #endif // ]
1105 union
1106 {
1107 DECLSPEC_ALIGN(8) KWAIT_BLOCK WaitBlock[THREAD_WAIT_OBJECTS + 1];
1108 #if (NTDDI_VERSION < NTDDI_WIN7) // [
1109 struct
1110 {
1111 UCHAR WaitBlockFill0[FIELD_OFFSET(KWAIT_BLOCK, SpareByte)]; // 32bit = 23, 64bit = 43
1112 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1113 UCHAR IdealProcessor;
1114 #else // ][
1115 BOOLEAN SystemAffinityActive;
1116 #endif // ]
1117 };
1118 struct
1119 {
1120 UCHAR WaitBlockFill1[1 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareByte)]; // 47 / 91
1121 CCHAR PreviousMode;
1122 };
1123 struct
1124 {
1125 UCHAR WaitBlockFill2[2 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareByte)]; // 71 / 139
1126 UCHAR ResourceIndex;
1127 };
1128 struct
1129 {
1130 UCHAR WaitBlockFill3[3 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareByte)]; // 95 / 187
1131 UCHAR LargeStack;
1132 };
1133 #endif // ]
1134 #ifdef _M_AMD64 // [
1135 struct
1136 {
1137 UCHAR WaitBlockFill4[FIELD_OFFSET(KWAIT_BLOCK, SpareLong)];
1138 ULONG ContextSwitches;
1139 };
1140 struct
1141 {
1142 UCHAR WaitBlockFill5[1 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareLong)];
1143 UCHAR State;
1144 UCHAR NpxState;
1145 UCHAR WaitIrql;
1146 CHAR WaitMode;
1147 };
1148 struct
1149 {
1150 UCHAR WaitBlockFill6[2 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareLong)];
1151 ULONG WaitTime;
1152 };
1153 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1154 struct
1155 {
1156 UCHAR WaitBlockFill7[168];
1157 PVOID TebMappedLowVa;
1158 struct _UMS_CONTROL_BLOCK* Ucb;
1159 };
1160 #endif // ]
1161 struct
1162 {
1163 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1164 UCHAR WaitBlockFill8[188];
1165 #else // ][
1166 UCHAR WaitBlockFill7[3 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareLong)];
1167 #endif // ]
1168 union
1169 {
1170 struct
1171 {
1172 SHORT KernelApcDisable;
1173 SHORT SpecialApcDisable;
1174 };
1175 ULONG CombinedApcDisable;
1176 };
1177 };
1178 #endif // ]
1179 };
1180 LIST_ENTRY QueueListEntry;
1181 PKTRAP_FRAME TrapFrame;
1182 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1183 PVOID FirstArgument;
1184 union // 2 elements, 0x8 bytes (sizeof)
1185 {
1186 PVOID CallbackStack;
1187 ULONG_PTR CallbackDepth;
1188 };
1189 #else // ][
1190 PVOID CallbackStack;
1191 #endif // ]
1192 #if (NTDDI_VERSION < NTDDI_LONGHORN) || ((NTDDI_VERSION < NTDDI_WIN7) && !defined(_WIN64)) // [
1193 PVOID ServiceTable;
1194 #endif // ]
1195 #if (NTDDI_VERSION < NTDDI_LONGHORN) && defined(_WIN64) // [
1196 ULONG KernelLimit;
1197 #endif // ]
1198 UCHAR ApcStateIndex;
1199 #if (NTDDI_VERSION < NTDDI_LONGHORN) // [
1200 UCHAR IdealProcessor;
1201 BOOLEAN Preempted;
1202 BOOLEAN ProcessReadyQueue;
1203 #ifdef _WIN64 // [
1204 PVOID Win32kTable;
1205 ULONG Win32kLimit;
1206 #endif // ]
1207 BOOLEAN KernelStackResident;
1208 #endif // ]
1209 SCHAR BasePriority;
1210 SCHAR PriorityDecrement;
1211 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1212 BOOLEAN Preempted;
1213 UCHAR AdjustReason;
1214 CHAR AdjustIncrement;
1215 #if (NTDDI_VERSION >= NTDDI_WIN7)
1216 UCHAR PreviousMode;
1217 #else
1218 UCHAR Spare01;
1219 #endif
1220 #endif // ]
1221 CHAR Saturation;
1222 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1223 ULONG SystemCallNumber;
1224 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1225 ULONG FreezeCount;
1226 #else // ][
1227 ULONG Spare02;
1228 #endif // ]
1229 #endif // ]
1230 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1231 GROUP_AFFINITY UserAffinity;
1232 struct _KPROCESS *Process;
1233 GROUP_AFFINITY Affinity;
1234 ULONG IdealProcessor;
1235 ULONG UserIdealProcessor;
1236 #else // ][
1237 KAFFINITY UserAffinity;
1238 struct _KPROCESS *Process;
1239 KAFFINITY Affinity;
1240 #endif // ]
1241 PKAPC_STATE ApcStatePointer[2];
1242 union
1243 {
1244 KAPC_STATE SavedApcState;
1245 struct
1246 {
1247 UCHAR SavedApcStateFill[FIELD_OFFSET(KAPC_STATE, UserApcPending) + 1];
1248 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1249 UCHAR WaitReason;
1250 #else // ][
1251 CCHAR FreezeCount;
1252 #endif // ]
1253 #ifndef _WIN64 // [
1254 };
1255 };
1256 #endif // ]
1257 CCHAR SuspendCount;
1258 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1259 CCHAR Spare1;
1260 #else // ][
1261 UCHAR UserIdealProcessor;
1262 #endif // ]
1263 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1264 #elif (NTDDI_VERSION >= NTDDI_LONGHORN) // ][
1265 UCHAR Spare03;
1266 #else // ][
1267 UCHAR CalloutActive;
1268 #endif // ]
1269 #ifdef _WIN64 // [
1270 UCHAR CodePatchInProgress;
1271 };
1272 };
1273 #endif // ]
1274 #if defined(_M_IX86) // [
1275 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1276 UCHAR OtherPlatformFill;
1277 #else // ][
1278 UCHAR Iopl;
1279 #endif // ]
1280 #endif // ]
1281 PVOID Win32Thread;
1282 PVOID StackBase;
1283 union
1284 {
1285 KAPC SuspendApc;
1286 struct
1287 {
1288 UCHAR SuspendApcFill0[1];
1289 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1290 UCHAR ResourceIndex;
1291 #elif (NTDDI_VERSION >= NTDDI_LONGHORN) // ][
1292 CHAR Spare04;
1293 #else // ][
1294 SCHAR Quantum;
1295 #endif // ]
1296 };
1297 struct
1298 {
1299 UCHAR SuspendApcFill1[3];
1300 UCHAR QuantumReset;
1301 };
1302 struct
1303 {
1304 UCHAR SuspendApcFill2[4];
1305 ULONG KernelTime;
1306 };
1307 struct
1308 {
1309 UCHAR SuspendApcFill3[FIELD_OFFSET(KAPC, SystemArgument1)];
1310 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1311 PKPRCB WaitPrcb;
1312 #else
1313 PVOID TlsArray;
1314 #endif
1315 };
1316 struct
1317 {
1318 UCHAR SuspendApcFill4[FIELD_OFFSET(KAPC, SystemArgument2)]; // 40 / 72
1319 PVOID LegoData;
1320 };
1321 struct
1322 {
1323 UCHAR SuspendApcFill5[FIELD_OFFSET(KAPC, Inserted) + 1]; // 47 / 83
1324 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1325 UCHAR LargeStack;
1326 #else // ][
1327 UCHAR PowerState;
1328 #endif // ]
1329 #ifdef _WIN64 // [
1330 ULONG UserTime;
1331 #endif // ]
1332 };
1333 };
1334 #ifndef _WIN64 // [
1335 ULONG UserTime;
1336 #endif // ]
1337 union
1338 {
1339 KSEMAPHORE SuspendSemaphore;
1340 struct
1341 {
1342 UCHAR SuspendSemaphorefill[FIELD_OFFSET(KSEMAPHORE, Limit) + 4]; // 20 / 28
1343 #ifdef _WIN64 // [
1344 ULONG SListFaultCount;
1345 #endif // ]
1346 };
1347 };
1348 #ifndef _WIN64 // [
1349 ULONG SListFaultCount;
1350 #endif // ]
1351 LIST_ENTRY ThreadListEntry;
1352 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1353 LIST_ENTRY MutantListHead;
1354 #endif // ]
1355 PVOID SListFaultAddress;
1356 #ifdef _M_AMD64 // [
1357 LONG64 ReadOperationCount;
1358 LONG64 WriteOperationCount;
1359 LONG64 OtherOperationCount;
1360 LONG64 ReadTransferCount;
1361 LONG64 WriteTransferCount;
1362 LONG64 OtherTransferCount;
1363 #endif // ]
1364 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1365 PKTHREAD_COUNTERS ThreadCounters;
1366 PXSTATE_SAVE XStateSave;
1367 #elif (NTDDI_VERSION >= NTDDI_LONGHORN) // ][
1368 PVOID MdlForLockedTeb;
1369 #endif // ]
1370 } KTHREAD;
1371
1372 #define ASSERT_THREAD(object) \
1373 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ThreadObject))
1374
1375 //
1376 // Kernel Process (KPROCESS)
1377 //
1378 typedef struct _KPROCESS
1379 {
1380 DISPATCHER_HEADER Header;
1381 LIST_ENTRY ProfileListHead;
1382 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1383 ULONG_PTR DirectoryTableBase;
1384 ULONG Unused0;
1385 #else
1386 ULONG_PTR DirectoryTableBase[2];
1387 #endif
1388 #if defined(_M_IX86)
1389 KGDTENTRY LdtDescriptor;
1390 KIDTENTRY Int21Descriptor;
1391 #endif
1392 USHORT IopmOffset;
1393 #if defined(_M_IX86)
1394 UCHAR Iopl;
1395 UCHAR Unused;
1396 #endif
1397 volatile ULONG ActiveProcessors;
1398 ULONG KernelTime;
1399 ULONG UserTime;
1400 LIST_ENTRY ReadyListHead;
1401 SINGLE_LIST_ENTRY SwapListEntry;
1402 PVOID VdmTrapcHandler;
1403 LIST_ENTRY ThreadListHead;
1404 KSPIN_LOCK ProcessLock;
1405 KAFFINITY Affinity;
1406 union
1407 {
1408 struct
1409 {
1410 LONG AutoAlignment:1;
1411 LONG DisableBoost:1;
1412 LONG DisableQuantum:1;
1413 LONG ReservedFlags:29;
1414 };
1415 LONG ProcessFlags;
1416 };
1417 SCHAR BasePriority;
1418 SCHAR QuantumReset;
1419 UCHAR State;
1420 UCHAR ThreadSeed;
1421 UCHAR PowerState;
1422 UCHAR IdealNode;
1423 UCHAR Visited;
1424 union
1425 {
1426 KEXECUTE_OPTIONS Flags;
1427 UCHAR ExecuteOptions;
1428 };
1429 ULONG StackCount;
1430 LIST_ENTRY ProcessListEntry;
1431 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1432 ULONGLONG CycleTime;
1433 #endif // ]
1434 } KPROCESS;
1435
1436 #define ASSERT_PROCESS(object) \
1437 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ProcessObject))
1438
1439 //
1440 // System Service Table Descriptor
1441 //
1442 typedef struct _KSERVICE_TABLE_DESCRIPTOR
1443 {
1444 PULONG_PTR Base;
1445 PULONG Count;
1446 ULONG Limit;
1447 #if defined(_IA64_)
1448 LONG TableBaseGpOffset;
1449 #endif
1450 PUCHAR Number;
1451 } KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;
1452
1453 #if (NTDDI_VERSION >= NTDDI_WIN8)
1454 //
1455 // Entropy Timing State
1456 //
1457 typedef struct _KENTROPY_TIMING_STATE
1458 {
1459 ULONG EntropyCount;
1460 ULONG Buffer[64];
1461 KDPC Dpc;
1462 ULONG LastDeliveredBuffer;
1463 PULONG RawDataBuffer;
1464 } KENTROPY_TIMING_STATE, *PKENTROPY_TIMING_STATE;
1465
1466 //
1467 // Constants from ks386.inc, ksamd64.inc and ksarm.h
1468 //
1469 #define KENTROPY_TIMING_INTERRUPTS_PER_BUFFER 0x400
1470 #define KENTROPY_TIMING_BUFFER_MASK 0x7ff
1471 #define KENTROPY_TIMING_ANALYSIS 0x0
1472
1473 #endif /* (NTDDI_VERSION >= NTDDI_WIN8) */
1474
1475 //
1476 // Exported Loader Parameter Block
1477 //
1478 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI *KeLoaderBlock;
1479
1480 //
1481 // Exported Hardware Data
1482 //
1483 extern KAFFINITY NTSYSAPI KeActiveProcessors;
1484 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1485 extern volatile CCHAR NTSYSAPI KeNumberProcessors;
1486 #else
1487 #if (NTDDI_VERSION >= NTDDI_WINXP)
1488 extern CCHAR NTSYSAPI KeNumberProcessors;
1489 #else
1490 //extern PCCHAR KeNumberProcessors;
1491 extern NTSYSAPI CCHAR KeNumberProcessors; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
1492 #endif
1493 #endif
1494 extern ULONG NTSYSAPI KiDmaIoCoherency;
1495 extern ULONG NTSYSAPI KeMaximumIncrement;
1496 extern ULONG NTSYSAPI KeMinimumIncrement;
1497 extern ULONG NTSYSAPI KeDcacheFlushCount;
1498 extern ULONG NTSYSAPI KeIcacheFlushCount;
1499 extern ULONG_PTR NTSYSAPI KiBugCheckData[];
1500 extern BOOLEAN NTSYSAPI KiEnableTimerWatchdog;
1501
1502 //
1503 // Exported System Service Descriptor Tables
1504 //
1505 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable[SSDT_MAX_ENTRIES];
1506 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow[SSDT_MAX_ENTRIES];
1507
1508 #endif // !NTOS_MODE_USER
1509
1510 #endif // _KETYPES_H