[NDK] Add Win8+ version of KTHREAD
[reactos.git] / sdk / include / ndk / ketypes.h
1 /*++ NDK Version: 0098
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4
5 Header Name:
6
7 ketypes.h
8
9 Abstract:
10
11 Type definitions for the Kernel services.
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 /// FIXME: should move to rtltypes.h, but we can't include it here.
923 #if (NTDDI_VERSION >= NTDDI_WIN8)
924 typedef struct _RTL_RB_TREE
925 {
926 PRTL_BALANCED_NODE Root;
927 PRTL_BALANCED_NODE Min;
928 } RTL_RB_TREE, *PRTL_RB_TREE;
929 #endif
930
931 #if (NTDDI_VERSION >= NTDDI_WINBLUE)
932 typedef struct _KLOCK_ENTRY_LOCK_STATE
933 {
934 union
935 {
936 struct
937 {
938 #if (NTDDI_VERSION >= NTDDI_WIN10) // since 6.4.9841.0
939 ULONG_PTR CrossThreadReleasable : 1;
940 #else
941 ULONG_PTR Waiting : 1;
942 #endif
943 ULONG_PTR Busy : 1;
944 ULONG_PTR Reserved : (8 * sizeof(PVOID)) - 3; // previously Spare
945 ULONG_PTR InTree : 1;
946 };
947 PVOID LockState;
948 };
949 union
950 {
951 PVOID SessionState;
952 struct
953 {
954 ULONG SessionId;
955 #ifdef _WIN64
956 ULONG SessionPad;
957 #endif
958 };
959 };
960 } KLOCK_ENTRY_LOCK_STATE, *PKLOCK_ENTRY_LOCK_STATE;
961
962 typedef struct _KLOCK_ENTRY
963 {
964 union
965 {
966 RTL_BALANCED_NODE TreeNode;
967 SINGLE_LIST_ENTRY FreeListEntry;
968 };
969 #if (NTDDI_VERSION >= NTDDI_WIN10)
970 union
971 {
972 ULONG EntryFlags;
973 struct
974 {
975 UCHAR EntryOffset;
976 union
977 {
978 UCHAR ThreadLocalFlags;
979 struct
980 {
981 UCHAR WaitingBit : 1;
982 UCHAR Spare0 : 7;
983 };
984 };
985 union
986 {
987 UCHAR AcquiredByte;
988 UCHAR AcquiredBit : 1;
989 };
990 union
991 {
992 UCHAR CrossThreadFlags;
993 struct
994 {
995 UCHAR HeadNodeBit : 1;
996 UCHAR IoPriorityBit : 1;
997 UCHAR IoQoSWaiter : 1; // since TH2
998 UCHAR Spare1 : 5;
999 };
1000 };
1001 };
1002 struct
1003 {
1004 ULONG StaticState : 8;
1005 ULONG AllFlags : 24;
1006 };
1007 };
1008 #ifdef _WIN64
1009 ULONG SpareFlags;
1010 #endif
1011 #else
1012 union
1013 {
1014 PVOID ThreadUnsafe;
1015 struct
1016 {
1017 volatile UCHAR HeadNodeByte;
1018 UCHAR Reserved1[2];
1019 volatile UCHAR AcquiredByte;
1020 };
1021 };
1022 #endif
1023
1024 union
1025 {
1026 KLOCK_ENTRY_LOCK_STATE LockState;
1027 PVOID LockUnsafe;
1028 struct
1029 {
1030 #if (NTDDI_VERSION >= NTDDI_WIN10)
1031 volatile UCHAR CrossThreadReleasableAndBusyByte;
1032 #else
1033 volatile UCHAR WaitingAndBusyByte;
1034 #endif
1035 UCHAR Reserved[sizeof(PVOID) - 2];
1036 UCHAR InTreeByte;
1037 union
1038 {
1039 PVOID SessionState;
1040 struct
1041 {
1042 ULONG SessionId;
1043 #ifdef _WIN64
1044 ULONG SessionPad;
1045 #endif
1046 };
1047 };
1048 };
1049 };
1050 union
1051 {
1052 struct
1053 {
1054 RTL_RB_TREE OwnerTree;
1055 RTL_RB_TREE WaiterTree;
1056 };
1057 CHAR CpuPriorityKey;
1058 };
1059 ULONG_PTR EntryLock;
1060 union
1061 {
1062 #if _WIN64
1063 ULONG AllBoosts : 17;
1064 #else
1065 USHORT AllBoosts;
1066 #endif
1067 struct
1068 {
1069 struct
1070 {
1071 USHORT CpuBoostsBitmap : 15;
1072 USHORT IoBoost : 1;
1073 };
1074 struct
1075 {
1076 USHORT IoQoSBoost : 1;
1077 USHORT IoNormalPriorityWaiterCount : 8;
1078 USHORT IoQoSWaiterCount : 7;
1079 };
1080 };
1081 };
1082 #if _WIN64
1083 ULONG SparePad;
1084 #endif
1085 } KLOCK_ENTRY, *PKLOCK_ENTRY;
1086
1087 #endif
1088
1089 //
1090 // Kernel Thread (KTHREAD)
1091 //
1092 #if (NTDDI_VERSION < NTDDI_WIN8)
1093
1094 typedef struct _KTHREAD
1095 {
1096 DISPATCHER_HEADER Header;
1097 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1098 ULONGLONG CycleTime;
1099 #ifndef _WIN64 // [
1100 ULONG HighCycleTime;
1101 #endif // ]
1102 ULONGLONG QuantumTarget;
1103 #else // ][
1104 LIST_ENTRY MutantListHead;
1105 #endif // ]
1106 PVOID InitialStack;
1107 ULONG_PTR StackLimit; // FIXME: PVOID
1108 PVOID KernelStack;
1109 KSPIN_LOCK ThreadLock;
1110 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1111 KWAIT_STATUS_REGISTER WaitRegister;
1112 BOOLEAN Running;
1113 BOOLEAN Alerted[2];
1114 union
1115 {
1116 struct
1117 {
1118 ULONG KernelStackResident:1;
1119 ULONG ReadyTransition:1;
1120 ULONG ProcessReadyQueue:1;
1121 ULONG WaitNext:1;
1122 ULONG SystemAffinityActive:1;
1123 ULONG Alertable:1;
1124 ULONG GdiFlushActive:1;
1125 ULONG UserStackWalkActive:1;
1126 ULONG ApcInterruptRequest:1;
1127 ULONG ForceDeferSchedule:1;
1128 ULONG QuantumEndMigrate:1;
1129 ULONG UmsDirectedSwitchEnable:1;
1130 ULONG TimerActive:1;
1131 ULONG Reserved:19;
1132 };
1133 LONG MiscFlags;
1134 };
1135 #endif // ]
1136 union
1137 {
1138 KAPC_STATE ApcState;
1139 struct
1140 {
1141 UCHAR ApcStateFill[FIELD_OFFSET(KAPC_STATE, UserApcPending) + 1];
1142 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1143 SCHAR Priority;
1144 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1145 /* On x86, the following members "fall out" of the union */
1146 volatile ULONG NextProcessor;
1147 volatile ULONG DeferredProcessor;
1148 #else // ][
1149 /* On x86, the following members "fall out" of the union */
1150 volatile USHORT NextProcessor;
1151 volatile USHORT DeferredProcessor;
1152 #endif // ]
1153 #else // ][
1154 UCHAR ApcQueueable;
1155 /* On x86, the following members "fall out" of the union */
1156 volatile UCHAR NextProcessor;
1157 volatile UCHAR DeferredProcessor;
1158 UCHAR AdjustReason;
1159 SCHAR AdjustIncrement;
1160 #endif // ]
1161 };
1162 };
1163 KSPIN_LOCK ApcQueueLock;
1164 #ifndef _M_AMD64 // [
1165 ULONG ContextSwitches;
1166 volatile UCHAR State;
1167 UCHAR NpxState;
1168 KIRQL WaitIrql;
1169 KPROCESSOR_MODE WaitMode;
1170 #endif // ]
1171 LONG_PTR WaitStatus;
1172 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1173 PKWAIT_BLOCK WaitBlockList;
1174 #else // ][
1175 union
1176 {
1177 PKWAIT_BLOCK WaitBlockList;
1178 PKGATE GateObject;
1179 };
1180 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1181 union
1182 {
1183 struct
1184 {
1185 ULONG KernelStackResident:1;
1186 ULONG ReadyTransition:1;
1187 ULONG ProcessReadyQueue:1;
1188 ULONG WaitNext:1;
1189 ULONG SystemAffinityActive:1;
1190 ULONG Alertable:1;
1191 ULONG GdiFlushActive:1;
1192 ULONG Reserved:25;
1193 };
1194 LONG MiscFlags;
1195 };
1196 #else // ][
1197 BOOLEAN Alertable;
1198 BOOLEAN WaitNext;
1199 #endif // ]
1200 UCHAR WaitReason;
1201 #if (NTDDI_VERSION < NTDDI_LONGHORN)
1202 SCHAR Priority;
1203 BOOLEAN EnableStackSwap;
1204 #endif // ]
1205 volatile UCHAR SwapBusy;
1206 BOOLEAN Alerted[MaximumMode];
1207 #endif // ]
1208 union
1209 {
1210 LIST_ENTRY WaitListEntry;
1211 SINGLE_LIST_ENTRY SwapListEntry;
1212 };
1213 PKQUEUE Queue;
1214 #ifndef _M_AMD64 // [
1215 ULONG WaitTime;
1216 union
1217 {
1218 struct
1219 {
1220 SHORT KernelApcDisable;
1221 SHORT SpecialApcDisable;
1222 };
1223 ULONG CombinedApcDisable;
1224 };
1225 #endif // ]
1226 struct _TEB *Teb;
1227
1228 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1229 KTIMER Timer;
1230 #else // ][
1231 union
1232 {
1233 KTIMER Timer;
1234 struct
1235 {
1236 UCHAR TimerFill[FIELD_OFFSET(KTIMER, Period) + sizeof(LONG)];
1237 #if !defined(_WIN64) // [
1238 };
1239 };
1240 #endif // ]
1241 #endif // ]
1242 union
1243 {
1244 struct
1245 {
1246 ULONG AutoAlignment:1;
1247 ULONG DisableBoost:1;
1248 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1249 ULONG EtwStackTraceApc1Inserted:1;
1250 ULONG EtwStackTraceApc2Inserted:1;
1251 ULONG CycleChargePending:1;
1252 ULONG CalloutActive:1;
1253 ULONG ApcQueueable:1;
1254 ULONG EnableStackSwap:1;
1255 ULONG GuiThread:1;
1256 ULONG ReservedFlags:23;
1257 #else // ][
1258 LONG ReservedFlags:30;
1259 #endif // ]
1260 };
1261 LONG ThreadFlags;
1262 };
1263 #if defined(_WIN64) && (NTDDI_VERSION < NTDDI_WIN7) // [
1264 };
1265 };
1266 #endif // ]
1267 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1268 #if defined(_WIN64) // [
1269 ULONG Spare0;
1270 #else // ][
1271 PVOID ServiceTable;
1272 #endif // ]
1273 #endif // ]
1274 union
1275 {
1276 DECLSPEC_ALIGN(8) KWAIT_BLOCK WaitBlock[THREAD_WAIT_OBJECTS + 1];
1277 #if (NTDDI_VERSION < NTDDI_WIN7) // [
1278 struct
1279 {
1280 UCHAR WaitBlockFill0[FIELD_OFFSET(KWAIT_BLOCK, SpareByte)]; // 32bit = 23, 64bit = 43
1281 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1282 UCHAR IdealProcessor;
1283 #else // ][
1284 BOOLEAN SystemAffinityActive;
1285 #endif // ]
1286 };
1287 struct
1288 {
1289 UCHAR WaitBlockFill1[1 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareByte)]; // 47 / 91
1290 CCHAR PreviousMode;
1291 };
1292 struct
1293 {
1294 UCHAR WaitBlockFill2[2 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareByte)]; // 71 / 139
1295 UCHAR ResourceIndex;
1296 };
1297 struct
1298 {
1299 UCHAR WaitBlockFill3[3 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareByte)]; // 95 / 187
1300 UCHAR LargeStack;
1301 };
1302 #endif // ]
1303 #ifdef _WIN64 // [
1304 struct
1305 {
1306 UCHAR WaitBlockFill4[FIELD_OFFSET(KWAIT_BLOCK, SpareLong)];
1307 ULONG ContextSwitches;
1308 };
1309 struct
1310 {
1311 UCHAR WaitBlockFill5[1 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareLong)];
1312 UCHAR State;
1313 UCHAR NpxState;
1314 UCHAR WaitIrql;
1315 CHAR WaitMode;
1316 };
1317 struct
1318 {
1319 UCHAR WaitBlockFill6[2 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareLong)];
1320 ULONG WaitTime;
1321 };
1322 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1323 struct
1324 {
1325 UCHAR WaitBlockFill7[168];
1326 PVOID TebMappedLowVa;
1327 struct _UMS_CONTROL_BLOCK* Ucb;
1328 };
1329 #endif // ]
1330 struct
1331 {
1332 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1333 UCHAR WaitBlockFill8[188];
1334 #else // ][
1335 UCHAR WaitBlockFill7[3 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareLong)];
1336 #endif // ]
1337 union
1338 {
1339 struct
1340 {
1341 SHORT KernelApcDisable;
1342 SHORT SpecialApcDisable;
1343 };
1344 ULONG CombinedApcDisable;
1345 };
1346 };
1347 #endif // ]
1348 };
1349 LIST_ENTRY QueueListEntry;
1350 PKTRAP_FRAME TrapFrame;
1351 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1352 PVOID FirstArgument;
1353 union
1354 {
1355 PVOID CallbackStack;
1356 ULONG_PTR CallbackDepth;
1357 };
1358 #else // ][
1359 PVOID CallbackStack;
1360 #endif // ]
1361 #if (NTDDI_VERSION < NTDDI_LONGHORN) || ((NTDDI_VERSION < NTDDI_WIN7) && !defined(_WIN64)) // [
1362 PVOID ServiceTable;
1363 #endif // ]
1364 #if (NTDDI_VERSION < NTDDI_LONGHORN) && defined(_WIN64) // [
1365 ULONG KernelLimit;
1366 #endif // ]
1367 UCHAR ApcStateIndex;
1368 #if (NTDDI_VERSION < NTDDI_LONGHORN) // [
1369 UCHAR IdealProcessor;
1370 BOOLEAN Preempted;
1371 BOOLEAN ProcessReadyQueue;
1372 #ifdef _WIN64 // [
1373 PVOID Win32kTable;
1374 ULONG Win32kLimit;
1375 #endif // ]
1376 BOOLEAN KernelStackResident;
1377 #endif // ]
1378 SCHAR BasePriority;
1379 SCHAR PriorityDecrement;
1380 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1381 BOOLEAN Preempted;
1382 UCHAR AdjustReason;
1383 CHAR AdjustIncrement;
1384 #if (NTDDI_VERSION >= NTDDI_WIN7)
1385 UCHAR PreviousMode;
1386 #else
1387 UCHAR Spare01;
1388 #endif
1389 #endif // ]
1390 CHAR Saturation;
1391 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1392 ULONG SystemCallNumber;
1393 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1394 ULONG FreezeCount;
1395 #else // ][
1396 ULONG Spare02;
1397 #endif // ]
1398 #endif // ]
1399 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1400 GROUP_AFFINITY UserAffinity;
1401 struct _KPROCESS *Process;
1402 GROUP_AFFINITY Affinity;
1403 ULONG IdealProcessor;
1404 ULONG UserIdealProcessor;
1405 #else // ][
1406 KAFFINITY UserAffinity;
1407 struct _KPROCESS *Process;
1408 KAFFINITY Affinity;
1409 #endif // ]
1410 PKAPC_STATE ApcStatePointer[2];
1411 union
1412 {
1413 KAPC_STATE SavedApcState;
1414 struct
1415 {
1416 UCHAR SavedApcStateFill[FIELD_OFFSET(KAPC_STATE, UserApcPending) + 1];
1417 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1418 UCHAR WaitReason;
1419 #else // ][
1420 CCHAR FreezeCount;
1421 #endif // ]
1422 #ifndef _WIN64 // [
1423 };
1424 };
1425 #endif // ]
1426 CCHAR SuspendCount;
1427 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1428 CCHAR Spare1;
1429 #else // ][
1430 UCHAR UserIdealProcessor;
1431 #endif // ]
1432 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1433 #elif (NTDDI_VERSION >= NTDDI_LONGHORN) // ][
1434 UCHAR Spare03;
1435 #else // ][
1436 UCHAR CalloutActive;
1437 #endif // ]
1438 #ifdef _WIN64 // [
1439 UCHAR CodePatchInProgress;
1440 };
1441 };
1442 #endif // ]
1443 #if defined(_M_IX86) // [
1444 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1445 UCHAR OtherPlatformFill;
1446 #else // ][
1447 UCHAR Iopl;
1448 #endif // ]
1449 #endif // ]
1450 PVOID Win32Thread;
1451 PVOID StackBase;
1452 union
1453 {
1454 KAPC SuspendApc;
1455 struct
1456 {
1457 UCHAR SuspendApcFill0[1];
1458 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1459 UCHAR ResourceIndex;
1460 #elif (NTDDI_VERSION >= NTDDI_LONGHORN) // ][
1461 CHAR Spare04;
1462 #else // ][
1463 SCHAR Quantum;
1464 #endif // ]
1465 };
1466 struct
1467 {
1468 UCHAR SuspendApcFill1[3];
1469 UCHAR QuantumReset;
1470 };
1471 struct
1472 {
1473 UCHAR SuspendApcFill2[4];
1474 ULONG KernelTime;
1475 };
1476 struct
1477 {
1478 UCHAR SuspendApcFill3[FIELD_OFFSET(KAPC, SystemArgument1)];
1479 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1480 PKPRCB WaitPrcb;
1481 #else
1482 PVOID TlsArray;
1483 #endif
1484 };
1485 struct
1486 {
1487 UCHAR SuspendApcFill4[FIELD_OFFSET(KAPC, SystemArgument2)]; // 40 / 72
1488 PVOID LegoData;
1489 };
1490 struct
1491 {
1492 UCHAR SuspendApcFill5[FIELD_OFFSET(KAPC, Inserted) + 1]; // 47 / 83
1493 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1494 UCHAR LargeStack;
1495 #else // ][
1496 UCHAR PowerState;
1497 #endif // ]
1498 #ifdef _WIN64 // [
1499 ULONG UserTime;
1500 #endif // ]
1501 };
1502 };
1503 #ifndef _WIN64 // [
1504 ULONG UserTime;
1505 #endif // ]
1506 union
1507 {
1508 KSEMAPHORE SuspendSemaphore;
1509 struct
1510 {
1511 UCHAR SuspendSemaphorefill[FIELD_OFFSET(KSEMAPHORE, Limit) + 4]; // 20 / 28
1512 #ifdef _WIN64 // [
1513 ULONG SListFaultCount;
1514 #endif // ]
1515 };
1516 };
1517 #ifndef _WIN64 // [
1518 ULONG SListFaultCount;
1519 #endif // ]
1520 LIST_ENTRY ThreadListEntry;
1521 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1522 LIST_ENTRY MutantListHead;
1523 #endif // ]
1524 PVOID SListFaultAddress;
1525 #ifdef _M_AMD64 // [
1526 LONG64 ReadOperationCount;
1527 LONG64 WriteOperationCount;
1528 LONG64 OtherOperationCount;
1529 LONG64 ReadTransferCount;
1530 LONG64 WriteTransferCount;
1531 LONG64 OtherTransferCount;
1532 #endif // ]
1533 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1534 PKTHREAD_COUNTERS ThreadCounters;
1535 PXSTATE_SAVE XStateSave;
1536 #elif (NTDDI_VERSION >= NTDDI_LONGHORN) // ][
1537 PVOID MdlForLockedTeb;
1538 #endif // ]
1539 } KTHREAD;
1540
1541 #else // not (NTDDI_VERSION < NTDDI_WIN8)
1542
1543 #if defined(_WIN64) && (NTDDI_VERSION < 0x06032580) // since WIN 8.1 Update1 6.3.9600.16384
1544 #define NUMBER_OF_LOCK_ENTRIES 5
1545 #else
1546 #define NUMBER_OF_LOCK_ENTRIES 6
1547 #endif
1548
1549 typedef struct _KTHREAD
1550 {
1551 DISPATCHER_HEADER Header;
1552 PVOID SListFaultAddress;
1553 ULONG64 QuantumTarget;
1554 PVOID InitialStack;
1555 volatile VOID *StackLimit;
1556 PVOID StackBase;
1557 KSPIN_LOCK ThreadLock;
1558 volatile ULONG64 CycleTime;
1559 #ifndef _WIN64
1560 volatile ULONG HighCycleTime;
1561 PVOID ServiceTable;
1562 #endif
1563 ULONG CurrentRunTime;
1564 ULONG ExpectedRunTime;
1565 PVOID KernelStack;
1566 XSAVE_FORMAT* StateSaveArea;
1567 struct _KSCHEDULING_GROUP* SchedulingGroup;
1568 KWAIT_STATUS_REGISTER WaitRegister;
1569 BOOLEAN Running;
1570 BOOLEAN Alerted[MaximumMode];
1571
1572 union
1573 {
1574 struct
1575 {
1576 #if (NTDDI_VERSION < NTDDI_WIN10)
1577 ULONG KernelStackResident : 1;
1578 #else
1579 ULONG AutoBoostActive : 1;
1580 #endif
1581 ULONG ReadyTransition : 1;
1582 #if (NTDDI_VERSION < NTDDI_WIN10TH2)
1583 ULONG ProcessReadyQueue : 1;
1584 #endif
1585 ULONG ProcessReadyQueue : 1;
1586 ULONG WaitNext : 1;
1587 ULONG SystemAffinityActive : 1;
1588 ULONG Alertable : 1;
1589 #if (NTDDI_VERSION < NTDDI_WIN81)
1590 ULONG CodePatchInProgress : 1;
1591 #endif
1592 ULONG UserStackWalkActive : 1;
1593 ULONG ApcInterruptRequest : 1;
1594 ULONG QuantumEndMigrate : 1;
1595 ULONG UmsDirectedSwitchEnable : 1;
1596 ULONG TimerActive : 1;
1597 ULONG SystemThread : 1;
1598 ULONG ProcessDetachActive : 1;
1599 ULONG CalloutActive : 1;
1600 ULONG ScbReadyQueue : 1;
1601 ULONG ApcQueueable : 1;
1602 ULONG ReservedStackInUse : 1;
1603 ULONG UmsPerformingSyscall : 1;
1604 ULONG DisableStackCheck : 1;
1605 ULONG Reserved : 12;
1606 };
1607 LONG MiscFlags;
1608 };
1609
1610 union
1611 {
1612 struct
1613 {
1614 ULONG AutoAlignment : 1;
1615 ULONG DisableBoost : 1;
1616 ULONG UserAffinitySet : 1;
1617 ULONG AlertedByThreadId : 1;
1618 ULONG QuantumDonation : 1;
1619 ULONG EnableStackSwap : 1;
1620 ULONG GuiThread : 1;
1621 ULONG DisableQuantum : 1;
1622 ULONG ChargeOnlyGroup : 1;
1623 ULONG DeferPreemption : 1;
1624 ULONG QueueDeferPreemption : 1;
1625 ULONG ForceDeferSchedule : 1;
1626 ULONG ExplicitIdealProcessor : 1;
1627 ULONG FreezeCount : 1;
1628 #if (NTDDI_VERSION >= 0x060324D7) // since 6.3.9431.0
1629 ULONG TerminationApcRequest : 1;
1630 #endif
1631 #if (NTDDI_VERSION >= 0x06032580) // since 6.3.9600.16384
1632 ULONG AutoBoostEntriesExhausted : 1;
1633 #endif
1634 #if (NTDDI_VERSION >= 0x06032580) // since 6.3.9600.17031
1635 ULONG KernelStackResident : 1;
1636 #endif
1637 #if (NTDDI_VERSION >= NTDDI_WIN10)
1638 ULONG CommitFailTerminateRequest : 1;
1639 ULONG ProcessStackCountDecremented : 1;
1640 ULONG ThreadFlagsSpare : 5;
1641 #endif
1642 ULONG EtwStackTraceApcInserted : 8;
1643 #if (NTDDI_VERSION < NTDDI_WIN10)
1644 ULONG ReservedFlags : 10;
1645 #endif
1646 };
1647 LONG ThreadFlags;
1648 };
1649
1650 #if (NTDDI_VERSION >= NTDDI_WIN10)
1651 volatile UCHAR Tag;
1652 UCHAR SystemHeteroCpuPolicy;
1653 UCHAR UserHeteroCpuPolicy : 7;
1654 UCHAR ExplicitSystemHeteroCpuPolicy : 1;
1655 UCHAR Spare0;
1656 #else
1657 ULONG Spare0;
1658 #endif
1659 ULONG SystemCallNumber;
1660 #ifdef _WIN64
1661 ULONG Spare1; // Win 10: Spare10
1662 #endif
1663 PVOID FirstArgument;
1664 PKTRAP_FRAME TrapFrame;
1665
1666 union
1667 {
1668 KAPC_STATE ApcState;
1669 struct
1670 {
1671 UCHAR ApcStateFill[RTL_SIZEOF_THROUGH_FIELD(KAPC_STATE, UserApcPending)]; // 32bit: 23/0x17, 64bit: 43/0x2B
1672 SCHAR Priority;
1673 ULONG UserIdealProcessor;
1674 };
1675 };
1676
1677 #ifndef _WIN64
1678 ULONG ContextSwitches;
1679 volatile UCHAR State;
1680 #if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.10074.0
1681 CHAR Spare12;
1682 #else
1683 CHAR NpxState;
1684 #endif
1685 KIRQL WaitIrql;
1686 KPROCESSOR_MODE WaitMode;
1687 #endif
1688
1689 volatile INT_PTR WaitStatus;
1690 PKWAIT_BLOCK WaitBlockList;
1691 union
1692 {
1693 LIST_ENTRY WaitListEntry;
1694 SINGLE_LIST_ENTRY SwapListEntry;
1695 };
1696 PKQUEUE Queue;
1697 PVOID Teb;
1698 #if (NTDDI_VERSION >= NTDDI_WIN8 /* 0x060223F0 */) // since 6.2.9200.16384
1699 ULONG64 RelativeTimerBias;
1700 #endif
1701 KTIMER Timer;
1702
1703 union
1704 {
1705 DECLSPEC_ALIGN(8) KWAIT_BLOCK WaitBlock[THREAD_WAIT_OBJECTS + 1];
1706 #ifdef _WIN64
1707 struct
1708 {
1709 UCHAR WaitBlockFill4[FIELD_OFFSET(KWAIT_BLOCK, SpareLong)]; // 32bit: -, 64bit: 20/0x14
1710 ULONG ContextSwitches;
1711 };
1712 struct
1713 {
1714 UCHAR WaitBlockFill5[1 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareLong)]; // 32bit: -, 64bit: 68/0x44
1715 UCHAR State;
1716 #if (NTDDI_VERSION >= NTDDI_WIN10)
1717 CHAR Spare13;
1718 #else
1719 CHAR NpxState;
1720 #endif
1721 UCHAR WaitIrql;
1722 CHAR WaitMode;
1723 };
1724 struct
1725 {
1726 UCHAR WaitBlockFill6[2 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareLong)]; // 32bit: -, 64bit: 116/0x74
1727 ULONG WaitTime;
1728 };
1729 struct
1730 {
1731 UCHAR WaitBlockFill7[3 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareLong)]; // 32bit: -, 64bit: 164/0xA4
1732 union
1733 {
1734 struct
1735 {
1736 SHORT KernelApcDisable;
1737 SHORT SpecialApcDisable;
1738 };
1739 ULONG CombinedApcDisable;
1740 };
1741 };
1742 #endif
1743 struct
1744 {
1745 UCHAR WaitBlockFill8[FIELD_OFFSET(KWAIT_BLOCK, SparePtr)]; // 32bit: 20/0x14, 64bit: 40/0x28
1746 struct _KTHREAD_COUNTERS *ThreadCounters;
1747 };
1748 struct
1749 {
1750 UCHAR WaitBlockFill9[1 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SparePtr)]; // 32bit: 44/0x2C, 64bit: 88/0x58
1751 PXSTATE_SAVE XStateSave;
1752 };
1753 struct
1754 {
1755 UCHAR WaitBlockFill10[2 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SparePtr)]; // 32bit: 68/0x44, 64bit: 136/0x88
1756 PVOID Win32Thread;
1757 };
1758 struct
1759 {
1760 UCHAR WaitBlockFill11[3 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, Object)]; // 32bit: 88/0x58, 64bit: 176/0xB0
1761 #ifdef _WIN64
1762 struct _UMS_CONTROL_BLOCK* Ucb;
1763 struct _KUMS_CONTEXT_HEADER* Uch;
1764 #else
1765 ULONG WaitTime;
1766 union
1767 {
1768 struct
1769 {
1770 SHORT KernelApcDisable;
1771 SHORT SpecialApcDisable;
1772 };
1773 ULONG CombinedApcDisable;
1774 };
1775 #endif
1776 };
1777 };
1778
1779 #ifdef _WIN64
1780 PVOID TebMappedLowVa;
1781 #endif
1782 LIST_ENTRY QueueListEntry;
1783 #if (NTDDI_VERSION >= 0x060223F0) // since 6.2.9200.16384
1784 union
1785 {
1786 ULONG NextProcessor;
1787 struct
1788 {
1789 ULONG NextProcessorNumber : 31;
1790 ULONG SharedReadyQueue : 1;
1791 };
1792 };
1793 LONG QueuePriority;
1794 #else
1795 ULONG NextProcessor;
1796 ULONG DeferredProcessor;
1797 #endif
1798 PKPROCESS Process;
1799
1800 union
1801 {
1802 GROUP_AFFINITY UserAffinity;
1803 struct
1804 {
1805 UCHAR UserAffinityFill[FIELD_OFFSET(GROUP_AFFINITY, Reserved)]; // 32bit: 6/0x6, 64bit: 10/0x0A
1806 CHAR PreviousMode;
1807 CHAR BasePriority;
1808 union
1809 {
1810 CHAR PriorityDecrement;
1811 struct
1812 {
1813 UCHAR ForegroundBoost : 4;
1814 UCHAR UnusualBoost : 4;
1815 };
1816 };
1817 UCHAR Preempted;
1818 UCHAR AdjustReason;
1819 CHAR AdjustIncrement;
1820 };
1821 };
1822
1823 #if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.10240.16384
1824 ULONG_PTR AffinityVersion;
1825 #endif
1826 union
1827 {
1828 GROUP_AFFINITY Affinity;
1829 struct
1830 {
1831 UCHAR AffinityFill[FIELD_OFFSET(GROUP_AFFINITY, Reserved)]; // 32bit: 6/0x6, 64bit: 10/0x0A
1832 UCHAR ApcStateIndex;
1833 UCHAR WaitBlockCount;
1834 ULONG IdealProcessor;
1835 };
1836 };
1837
1838 #if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.10240.16384
1839 #ifdef _WIN64
1840 ULONG64 NpxState;
1841 #else
1842 ULONG Spare15;
1843 #endif
1844 #else
1845 PKAPC_STATE ApcStatePointer[2];
1846 #endif
1847
1848 union
1849 {
1850 KAPC_STATE SavedApcState;
1851 struct
1852 {
1853 UCHAR SavedApcStateFill[FIELD_OFFSET(KAPC_STATE, UserApcPending) + 1]; // 32bit: 23/0x17, 64bit: 43/0x2B
1854 UCHAR WaitReason;
1855 CHAR SuspendCount;
1856 CHAR Saturation;
1857 SHORT SListFaultCount;
1858 };
1859 };
1860
1861 union
1862 {
1863 KAPC SchedulerApc;
1864 struct
1865 {
1866 UCHAR SchedulerApcFill0[FIELD_OFFSET(KAPC, SpareByte0)]; // 32bit: 1/0x01, 64bit: 1/0x01
1867 UCHAR ResourceIndex;
1868 };
1869 struct
1870 {
1871 UCHAR SchedulerApcFill1[FIELD_OFFSET(KAPC, SpareByte1)]; // 32bit: 3/0x03, 64bit: 3/0x03
1872 UCHAR QuantumReset;
1873 };
1874 struct
1875 {
1876 UCHAR SchedulerApcFill2[FIELD_OFFSET(KAPC, SpareLong0)]; // 32bit: 4/0x04, 64bit: 4/0x04
1877 ULONG KernelTime;
1878 };
1879 struct
1880 {
1881 UCHAR SuspendApcFill3[FIELD_OFFSET(KAPC, SystemArgument1)]; // 32 bit:, 64 bit: 64/0x40
1882 PKPRCB WaitPrcb;
1883 };
1884 struct
1885 {
1886 UCHAR SchedulerApcFill4[FIELD_OFFSET(KAPC, SystemArgument2)]; // 32 bit:, 64 bit: 72/0x48
1887 PVOID LegoData;
1888 };
1889 struct
1890 {
1891 UCHAR SchedulerApcFill5[FIELD_OFFSET(KAPC, Inserted) + 1]; // 32 bit:, 64 bit: 83/0x53
1892 UCHAR CallbackNestingLevel;
1893 ULONG UserTime;
1894 };
1895 };
1896
1897 KEVENT SuspendEvent;
1898 LIST_ENTRY ThreadListEntry;
1899 LIST_ENTRY MutantListHead;
1900
1901 #if (NTDDI_VERSION >= NTDDI_WIN10)
1902 UCHAR AbEntrySummary;
1903 UCHAR AbWaitEntryCount;
1904 USHORT Spare20;
1905 #if _WIN64
1906 ULONG SecureThreadCookie;
1907 #endif
1908 #elif (NTDDI_VERSION >= NTDDI_WINBLUE) // 6.3.9431.0
1909 SINGLE_LIST_ENTRY LockEntriesFreeList;
1910 #endif
1911
1912 #if (NTDDI_VERSION >= NTDDI_WINBLUE /* 0x06032580 */) // since 6.3.9600.16384
1913 KLOCK_ENTRY LockEntries[NUMBER_OF_LOCK_ENTRIES];
1914 SINGLE_LIST_ENTRY PropagateBoostsEntry;
1915 SINGLE_LIST_ENTRY IoSelfBoostsEntry;
1916 UCHAR PriorityFloorCounts[16];
1917 ULONG PriorityFloorSummary;
1918 volatile LONG AbCompletedIoBoostCount;
1919 #if (NTDDI_VERSION >= NTDDI_WIN10_RS1)
1920 LONG AbCompletedIoQoSBoostCount;
1921 #endif
1922
1923 #if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.10240.16384
1924 volatile SHORT KeReferenceCount;
1925 #else
1926 volatile SHORT AbReferenceCount;
1927 #endif
1928 #if (NTDDI_VERSION >= 0x06040000) // since 6.4.9841.0
1929 UCHAR AbOrphanedEntrySummary;
1930 UCHAR AbOwnedEntryCount;
1931 #else
1932 UCHAR AbFreeEntryCount;
1933 UCHAR AbWaitEntryCount;
1934 #endif
1935 ULONG ForegroundLossTime;
1936 union
1937 {
1938 LIST_ENTRY GlobalForegroundListEntry;
1939 struct
1940 {
1941 SINGLE_LIST_ENTRY ForegroundDpcStackListEntry;
1942 ULONG_PTR InGlobalForegroundList;
1943 };
1944 };
1945 #endif
1946
1947 #if _WIN64
1948 LONG64 ReadOperationCount;
1949 LONG64 WriteOperationCount;
1950 LONG64 OtherOperationCount;
1951 LONG64 ReadTransferCount;
1952 LONG64 WriteTransferCount;
1953 LONG64 OtherTransferCount;
1954 #endif
1955 #if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.10041.0
1956 struct _KSCB *QueuedScb;
1957 #ifndef _WIN64
1958 ULONG64 NpxState;
1959 #endif
1960 #endif
1961 } KTHREAD;
1962
1963 #endif
1964
1965
1966 #define ASSERT_THREAD(object) \
1967 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ThreadObject))
1968
1969 //
1970 // Kernel Process (KPROCESS)
1971 //
1972 typedef struct _KPROCESS
1973 {
1974 DISPATCHER_HEADER Header;
1975 LIST_ENTRY ProfileListHead;
1976 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1977 ULONG_PTR DirectoryTableBase;
1978 ULONG Unused0;
1979 #else
1980 ULONG_PTR DirectoryTableBase[2];
1981 #endif
1982 #if defined(_M_IX86)
1983 KGDTENTRY LdtDescriptor;
1984 KIDTENTRY Int21Descriptor;
1985 #endif
1986 USHORT IopmOffset;
1987 #if defined(_M_IX86)
1988 UCHAR Iopl;
1989 UCHAR Unused;
1990 #endif
1991 volatile ULONG ActiveProcessors;
1992 ULONG KernelTime;
1993 ULONG UserTime;
1994 LIST_ENTRY ReadyListHead;
1995 SINGLE_LIST_ENTRY SwapListEntry;
1996 PVOID VdmTrapcHandler;
1997 LIST_ENTRY ThreadListHead;
1998 KSPIN_LOCK ProcessLock;
1999 KAFFINITY Affinity;
2000 union
2001 {
2002 struct
2003 {
2004 LONG AutoAlignment:1;
2005 LONG DisableBoost:1;
2006 LONG DisableQuantum:1;
2007 LONG ReservedFlags:29;
2008 };
2009 LONG ProcessFlags;
2010 };
2011 SCHAR BasePriority;
2012 SCHAR QuantumReset;
2013 UCHAR State;
2014 UCHAR ThreadSeed;
2015 UCHAR PowerState;
2016 UCHAR IdealNode;
2017 UCHAR Visited;
2018 union
2019 {
2020 KEXECUTE_OPTIONS Flags;
2021 UCHAR ExecuteOptions;
2022 };
2023 ULONG StackCount;
2024 LIST_ENTRY ProcessListEntry;
2025 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
2026 ULONGLONG CycleTime;
2027 #endif // ]
2028 } KPROCESS;
2029
2030 #define ASSERT_PROCESS(object) \
2031 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ProcessObject))
2032
2033 //
2034 // System Service Table Descriptor
2035 //
2036 typedef struct _KSERVICE_TABLE_DESCRIPTOR
2037 {
2038 PULONG_PTR Base;
2039 PULONG Count;
2040 ULONG Limit;
2041 #if defined(_IA64_)
2042 LONG TableBaseGpOffset;
2043 #endif
2044 PUCHAR Number;
2045 } KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;
2046
2047 #if (NTDDI_VERSION >= NTDDI_WIN8)
2048 //
2049 // Entropy Timing State
2050 //
2051 typedef struct _KENTROPY_TIMING_STATE
2052 {
2053 ULONG EntropyCount;
2054 ULONG Buffer[64];
2055 KDPC Dpc;
2056 ULONG LastDeliveredBuffer;
2057 PULONG RawDataBuffer;
2058 } KENTROPY_TIMING_STATE, *PKENTROPY_TIMING_STATE;
2059
2060 //
2061 // Constants from ks386.inc, ksamd64.inc and ksarm.h
2062 //
2063 #define KENTROPY_TIMING_INTERRUPTS_PER_BUFFER 0x400
2064 #define KENTROPY_TIMING_BUFFER_MASK 0x7ff
2065 #define KENTROPY_TIMING_ANALYSIS 0x0
2066
2067 #endif /* (NTDDI_VERSION >= NTDDI_WIN8) */
2068
2069 //
2070 // Exported Loader Parameter Block
2071 //
2072 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI *KeLoaderBlock;
2073
2074 //
2075 // Exported Hardware Data
2076 //
2077 extern ULONG NTSYSAPI KiDmaIoCoherency;
2078 extern ULONG NTSYSAPI KeMaximumIncrement;
2079 extern ULONG NTSYSAPI KeMinimumIncrement;
2080 extern ULONG NTSYSAPI KeDcacheFlushCount;
2081 extern ULONG NTSYSAPI KeIcacheFlushCount;
2082 extern ULONG_PTR NTSYSAPI KiBugCheckData[];
2083 extern BOOLEAN NTSYSAPI KiEnableTimerWatchdog;
2084
2085 //
2086 // Exported System Service Descriptor Tables
2087 //
2088 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable[SSDT_MAX_ENTRIES];
2089 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow[SSDT_MAX_ENTRIES];
2090
2091 #endif // !NTOS_MODE_USER
2092
2093 #endif // _KETYPES_H