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