0609dac137e6c668882acf18d478f72d5c331d72
[reactos.git] / sdk / 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 // CPU Vendors
40 //
41 typedef enum
42 {
43 CPU_UNKNOWN,
44 CPU_AMD,
45 CPU_INTEL,
46 CPU_VIA
47 } CPU_VENDORS;
48
49 //
50 // Machine Types
51 //
52 #define MACHINE_TYPE_ISA 0x0000
53 #define MACHINE_TYPE_EISA 0x0001
54 #define MACHINE_TYPE_MCA 0x0002
55
56 //
57 // X86 80386 Segment Types
58 //
59 #define I386_TASK_GATE 0x5
60 #define I386_TSS 0x9
61 #define I386_ACTIVE_TSS 0xB
62 #define I386_CALL_GATE 0xC
63 #define I386_INTERRUPT_GATE 0xE
64 #define I386_TRAP_GATE 0xF
65
66 //
67 // Selector Names
68 //
69 #define RPL_MASK 0x0003
70 #define MODE_MASK 0x0001
71 #define KGDT64_NULL 0x0000
72 #define KGDT64_R0_CODE 0x0010
73 #define KGDT64_R0_DATA 0x0018
74 #define KGDT64_R3_CMCODE 0x0020
75 #define KGDT64_R3_DATA 0x0028
76 #define KGDT64_R3_CODE 0x0030
77 #define KGDT64_SYS_TSS 0x0040
78 #define KGDT64_R3_CMTEB 0x0050
79 #define KGDT64_R0_LDT 0x0060
80
81 //
82 // CR4
83 //
84 #define CR4_VME 0x1
85 #define CR4_PVI 0x2
86 #define CR4_TSD 0x4
87 #define CR4_DE 0x8
88 #define CR4_PSE 0x10
89 #define CR4_PAE 0x20
90 #define CR4_MCE 0x40
91 #define CR4_PGE 0x80
92 #define CR4_FXSR 0x200
93 #define CR4_XMMEXCPT 0x400
94 #define CR4_CHANNELS 0x800
95 #define CR4_XSAVE 0x40000
96
97 //
98 // DR7
99 //
100 #define DR7_LEGAL 0xFFFF0355
101 #define DR7_ACTIVE 0x00000355
102 #define DR7_TRACE_BRANCH 0x00000200
103 #define DR7_LAST_BRANCH 0x00000100
104
105 //
106 // Debug flags
107 //
108 #define DEBUG_ACTIVE_DR7 0x0001
109 #define DEBUG_ACTIVE_INSTRUMENTED 0x0002
110 #define DEBUG_ACTIVE_DBG_INSTRUMENTED 0x0003
111 #define DEBUG_ACTIVE_MINIMAL_THREAD 0x0004
112 #define DEBUG_ACTIVE_PRIMARY_THREAD 0x0080
113 #define DEBUG_ACTIVE_PRIMARY_THREAD_BIT 0x0007
114 #define DEBUG_ACTIVE_PRIMARY_THREAD_LOCK_BIT 0x001F
115 #define DEBUG_ACTIVE_SCHEDULED_THREAD 0x0040
116 #define DEBUG_ACTIVE_SCHEDULED_THREAD_BIT 0x0006
117 #define DEBUG_ACTIVE_SCHEDULED_THREAD_LOCK_BIT 0x001E
118 #define DEBUG_ACTIVE_SCHEDULED_THREAD_LOCK 0x40000000
119
120 //
121 // EFlags
122 //
123 #define EFLAGS_CF 0x01L
124 #define EFLAGS_ZF 0x40L
125 #define EFLAGS_TF 0x100L
126 #define EFLAGS_INTERRUPT_MASK 0x200L
127 #define EFLAGS_DF 0x400L
128 #define EFLAGS_NESTED_TASK 0x4000L
129 #define EFLAGS_V86_MASK 0x20000
130 #define EFLAGS_ALIGN_CHECK 0x40000
131 #define EFLAGS_VIF 0x80000
132 #define EFLAGS_VIP 0x100000
133 #define EFLAGS_USER_SANITIZE 0x3F4DD7
134 #define EFLAG_SIGN 0x8000
135 #define EFLAG_ZERO 0x4000
136 #define EFLAGS_TF_MASK 0x0100
137 #define EFLAGS_TF_SHIFT 0x0008
138 #define EFLAGS_ID_MASK 0x200000
139 #define EFLAGS_IF_MASK 0x0200
140 #define EFLAGS_IF_SHIFT 0x0009
141
142 //
143 // MXCSR Floating Control/Status Bit Masks
144 //
145 #define XSW_INVALID_OPERATION 0x0001
146 #define XSW_DENORMAL 0x0002
147 #define XSW_ZERO_DIVIDE 0x0004
148 #define XSW_OVERFLOW 0x0008
149 #define XSW_UNDERFLOW 0x0010
150 #define XSW_PRECISION 0x0020
151 #define XCW_INVALID_OPERATION 0x0080
152 #define XCW_DENORMAL 0x0100
153 #define XCW_ZERO_DIVIDE 0x0200
154 #define XCW_OVERFLOW 0x0400
155 #define XCW_UNDERFLOW 0x0800
156 #define XCW_PRECISION 0x1000
157 #define XCW_ROUND_CONTROL 0x6000
158 #define XCW_FLUSH_ZERO 0x8000
159 #define XSW_ERROR_MASK 0x003F
160 #define XSW_ERROR_SHIFT 7
161
162 //
163 // Legacy floating status word bit masks.
164 //
165 #define FSW_INVALID_OPERATION 0x0001
166 #define FSW_DENORMAL 0x0002
167 #define FSW_ZERO_DIVIDE 0x0004
168 #define FSW_OVERFLOW 0x0008
169 #define FSW_UNDERFLOW 0x0010
170 #define FSW_PRECISION 0x0020
171 #define FSW_STACK_FAULT 0x0040
172 #define FSW_ERROR_SUMMARY 0x0080
173 #define FSW_CONDITION_CODE_0 0x0100
174 #define FSW_CONDITION_CODE_1 0x0200
175 #define FSW_CONDITION_CODE_2 0x0400
176 #define FSW_CONDITION_CODE_3 0x4000
177 #define FSW_ERROR_MASK 0x003F
178
179 //
180 // Machine Specific Registers
181 //
182 #define MSR_EFER 0xC0000080
183 #define MSR_STAR 0xC0000081
184 #define MSR_LSTAR 0xC0000082
185 #define MSR_CSTAR 0xC0000083
186 #define MSR_SYSCALL_MASK 0xC0000084
187 #define MSR_FS_BASE 0xC0000100
188 #define MSR_GS_BASE 0xC0000101
189 #define MSR_GS_SWAP 0xC0000102
190 #define MSR_MCG_STATUS 0x017A
191 #define MSR_AMD_ACCESS 0x9C5A203A
192 #define MSR_IA32_MISC_ENABLE 0x01A0
193 #define MSR_LAST_BRANCH_FROM 0x01DB
194 #define MSR_LAST_BRANCH_TO 0x01DC
195 #define MSR_LAST_EXCEPTION_FROM 0x01DD
196 #define MSR_LAST_EXCEPTION_TO 0x01DE
197
198 //
199 // Caching values for the PAT MSR
200 //
201 #define PAT_UC 0ULL
202 #define PAT_WC 1ULL
203 #define PAT_WT 4ULL
204 #define PAT_WP 5ULL
205 #define PAT_WB 6ULL
206 #define PAT_UCM 7ULL
207
208 //
209 // Flags in MSR_EFER
210 //
211 #define MSR_SCE 0x0001
212 #define MSR_LME 0x0100
213 #define MSR_LMA 0x0400
214 #define MSR_NXE 0x0800
215 #define MSR_PAT 0x0277
216 #define MSR_DEBUG_CTL 0x01D9
217
218 //
219 // Flags in MSR_IA32_MISC_ENABLE
220 //
221 #define MSR_XD_ENABLE_MASK 0xFFFFFFFB
222
223 //
224 // Flags in MSR_DEBUG_CTL
225 //
226 #define MSR_DEBUG_CTL_LBR equ 0x0001
227 #define MSR_DEBUG_CTL_BTF equ 0x0002
228
229 //
230 // IPI Types
231 //
232 #define IPI_APC 1
233 #define IPI_DPC 2
234 #define IPI_FREEZE 4
235 #define IPI_PACKET_READY 8
236 #define IPI_SYNCH_REQUEST 16
237
238 //
239 // PRCB Flags
240 //
241 #define PRCB_MAJOR_VERSION 1
242 #define PRCB_BUILD_DEBUG 1
243 #define PRCB_BUILD_UNIPROCESSOR 2
244
245 //
246 // Exception active flags
247 //
248 #define KEXCEPTION_ACTIVE_INTERRUPT_FRAME 0x0000
249 #define KEXCEPTION_ACTIVE_EXCEPTION_FRAME 0x0001
250 #define KEXCEPTION_ACTIVE_SERVICE_FRAME 0x0002
251
252 //
253 // HAL Variables
254 //
255 #define INITIAL_STALL_COUNT 100
256 #define MM_HAL_VA_START 0xFFFFFFFFFFC00000ULL /* This is Vista+ */
257 #define MM_HAL_VA_END 0xFFFFFFFFFFFFFFFFULL
258 #define APIC_BASE 0xFFFFFFFFFFFE0000ULL
259
260 //
261 // IOPM Definitions
262 //
263 #define IO_ACCESS_MAP_NONE 0
264 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
265 #define KiComputeIopmOffset(MapNumber) \
266 (MapNumber == IO_ACCESS_MAP_NONE) ? \
267 (USHORT)(sizeof(KTSS)) : \
268 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
269
270 //
271 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
272 //
273 #define KSEG0_BASE 0xfffff80000000000ULL
274
275 //
276 // Synchronization-level IRQL
277 //
278 #define SYNCH_LEVEL 12
279
280 #define NMI_STACK_SIZE 0x2000
281 #define ISR_STACK_SIZE 0x6000
282
283 //
284 // Number of pool lookaside lists per pool in the PRCB
285 //
286 #define NUMBER_POOL_LOOKASIDE_LISTS 32
287
288 //
289 // Structure for CPUID
290 //
291 typedef union _CPU_INFO
292 {
293 UINT32 AsUINT32[4];
294 struct
295 {
296 ULONG Eax;
297 ULONG Ebx;
298 ULONG Ecx;
299 ULONG Edx;
300 };
301 } CPU_INFO, *PCPU_INFO;
302
303 //
304 // Trap Frame Definition
305 //
306 typedef struct _KTRAP_FRAME
307 {
308 UINT64 P1Home;
309 UINT64 P2Home;
310 UINT64 P3Home;
311 UINT64 P4Home;
312 UINT64 P5;
313 CHAR PreviousMode;
314 UCHAR PreviousIrql;
315 UCHAR FaultIndicator;
316 UCHAR ExceptionActive;
317 ULONG MxCsr;
318 UINT64 Rax;
319 UINT64 Rcx;
320 UINT64 Rdx;
321 UINT64 R8;
322 UINT64 R9;
323 UINT64 R10;
324 UINT64 R11;
325 union
326 {
327 UINT64 GsBase;
328 UINT64 GsSwap;
329 };
330 M128A Xmm0;
331 M128A Xmm1;
332 M128A Xmm2;
333 M128A Xmm3;
334 M128A Xmm4;
335 M128A Xmm5;
336 union
337 {
338 UINT64 FaultAddress;
339 UINT64 ContextRecord;
340 UINT64 TimeStampCKCL;
341 };
342 UINT64 Dr0;
343 UINT64 Dr1;
344 UINT64 Dr2;
345 UINT64 Dr3;
346 UINT64 Dr6;
347 UINT64 Dr7;
348 union
349 {
350 struct
351 {
352 UINT64 DebugControl;
353 UINT64 LastBranchToRip;
354 UINT64 LastBranchFromRip;
355 UINT64 LastExceptionToRip;
356 UINT64 LastExceptionFromRip;
357 };
358 struct
359 {
360 UINT64 LastBranchControl;
361 ULONG LastBranchMSR;
362 };
363 };
364 USHORT SegDs;
365 USHORT SegEs;
366 USHORT SegFs;
367 USHORT SegGs;
368 UINT64 TrapFrame;
369 UINT64 Rbx;
370 UINT64 Rdi;
371 UINT64 Rsi;
372 UINT64 Rbp;
373 union
374 {
375 UINT64 ErrorCode;
376 UINT64 ExceptionFrame;
377 UINT64 TimeStampKlog;
378 };
379 UINT64 Rip;
380 USHORT SegCs;
381 UCHAR Fill0;
382 UCHAR Logging;
383 USHORT Fill1[2];
384 ULONG EFlags;
385 ULONG Fill2;
386 UINT64 Rsp;
387 USHORT SegSs;
388 USHORT Fill3;
389 LONG CodePatchCycle;
390 } KTRAP_FRAME, *PKTRAP_FRAME;
391
392 //
393 // Dummy LDT_ENTRY
394 //
395 #ifndef _LDT_ENTRY_DEFINED
396 #define _LDT_ENTRY_DEFINED
397 typedef ULONG LDT_ENTRY;
398 #endif
399
400 //
401 // GDT Entry Definition
402 //
403 typedef union _KGDTENTRY64
404 {
405 struct
406 {
407 USHORT LimitLow;
408 USHORT BaseLow;
409 union
410 {
411 struct
412 {
413 UCHAR BaseMiddle;
414 UCHAR Flags1;
415 UCHAR Flags2;
416 UCHAR BaseHigh;
417 } Bytes;
418 struct
419 {
420 ULONG BaseMiddle:8;
421 ULONG Type:5;
422 ULONG Dpl:2;
423 ULONG Present:1;
424 ULONG LimitHigh:4;
425 ULONG System:1;
426 ULONG LongMode:1;
427 ULONG DefaultBig:1;
428 ULONG Granularity:1;
429 ULONG BaseHigh:8;
430 } Bits;
431 };
432 ULONG BaseUpper;
433 ULONG MustBeZero;
434 };
435 UINT64 Alignment;
436 } KGDTENTRY64, *PKGDTENTRY64;
437 #define KGDTENTRY KGDTENTRY64
438 #define PKGDTENTRY PKGDTENTRY64
439
440 //
441 // IDT Entry Access Definition
442 //
443 typedef struct _KIDT_ACCESS
444 {
445 union
446 {
447 struct
448 {
449 UCHAR Reserved;
450 UCHAR SegmentType:4;
451 UCHAR SystemSegmentFlag:1;
452 UCHAR Dpl:2;
453 UCHAR Present:1;
454 };
455 USHORT Value;
456 };
457 } KIDT_ACCESS, *PKIDT_ACCESS;
458
459 //
460 // IDT Entry Definition
461 //
462 typedef union _KIDTENTRY64
463 {
464 struct
465 {
466 USHORT OffsetLow;
467 USHORT Selector;
468 USHORT IstIndex:3;
469 USHORT Reserved0:5;
470 USHORT Type:5;
471 USHORT Dpl:2;
472 USHORT Present:1;
473 USHORT OffsetMiddle;
474 ULONG OffsetHigh;
475 ULONG Reserved1;
476 };
477 UINT64 Alignment;
478 } KIDTENTRY64, *PKIDTENTRY64;
479 #define KIDTENTRY KIDTENTRY64
480 #define PKIDTENTRY PKIDTENTRY64
481
482 typedef struct _KDESCRIPTOR
483 {
484 USHORT Pad[3];
485 USHORT Limit;
486 PVOID Base;
487 } KDESCRIPTOR, *PKDESCRIPTOR;
488
489 #ifndef NTOS_MODE_USER
490
491 //
492 // Special Registers Structure (outside of CONTEXT)
493 //
494 typedef struct _KSPECIAL_REGISTERS
495 {
496 ULONG64 Cr0;
497 ULONG64 Cr2;
498 ULONG64 Cr3;
499 ULONG64 Cr4;
500 ULONG64 KernelDr0;
501 ULONG64 KernelDr1;
502 ULONG64 KernelDr2;
503 ULONG64 KernelDr3;
504 ULONG64 KernelDr6;
505 ULONG64 KernelDr7;
506 KDESCRIPTOR Gdtr;
507 KDESCRIPTOR Idtr;
508 USHORT Tr;
509 USHORT Ldtr;
510 ULONG MxCsr;
511 ULONG64 DebugControl;
512 ULONG64 LastBranchToRip;
513 ULONG64 LastBranchFromRip;
514 ULONG64 LastExceptionToRip;
515 ULONG64 LastExceptionFromRip;
516 ULONG64 Cr8;
517 ULONG64 MsrGsBase;
518 ULONG64 MsrGsSwap;
519 ULONG64 MsrStar;
520 ULONG64 MsrLStar;
521 ULONG64 MsrCStar;
522 ULONG64 MsrSyscallMask;
523 } KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
524
525 //
526 // Processor State Data
527 //
528 typedef struct _KPROCESSOR_STATE
529 {
530 KSPECIAL_REGISTERS SpecialRegisters;
531 CONTEXT ContextFrame;
532 } KPROCESSOR_STATE, *PKPROCESSOR_STATE;
533
534 #if (NTDDI_VERSION < NTDDI_LONGHORN)
535 #define GENERAL_LOOKASIDE_POOL PP_LOOKASIDE_LIST
536 #endif
537
538 typedef struct _KREQUEST_PACKET
539 {
540 PVOID CurrentPacket[3];
541 PVOID WorkerRoutine;
542 } KREQUEST_PACKET, *PKREQUEST_PACKET;
543
544 typedef struct _REQUEST_MAILBOX
545 {
546 INT64 RequestSummary;
547 KREQUEST_PACKET RequestPacket;
548 PVOID Virtual[7];
549 } REQUEST_MAILBOX, *PREQUEST_MAILBOX;
550
551 //
552 // Processor Region Control Block
553 //
554 #pragma pack(push,4)
555 typedef struct _KPRCB
556 {
557 ULONG MxCsr;
558 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
559 USHORT Number;
560 #else
561 UCHAR Number;
562 UCHAR NestingLevel;
563 #endif
564 UCHAR InterruptRequest;
565 UCHAR IdleHalt;
566 struct _KTHREAD *CurrentThread;
567 struct _KTHREAD *NextThread;
568 struct _KTHREAD *IdleThread;
569 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
570 UCHAR NestingLevel;
571 UCHAR Group;
572 UCHAR PrcbPad00[6];
573 #else
574 UINT64 UserRsp;
575 #endif
576 UINT64 RspBase;
577 UINT64 PrcbLock;
578 UINT64 SetMember;
579 KPROCESSOR_STATE ProcessorState;
580 CHAR CpuType;
581 CHAR CpuID;
582 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
583 union
584 {
585 USHORT CpuStep;
586 struct
587 {
588 UCHAR CpuStepping;
589 UCHAR CpuModel;
590 };
591 };
592 #else
593 USHORT CpuStep;
594 #endif
595 ULONG MHz;
596 UINT64 HalReserved[8];
597 USHORT MinorVersion;
598 USHORT MajorVersion;
599 UCHAR BuildType;
600 UCHAR CpuVendor;
601 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
602 UCHAR CoresPerPhysicalProcessor;
603 UCHAR LogicalProcessorsPerCore;
604 #else
605 UCHAR InitialApicId;
606 UCHAR LogicalProcessorsPerPhysicalProcessor;
607 #endif
608 ULONG ApicMask;
609 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
610 ULONG CFlushSize;
611 #else
612 UCHAR CFlushSize;
613 UCHAR PrcbPad0x[3];
614 #endif
615 PVOID AcpiReserved;
616 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
617 ULONG InitialApicId;
618 ULONG Stride;
619 UINT64 PrcbPad01[3];
620 #else
621 UINT64 PrcbPad00[4];
622 #endif
623 KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock]; // 2003: 33, vista:49
624 PP_LOOKASIDE_LIST PPLookasideList[16];
625 GENERAL_LOOKASIDE_POOL PPNPagedLookasideList[NUMBER_POOL_LOOKASIDE_LISTS];
626 GENERAL_LOOKASIDE_POOL PPPagedLookasideList[NUMBER_POOL_LOOKASIDE_LISTS];
627 UINT64 PacketBarrier;
628 SINGLE_LIST_ENTRY DeferredReadyListHead;
629 LONG MmPageFaultCount;
630 LONG MmCopyOnWriteCount;
631 LONG MmTransitionCount;
632 #if (NTDDI_VERSION < NTDDI_LONGHORN)
633 LONG MmCacheTransitionCount;
634 #endif
635 LONG MmDemandZeroCount;
636 LONG MmPageReadCount;
637 LONG MmPageReadIoCount;
638 #if (NTDDI_VERSION < NTDDI_LONGHORN)
639 LONG MmCacheReadCount;
640 LONG MmCacheIoCount;
641 #endif
642 LONG MmDirtyPagesWriteCount;
643 LONG MmDirtyWriteIoCount;
644 LONG MmMappedPagesWriteCount;
645 LONG MmMappedWriteIoCount;
646 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
647 ULONG KeSystemCalls;
648 ULONG KeContextSwitches;
649 ULONG CcFastReadNoWait;
650 ULONG CcFastReadWait;
651 ULONG CcFastReadNotPossible;
652 ULONG CcCopyReadNoWait;
653 ULONG CcCopyReadWait;
654 ULONG CcCopyReadNoWaitMiss;
655 LONG LookasideIrpFloat;
656 #else
657 LONG LookasideIrpFloat;
658 ULONG KeSystemCalls;
659 #endif
660 LONG IoReadOperationCount;
661 LONG IoWriteOperationCount;
662 LONG IoOtherOperationCount;
663 LARGE_INTEGER IoReadTransferCount;
664 LARGE_INTEGER IoWriteTransferCount;
665 LARGE_INTEGER IoOtherTransferCount;
666 #if (NTDDI_VERSION < NTDDI_LONGHORN)
667 ULONG KeContextSwitches;
668 UCHAR PrcbPad2[12];
669 #endif
670 UINT64 TargetSet;
671 ULONG IpiFrozen;
672 UCHAR PrcbPad3[116];
673 REQUEST_MAILBOX RequestMailbox[64];
674 UINT64 SenderSummary;
675 UCHAR PrcbPad4[120];
676 KDPC_DATA DpcData[2];
677 PVOID DpcStack;
678 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
679 PVOID SparePtr0;
680 #else
681 PVOID SavedRsp;
682 #endif
683 LONG MaximumDpcQueueDepth;
684 ULONG DpcRequestRate;
685 ULONG MinimumDpcRate;
686 UCHAR DpcInterruptRequested;
687 UCHAR DpcThreadRequested;
688 UCHAR DpcRoutineActive;
689 UCHAR DpcThreadActive;
690 UINT64 TimerHand;
691 UINT64 TimerRequest;
692 LONG TickOffset;
693 LONG MasterOffset;
694 ULONG DpcLastCount;
695 UCHAR ThreadDpcEnable;
696 UCHAR QuantumEnd;
697 UCHAR PrcbPad50;
698 UCHAR IdleSchedule;
699 LONG DpcSetEventRequest;
700 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
701 ULONG KeExceptionDispatchCount;
702 #else
703 LONG PrcbPad40;
704 PVOID DpcThread;
705 #endif
706 KEVENT DpcEvent;
707 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
708 PVOID PrcbPad51;
709 #endif
710 KDPC CallDpc;
711 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
712 LONG ClockKeepAlive;
713 UCHAR ClockCheckSlot;
714 UCHAR ClockPollCycle;
715 UCHAR PrcbPad6[2];
716 LONG DpcWatchdogPeriod;
717 LONG DpcWatchdogCount;
718 UINT64 PrcbPad70[2];
719 #else
720 UINT64 PrcbPad7[4];
721 #endif
722 LIST_ENTRY WaitListHead;
723 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
724 UINT64 WaitLock;
725 #endif
726 ULONG ReadySummary;
727 ULONG QueueIndex;
728 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
729 UINT64 PrcbPad71[12];
730 #endif
731 LIST_ENTRY DispatcherReadyListHead[32];
732 ULONG InterruptCount;
733 ULONG KernelTime;
734 ULONG UserTime;
735 ULONG DpcTime;
736 ULONG InterruptTime;
737 ULONG AdjustDpcThreshold;
738 UCHAR SkipTick;
739 UCHAR DebuggerSavedIRQL;
740 UCHAR PollSlot;
741 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
742 UCHAR PrcbPad80[5];
743 ULONG DpcTimeCount;
744 ULONG DpcTimeLimit;
745 ULONG PeriodicCount;
746 ULONG PeriodicBias;
747 UINT64 PrcbPad81[2];
748 #else
749 UCHAR PrcbPad8[13];
750 #endif
751 struct _KNODE *ParentNode;
752 UINT64 MultiThreadProcessorSet;
753 struct _KPRCB *MultiThreadSetMaster;
754 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
755 UINT64 StartCycles;
756 LONG MmSpinLockOrdering;
757 ULONG PageColor;
758 ULONG NodeColor;
759 ULONG NodeShiftedColor;
760 ULONG SecondaryColorMask;
761 #endif
762 LONG Sleeping;
763 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
764 UINT64 CycleTime;
765 ULONG CcFastMdlReadNoWait;
766 ULONG CcFastMdlReadWait;
767 ULONG CcFastMdlReadNotPossible;
768 ULONG CcMapDataNoWait;
769 ULONG CcMapDataWait;
770 ULONG CcPinMappedDataCount;
771 ULONG CcPinReadNoWait;
772 ULONG CcPinReadWait;
773 ULONG CcMdlReadNoWait;
774 ULONG CcMdlReadWait;
775 ULONG CcLazyWriteHotSpots;
776 ULONG CcLazyWriteIos;
777 ULONG CcLazyWritePages;
778 ULONG CcDataFlushes;
779 ULONG CcDataPages;
780 ULONG CcLostDelayedWrites;
781 ULONG CcFastReadResourceMiss;
782 ULONG CcCopyReadWaitMiss;
783 ULONG CcFastMdlReadResourceMiss;
784 ULONG CcMapDataNoWaitMiss;
785 ULONG CcMapDataWaitMiss;
786 ULONG CcPinReadNoWaitMiss;
787 ULONG CcPinReadWaitMiss;
788 ULONG CcMdlReadNoWaitMiss;
789 ULONG CcMdlReadWaitMiss;
790 ULONG CcReadAheadIos;
791 LONG MmCacheTransitionCount;
792 LONG MmCacheReadCount;
793 LONG MmCacheIoCount;
794 ULONG PrcbPad91[3];
795 PROCESSOR_POWER_STATE PowerState;
796 ULONG KeAlignmentFixupCount;
797 UCHAR VendorString[13];
798 UCHAR PrcbPad10[3];
799 ULONG FeatureBits;
800 LARGE_INTEGER UpdateSignature;
801 KDPC DpcWatchdogDpc;
802 KTIMER DpcWatchdogTimer;
803 CACHE_DESCRIPTOR Cache[5];
804 ULONG CacheCount;
805 ULONG CachedCommit;
806 ULONG CachedResidentAvailable;
807 PVOID HyperPte;
808 PVOID WheaInfo;
809 PVOID EtwSupport;
810 SLIST_HEADER InterruptObjectPool;
811 SLIST_HEADER HypercallPageList;
812 PVOID HypercallPageVirtual;
813 PVOID VirtualApicAssist;
814 UINT64* StatisticsPage;
815 PVOID RateControl;
816 UINT64 CacheProcessorMask[5];
817 UINT64 PackageProcessorSet;
818 UINT64 CoreProcessorSet;
819 #else
820 ULONG PrcbPad90[1];
821 ULONG DebugDpcTime;
822 ULONG PageColor;
823 ULONG NodeColor;
824 ULONG NodeShiftedColor;
825 ULONG SecondaryColorMask;
826 UCHAR PrcbPad9[12];
827 ULONG CcFastReadNoWait;
828 ULONG CcFastReadWait;
829 ULONG CcFastReadNotPossible;
830 ULONG CcCopyReadNoWait;
831 ULONG CcCopyReadWait;
832 ULONG CcCopyReadNoWaitMiss;
833 ULONG KeAlignmentFixupCount;
834 ULONG KeDcacheFlushCount;
835 ULONG KeExceptionDispatchCount;
836 ULONG KeFirstLevelTbFills;
837 ULONG KeFloatingEmulationCount;
838 ULONG KeIcacheFlushCount;
839 ULONG KeSecondLevelTbFills;
840 UCHAR VendorString[13];
841 UCHAR PrcbPad10[2];
842 ULONG FeatureBits;
843 LARGE_INTEGER UpdateSignature;
844 PROCESSOR_POWER_STATE PowerState;
845 CACHE_DESCRIPTOR Cache[5];
846 ULONG CacheCount;
847 #endif
848 } KPRCB, *PKPRCB;
849
850 //
851 // Processor Control Region
852 //
853 typedef struct _KIPCR
854 {
855 union
856 {
857 NT_TIB NtTib;
858 struct
859 {
860 union _KGDTENTRY64 *GdtBase;
861 struct _KTSS64 *TssBase;
862 ULONG64 UserRsp;
863 struct _KPCR *Self;
864 struct _KPRCB *CurrentPrcb;
865 PKSPIN_LOCK_QUEUE LockArray;
866 PVOID Used_Self;
867 };
868 };
869 union _KIDTENTRY64 *IdtBase;
870 ULONG64 Unused[2];
871 KIRQL Irql;
872 UCHAR SecondLevelCacheAssociativity;
873 UCHAR ObsoleteNumber;
874 UCHAR Fill0;
875 ULONG Unused0[3];
876 USHORT MajorVersion;
877 USHORT MinorVersion;
878 ULONG StallScaleFactor;
879 PVOID Unused1[3];
880 ULONG KernelReserved[15];
881 ULONG SecondLevelCacheSize;
882 ULONG HalReserved[16];
883 ULONG Unused2;
884 ULONG Fill1;
885 PVOID KdVersionBlock; // 0x108
886 PVOID Unused3;
887 ULONG PcrAlign1[24];
888 ULONG Fill2[2]; // 0x178
889 KPRCB Prcb; // 0x180
890
891 // hack:
892 ULONG ContextSwitches;
893
894 } KIPCR, *PKIPCR;
895 #pragma pack(pop)
896
897 //
898 // TSS Definition
899 //
900 typedef struct _KiIoAccessMap
901 {
902 UCHAR DirectionMap[32];
903 UCHAR IoMap[8196];
904 } KIIO_ACCESS_MAP;
905
906
907 #pragma pack(push,4)
908 typedef struct _KTSS64
909 {
910 /* 000 */ ULONG Reserved0;
911 /* 004 */ UINT64 Rsp0;
912 /* 00c */ UINT64 Rsp1;
913 /* 014 */ UINT64 Rsp2;
914 /* 01c */ UINT64 Ist[8];
915 /* 05c */ UINT64 Reserved1;
916 /* 064 */ USHORT Reserved2;
917 /* 066 */ USHORT IoMapBase;
918 } KTSS64, *PKTSS64;
919 #pragma pack(pop)
920 #define KTSS KTSS64
921 #define PKTSS PKTSS64
922
923 //
924 // KEXCEPTION_FRAME
925 //
926 typedef struct _KEXCEPTION_FRAME
927 {
928 ULONG64 P1Home;
929 ULONG64 P2Home;
930 ULONG64 P3Home;
931 ULONG64 P4Home;
932 ULONG64 P5;
933 #if (NTDDI_VERSION >= NTDDI_WIN8)
934 ULONG64 Spare1;
935 #else
936 ULONG64 InitialStack;
937 #endif
938 M128A Xmm6;
939 M128A Xmm7;
940 M128A Xmm8;
941 M128A Xmm9;
942 M128A Xmm10;
943 M128A Xmm11;
944 M128A Xmm12;
945 M128A Xmm13;
946 M128A Xmm14;
947 M128A Xmm15;
948 ULONG64 TrapFrame;
949 #if (NTDDI_VERSION < NTDDI_WIN8)
950 ULONG64 CallbackStack;
951 #endif
952 ULONG64 OutputBuffer;
953 ULONG64 OutputLength;
954 #if (NTDDI_VERSION >= NTDDI_WIN8)
955 ULONG64 Spare2;
956 #endif
957 ULONG64 MxCsr;
958 ULONG64 Rbp;
959 ULONG64 Rbx;
960 ULONG64 Rdi;
961 ULONG64 Rsi;
962 ULONG64 R12;
963 ULONG64 R13;
964 ULONG64 R14;
965 ULONG64 R15;
966 ULONG64 Return;
967 } KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
968
969 typedef struct _MACHINE_FRAME
970 {
971 ULONG64 Rip;
972 USHORT SegCs;
973 USHORT Fill1[3];
974 ULONG EFlags;
975 ULONG Fill2;
976 ULONG64 Rsp;
977 USHORT SegSs;
978 USHORT Fill3[3];
979 } MACHINE_FRAME, *PMACHINE_FRAME;
980
981 //
982 // Defines the Callback Stack Layout for User Mode Callbacks
983 //
984 typedef KEXCEPTION_FRAME KCALLOUT_FRAME, *PKCALLOUT_FRAME;
985
986 //
987 // User side callout frame
988 //
989 typedef struct _UCALLOUT_FRAME
990 {
991 ULONG64 P1Home;
992 ULONG64 P2Home;
993 ULONG64 P3Home;
994 ULONG64 P4Home;
995 PVOID Buffer;
996 ULONG Length;
997 ULONG ApiNumber;
998 MACHINE_FRAME MachineFrame;
999 } UCALLOUT_FRAME, *PUCALLOUT_FRAME; // size = 0x0058
1000
1001 typedef struct _DISPATCHER_CONTEXT
1002 {
1003 ULONG64 ControlPc;
1004 PVOID ImageBase;
1005 PVOID FunctionEntry;
1006 PVOID EstablisherFrame;
1007 ULONG64 TargetIp;
1008 PVOID ContextRecord;
1009 PVOID LanguageHandler;
1010 PVOID HandlerData;
1011 PVOID HistoryTable;
1012 ULONG ScopeIndex;
1013 } DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
1014
1015 typedef struct _KSTART_FRAME
1016 {
1017 ULONG64 P1Home;
1018 ULONG64 P2Home;
1019 ULONG64 P3Home;
1020 ULONG64 P4Home;
1021 ULONG64 Reserved;
1022 ULONG64 Return;
1023 } KSTART_FRAME, *PKSTART_FRAME;
1024
1025 typedef struct _KSWITCH_FRAME
1026 {
1027 ULONG64 P1Home;
1028 ULONG64 P2Home;
1029 ULONG64 P3Home;
1030 ULONG64 P4Home;
1031 ULONG64 P5Home;
1032 KIRQL ApcBypass;
1033 UCHAR Fill1[7];
1034 ULONG64 Rbp;
1035 ULONG64 Return;
1036 } KSWITCH_FRAME, *PKSWITCH_FRAME;
1037
1038 #define PROCESSOR_START_FLAG_FORCE_ENABLE_NX 0x0001
1039 typedef struct _KPROCESSOR_START_BLOCK
1040 {
1041 ULONG CompletionFlag; // 0x0004
1042 ULONG Flags; // 0x0008
1043 ULONG Gdt32; // 0x000C
1044 ULONG Idt32; // 0x0012
1045 PVOID Gdt; // 0x0018
1046 // ???
1047 ULONG64 TiledMemoryMap; // 0x0058
1048 UCHAR PmTarget[6]; // 0x0060
1049 UCHAR LmIdentityTarget[6]; // 0x0066
1050 ULONG64 LmTarget; // 0x0070
1051 struct _KPROCESSOR_START_BLOCK *SelfMap; // 0x0078
1052 ULONG64 MsrPat; // 0x0080
1053 ULONG64 MsrEFER; // 0x0088
1054 KPROCESSOR_STATE ProcessorState; // 0x0090
1055 } KPROCESSOR_START_BLOCK, *PKPROCESSOR_START_BLOCK; // size 00640
1056
1057 //
1058 // Inline function to get current KPRCB
1059 //
1060 FORCEINLINE
1061 struct _KPRCB *
1062 KeGetCurrentPrcb(VOID)
1063 {
1064 return (struct _KPRCB *)__readgsqword(FIELD_OFFSET(KIPCR, CurrentPrcb));
1065 }
1066
1067 #endif
1068 #endif