[REACTOS]
[reactos.git] / reactos / include / ndk / amd64 / ketypes.h
1 /*++ NDK Version: 0098
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4
5 Header Name:
6
7 ketypes.h (AMD64)
8
9 Abstract:
10
11 amd64 Type definitions for the Kernel services.
12
13 Author:
14
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
16 Timo Kreuzer (timo.kreuzer@reactos.org) - Updated - 14-Aug-2008
17
18 --*/
19
20 #ifndef _AMD64_KETYPES_H
21 #define _AMD64_KETYPES_H
22
23 //
24 // Dependencies
25 //
26
27 //
28 // KPCR Access for non-IA64 builds
29 //
30 //#define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
31 //#define PCR ((volatile KPCR * const)K0IPCR)
32 #define PCR ((volatile KPCR * const)__readgsqword(FIELD_OFFSET(KPCR, Self)))
33 //#if defined(CONFIG_SMP) || defined(NT_BUILD)
34 //#undef KeGetPcr
35 //#define KeGetPcr() ((volatile KPCR * const)__readfsdword(0x1C))
36 //#endif
37
38 //
39 // Machine Types
40 //
41 #define MACHINE_TYPE_ISA 0x0000
42 #define MACHINE_TYPE_EISA 0x0001
43 #define MACHINE_TYPE_MCA 0x0002
44
45 //
46 // X86 80386 Segment Types
47 //
48 #define I386_TASK_GATE 0x5
49 #define I386_TSS 0x9
50 #define I386_ACTIVE_TSS 0xB
51 #define I386_CALL_GATE 0xC
52 #define I386_INTERRUPT_GATE 0xE
53 #define I386_TRAP_GATE 0xF
54
55 //
56 // Selector Names
57 //
58 #define RPL_MASK 0x0003
59 #define MODE_MASK 0x0001
60 #define KGDT64_NULL 0x0000
61 #define KGDT64_R0_CODE 0x0010
62 #define KGDT64_R0_DATA 0x0018
63 #define KGDT64_R3_CMCODE 0x0020
64 #define KGDT64_R3_DATA 0x0028
65 #define KGDT64_R3_CODE 0x0030
66 #define KGDT64_SYS_TSS 0x0040
67 #define KGDT64_R3_CMTEB 0x0050
68
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 #define CR4_CHANNELS 0x800
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 #define EFLAGS_TF_MASK 0x0100
102 #define EFLAGS_TF_SHIFT 0x0008
103 #define EFLAGS_ID_MASK 0x200000
104 #define EFLAGS_IF_MASK 0x0200
105 #define EFLAGS_IF_SHIFT 0x0009
106
107 //
108 // Machine Specific Registers
109 //
110 #define MSR_MCG_STATUS 0x017A
111 #define MSR_DEGUG_CTL 0x01D9
112 #define MSR_LAST_BRANCH_FROM 0x01DB
113 #define MSR_LAST_BRANCH_TO 0x01DC
114 #define MSR_LAST_EXCEPTION_FROM 0x01DD
115 #define MSR_LAST_EXCEPTION_TO 0x01DE
116 #define MSR_PAT 0x0277
117 #define MSR_AMD_ACCESS 0x9C5A203A
118 #define MSR_EFER 0xC0000080
119 #define MSR_STAR 0xC0000081
120 #define MSR_LSTAR 0xC0000082
121 #define MSR_CSTAR 0xC0000083
122 #define MSR_SYSCALL_MASK 0xC0000084
123 #define MSR_FS_BASE 0xC0000100
124 #define MSR_GS_BASE 0xC0000101
125 #define MSR_GS_SWAP 0xC0000102
126
127 //
128 // Flags in MSR_EFER
129 //
130 #define MSR_LMA 0x0400
131 #define MSR_LME 0x0100
132 #define MSR_SCE 0x0001
133 #define MSR_NXE 0x0800
134
135 //
136 // IPI Types
137 //
138 #define IPI_APC 1
139 #define IPI_DPC 2
140 #define IPI_FREEZE 4
141 #define IPI_PACKET_READY 8
142 #define IPI_SYNCH_REQUEST 16
143
144 //
145 // PRCB Flags
146 //
147 #define PRCB_MAJOR_VERSION 1
148 #define PRCB_BUILD_DEBUG 1
149 #define PRCB_BUILD_UNIPROCESSOR 2
150
151 //
152 // Service Table
153 //
154 #define NUMBER_SERVICE_TABLES 2
155 #define SERVICE_NUMBER_MASK 0xFFF
156 #define SERVICE_TABLE_SHIFT 7
157 #define SERVICE_TABLE_MASK 0x20
158 #define SERVICE_TABLE_TEST 0x20
159
160 //
161 // HAL Variables
162 //
163 #define INITIAL_STALL_COUNT 100
164 #define HYPERSPACE_BASE 0xfffff70000000000ULL
165 #define MM_HAL_VA_START 0xFFFFFFFFFFC00000ULL /* This is Vista+ */
166 #define MM_HAL_VA_END 0xFFFFFFFFFFFFFFFFULL
167 #define APIC_BASE 0xFFFFFFFFFFFE0000ULL
168
169 //
170 // IOPM Definitions
171 //
172 #define IO_ACCESS_MAP_NONE 0
173 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
174 #define KiComputeIopmOffset(MapNumber) \
175 (MapNumber == IO_ACCESS_MAP_NONE) ? \
176 (USHORT)(sizeof(KTSS)) : \
177 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
178
179 //
180 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
181 //
182 #define KSEG0_BASE 0xfffff80000000000ULL
183
184 //
185 // Synchronization-level IRQL
186 //
187 #define SYNCH_LEVEL 12
188
189 #define NMI_STACK_SIZE 0x2000
190
191 //
192 // Trap Frame Definition
193 //
194 typedef struct _KTRAP_FRAME
195 {
196 UINT64 P1Home;
197 UINT64 P2Home;
198 UINT64 P3Home;
199 UINT64 P4Home;
200 UINT64 P5;
201 CHAR PreviousMode;
202 UCHAR PreviousIrql;
203 UCHAR FaultIndicator;
204 UCHAR ExceptionActive;
205 ULONG MxCsr;
206 UINT64 Rax;
207 UINT64 Rcx;
208 UINT64 Rdx;
209 UINT64 R8;
210 UINT64 R9;
211 UINT64 R10;
212 UINT64 R11;
213 union
214 {
215 UINT64 GsBase;
216 UINT64 GsSwap;
217 };
218 M128A Xmm0;
219 M128A Xmm1;
220 M128A Xmm2;
221 M128A Xmm3;
222 M128A Xmm4;
223 M128A Xmm5;
224 union
225 {
226 UINT64 FaultAddress;
227 UINT64 ContextRecord;
228 UINT64 TimeStampCKCL;
229 };
230 UINT64 Dr0;
231 UINT64 Dr1;
232 UINT64 Dr2;
233 UINT64 Dr3;
234 UINT64 Dr6;
235 UINT64 Dr7;
236 union
237 {
238 struct
239 {
240 UINT64 DebugControl;
241 UINT64 LastBranchToRip;
242 UINT64 LastBranchFromRip;
243 UINT64 LastExceptionToRip;
244 UINT64 LastExceptionFromRip;
245 };
246 struct
247 {
248 UINT64 LastBranchControl;
249 ULONG LastBranchMSR;
250 };
251 };
252 USHORT SegDs;
253 USHORT SegEs;
254 USHORT SegFs;
255 USHORT SegGs;
256 UINT64 TrapFrame;
257 UINT64 Rbx;
258 UINT64 Rdi;
259 UINT64 Rsi;
260 UINT64 Rbp;
261 union
262 {
263 UINT64 ErrorCode;
264 UINT64 ExceptionFrame;
265 UINT64 TimeStampKlog;
266 };
267 UINT64 Rip;
268 USHORT SegCs;
269 UCHAR Fill0;
270 UCHAR Logging;
271 USHORT Fill1[2];
272 ULONG EFlags;
273 ULONG Fill2;
274 UINT64 Rsp;
275 USHORT SegSs;
276 USHORT Fill3;
277 LONG CodePatchCycle;
278 } KTRAP_FRAME, *PKTRAP_FRAME;
279
280 //
281 // Defines the Callback Stack Layout for User Mode Callbacks
282 //
283 typedef struct _KCALLOUT_FRAME
284 {
285 ULONG64 InitialStack;
286 ULONG64 TrapFrame;
287 ULONG64 CallbackStack;
288 ULONG64 Rdi;
289 ULONG64 Rsi;
290 ULONG64 Rbx;
291 ULONG64 Rbp;
292 ULONG64 ReturnAddress;
293 ULONG64 Result;
294 ULONG64 ResultLength;
295 } KCALLOUT_FRAME, *PKCALLOUT_FRAME;
296
297 //
298 // Dummy LDT_ENTRY
299 //
300 #ifndef _LDT_ENTRY_DEFINED
301 #define _LDT_ENTRY_DEFINED
302 typedef ULONG LDT_ENTRY;
303 #endif
304
305 //
306 // GDT Entry Definition
307 //
308 typedef union _KGDTENTRY64
309 {
310 struct
311 {
312 USHORT LimitLow;
313 USHORT BaseLow;
314 union
315 {
316 struct
317 {
318 UCHAR BaseMiddle;
319 UCHAR Flags1;
320 UCHAR Flags2;
321 UCHAR BaseHigh;
322 } Bytes;
323 struct
324 {
325 ULONG BaseMiddle:8;
326 ULONG Type:5;
327 ULONG Dpl:2;
328 ULONG Present:1;
329 ULONG LimitHigh:4;
330 ULONG System:1;
331 ULONG LongMode:1;
332 ULONG DefaultBig:1;
333 ULONG Granularity:1;
334 ULONG BaseHigh:8;
335 } Bits;
336 };
337 ULONG BaseUpper;
338 ULONG MustBeZero;
339 };
340 UINT64 Alignment;
341 } KGDTENTRY64, *PKGDTENTRY64;
342 #define KGDTENTRY KGDTENTRY64
343 #define PKGDTENTRY PKGDTENTRY64
344
345 //
346 // IDT Entry Access Definition
347 //
348 typedef struct _KIDT_ACCESS
349 {
350 union
351 {
352 struct
353 {
354 UCHAR Reserved;
355 UCHAR SegmentType:4;
356 UCHAR SystemSegmentFlag:1;
357 UCHAR Dpl:2;
358 UCHAR Present:1;
359 };
360 USHORT Value;
361 };
362 } KIDT_ACCESS, *PKIDT_ACCESS;
363
364 //
365 // IDT Entry Definition
366 //
367 typedef union _KIDTENTRY64
368 {
369 struct
370 {
371 USHORT OffsetLow;
372 USHORT Selector;
373 USHORT IstIndex:3;
374 USHORT Reserved0:5;
375 USHORT Type:5;
376 USHORT Dpl:2;
377 USHORT Present:1;
378 USHORT OffsetMiddle;
379 ULONG OffsetHigh;
380 ULONG Reserved1;
381 };
382 UINT64 Alignment;
383 } KIDTENTRY64, *PKIDTENTRY64;
384 #define KIDTENTRY KIDTENTRY64
385 #define PKIDTENTRY PKIDTENTRY64
386
387 typedef struct _KDESCRIPTOR
388 {
389 USHORT Pad[3];
390 USHORT Limit;
391 PVOID Base;
392 } KDESCRIPTOR, *PKDESCRIPTOR;
393
394 #ifndef NTOS_MODE_USER
395
396 //
397 // Special Registers Structure (outside of CONTEXT)
398 //
399 typedef struct _KSPECIAL_REGISTERS
400 {
401 UINT64 Cr0;
402 UINT64 Cr2;
403 UINT64 Cr3;
404 UINT64 Cr4;
405 UINT64 KernelDr0;
406 UINT64 KernelDr1;
407 UINT64 KernelDr2;
408 UINT64 KernelDr3;
409 UINT64 KernelDr6;
410 UINT64 KernelDr7;
411 struct _KDESCRIPTOR Gdtr;
412 struct _KDESCRIPTOR Idtr;
413 USHORT Tr;
414 USHORT Ldtr;
415 ULONG MxCsr;
416 UINT64 DebugControl;
417 UINT64 LastBranchToRip;
418 UINT64 LastBranchFromRip;
419 UINT64 LastExceptionToRip;
420 UINT64 LastExceptionFromRip;
421 UINT64 Cr8;
422 UINT64 MsrGsBase;
423 UINT64 MsrGsSwap;
424 UINT64 MsrStar;
425 UINT64 MsrLStar;
426 UINT64 MsrCStar;
427 UINT64 MsrSyscallMask;
428 } KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
429
430 //
431 // Processor State Data
432 //
433 typedef struct _KPROCESSOR_STATE
434 {
435 KSPECIAL_REGISTERS SpecialRegisters;
436 CONTEXT ContextFrame;
437 } KPROCESSOR_STATE, *PKPROCESSOR_STATE;
438
439 #if (NTDDI_VERSION < NTDDI_LONGHORN)
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 typedef struct _DISPATCHER_CONTEXT
867 {
868 ULONG64 ControlPc;
869 PVOID ImageBase;
870 PVOID FunctionEntry;
871 PVOID EstablisherFrame;
872 ULONG64 TargetIp;
873 PVOID ContextRecord;
874 PVOID LanguageHandler;
875 PVOID HandlerData;
876 PVOID HistoryTable;
877 ULONG ScopeIndex;
878 } DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
879
880
881 typedef struct _KSTART_FRAME
882 {
883 ULONG64 P1Home;
884 ULONG64 P2Home;
885 ULONG64 P3Home;
886 ULONG64 P4Home;
887 ULONG64 P5Home;
888 ULONG64 Return;
889 } KSTART_FRAME, *PKSTART_FRAME;
890
891 typedef struct _KSWITCH_FRAME
892 {
893 ULONG64 P1Home;
894 ULONG64 P2Home;
895 ULONG64 P3Home;
896 ULONG64 P4Home;
897 ULONG64 P5Home;
898 ULONG64 ApcBypass;
899 ULONG64 Rbp;
900 ULONG64 Return;
901 } KSWITCH_FRAME, *PKSWITCH_FRAME;
902
903 #if 0
904 typedef struct _KTIMER_TABLE_ENTRY
905 {
906 ULONG_PTR Lock;
907 LIST_ENTRY Entry;
908 ULARGE_INTEGER Time;
909 } KTIMER_TABLE_ENTRY, *PKTIMER_TABLE_ENTRY;
910
911 typedef struct _KTIMER_TABLE
912 {
913 KTIMER* TimerExpiry[64];
914 KTIMER_TABLE_ENTRY TimerEntries[256];
915 } KTIMER_TABLE, *PKTIMER_TABLE;
916 #endif
917
918 //
919 // Inline function to get current KPRCB
920 //
921 FORCEINLINE
922 struct _KPRCB *
923 KeGetCurrentPrcb(VOID)
924 {
925 return (struct _KPRCB *)__readgsqword(FIELD_OFFSET(KIPCR, CurrentPrcb));
926 }
927
928 #endif
929 #endif