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