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