[NDK]
[reactos.git] / reactos / include / ndk / i386 / ketypes.h
1 /*++ NDK Version: 0098
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4
5 Header Name:
6
7 ketypes.h (X86)
8
9 Abstract:
10
11 i386 Type definitions for the Kernel services.
12
13 Author:
14
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
16
17 --*/
18
19 #ifndef _I386_KETYPES_H
20 #define _I386_KETYPES_H
21
22 //
23 // Dependencies
24 //
25
26 //
27 // KPCR Access for non-IA64 builds
28 //
29 #define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
30 #define PCR ((KPCR *)K0IPCR)
31 #if defined(CONFIG_SMP) || defined(NT_BUILD)
32 #undef KeGetPcr
33 #define KeGetPcr() ((KPCR *)__readfsdword(FIELD_OFFSET(KPCR, SelfPcr)))
34 #endif
35
36 //
37 // CPU Vendors
38 //
39 typedef enum
40 {
41 CPU_NONE = 0,
42 CPU_INTEL = 1,
43 CPU_AMD = 2,
44 CPU_CYRIX = 3,
45 CPU_TRANSMETA = 4,
46 CPU_VIA = 5,
47 CPU_CENTAUR = CPU_VIA,
48 CPU_RISE = 6,
49 CPU_UNKNOWN = 7
50 } CPU_VENDORS;
51
52 //
53 // Machine Types
54 //
55 #define MACHINE_TYPE_ISA 0x0000
56 #define MACHINE_TYPE_EISA 0x0001
57 #define MACHINE_TYPE_MCA 0x0002
58
59 //
60 // X86 80386 Segment Types
61 //
62 #define I386_TASK_GATE 0x5
63 #define I386_TSS 0x9
64 #define I386_ACTIVE_TSS 0xB
65 #define I386_CALL_GATE 0xC
66 #define I386_INTERRUPT_GATE 0xE
67 #define I386_TRAP_GATE 0xF
68
69 //
70 // Selector Names
71 //
72 #define RPL_MASK 0x0003
73 #define MODE_MASK 0x0001
74 #define KGDT_R0_CODE 0x8
75 #define KGDT_R0_DATA 0x10
76 #define KGDT_R3_CODE 0x18
77 #define KGDT_R3_DATA 0x20
78 #define KGDT_TSS 0x28
79 #define KGDT_R0_PCR 0x30
80 #define KGDT_R3_TEB 0x38
81 #define KGDT_LDT 0x48
82 #define KGDT_DF_TSS 0x50
83 #define KGDT_NMI_TSS 0x58
84
85 //
86 // Define the number of GDTs that can be queried by user mode
87 //
88 #define KGDT_NUMBER 10
89
90 //
91 // CR4
92 //
93 #define CR4_VME 0x1
94 #define CR4_PVI 0x2
95 #define CR4_TSD 0x4
96 #define CR4_DE 0x8
97 #define CR4_PSE 0x10
98 #define CR4_PAE 0x20
99 #define CR4_MCE 0x40
100 #define CR4_PGE 0x80
101 #define CR4_FXSR 0x200
102 #define CR4_XMMEXCPT 0x400
103
104 //
105 // EFlags
106 //
107 #define EFLAGS_CF 0x01L
108 #define EFLAGS_ZF 0x40L
109 #define EFLAGS_TF 0x100L
110 #define EFLAGS_INTERRUPT_MASK 0x200L
111 #define EFLAGS_DF 0x400L
112 #define EFLAGS_IOPL 0x3000L
113 #define EFLAGS_NESTED_TASK 0x4000L
114 #define EFLAGS_RF 0x10000
115 #define EFLAGS_V86_MASK 0x20000
116 #define EFLAGS_ALIGN_CHECK 0x40000
117 #define EFLAGS_VIF 0x80000
118 #define EFLAGS_VIP 0x100000
119 #define EFLAGS_ID 0x200000
120 #define EFLAGS_USER_SANITIZE 0x3F4DD7
121 #define EFLAG_SIGN 0x8000
122 #define EFLAG_ZERO 0x4000
123
124 //
125 // Legacy floating status word bit masks.
126 //
127 #define FSW_INVALID_OPERATION 0x1
128 #define FSW_DENORMAL 0x2
129 #define FSW_ZERO_DIVIDE 0x4
130 #define FSW_OVERFLOW 0x8
131 #define FSW_UNDERFLOW 0x10
132 #define FSW_PRECISION 0x20
133 #define FSW_STACK_FAULT 0x40
134
135 //
136 // Machine Specific Registers
137 //
138 #define MSR_AMD_ACCESS 0x9C5A203A
139 #define MSR_IA32_MISC_ENABLE 0x01A0
140 #define MSR_EFER 0xC0000080
141
142 //
143 // MSR internal Values
144 //
145 #define MSR_NXE 0x0800
146 #define XHF_NOEXECUTE 0x100000
147 #define MSR_XD_ENABLE_MASK 0xFFFFFFFB
148
149 //
150 // IPI Types
151 //
152 #define IPI_APC 1
153 #define IPI_DPC 2
154 #define IPI_FREEZE 4
155 #define IPI_PACKET_READY 8
156 #define IPI_SYNCH_REQUEST 16
157
158 //
159 // PRCB Flags
160 //
161 #define PRCB_MAJOR_VERSION 1
162 #define PRCB_BUILD_DEBUG 1
163 #define PRCB_BUILD_UNIPROCESSOR 2
164
165 //
166 // HAL Variables
167 //
168 #define INITIAL_STALL_COUNT 100
169 #ifdef PAE
170 #define HYPERSPACE_BASE 0xc0400000
171 #else
172 #define HYPERSPACE_BASE 0xc0800000
173 #endif
174 #define MM_HAL_VA_START 0xFFC00000
175 #define MM_HAL_VA_END 0xFFFFFFFF
176 #define APIC_BASE 0xFFFE0000
177
178 //
179 // IOPM Definitions
180 //
181 #define IOPM_COUNT 1
182 #define IOPM_SIZE 8192
183 #define IOPM_FULL_SIZE 8196
184 #define IO_ACCESS_MAP_NONE 0
185 #define IOPM_DIRECTION_MAP_SIZE 32
186 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
187 #define KiComputeIopmOffset(MapNumber) \
188 (MapNumber == IO_ACCESS_MAP_NONE) ? \
189 (USHORT)(sizeof(KTSS)) : \
190 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
191
192 typedef UCHAR KIO_ACCESS_MAP[IOPM_SIZE];
193
194 typedef KIO_ACCESS_MAP *PKIO_ACCESS_MAP;
195
196 //
197 // Size of the XMM register save area in the FXSAVE format
198 //
199 #define SIZE_OF_FX_REGISTERS 128
200
201 //
202 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
203 //
204 #define KSEG0_BASE 0x80000000
205
206 //
207 // Synchronization-level IRQL
208 //
209 #ifndef CONFIG_SMP
210 #define SYNCH_LEVEL DISPATCH_LEVEL
211 #else
212 #if (NTDDI_VERSION < NTDDI_WS03)
213 #define SYNCH_LEVEL (IPI_LEVEL - 1)
214 #else
215 #define SYNCH_LEVEL (IPI_LEVEL - 2)
216 #endif
217 #endif
218
219 //
220 // Number of pool lookaside lists per pool in the PRCB
221 //
222 #define NUMBER_POOL_LOOKASIDE_LISTS 32
223
224 //
225 // Structure for CPUID
226 //
227 typedef union _CPU_INFO
228 {
229 UINT32 AsUINT32[4];
230 struct
231 {
232 ULONG Eax;
233 ULONG Ebx;
234 ULONG Ecx;
235 ULONG Edx;
236 };
237 } CPU_INFO, *PCPU_INFO;
238
239 //
240 // Trap Frame Definition
241 //
242 typedef struct _KTRAP_FRAME
243 {
244 ULONG DbgEbp;
245 ULONG DbgEip;
246 ULONG DbgArgMark;
247 ULONG DbgArgPointer;
248 ULONG TempSegCs;
249 ULONG TempEsp;
250 ULONG Dr0;
251 ULONG Dr1;
252 ULONG Dr2;
253 ULONG Dr3;
254 ULONG Dr6;
255 ULONG Dr7;
256 ULONG SegGs;
257 ULONG SegEs;
258 ULONG SegDs;
259 ULONG Edx;
260 ULONG Ecx;
261 ULONG Eax;
262 ULONG PreviousPreviousMode;
263 struct _EXCEPTION_REGISTRATION_RECORD FAR *ExceptionList;
264 ULONG SegFs;
265 ULONG Edi;
266 ULONG Esi;
267 ULONG Ebx;
268 ULONG Ebp;
269 ULONG ErrCode;
270 ULONG Eip;
271 ULONG SegCs;
272 ULONG EFlags;
273 ULONG HardwareEsp;
274 ULONG HardwareSegSs;
275 ULONG V86Es;
276 ULONG V86Ds;
277 ULONG V86Fs;
278 ULONG V86Gs;
279 } KTRAP_FRAME, *PKTRAP_FRAME;
280
281 //
282 // Defines the Callback Stack Layout for User Mode Callbacks
283 //
284 typedef struct _KCALLOUT_FRAME
285 {
286 ULONG InitialStack;
287 ULONG TrapFrame;
288 ULONG CallbackStack;
289 ULONG Edi;
290 ULONG Esi;
291 ULONG Ebx;
292 ULONG Ebp;
293 ULONG ReturnAddress;
294 ULONG Result;
295 ULONG ResultLength;
296 } KCALLOUT_FRAME, *PKCALLOUT_FRAME;
297
298 //
299 // LDT Entry Definition
300 //
301 #ifndef _LDT_ENTRY_DEFINED
302 #define _LDT_ENTRY_DEFINED
303 typedef struct _LDT_ENTRY
304 {
305 USHORT LimitLow;
306 USHORT BaseLow;
307 union
308 {
309 struct
310 {
311 UCHAR BaseMid;
312 UCHAR Flags1;
313 UCHAR Flags2;
314 UCHAR BaseHi;
315 } Bytes;
316 struct
317 {
318 ULONG BaseMid:8;
319 ULONG Type:5;
320 ULONG Dpl:2;
321 ULONG Pres:1;
322 ULONG LimitHi:4;
323 ULONG Sys:1;
324 ULONG Reserved_0:1;
325 ULONG Default_Big:1;
326 ULONG Granularity:1;
327 ULONG BaseHi:8;
328 } Bits;
329 } HighWord;
330 } LDT_ENTRY, *PLDT_ENTRY, *LPLDT_ENTRY;
331 #endif
332
333 //
334 // GDT Entry Definition
335 //
336 typedef struct _KGDTENTRY
337 {
338 USHORT LimitLow;
339 USHORT BaseLow;
340 union
341 {
342 struct
343 {
344 UCHAR BaseMid;
345 UCHAR Flags1;
346 UCHAR Flags2;
347 UCHAR BaseHi;
348 } Bytes;
349 struct
350 {
351 ULONG BaseMid:8;
352 ULONG Type:5;
353 ULONG Dpl:2;
354 ULONG Pres:1;
355 ULONG LimitHi:4;
356 ULONG Sys:1;
357 ULONG Reserved_0:1;
358 ULONG Default_Big:1;
359 ULONG Granularity:1;
360 ULONG BaseHi:8;
361 } Bits;
362 } HighWord;
363 } KGDTENTRY, *PKGDTENTRY;
364
365 //
366 // IDT Entry Access Definition
367 //
368 typedef struct _KIDT_ACCESS
369 {
370 union
371 {
372 struct
373 {
374 UCHAR Reserved;
375 UCHAR SegmentType:4;
376 UCHAR SystemSegmentFlag:1;
377 UCHAR Dpl:2;
378 UCHAR Present:1;
379 };
380 USHORT Value;
381 };
382 } KIDT_ACCESS, *PKIDT_ACCESS;
383
384 //
385 // IDT Entry Definition
386 //
387 typedef struct _KIDTENTRY
388 {
389 USHORT Offset;
390 USHORT Selector;
391 USHORT Access;
392 USHORT ExtendedOffset;
393 } KIDTENTRY, *PKIDTENTRY;
394
395 typedef struct _DESCRIPTOR
396 {
397 USHORT Pad;
398 USHORT Limit;
399 ULONG Base;
400 } KDESCRIPTOR, *PKDESCRIPTOR;
401
402 #ifndef NTOS_MODE_USER
403 //
404 // Macro to get current KPRCB
405 //
406 FORCEINLINE
407 struct _KPRCB *
408 KeGetCurrentPrcb(VOID)
409 {
410 return (struct _KPRCB *)(ULONG_PTR)__readfsdword(FIELD_OFFSET(KPCR, Prcb));
411 }
412
413 //
414 // FN/FX (FPU) Save Area Structures
415 //
416 typedef struct _FNSAVE_FORMAT
417 {
418 ULONG ControlWord;
419 ULONG StatusWord;
420 ULONG TagWord;
421 ULONG ErrorOffset;
422 ULONG ErrorSelector;
423 ULONG DataOffset;
424 ULONG DataSelector;
425 UCHAR RegisterArea[80];
426 } FNSAVE_FORMAT, *PFNSAVE_FORMAT;
427
428 typedef struct _FXSAVE_FORMAT
429 {
430 USHORT ControlWord;
431 USHORT StatusWord;
432 USHORT TagWord;
433 USHORT ErrorOpcode;
434 ULONG ErrorOffset;
435 ULONG ErrorSelector;
436 ULONG DataOffset;
437 ULONG DataSelector;
438 ULONG MXCsr;
439 ULONG MXCsrMask;
440 UCHAR RegisterArea[SIZE_OF_FX_REGISTERS];
441 UCHAR Reserved3[128];
442 UCHAR Reserved4[224];
443 UCHAR Align16Byte[8];
444 } FXSAVE_FORMAT, *PFXSAVE_FORMAT;
445
446 typedef struct _FX_SAVE_AREA
447 {
448 union
449 {
450 FNSAVE_FORMAT FnArea;
451 FXSAVE_FORMAT FxArea;
452 } U;
453 ULONG NpxSavedCpu;
454 ULONG Cr0NpxState;
455 } FX_SAVE_AREA, *PFX_SAVE_AREA;
456
457 //
458 // Special Registers Structure (outside of CONTEXT)
459 //
460 typedef struct _KSPECIAL_REGISTERS
461 {
462 ULONG Cr0;
463 ULONG Cr2;
464 ULONG Cr3;
465 ULONG Cr4;
466 ULONG KernelDr0;
467 ULONG KernelDr1;
468 ULONG KernelDr2;
469 ULONG KernelDr3;
470 ULONG KernelDr6;
471 ULONG KernelDr7;
472 KDESCRIPTOR Gdtr;
473 KDESCRIPTOR Idtr;
474 USHORT Tr;
475 USHORT Ldtr;
476 ULONG Reserved[6];
477 } KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
478
479 //
480 // Processor State Data
481 //
482 typedef struct _KPROCESSOR_STATE
483 {
484 CONTEXT ContextFrame;
485 KSPECIAL_REGISTERS SpecialRegisters;
486 } KPROCESSOR_STATE, *PKPROCESSOR_STATE;
487
488 //
489 // Processor Region Control Block
490 //
491 #pragma pack(push,4)
492 typedef struct _KPRCB
493 {
494 USHORT MinorVersion;
495 USHORT MajorVersion;
496 struct _KTHREAD *CurrentThread;
497 struct _KTHREAD *NextThread;
498 struct _KTHREAD *IdleThread;
499 UCHAR Number;
500 UCHAR Reserved;
501 USHORT BuildType;
502 KAFFINITY SetMember;
503 UCHAR CpuType;
504 UCHAR CpuID;
505 USHORT CpuStep;
506 KPROCESSOR_STATE ProcessorState;
507 ULONG KernelReserved[16];
508 ULONG HalReserved[16];
509 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
510 ULONG CFlushSize;
511 UCHAR PrcbPad0[88];
512 #else
513 UCHAR PrcbPad0[92];
514 #endif
515 KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock];
516 struct _KTHREAD *NpxThread;
517 ULONG InterruptCount;
518 ULONG KernelTime;
519 ULONG UserTime;
520 ULONG DpcTime;
521 ULONG DebugDpcTime;
522 ULONG InterruptTime;
523 ULONG AdjustDpcThreshold;
524 ULONG PageColor;
525 UCHAR SkipTick;
526 UCHAR DebuggerSavedIRQL;
527 #if (NTDDI_VERSION >= NTDDI_WS03)
528 UCHAR NodeColor;
529 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
530 UCHAR PollSlot;
531 #else
532 UCHAR Spare1;
533 #endif
534 ULONG NodeShiftedColor;
535 #else
536 UCHAR Spare1[6];
537 #endif
538 struct _KNODE *ParentNode;
539 ULONG MultiThreadProcessorSet;
540 struct _KPRCB *MultiThreadSetMaster;
541 #if (NTDDI_VERSION >= NTDDI_WS03)
542 ULONG SecondaryColorMask;
543 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
544 ULONG DpcTimeLimit;
545 #else
546 LONG Sleeping;
547 #endif
548 #else
549 ULONG ThreadStartCount[2];
550 #endif
551 ULONG CcFastReadNoWait;
552 ULONG CcFastReadWait;
553 ULONG CcFastReadNotPossible;
554 ULONG CcCopyReadNoWait;
555 ULONG CcCopyReadWait;
556 ULONG CcCopyReadNoWaitMiss;
557 #if (NTDDI_VERSION < NTDDI_LONGHORN)
558 ULONG KeAlignmentFixupCount;
559 #endif
560 ULONG SpareCounter0;
561 #if (NTDDI_VERSION < NTDDI_LONGHORN)
562 ULONG KeDcacheFlushCount;
563 ULONG KeExceptionDispatchCount;
564 ULONG KeFirstLevelTbFills;
565 ULONG KeFloatingEmulationCount;
566 ULONG KeIcacheFlushCount;
567 ULONG KeSecondLevelTbFills;
568 ULONG KeSystemCalls;
569 #endif
570 volatile ULONG IoReadOperationCount;
571 volatile ULONG IoWriteOperationCount;
572 volatile ULONG IoOtherOperationCount;
573 LARGE_INTEGER IoReadTransferCount;
574 LARGE_INTEGER IoWriteTransferCount;
575 LARGE_INTEGER IoOtherTransferCount;
576 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
577 ULONG CcFastMdlReadNoWait;
578 ULONG CcFastMdlReadWait;
579 ULONG CcFastMdlReadNotPossible;
580 ULONG CcMapDataNoWait;
581 ULONG CcMapDataWait;
582 ULONG CcPinMappedDataCount;
583 ULONG CcPinReadNoWait;
584 ULONG CcPinReadWait;
585 ULONG CcMdlReadNoWait;
586 ULONG CcMdlReadWait;
587 ULONG CcLazyWriteHotSpots;
588 ULONG CcLazyWriteIos;
589 ULONG CcLazyWritePages;
590 ULONG CcDataFlushes;
591 ULONG CcDataPages;
592 ULONG CcLostDelayedWrites;
593 ULONG CcFastReadResourceMiss;
594 ULONG CcCopyReadWaitMiss;
595 ULONG CcFastMdlReadResourceMiss;
596 ULONG CcMapDataNoWaitMiss;
597 ULONG CcMapDataWaitMiss;
598 ULONG CcPinReadNoWaitMiss;
599 ULONG CcPinReadWaitMiss;
600 ULONG CcMdlReadNoWaitMiss;
601 ULONG CcMdlReadWaitMiss;
602 ULONG CcReadAheadIos;
603 ULONG KeAlignmentFixupCount;
604 ULONG KeExceptionDispatchCount;
605 ULONG KeSystemCalls;
606 ULONG PrcbPad1[3];
607 #else
608 ULONG SpareCounter1[8];
609 #endif
610 PP_LOOKASIDE_LIST PPLookasideList[16];
611 PP_LOOKASIDE_LIST PPNPagedLookasideList[NUMBER_POOL_LOOKASIDE_LISTS];
612 PP_LOOKASIDE_LIST PPPagedLookasideList[NUMBER_POOL_LOOKASIDE_LISTS];
613 volatile ULONG PacketBarrier;
614 volatile ULONG ReverseStall;
615 PVOID IpiFrame;
616 UCHAR PrcbPad2[52];
617 volatile PVOID CurrentPacket[3];
618 volatile ULONG TargetSet;
619 volatile PKIPI_WORKER WorkerRoutine;
620 volatile ULONG IpiFrozen;
621 UCHAR PrcbPad3[40];
622 volatile ULONG RequestSummary;
623 volatile struct _KPRCB *SignalDone;
624 UCHAR PrcbPad4[56];
625 struct _KDPC_DATA DpcData[2];
626 PVOID DpcStack;
627 ULONG MaximumDpcQueueDepth;
628 ULONG DpcRequestRate;
629 ULONG MinimumDpcRate;
630 volatile UCHAR DpcInterruptRequested;
631 volatile UCHAR DpcThreadRequested;
632 volatile UCHAR DpcRoutineActive;
633 volatile UCHAR DpcThreadActive;
634 ULONG PrcbLock;
635 ULONG DpcLastCount;
636 volatile ULONG TimerHand;
637 volatile ULONG TimerRequest;
638 PVOID DpcThread;
639 KEVENT DpcEvent;
640 UCHAR ThreadDpcEnable;
641 volatile BOOLEAN QuantumEnd;
642 UCHAR PrcbPad50;
643 volatile UCHAR IdleSchedule;
644 LONG DpcSetEventRequest;
645 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
646 LONG Sleeping;
647 ULONG PeriodicCount;
648 ULONG PeriodicBias;
649 UCHAR PrcbPad5[6];
650 #else
651 UCHAR PrcbPad5[18];
652 #endif
653 LONG TickOffset;
654 KDPC CallDpc;
655 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
656 LONG ClockKeepAlive;
657 UCHAR ClockCheckSlot;
658 UCHAR ClockPollCycle;
659 UCHAR PrcbPad6[2];
660 LONG DpcWatchdogPeriod;
661 LONG DpcWatchDogCount;
662 LONG ThreadWatchdogPeriod;
663 LONG ThreadWatchDogCount;
664 ULONG PrcbPad70[2];
665 #else
666 ULONG PrcbPad7[8];
667 #endif
668 LIST_ENTRY WaitListHead;
669 ULONG ReadySummary;
670 ULONG QueueIndex;
671 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
672 SINGLE_LIST_ENTRY DeferredReadyListHead;
673 ULONGLONG StartCycles;
674 ULONGLONG CycleTime;
675 ULONGLONG PrcbPad71[3];
676 LIST_ENTRY DispatcherReadyListHead[32];
677 #else
678 LIST_ENTRY DispatcherReadyListHead[32];
679 SINGLE_LIST_ENTRY DeferredReadyListHead;
680 ULONG PrcbPad72[11];
681 #endif
682 PVOID ChainedInterruptList;
683 LONG LookasideIrpFloat;
684 volatile LONG MmPageFaultCount;
685 volatile LONG MmCopyOnWriteCount;
686 volatile LONG MmTransitionCount;
687 volatile LONG MmCacheTransitionCount;
688 volatile LONG MmDemandZeroCount;
689 volatile LONG MmPageReadCount;
690 volatile LONG MmPageReadIoCount;
691 volatile LONG MmCacheReadCount;
692 volatile LONG MmCacheIoCount;
693 volatile LONG MmDirtyPagesWriteCount;
694 volatile LONG MmDirtyWriteIoCount;
695 volatile LONG MmMappedPagesWriteCount;
696 volatile LONG MmMappedWriteIoCount;
697 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
698 ULONG CachedCommit;
699 ULONG CachedResidentAvailable;
700 PVOID HyperPte;
701 UCHAR CpuVendor;
702 UCHAR PrcbPad9[3];
703 #else
704 ULONG SpareFields0[1];
705 #endif
706 CHAR VendorString[13];
707 UCHAR InitialApicId;
708 UCHAR LogicalProcessorsPerPhysicalProcessor;
709 ULONG MHz;
710 ULONG FeatureBits;
711 LARGE_INTEGER UpdateSignature;
712 volatile LARGE_INTEGER IsrTime;
713 LARGE_INTEGER SpareField1;
714 FX_SAVE_AREA NpxSaveArea;
715 PROCESSOR_POWER_STATE PowerState;
716 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
717 KDPC DpcWatchdogDoc;
718 KTIMER DpcWatchdogTimer;
719 PVOID WheaInfo;
720 PVOID EtwSupport;
721 SLIST_HEADER InterruptObjectPool;
722 LARGE_INTEGER HyperCallPagePhysical;
723 LARGE_INTEGER HyperCallPageVirtual;
724 PVOID RateControl;
725 CACHE_DESCRIPTOR Cache[5];
726 ULONG CacheCount;
727 ULONG CacheProcessorMask[5];
728 UCHAR LogicalProcessorsPerCore;
729 UCHAR PrcbPad8[3];
730 ULONG PackageProcessorSet;
731 ULONG CoreProcessorSet;
732 #endif
733 } KPRCB, *PKPRCB;
734
735 //
736 // Processor Control Region
737 //
738 typedef struct _KIPCR
739 {
740 union
741 {
742 NT_TIB NtTib;
743 struct
744 {
745 struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
746 PVOID Used_StackBase;
747 PVOID PerfGlobalGroupMask;
748 PVOID TssCopy;
749 ULONG ContextSwitches;
750 KAFFINITY SetMemberCopy;
751 PVOID Used_Self;
752 };
753 };
754 struct _KPCR *Self;
755 struct _KPRCB *Prcb;
756 KIRQL Irql;
757 ULONG IRR;
758 ULONG IrrActive;
759 ULONG IDR;
760 PVOID KdVersionBlock;
761 PKIDTENTRY IDT;
762 PKGDTENTRY GDT;
763 struct _KTSS *TSS;
764 USHORT MajorVersion;
765 USHORT MinorVersion;
766 KAFFINITY SetMember;
767 ULONG StallScaleFactor;
768 UCHAR SpareUnused;
769 UCHAR Number;
770 UCHAR Spare0;
771 UCHAR SecondLevelCacheAssociativity;
772 ULONG VdmAlert;
773 ULONG KernelReserved[14];
774 ULONG SecondLevelCacheSize;
775 ULONG HalReserved[16];
776 ULONG InterruptMode;
777 UCHAR Spare1;
778 ULONG KernelReserved2[17];
779 KPRCB PrcbData;
780 } KIPCR, *PKIPCR;
781 #pragma pack(pop)
782
783 //
784 // TSS Definition
785 //
786 typedef struct _KiIoAccessMap
787 {
788 UCHAR DirectionMap[IOPM_DIRECTION_MAP_SIZE];
789 UCHAR IoMap[IOPM_FULL_SIZE];
790 } KIIO_ACCESS_MAP;
791
792 typedef struct _KTSS
793 {
794 USHORT Backlink;
795 USHORT Reserved0;
796 ULONG Esp0;
797 USHORT Ss0;
798 USHORT Reserved1;
799 ULONG NotUsed1[4];
800 ULONG CR3;
801 ULONG Eip;
802 ULONG EFlags;
803 ULONG Eax;
804 ULONG Ecx;
805 ULONG Edx;
806 ULONG Ebx;
807 ULONG Esp;
808 ULONG Ebp;
809 ULONG Esi;
810 ULONG Edi;
811 USHORT Es;
812 USHORT Reserved2;
813 USHORT Cs;
814 USHORT Reserved3;
815 USHORT Ss;
816 USHORT Reserved4;
817 USHORT Ds;
818 USHORT Reserved5;
819 USHORT Fs;
820 USHORT Reserved6;
821 USHORT Gs;
822 USHORT Reserved7;
823 USHORT LDT;
824 USHORT Reserved8;
825 USHORT Flags;
826 USHORT IoMapBase;
827 KIIO_ACCESS_MAP IoMaps[IOPM_COUNT];
828 UCHAR IntDirectionMap[IOPM_DIRECTION_MAP_SIZE];
829 } KTSS, *PKTSS;
830
831 //
832 // i386 CPUs don't have exception frames
833 //
834 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
835
836 #endif /* NTOS_MODE_USER */
837
838 typedef enum _WOW64_SERVICE_TYPES
839 {
840 ServiceNoTurbo = 0x0000,
841 Service0Arg = 0x0001,
842 Service0ArgReloadState = 0x0002,
843 Service1ArgSp = 0x0003,
844 Service1ArgNSp = 0x0004,
845 Service2ArgNSpNSp = 0x0005,
846 Service2ArgNSpNSpReloadState = 0x0006,
847 Service2ArgSpNSp = 0x0007,
848 Service2ArgSpSp = 0x0008,
849 Service2ArgNSpSp = 0x0009,
850 Service3ArgNSpNSpNSp = 0x000A,
851 Service3ArgSpSpSp = 0x000B,
852 Service3ArgSpNSpNSp = 0x000C,
853 Service3ArgSpNSpNSpReloadState = 0x000D,
854 Service3ArgSpSpNSp = 0x000E,
855 Service3ArgNSpSpNSp = 0x000F,
856 Service3ArgSpNSpSp = 0x0010,
857 Service4ArgNSpNSpNSpNSp = 0x0011,
858 Service4ArgSpSpNSpNSp = 0x0012,
859 Service4ArgSpSpNSpNSpReloadState = 0x0013,
860 Service4ArgSpNSpNSpNSp = 0x0014,
861 Service4ArgSpNSpNSpNSpReloadState = 0x0015,
862 Service4ArgNSpSpNSpNSp = 0x0016,
863 Service4ArgSpSpSpNSp = 0x0017,
864 ServiceCpupTdQuerySystemTime = 0x0018,
865 ServiceCpupTdGetCurrentProcessorNumber = 0x0019,
866 ServiceCpupTdReadWriteFile = 0x001A,
867 ServiceCpupTdDeviceIoControlFile = 0x001B,
868 ServiceCpupTdRemoveIoCompletion = 0x001C,
869 ServiceCpupTdWaitForMultipleObjects = 0x001D,
870 ServiceCpupTdWaitForMultipleObjects32 = 0x001E,
871 Wow64ServiceTypesCount // = 0x001F
872 } WOW64_SERVICE_TYPES, *PWOW64_SERVICE_TYPES;
873
874 typedef enum _VDM_INDEX
875 {
876 VDM_INDEX_Invalid = 0,
877 VDM_INDEX_0F,
878 VDM_INDEX_ESPrefix,
879 VDM_INDEX_CSPrefix,
880 VDM_INDEX_SSPrefix,
881 VDM_INDEX_DSPrefix,
882 VDM_INDEX_FSPrefix,
883 VDM_INDEX_GSPrefix,
884 VDM_INDEX_OPER32Prefix,
885 VDM_INDEX_ADDR32Prefix,
886 VDM_INDEX_INSB,
887 VDM_INDEX_INSW,
888 VDM_INDEX_OUTSB,
889 VDM_INDEX_OUTSW,
890 VDM_INDEX_PUSHF,
891 VDM_INDEX_POPF,
892 VDM_INDEX_INTnn,
893 VDM_INDEX_INTO,
894 VDM_INDEX_IRET,
895 VDM_INDEX_NPX,
896 VDM_INDEX_INBimm,
897 VDM_INDEX_INWimm,
898 VDM_INDEX_OUTBimm,
899 VDM_INDEX_OUTWimm,
900 VDM_INDEX_INB,
901 VDM_INDEX_INW,
902 VDM_INDEX_OUTB,
903 VDM_INDEX_OUTW,
904 VDM_INDEX_LOCKPrefix,
905 VDM_INDEX_REPNEPrefix,
906 VDM_INDEX_REPPrefix,
907 VDM_INDEX_CLI,
908 VDM_INDEX_STI,
909 VDM_INDEX_HLT,
910 MAX_VDM_INDEX
911 } VDM_INDEX, *PVDM_INDEX;
912
913 #endif /* _I386_KETYPES_H */