- More MSVC fixes (down to 19 errors):
[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 // Machine Types
28 //
29 #define MACHINE_TYPE_ISA 0x0000
30 #define MACHINE_TYPE_EISA 0x0001
31 #define MACHINE_TYPE_MCA 0x0002
32
33 //
34 // X86 80386 Segment Types
35 //
36 #define I386_TASK_GATE 0x5
37 #define I386_TSS 0x9
38 #define I386_ACTIVE_TSS 0xB
39 #define I386_CALL_GATE 0xC
40 #define I386_INTERRUPT_GATE 0xE
41 #define I386_TRAP_GATE 0xF
42
43 //
44 // Selector Names
45 //
46 #define RPL_MASK 0x0003
47 #define MODE_MASK 0x0001
48 #define KGDT_R0_CODE 0x8
49 #define KGDT_R0_DATA 0x10
50 #define KGDT_R3_CODE 0x18
51 #define KGDT_R3_DATA 0x20
52 #define KGDT_TSS 0x28
53 #define KGDT_R0_PCR 0x30
54 #define KGDT_R3_TEB 0x38
55 #define KGDT_LDT 0x48
56 #define KGDT_DF_TSS 0x50
57 #define KGDT_NMI_TSS 0x58
58
59 //
60 // CR4
61 //
62 #define CR4_VME 0x1
63 #define CR4_PVI 0x2
64 #define CR4_TSD 0x4
65 #define CR4_DE 0x8
66 #define CR4_PSE 0x10
67 #define CR4_PAE 0x20
68 #define CR4_MCE 0x40
69 #define CR4_PGE 0x80
70 #define CR4_FXSR 0x200
71 #define CR4_XMMEXCPT 0x400
72
73 //
74 // EFlags
75 //
76 #define EFLAGS_CF 0x01L
77 #define EFLAGS_ZF 0x40L
78 #define EFLAGS_TF 0x100L
79 #define EFLAGS_INTERRUPT_MASK 0x200L
80 #define EFLAGS_DF 0x400L
81 #define EFLAGS_NESTED_TASK 0x4000L
82 #define EFLAGS_V86_MASK 0x20000
83 #define EFLAGS_ALIGN_CHECK 0x40000
84 #define EFLAGS_VIF 0x80000
85 #define EFLAGS_VIP 0x100000
86 #define EFLAGS_USER_SANITIZE 0x3F4DD7
87 #define EFLAG_SIGN 0x8000
88 #define EFLAG_ZERO 0x4000
89
90 //
91 // IPI Types
92 //
93 #define IPI_APC 1
94 #define IPI_DPC 2
95 #define IPI_FREEZE 4
96 #define IPI_PACKET_READY 8
97 #define IPI_SYNCH_REQUEST 16
98
99 //
100 // HAL Variables
101 //
102 #define INITIAL_STALL_COUNT 0x64
103
104 //
105 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
106 //
107 #define KSEG0_BASE 0x80000000
108
109 //
110 // Synchronization-level IRQL
111 //
112 #if defined(NT_UP)
113 #define SYNCH_LEVEL DISPATCH_LEVEL
114 #else
115 #define SYNCH_LEVEL (IPI_LEVEL - 1)
116 #endif
117
118 //
119 // Macro to get current KPRCB
120 //
121 #ifndef __GNUC__ // fixme
122 FORCEINLINE
123 struct _KPRCB *
124 KeGetCurrentPrcb(VOID)
125 {
126 return (struct _KPRCB *)(ULONG_PTR)__readfsdword(FIELD_OFFSET(KPCR, Prcb));
127 }
128
129 //
130 // Macro to get current previous mode
131 //
132 #define KeGetPreviousMode ExGetPreviousMode
133 #endif
134
135 //
136 // Trap Frame Definition
137 //
138 typedef struct _KTRAP_FRAME
139 {
140 ULONG DbgEbp;
141 ULONG DbgEip;
142 ULONG DbgArgMark;
143 ULONG DbgArgPointer;
144 ULONG TempSegCs;
145 ULONG TempEsp;
146 ULONG Dr0;
147 ULONG Dr1;
148 ULONG Dr2;
149 ULONG Dr3;
150 ULONG Dr6;
151 ULONG Dr7;
152 ULONG SegGs;
153 ULONG SegEs;
154 ULONG SegDs;
155 ULONG Edx;
156 ULONG Ecx;
157 ULONG Eax;
158 ULONG PreviousPreviousMode;
159 struct _EXCEPTION_REGISTRATION_RECORD FAR *ExceptionList;
160 ULONG SegFs;
161 ULONG Edi;
162 ULONG Esi;
163 ULONG Ebx;
164 ULONG Ebp;
165 ULONG ErrCode;
166 ULONG Eip;
167 ULONG SegCs;
168 ULONG EFlags;
169 ULONG HardwareEsp;
170 ULONG HardwareSegSs;
171 ULONG V86Es;
172 ULONG V86Ds;
173 ULONG V86Fs;
174 ULONG V86Gs;
175 } KTRAP_FRAME, *PKTRAP_FRAME;
176
177 //
178 // LDT Entry Definition
179 //
180 #ifndef _LDT_ENTRY_DEFINED
181 #define _LDT_ENTRY_DEFINED
182 typedef struct _LDT_ENTRY
183 {
184 USHORT LimitLow;
185 USHORT BaseLow;
186 union
187 {
188 struct
189 {
190 UCHAR BaseMid;
191 UCHAR Flags1;
192 UCHAR Flags2;
193 UCHAR BaseHi;
194 } Bytes;
195 struct
196 {
197 ULONG BaseMid:8;
198 ULONG Type:5;
199 ULONG Dpl:2;
200 ULONG Pres:1;
201 ULONG LimitHi:4;
202 ULONG Sys:1;
203 ULONG Reserved_0:1;
204 ULONG Default_Big:1;
205 ULONG Granularity:1;
206 ULONG BaseHi:8;
207 } Bits;
208 } HighWord;
209 } LDT_ENTRY, *PLDT_ENTRY, *LPLDT_ENTRY;
210 #endif
211
212 //
213 // GDT Entry Definition
214 //
215 typedef struct _KGDTENTRY
216 {
217 USHORT LimitLow;
218 USHORT BaseLow;
219 union
220 {
221 struct
222 {
223 UCHAR BaseMid;
224 UCHAR Flags1;
225 UCHAR Flags2;
226 UCHAR BaseHi;
227 } Bytes;
228 struct
229 {
230 ULONG BaseMid:8;
231 ULONG Type:5;
232 ULONG Dpl:2;
233 ULONG Pres:1;
234 ULONG LimitHi:4;
235 ULONG Sys:1;
236 ULONG Reserved_0:1;
237 ULONG Default_Big:1;
238 ULONG Granularity:1;
239 ULONG BaseHi:8;
240 } Bits;
241 } HighWord;
242 } KGDTENTRY, *PKGDTENTRY;
243
244 //
245 // IDT Entry Access Definition
246 //
247 typedef struct _KIDT_ACCESS
248 {
249 union
250 {
251 struct
252 {
253 UCHAR Reserved;
254 UCHAR SegmentType:4;
255 UCHAR SystemSegmentFlag:1;
256 UCHAR Dpl:2;
257 UCHAR Present:1;
258 };
259 USHORT Value;
260 };
261 } KIDT_ACCESS, *PKIDT_ACCESS;
262
263 //
264 // IDT Entry Definition
265 //
266 typedef struct _KIDTENTRY
267 {
268 USHORT Offset;
269 USHORT Selector;
270 USHORT Access;
271 USHORT ExtendedOffset;
272 } KIDTENTRY, *PKIDTENTRY;
273
274 #include <pshpack2.h>
275 typedef struct _DESCRIPTOR
276 {
277 USHORT Limit;
278 ULONG Base;
279 USHORT Padding;
280 } KDESCRIPTOR, *PKDESCRIPTOR;
281 #include <poppack.h>
282
283 #ifndef NTOS_MODE_USER
284
285 //
286 // FN/FX (FPU) Save Area Structures
287 //
288 typedef struct _FNSAVE_FORMAT
289 {
290 ULONG ControlWord;
291 ULONG StatusWord;
292 ULONG TagWord;
293 ULONG ErrorOffset;
294 ULONG ErrorSelector;
295 ULONG DataOffset;
296 ULONG DataSelector;
297 UCHAR RegisterArea[80];
298 } FNSAVE_FORMAT, *PFNSAVE_FORMAT;
299
300 typedef struct _FXSAVE_FORMAT
301 {
302 USHORT ControlWord;
303 USHORT StatusWord;
304 USHORT TagWord;
305 USHORT ErrorOpcode;
306 ULONG ErrorOffset;
307 ULONG ErrorSelector;
308 ULONG DataOffset;
309 ULONG DataSelector;
310 ULONG MXCsr;
311 ULONG MXCsrMask;
312 UCHAR RegisterArea[128];
313 UCHAR Reserved3[128];
314 UCHAR Reserved4[224];
315 UCHAR Align16Byte[8];
316 } FXSAVE_FORMAT, *PFXSAVE_FORMAT;
317
318 typedef struct _FX_SAVE_AREA
319 {
320 union
321 {
322 FNSAVE_FORMAT FnArea;
323 FXSAVE_FORMAT FxArea;
324 } U;
325 ULONG NpxSavedCpu;
326 ULONG Cr0NpxState;
327 } FX_SAVE_AREA, *PFX_SAVE_AREA;
328
329 //
330 // Special Registers Structure (outside of CONTEXT)
331 //
332 typedef struct _KSPECIAL_REGISTERS
333 {
334 ULONG Cr0;
335 ULONG Cr2;
336 ULONG Cr3;
337 ULONG Cr4;
338 ULONG KernelDr0;
339 ULONG KernelDr1;
340 ULONG KernelDr2;
341 ULONG KernelDr3;
342 ULONG KernelDr6;
343 ULONG KernelDr7;
344 KDESCRIPTOR Gdtr;
345 KDESCRIPTOR Idtr;
346 USHORT Tr;
347 USHORT Ldtr;
348 ULONG Reserved[6];
349 } KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
350
351 //
352 // Processor State Data
353 //
354 #pragma pack(push,4)
355 typedef struct _KPROCESSOR_STATE
356 {
357 CONTEXT ContextFrame;
358 KSPECIAL_REGISTERS SpecialRegisters;
359 } KPROCESSOR_STATE, *PKPROCESSOR_STATE;
360
361 //
362 // Processor Region Control Block
363 //
364 typedef struct _KPRCB
365 {
366 USHORT MinorVersion;
367 USHORT MajorVersion;
368 struct _KTHREAD *CurrentThread;
369 struct _KTHREAD *NextThread;
370 struct _KTHREAD *IdleThread;
371 UCHAR Number;
372 UCHAR Reserved;
373 USHORT BuildType;
374 KAFFINITY SetMember;
375 UCHAR CpuType;
376 UCHAR CpuID;
377 USHORT CpuStep;
378 KPROCESSOR_STATE ProcessorState;
379 ULONG KernelReserved[16];
380 ULONG HalReserved[16];
381 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
382 ULONG CFlushSize;
383 UCHAR PrcbPad0[88];
384 #else
385 UCHAR PrcbPad0[92];
386 #endif
387 KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock];
388 struct _KTHREAD *NpxThread;
389 ULONG InterruptCount;
390 ULONG KernelTime;
391 ULONG UserTime;
392 ULONG DpcTime;
393 ULONG DebugDpcTime;
394 ULONG InterruptTime;
395 ULONG AdjustDpcThreshold;
396 ULONG PageColor;
397 UCHAR SkipTick;
398 UCHAR DebuggerSavedIRQL;
399 #if (NTDDI_VERSION >= NTDDI_WS03)
400 UCHAR NodeColor;
401 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
402 UCHAR PollSlot;
403 #else
404 UCHAR Spare1;
405 #endif
406 ULONG NodeShiftedColor;
407 #else
408 UCHAR Spare1[6];
409 #endif
410 struct _KNODE *ParentNode;
411 ULONG MultiThreadProcessorSet;
412 struct _KPRCB *MultiThreadSetMaster;
413 #if (NTDDI_VERSION >= NTDDI_WS03)
414 ULONG SecondaryColorMask;
415 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
416 ULONG DpcTimeLimit;
417 #else
418 LONG Sleeping;
419 #endif
420 #else
421 ULONG ThreadStartCount[2];
422 #endif
423 ULONG CcFastReadNoWait;
424 ULONG CcFastReadWait;
425 ULONG CcFastReadNotPossible;
426 ULONG CcCopyReadNoWait;
427 ULONG CcCopyReadWait;
428 ULONG CcCopyReadNoWaitMiss;
429 #if (NTDDI_VERSION < NTDDI_LONGHORN)
430 ULONG KeAlignmentFixupCount;
431 #endif
432 ULONG SpareCounter0;
433 #if (NTDDI_VERSION < NTDDI_LONGHORN)
434 ULONG KeDcacheFlushCount;
435 ULONG KeExceptionDispatchCount;
436 ULONG KeFirstLevelTbFills;
437 ULONG KeFloatingEmulationCount;
438 ULONG KeIcacheFlushCount;
439 ULONG KeSecondLevelTbFills;
440 ULONG KeSystemCalls;
441 #endif
442 volatile ULONG IoReadOperationCount;
443 volatile ULONG IoWriteOperationCount;
444 volatile ULONG IoOtherOperationCount;
445 LARGE_INTEGER IoReadTransferCount;
446 LARGE_INTEGER IoWriteTransferCount;
447 LARGE_INTEGER IoOtherTransferCount;
448 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
449 ULONG CcFastMdlReadNoWait;
450 ULONG CcFastMdlReadWait;
451 ULONG CcFastMdlReadNotPossible;
452 ULONG CcMapDataNoWait;
453 ULONG CcMapDataWait;
454 ULONG CcPinMappedDataCount;
455 ULONG CcPinReadNoWait;
456 ULONG CcPinReadWait;
457 ULONG CcMdlReadNoWait;
458 ULONG CcMdlReadWait;
459 ULONG CcLazyWriteHotSpots;
460 ULONG CcLazyWriteIos;
461 ULONG CcLazyWritePages;
462 ULONG CcDataFlushes;
463 ULONG CcDataPages;
464 ULONG CcLostDelayedWrites;
465 ULONG CcFastReadResourceMiss;
466 ULONG CcCopyReadWaitMiss;
467 ULONG CcFastMdlReadResourceMiss;
468 ULONG CcMapDataNoWaitMiss;
469 ULONG CcMapDataWaitMiss;
470 ULONG CcPinReadNoWaitMiss;
471 ULONG CcPinReadWaitMiss;
472 ULONG CcMdlReadNoWaitMiss;
473 ULONG CcMdlReadWaitMiss;
474 ULONG CcReadAheadIos;
475 ULONG KeAlignmentFixupCount;
476 ULONG KeExceptionDispatchCount;
477 ULONG KeSystemCalls;
478 ULONG PrcbPad1[3];
479 #else
480 ULONG SpareCounter1[8];
481 #endif
482 PP_LOOKASIDE_LIST PPLookasideList[16];
483 PP_LOOKASIDE_LIST PPNPagedLookasideList[32];
484 PP_LOOKASIDE_LIST PPPagedLookasideList[32];
485 volatile ULONG PacketBarrier;
486 volatile ULONG ReverseStall;
487 PVOID IpiFrame;
488 UCHAR PrcbPad2[52];
489 volatile PVOID CurrentPacket[3];
490 volatile ULONG TargetSet;
491 volatile PKIPI_WORKER WorkerRoutine;
492 volatile ULONG IpiFrozen;
493 UCHAR PrcbPad3[40];
494 volatile ULONG RequestSummary;
495 volatile struct _KPRCB *SignalDone;
496 UCHAR PrcbPad4[56];
497 struct _KDPC_DATA DpcData[2];
498 PVOID DpcStack;
499 ULONG MaximumDpcQueueDepth;
500 ULONG DpcRequestRate;
501 ULONG MinimumDpcRate;
502 volatile UCHAR DpcInterruptRequested;
503 volatile UCHAR DpcThreadRequested;
504 volatile UCHAR DpcRoutineActive;
505 volatile UCHAR DpcThreadActive;
506 ULONG PrcbLock;
507 ULONG DpcLastCount;
508 volatile ULONG TimerHand;
509 volatile ULONG TimerRequest;
510 PVOID DpcThread;
511 KEVENT DpcEvent;
512 UCHAR ThreadDpcEnable;
513 volatile BOOLEAN QuantumEnd;
514 UCHAR PrcbPad50;
515 volatile UCHAR IdleSchedule;
516 LONG DpcSetEventRequest;
517 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
518 LONG Sleeping;
519 ULONG PeriodicCount;
520 ULONG PeriodicBias;
521 UCHAR PrcbPad5[6];
522 #else
523 UCHAR PrcbPad5[18];
524 #endif
525 LONG TickOffset;
526 KDPC CallDpc;
527 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
528 LONG ClockKeepAlive;
529 UCHAR ClockCheckSlot;
530 UCHAR ClockPollCycle;
531 UCHAR PrcbPad6[2];
532 LONG DpcWatchdogPeriod;
533 LONG DpcWatchDogCount;
534 LONG ThreadWatchdogPeriod;
535 LONG ThreadWatchDogCount;
536 ULONG PrcbPad70[2];
537 #else
538 ULONG PrcbPad7[8];
539 #endif
540 LIST_ENTRY WaitListHead;
541 ULONG ReadySummary;
542 ULONG QueueIndex;
543 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
544 SINGLE_LIST_ENTRY DeferredReadyListHead;
545 ULONGLONG StartCycles;
546 ULONGLONG CycleTime;
547 ULONGLONG PrcbPad71[3];
548 LIST_ENTRY DispatcherReadyListHead[32];
549 #else
550 LIST_ENTRY DispatcherReadyListHead[32];
551 SINGLE_LIST_ENTRY DeferredReadyListHead;
552 ULONG PrcbPad72[11];
553 #endif
554 PVOID ChainedInterruptList;
555 LONG LookasideIrpFloat;
556 volatile LONG MmPageFaultCount;
557 volatile LONG MmCopyOnWriteCount;
558 volatile LONG MmTransitionCount;
559 volatile LONG MmCacheTransitionCount;
560 volatile LONG MmDemandZeroCount;
561 volatile LONG MmPageReadCount;
562 volatile LONG MmPageReadIoCount;
563 volatile LONG MmCacheReadCount;
564 volatile LONG MmCacheIoCount;
565 volatile LONG MmDirtyPagesWriteCount;
566 volatile LONG MmDirtyWriteIoCount;
567 volatile LONG MmMappedPagesWriteCount;
568 volatile LONG MmMappedWriteIoCount;
569 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
570 ULONG CachedCommit;
571 ULONG CachedResidentAvailable;
572 PVOID HyperPte;
573 UCHAR CpuVendor;
574 UCHAR PrcbPad9[3];
575 #else
576 ULONG SpareFields0[1];
577 #endif
578 CHAR VendorString[13];
579 UCHAR InitialApicId;
580 UCHAR LogicalProcessorsPerPhysicalProcessor;
581 ULONG MHz;
582 ULONG FeatureBits;
583 LARGE_INTEGER UpdateSignature;
584 volatile LARGE_INTEGER IsrTime;
585 LARGE_INTEGER SpareField1;
586 FX_SAVE_AREA NpxSaveArea;
587 PROCESSOR_POWER_STATE PowerState;
588 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
589 KDPC DpcWatchdogDoc;
590 KTIMER DpcWatchdogTimer;
591 PVOID WheaInfo;
592 PVOID EtwSupport;
593 SLIST_HEADER InterruptObjectPool;
594 LARGE_INTEGER HyperCallPagePhysical;
595 LARGE_INTEGER HyperCallPageVirtual;
596 PVOID RateControl;
597 CACHE_DESCRIPTOR Cache[5];
598 ULONG CacheCount;
599 ULONG CacheProcessorMask[5];
600 UCHAR LogicalProcessorsPerCore;
601 UCHAR PrcbPad8[3];
602 ULONG PackageProcessorSet;
603 ULONG CoreProcessorSet;
604 #endif
605 } KPRCB, *PKPRCB;
606
607 //
608 // Processor Control Region
609 //
610 typedef struct _KIPCR
611 {
612 union
613 {
614 NT_TIB NtTib;
615 struct
616 {
617 struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
618 PVOID Used_StackBase;
619 PVOID PerfGlobalGroupMask;
620 PVOID TssCopy;
621 ULONG ContextSwitches;
622 KAFFINITY SetMemberCopy;
623 PVOID Used_Self;
624 };
625 };
626 struct _KPCR *Self;
627 struct _KPRCB *Prcb;
628 KIRQL Irql;
629 ULONG IRR;
630 ULONG IrrActive;
631 ULONG IDR;
632 PVOID KdVersionBlock;
633 PKIDTENTRY IDT;
634 #ifdef _REACTOS_
635 PUSHORT GDT;
636 #else
637 PKGDTENTRY GDT;
638 #endif
639 struct _KTSS *TSS;
640 USHORT MajorVersion;
641 USHORT MinorVersion;
642 KAFFINITY SetMember;
643 ULONG StallScaleFactor;
644 UCHAR SparedUnused;
645 UCHAR Number;
646 UCHAR Reserved;
647 UCHAR L2CacheAssociativity;
648 ULONG VdmAlert;
649 ULONG KernelReserved[14];
650 ULONG SecondLevelCacheSize;
651 ULONG HalReserved[16];
652 ULONG InterruptMode;
653 UCHAR Spare1;
654 ULONG KernelReserved2[17];
655 KPRCB PrcbData;
656 } KIPCR, *PKIPCR;
657 #pragma pack(pop)
658
659 //
660 // TSS Definition
661 //
662 typedef struct _KiIoAccessMap
663 {
664 UCHAR DirectionMap[32];
665 UCHAR IoMap[8196];
666 } KIIO_ACCESS_MAP;
667
668 typedef struct _KTSS
669 {
670 USHORT Backlink;
671 USHORT Reserved0;
672 ULONG Esp0;
673 USHORT Ss0;
674 USHORT Reserved1;
675 ULONG NotUsed1[4];
676 ULONG CR3;
677 ULONG Eip;
678 ULONG EFlags;
679 ULONG Eax;
680 ULONG Ecx;
681 ULONG Edx;
682 ULONG Ebx;
683 ULONG Esp;
684 ULONG Ebp;
685 ULONG Esi;
686 ULONG Edi;
687 USHORT Es;
688 USHORT Reserved2;
689 USHORT Cs;
690 USHORT Reserved3;
691 USHORT Ss;
692 USHORT Reserved4;
693 USHORT Ds;
694 USHORT Reserved5;
695 USHORT Fs;
696 USHORT Reserved6;
697 USHORT Gs;
698 USHORT Reserved7;
699 USHORT LDT;
700 USHORT Reserved8;
701 USHORT Flags;
702 USHORT IoMapBase;
703 KIIO_ACCESS_MAP IoMaps[1];
704 UCHAR IntDirectionMap[32];
705 } KTSS, *PKTSS;
706
707 //
708 // i386 CPUs don't have exception frames
709 //
710 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
711 #endif
712 #endif