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