9e9042fa19a6cc7c30e1176f852205f5dcbda277
[reactos.git] / reactos / include / ndk / amd64 / ketypes.h
1 /*++ NDK Version: 0098
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4 Copyright (c) Timo Kreuzer. All rights reserved.
5
6 Header Name:
7
8 ketypes.h (AMD64)
9
10 Abstract:
11
12 amd64 Type definitions for the Kernel services.
13
14 Author:
15
16 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
17 Timo Kreuzer (timo.kreuzer@reactos.org) - Updated - 14-Aug-2008
18
19 --*/
20
21 #ifndef _AMD64_KETYPES_H
22 #define _AMD64_KETYPES_H
23
24 //
25 // Dependencies
26 //
27
28 //
29 // KPCR Access for non-IA64 builds
30 //
31 //#define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
32 //#define PCR ((volatile KPCR * const)K0IPCR)
33 #define PCR ((volatile KPCR * const)__readgsqword(FIELD_OFFSET(KPCR, Self)))
34 //#if defined(CONFIG_SMP) || defined(NT_BUILD)
35 //#undef KeGetPcr
36 //#define KeGetPcr() ((volatile KPCR * const)__readfsdword(0x1C))
37 //#endif
38
39 //
40 // Machine Types
41 //
42 #define MACHINE_TYPE_ISA 0x0000
43 #define MACHINE_TYPE_EISA 0x0001
44 #define MACHINE_TYPE_MCA 0x0002
45
46 //
47 // X86 80386 Segment Types
48 //
49 #define I386_TASK_GATE 0x5
50 #define I386_TSS 0x9
51 #define I386_ACTIVE_TSS 0xB
52 #define I386_CALL_GATE 0xC
53 #define I386_INTERRUPT_GATE 0xE
54 #define I386_TRAP_GATE 0xF
55
56 //
57 // Selector Names
58 //
59 #define RPL_MASK 0x0003
60 #define MODE_MASK 0x0001
61 #define KGDT64_NULL 0x0000
62 #define KGDT64_R0_CODE 0x0010
63 #define KGDT64_R0_DATA 0x0018
64 #define KGDT64_R3_CMCODE 0x0020
65 #define KGDT64_R3_DATA 0x0028
66 #define KGDT64_R3_CODE 0x0030
67 #define KGDT64_SYS_TSS 0x0040
68 #define KGDT64_R3_CMTEB 0x0050
69
70
71 //
72 // CR4
73 //
74 #define CR4_VME 0x1
75 #define CR4_PVI 0x2
76 #define CR4_TSD 0x4
77 #define CR4_DE 0x8
78 #define CR4_PSE 0x10
79 #define CR4_PAE 0x20
80 #define CR4_MCE 0x40
81 #define CR4_PGE 0x80
82 #define CR4_FXSR 0x200
83 #define CR4_XMMEXCPT 0x400
84
85 //
86 // EFlags
87 //
88 #define EFLAGS_CF 0x01L
89 #define EFLAGS_ZF 0x40L
90 #define EFLAGS_TF 0x100L
91 #define EFLAGS_INTERRUPT_MASK 0x200L
92 #define EFLAGS_DF 0x400L
93 #define EFLAGS_NESTED_TASK 0x4000L
94 #define EFLAGS_V86_MASK 0x20000
95 #define EFLAGS_ALIGN_CHECK 0x40000
96 #define EFLAGS_VIF 0x80000
97 #define EFLAGS_VIP 0x100000
98 #define EFLAGS_USER_SANITIZE 0x3F4DD7
99 #define EFLAG_SIGN 0x8000
100 #define EFLAG_ZERO 0x4000
101
102 //
103 // IPI Types
104 //
105 #define IPI_APC 1
106 #define IPI_DPC 2
107 #define IPI_FREEZE 4
108 #define IPI_PACKET_READY 8
109 #define IPI_SYNCH_REQUEST 16
110
111 //
112 // PRCB Flags
113 //
114 #define PRCB_MAJOR_VERSION 1
115 #define PRCB_BUILD_DEBUG 1
116 #define PRCB_BUILD_UNIPROCESSOR 2
117
118 //
119 // HAL Variables
120 //
121 #define INITIAL_STALL_COUNT 100
122
123 //
124 // IOPM Definitions
125 //
126 #define IO_ACCESS_MAP_NONE 0
127 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
128 #define KiComputeIopmOffset(MapNumber) \
129 (MapNumber == IO_ACCESS_MAP_NONE) ? \
130 (USHORT)(sizeof(KTSS)) : \
131 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
132
133 //
134 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
135 //
136 #define KSEG0_BASE 0xfffff80000000000ULL
137
138 //
139 // Synchronization-level IRQL
140 //
141 #ifndef CONFIG_SMP
142 #define SYNCH_LEVEL DISPATCH_LEVEL
143 #else
144 #define SYNCH_LEVEL (IPI_LEVEL - 2)
145 #endif
146
147 //
148 // Trap Frame Definition
149 //
150 typedef struct _KTRAP_FRAME
151 {
152 UINT64 P1Home;
153 UINT64 P2Home;
154 UINT64 P3Home;
155 UINT64 P4Home;
156 UINT64 P5;
157 CHAR PreviousMode;
158 UCHAR PreviousIrql;
159 UCHAR FaultIndicator;
160 UCHAR ExceptionActive;
161 ULONG MxCsr;
162 UINT64 Rax;
163 UINT64 Rcx;
164 UINT64 Rdx;
165 UINT64 R8;
166 UINT64 R9;
167 UINT64 R10;
168 UINT64 R11;
169 union
170 {
171 UINT64 GsBase;
172 UINT64 GsSwap;
173 };
174 M128A Xmm0;
175 M128A Xmm1;
176 M128A Xmm2;
177 M128A Xmm3;
178 M128A Xmm4;
179 M128A Xmm5;
180 union
181 {
182 UINT64 FaultAddress;
183 UINT64 ContextRecord;
184 UINT64 TimeStampCKCL;
185 };
186 UINT64 Dr0;
187 UINT64 Dr1;
188 UINT64 Dr2;
189 UINT64 Dr3;
190 UINT64 Dr6;
191 UINT64 Dr7;
192 union
193 {
194 struct
195 {
196 UINT64 DebugControl;
197 UINT64 LastBranchToRip;
198 UINT64 LastBranchFromRip;
199 UINT64 LastExceptionToRip;
200 UINT64 LastExceptionFromRip;
201 };
202 struct
203 {
204 UINT64 LastBranchControl;
205 ULONG LastBranchMSR;
206 };
207 };
208 USHORT SegDs;
209 USHORT SegEs;
210 USHORT SegFs;
211 USHORT SegGs;
212 UINT64 TrapFrame;
213 UINT64 Rbx;
214 UINT64 Rdi;
215 UINT64 Rsi;
216 UINT64 Rbp;
217 union
218 {
219 UINT64 ErrorCode;
220 UINT64 ExceptionFrame;
221 UINT64 TimeStampKlog;
222 };
223 UINT64 Rip;
224 USHORT SegCs;
225 UCHAR Fill0;
226 UCHAR Logging;
227 USHORT Fill1[2];
228 ULONG EFlags;
229 ULONG Fill2;
230 UINT64 Rsp;
231 USHORT SegSs;
232 USHORT Fill3;
233 LONG CodePatchCycle;
234 } KTRAP_FRAME, *PKTRAP_FRAME;
235
236 //
237 // Defines the Callback Stack Layout for User Mode Callbacks
238 //
239 typedef struct _KCALLOUT_FRAME
240 {
241 ULONG64 InitialStack;
242 ULONG64 TrapFrame;
243 ULONG64 CallbackStack;
244 ULONG64 Rdi;
245 ULONG64 Rsi;
246 ULONG64 Rbx;
247 ULONG64 Rbp;
248 ULONG64 ReturnAddress;
249 ULONG64 Result;
250 ULONG64 ResultLength;
251 } KCALLOUT_FRAME, *PKCALLOUT_FRAME;
252
253 //
254 // Dummy LDT_ENTRY
255 //
256 #ifndef _LDT_ENTRY_DEFINED
257 #define _LDT_ENTRY_DEFINED
258 typedef ULONG LDT_ENTRY;
259 #endif
260
261 //
262 // GDT Entry Definition
263 //
264 typedef union _KGDTENTRY64
265 {
266 struct
267 {
268 USHORT LimitLow;
269 USHORT BaseLow;
270 union
271 {
272 struct
273 {
274 UCHAR BaseMiddle;
275 UCHAR Flags1;
276 UCHAR Flags2;
277 UCHAR BaseHigh;
278 } Bytes;
279 struct
280 {
281 ULONG BaseMiddle:8;
282 ULONG Type:5;
283 ULONG Dpl:2;
284 ULONG Present:1;
285 ULONG LimitHigh:4;
286 ULONG System:1;
287 ULONG LongMode:1;
288 ULONG DefaultBig:1;
289 ULONG Granularity:1;
290 ULONG BaseHigh:8;
291 } Bits;
292 };
293 ULONG BaseUpper;
294 ULONG MustBeZero;
295 };
296 UINT64 Alignment;
297 } KGDTENTRY64, *PKGDTENTRY64;
298 #define KGDTENTRY KGDTENTRY64
299 #define PKGDTENTRY PKGDTENTRY64
300
301 //
302 // IDT Entry Access Definition
303 //
304 typedef struct _KIDT_ACCESS
305 {
306 union
307 {
308 struct
309 {
310 UCHAR Reserved;
311 UCHAR SegmentType:4;
312 UCHAR SystemSegmentFlag:1;
313 UCHAR Dpl:2;
314 UCHAR Present:1;
315 };
316 USHORT Value;
317 };
318 } KIDT_ACCESS, *PKIDT_ACCESS;
319
320 //
321 // IDT Entry Definition
322 //
323 typedef union _KIDTENTRY64
324 {
325 struct
326 {
327 USHORT OffsetLow;
328 USHORT Selector;
329 USHORT IstIndex:3;
330 USHORT Reserved0:5;
331 USHORT Type:5;
332 USHORT Dpl:2;
333 USHORT Present:1;
334 USHORT OffsetMiddle;
335 ULONG OffsetHigh;
336 ULONG Reserved1;
337 };
338 UINT64 Alignment;
339 } KIDTENTRY64, *PKIDTENTRY64;
340 #define KIDTENTRY KIDTENTRY64
341 #define PKIDTENTRY PKIDTENTRY64
342
343 typedef struct _KDESCRIPTOR
344 {
345 USHORT Pad[3];
346 USHORT Limit;
347 PVOID Base;
348 } KDESCRIPTOR, *PKDESCRIPTOR;
349
350 #ifndef NTOS_MODE_USER
351
352 //
353 // Special Registers Structure (outside of CONTEXT)
354 //
355 typedef struct _KSPECIAL_REGISTERS
356 {
357 UINT64 Cr0;
358 UINT64 Cr2;
359 UINT64 Cr3;
360 UINT64 Cr4;
361 UINT64 KernelDr0;
362 UINT64 KernelDr1;
363 UINT64 KernelDr2;
364 UINT64 KernelDr3;
365 UINT64 KernelDr6;
366 UINT64 KernelDr7;
367 struct _KDESCRIPTOR Gdtr;
368 struct _KDESCRIPTOR Idtr;
369 USHORT Tr;
370 USHORT Ldtr;
371 ULONG MxCsr;
372 UINT64 DebugControl;
373 UINT64 LastBranchToRip;
374 UINT64 LastBranchFromRip;
375 UINT64 LastExceptionToRip;
376 UINT64 LastExceptionFromRip;
377 UINT64 Cr8;
378 UINT64 MsrGsBase;
379 UINT64 MsrGsSwap;
380 UINT64 MsrStar;
381 UINT64 MsrLStar;
382 UINT64 MsrCStar;
383 UINT64 MsrSyscallMask;
384 } KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
385
386 //
387 // Processor State Data
388 //
389 typedef struct _KPROCESSOR_STATE
390 {
391 KSPECIAL_REGISTERS SpecialRegisters;
392 CONTEXT ContextFrame;
393 } KPROCESSOR_STATE, *PKPROCESSOR_STATE;
394
395 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
396 typedef struct _GENERAL_LOOKASIDE_POOL
397 {
398 union
399 {
400 SLIST_HEADER ListHead;
401 SINGLE_LIST_ENTRY SingleListHead;
402 };
403 USHORT Depth;
404 USHORT MaximumDepth;
405 ULONG TotalAllocates;
406 union
407 {
408 ULONG AllocateMisses;
409 ULONG AllocateHits;
410 };
411 union
412 {
413 ULONG TotalFrees;
414 ULONG FreeMisses;
415 };
416 ULONG FreeHits;
417 POOL_TYPE Type;
418 ULONG Tag;
419 ULONG Size;
420 union
421 {
422 PVOID AllocateEx;
423 PVOID Allocate;
424 };
425 union
426 {
427 PVOID FreeEx;
428 PVOID Free;
429 };
430 LIST_ENTRY ListEntry;
431 ULONG LastTotalAllocates;
432 union
433 {
434 ULONG LastAllocateMisses;
435 ULONG LastAllocateHits;
436 };
437 ULONG Future[2];
438 } GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
439 #else
440 #define GENERAL_LOOKASIDE_POOL PP_LOOKASIDE_LIST
441 #endif
442
443 typedef struct _KREQUEST_PACKET
444 {
445 PVOID CurrentPacket[3];
446 PVOID WorkerRoutine;
447 } KREQUEST_PACKET, *PKREQUEST_PACKET;
448
449 typedef struct _REQUEST_MAILBOX
450 {
451 INT64 RequestSummary;
452 KREQUEST_PACKET RequestPacket;
453 PVOID Virtual[7];
454 } REQUEST_MAILBOX, *PREQUEST_MAILBOX;
455
456 //
457 // Processor Region Control Block
458 //
459 #pragma pack(push,4)
460 typedef struct _KPRCB
461 {
462 ULONG MxCsr;
463 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
464 USHORT Number;
465 #else
466 UCHAR Number;
467 UCHAR NestingLevel;
468 #endif
469 UCHAR InterruptRequest;
470 UCHAR IdleHalt;
471 struct _KTHREAD *CurrentThread;
472 struct _KTHREAD *NextThread;
473 struct _KTHREAD *IdleThread;
474 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
475 UCHAR NestingLevel;
476 UCHAR Group;
477 UCHAR PrcbPad00[6];
478 #else
479 UINT64 UserRsp;
480 #endif
481 UINT64 RspBase;
482 UINT64 PrcbLock;
483 UINT64 SetMember;
484 KPROCESSOR_STATE ProcessorState;
485 CHAR CpuType;
486 CHAR CpuID;
487 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
488 union
489 {
490 USHORT CpuStep;
491 struct
492 {
493 UCHAR CpuStepping;
494 UCHAR CpuModel;
495 };
496 };
497 #else
498 USHORT CpuStep;
499 #endif
500 ULONG MHz;
501 UINT64 HalReserved[8];
502 USHORT MinorVersion;
503 USHORT MajorVersion;
504 UCHAR BuildType;
505 UCHAR CpuVendor;
506 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
507 UCHAR CoresPerPhysicalProcessor;
508 UCHAR LogicalProcessorsPerCore;
509 #else
510 UCHAR InitialApicId;
511 UCHAR LogicalProcessorsPerPhysicalProcessor;
512 #endif
513 ULONG ApicMask;
514 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
515 ULONG CFlushSize;
516 #else
517 UCHAR CFlushSize;
518 UCHAR PrcbPad0x[3];
519 #endif
520 PVOID AcpiReserved;
521 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
522 ULONG InitialApicId;
523 ULONG Stride;
524 UINT64 PrcbPad01[3];
525 #else
526 UINT64 PrcbPad00[4];
527 #endif
528 KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock]; // 2003: 33, vista:49
529 PP_LOOKASIDE_LIST PPLookasideList[16];
530 GENERAL_LOOKASIDE_POOL PPNPagedLookasideList[32];
531 GENERAL_LOOKASIDE_POOL PPPagedLookasideList[32];
532 UINT64 PacketBarrier;
533 SINGLE_LIST_ENTRY DeferredReadyListHead;
534 LONG MmPageFaultCount;
535 LONG MmCopyOnWriteCount;
536 LONG MmTransitionCount;
537 #if (NTDDI_VERSION < NTDDI_LONGHORN)
538 LONG MmCacheTransitionCount;
539 #endif
540 LONG MmDemandZeroCount;
541 LONG MmPageReadCount;
542 LONG MmPageReadIoCount;
543 #if (NTDDI_VERSION < NTDDI_LONGHORN)
544 LONG MmCacheReadCount;
545 LONG MmCacheIoCount;
546 #endif
547 LONG MmDirtyPagesWriteCount;
548 LONG MmDirtyWriteIoCount;
549 LONG MmMappedPagesWriteCount;
550 LONG MmMappedWriteIoCount;
551 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
552 ULONG KeSystemCalls;
553 ULONG KeContextSwitches;
554 ULONG CcFastReadNoWait;
555 ULONG CcFastReadWait;
556 ULONG CcFastReadNotPossible;
557 ULONG CcCopyReadNoWait;
558 ULONG CcCopyReadWait;
559 ULONG CcCopyReadNoWaitMiss;
560 LONG LookasideIrpFloat;
561 #else
562 LONG LookasideIrpFloat;
563 ULONG KeSystemCalls;
564 #endif
565 LONG IoReadOperationCount;
566 LONG IoWriteOperationCount;
567 LONG IoOtherOperationCount;
568 LARGE_INTEGER IoReadTransferCount;
569 LARGE_INTEGER IoWriteTransferCount;
570 LARGE_INTEGER IoOtherTransferCount;
571 #if (NTDDI_VERSION < NTDDI_LONGHORN)
572 ULONG KeContextSwitches;
573 UCHAR PrcbPad2[12];
574 #endif
575 UINT64 TargetSet;
576 ULONG IpiFrozen;
577 UCHAR PrcbPad3[116];
578 REQUEST_MAILBOX RequestMailbox[64];
579 UINT64 SenderSummary;
580 UCHAR PrcbPad4[120];
581 KDPC_DATA DpcData[2];
582 PVOID DpcStack;
583 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
584 PVOID SparePtr0;
585 #else
586 PVOID SavedRsp;
587 #endif
588 LONG MaximumDpcQueueDepth;
589 ULONG DpcRequestRate;
590 ULONG MinimumDpcRate;
591 UCHAR DpcInterruptRequested;
592 UCHAR DpcThreadRequested;
593 UCHAR DpcRoutineActive;
594 UCHAR DpcThreadActive;
595 UINT64 TimerHand;
596 UINT64 TimerRequest;
597 LONG TickOffset;
598 LONG MasterOffset;
599 ULONG DpcLastCount;
600 UCHAR ThreadDpcEnable;
601 UCHAR QuantumEnd;
602 UCHAR PrcbPad50;
603 UCHAR IdleSchedule;
604 LONG DpcSetEventRequest;
605 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
606 ULONG KeExceptionDispatchCount;
607 #else
608 LONG PrcbPad40;
609 PVOID DpcThread;
610 #endif
611 KEVENT DpcEvent;
612 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
613 PVOID PrcbPad51;
614 #endif
615 KDPC CallDpc;
616 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
617 LONG ClockKeepAlive;
618 UCHAR ClockCheckSlot;
619 UCHAR ClockPollCycle;
620 UCHAR PrcbPad6[2];
621 LONG DpcWatchdogPeriod;
622 LONG DpcWatchdogCount;
623 UINT64 PrcbPad70[2];
624 #else
625 UINT64 PrcbPad7[4];
626 #endif
627 LIST_ENTRY WaitListHead;
628 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
629 UINT64 WaitLock;
630 #endif
631 ULONG ReadySummary;
632 ULONG QueueIndex;
633 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
634 UINT64 PrcbPad71[12];
635 #endif
636 LIST_ENTRY DispatcherReadyListHead[32];
637 ULONG InterruptCount;
638 ULONG KernelTime;
639 ULONG UserTime;
640 ULONG DpcTime;
641 ULONG InterruptTime;
642 ULONG AdjustDpcThreshold;
643 UCHAR SkipTick;
644 UCHAR DebuggerSavedIRQL;
645 UCHAR PollSlot;
646 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
647 UCHAR PrcbPad80[5];
648 ULONG DpcTimeCount;
649 ULONG DpcTimeLimit;
650 ULONG PeriodicCount;
651 ULONG PeriodicBias;
652 UINT64 PrcbPad81[2];
653 #else
654 UCHAR PrcbPad8[13];
655 #endif
656 struct _KNODE *ParentNode;
657 UINT64 MultiThreadProcessorSet;
658 struct _KPRCB *MultiThreadSetMaster;
659 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
660 UINT64 StartCycles;
661 LONG MmSpinLockOrdering;
662 ULONG PageColor;
663 ULONG NodeColor;
664 ULONG NodeShiftedColor;
665 ULONG SecondaryColorMask;
666 #endif
667 LONG Sleeping;
668 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
669 UINT64 CycleTime;
670 ULONG CcFastMdlReadNoWait;
671 ULONG CcFastMdlReadWait;
672 ULONG CcFastMdlReadNotPossible;
673 ULONG CcMapDataNoWait;
674 ULONG CcMapDataWait;
675 ULONG CcPinMappedDataCount;
676 ULONG CcPinReadNoWait;
677 ULONG CcPinReadWait;
678 ULONG CcMdlReadNoWait;
679 ULONG CcMdlReadWait;
680 ULONG CcLazyWriteHotSpots;
681 ULONG CcLazyWriteIos;
682 ULONG CcLazyWritePages;
683 ULONG CcDataFlushes;
684 ULONG CcDataPages;
685 ULONG CcLostDelayedWrites;
686 ULONG CcFastReadResourceMiss;
687 ULONG CcCopyReadWaitMiss;
688 ULONG CcFastMdlReadResourceMiss;
689 ULONG CcMapDataNoWaitMiss;
690 ULONG CcMapDataWaitMiss;
691 ULONG CcPinReadNoWaitMiss;
692 ULONG CcPinReadWaitMiss;
693 ULONG CcMdlReadNoWaitMiss;
694 ULONG CcMdlReadWaitMiss;
695 ULONG CcReadAheadIos;
696 LONG MmCacheTransitionCount;
697 LONG MmCacheReadCount;
698 LONG MmCacheIoCount;
699 ULONG PrcbPad91[3];
700 PROCESSOR_POWER_STATE PowerState;
701 ULONG KeAlignmentFixupCount;
702 UCHAR VendorString[13];
703 UCHAR PrcbPad10[3];
704 ULONG FeatureBits;
705 LARGE_INTEGER UpdateSignature;
706 KDPC DpcWatchdogDpc;
707 KTIMER DpcWatchdogTimer;
708 CACHE_DESCRIPTOR Cache[5];
709 ULONG CacheCount;
710 ULONG CachedCommit;
711 ULONG CachedResidentAvailable;
712 PVOID HyperPte;
713 PVOID WheaInfo;
714 PVOID EtwSupport;
715 SLIST_HEADER InterruptObjectPool;
716 SLIST_HEADER HypercallPageList;
717 PVOID HypercallPageVirtual;
718 PVOID VirtualApicAssist;
719 UINT64* StatisticsPage;
720 PVOID RateControl;
721 UINT64 CacheProcessorMask[5];
722 UINT64 PackageProcessorSet;
723 UINT64 CoreProcessorSet;
724 #else
725 ULONG PrcbPad90[1];
726 ULONG DebugDpcTime;
727 ULONG PageColor;
728 ULONG NodeColor;
729 ULONG NodeShiftedColor;
730 ULONG SecondaryColorMask;
731 UCHAR PrcbPad9[12];
732 ULONG CcFastReadNoWait;
733 ULONG CcFastReadWait;
734 ULONG CcFastReadNotPossible;
735 ULONG CcCopyReadNoWait;
736 ULONG CcCopyReadWait;
737 ULONG CcCopyReadNoWaitMiss;
738 ULONG KeAlignmentFixupCount;
739 ULONG KeDcacheFlushCount;
740 ULONG KeExceptionDispatchCount;
741 ULONG KeFirstLevelTbFills;
742 ULONG KeFloatingEmulationCount;
743 ULONG KeIcacheFlushCount;
744 ULONG KeSecondLevelTbFills;
745 UCHAR VendorString[13];
746 UCHAR PrcbPad10[2];
747 ULONG FeatureBits;
748 LARGE_INTEGER UpdateSignature;
749 PROCESSOR_POWER_STATE PowerState;
750 CACHE_DESCRIPTOR Cache[5];
751 ULONG CacheCount;
752 #endif
753 }
754 KPRCB, *PKPRCB;
755
756 //
757 // Processor Control Region
758 //
759 typedef struct _KIPCR
760 {
761 union
762 {
763 NT_TIB NtTib;
764 struct
765 {
766 union _KGDTENTRY64 *GdtBase;
767 struct _KTSS64 *TssBase;
768 ULONG64 UserRsp;
769 struct _KPCR *Self;
770 struct _KPRCB *CurrentPrcb;
771 PKSPIN_LOCK_QUEUE LockArray;
772 PVOID Used_Self;
773 };
774 };
775 union _KIDTENTRY64 *IdtBase;
776 ULONG64 Unused[2];
777 KIRQL Irql;
778 UCHAR SecondLevelCacheAssociativity;
779 UCHAR ObsoleteNumber;
780 UCHAR Fill0;
781 ULONG Unused0[3];
782 USHORT MajorVersion;
783 USHORT MinorVersion;
784 ULONG StallScaleFactor;
785 PVOID Unused1[3];
786 ULONG KernelReserved[15];
787 ULONG SecondLevelCacheSize;
788 ULONG HalReserved[16];
789 ULONG Unused2;
790 ULONG Fill1;
791 PVOID KdVersionBlock; // 0x108
792 PVOID Unused3;
793 ULONG PcrAlign1[24];
794 ULONG Fill2[2]; // 0x178
795 KPRCB Prcb; // 0x180
796
797 // hack:
798 ULONG ContextSwitches;
799
800 } KIPCR, *PKIPCR;
801 #pragma pack(pop)
802
803 //
804 // TSS Definition
805 //
806 typedef struct _KiIoAccessMap
807 {
808 UCHAR DirectionMap[32];
809 UCHAR IoMap[8196];
810 } KIIO_ACCESS_MAP;
811
812
813 #pragma pack(push,4)
814 typedef struct _KTSS64
815 {
816 /* 000 */ ULONG Reserved0;
817 /* 004 */ UINT64 Rsp0;
818 /* 00c */ UINT64 Rsp1;
819 /* 014 */ UINT64 Rsp2;
820 /* 01c */ UINT64 Ist[8];
821 /* 05c */ UINT64 Reserved1;
822 /* 064 */ USHORT Reserved2;
823 /* 066 */ USHORT IoMapBase;
824 } KTSS64, *PKTSS64;
825 #pragma pack(pop)
826 #define KTSS KTSS64
827 #define PKTSS PKTSS64
828
829 //
830 // KEXCEPTION_FRAME
831 //
832 typedef struct _KEXCEPTION_FRAME
833 {
834 UINT64 P1Home;
835 UINT64 P2Home;
836 UINT64 P3Home;
837 UINT64 P4Home;
838 UINT64 P5;
839 UINT64 InitialStack;
840 M128A Xmm6;
841 M128A Xmm7;
842 M128A Xmm8;
843 M128A Xmm9;
844 M128A Xmm10;
845 M128A Xmm11;
846 M128A Xmm12;
847 M128A Xmm13;
848 M128A Xmm14;
849 M128A Xmm15;
850 UINT64 TrapFrame;
851 UINT64 CallbackStack;
852 UINT64 OutputBuffer;
853 UINT64 OutputLength;
854 UINT64 MxCsr;
855 UINT64 Rbp;
856 UINT64 Rbx;
857 UINT64 Rdi;
858 UINT64 Rsi;
859 UINT64 R12;
860 UINT64 R13;
861 UINT64 R14;
862 UINT64 R15;
863 UINT64 Return;
864 } KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
865
866 //
867 // Inline function to get current KPRCB
868 //
869 FORCEINLINE
870 struct _KPRCB *
871 KeGetCurrentPrcb(VOID)
872 {
873 return (struct _KPRCB *)__readgsqword(FIELD_OFFSET(KIPCR, CurrentPrcb));
874 }
875
876 #endif
877 #endif