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