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