- Fix KTSS definition.
[reactos.git] / reactos / ntoskrnl / include / internal / ke.h
1 #ifndef __NTOSKRNL_INCLUDE_INTERNAL_KE_H
2 #define __NTOSKRNL_INCLUDE_INTERNAL_KE_H
3
4 /* INCLUDES *****************************************************************/
5
6 #include "arch/ke.h"
7
8 /* INTERNAL KERNEL TYPES ****************************************************/
9
10 typedef struct _WOW64_PROCESS
11 {
12 PVOID Wow64;
13 } WOW64_PROCESS, *PWOW64_PROCESS;
14
15 typedef struct _KPROFILE_SOURCE_OBJECT
16 {
17 KPROFILE_SOURCE Source;
18 LIST_ENTRY ListEntry;
19 } KPROFILE_SOURCE_OBJECT, *PKPROFILE_SOURCE_OBJECT;
20
21 /* Cached modules from the loader block */
22 typedef enum _CACHED_MODULE_TYPE
23 {
24 AnsiCodepage,
25 OemCodepage,
26 UnicodeCasemap,
27 SystemRegistry,
28 HardwareRegistry,
29 MaximumCachedModuleType,
30 } CACHED_MODULE_TYPE, *PCACHED_MODULE_TYPE;
31 extern PLOADER_MODULE CachedModules[MaximumCachedModuleType];
32
33 typedef enum _CONNECT_TYPE
34 {
35 NoConnect,
36 NormalConnect,
37 ChainConnect,
38 UnknownConnect
39 } CONNECT_TYPE, *PCONNECT_TYPE;
40
41 typedef struct _DISPATCH_INFO
42 {
43 CONNECT_TYPE Type;
44 PKINTERRUPT Interrupt;
45 PKINTERRUPT_ROUTINE NoDispatch;
46 PKINTERRUPT_ROUTINE InterruptDispatch;
47 PKINTERRUPT_ROUTINE FloatingDispatch;
48 PKINTERRUPT_ROUTINE ChainedDispatch;
49 PKINTERRUPT_ROUTINE *FlatDispatch;
50 } DISPATCH_INFO, *PDISPATCH_INFO;
51
52 typedef struct _KTIMER_TABLE_ENTRY
53 {
54 LIST_ENTRY Entry;
55 ULARGE_INTEGER Time;
56 } KTIMER_TABLE_ENTRY, *PKTIMER_TABLE_ENTRY;
57
58 typedef PCHAR
59 (NTAPI *PKE_BUGCHECK_UNICODE_TO_ANSI)(
60 IN PUNICODE_STRING Unicode,
61 IN PCHAR Ansi,
62 IN ULONG Length
63 );
64
65 struct _KIRQ_TRAPFRAME;
66 struct _KPCR;
67 struct _KPRCB;
68 struct _KEXCEPTION_FRAME;
69
70 extern PVOID KeUserApcDispatcher;
71 extern PVOID KeUserCallbackDispatcher;
72 extern PVOID KeUserExceptionDispatcher;
73 extern PVOID KeRaiseUserExceptionDispatcher;
74 extern LARGE_INTEGER SystemBootTime;
75 extern ULONG_PTR KERNEL_BASE;
76 extern ULONG KeI386NpxPresent;
77 extern ULONG KeI386XMMIPresent;
78 extern ULONG KeI386FxsrPresent;
79 extern ULONG KeI386CpuType;
80 extern ULONG KeI386CpuStep;
81 extern ULONG KeProcessorArchitecture;
82 extern ULONG KeProcessorLevel;
83 extern ULONG KeProcessorRevision;
84 extern ULONG KeFeatureBits;
85 extern PKNODE KeNodeBlock[1];
86 extern UCHAR KeNumberNodes;
87 extern UCHAR KeProcessNodeSeed;
88 extern ULONG KiInterruptTemplate[KINTERRUPT_DISPATCH_CODES];
89 extern PULONG KiInterruptTemplateObject;
90 extern PULONG KiInterruptTemplateDispatch;
91 extern PULONG KiInterruptTemplate2ndDispatch;
92 extern ULONG KiUnexpectedEntrySize;
93 extern PVOID Ki386IopmSaveArea;
94 extern ULONG KeI386EFlagsAndMaskV86;
95 extern ULONG KeI386EFlagsOrMaskV86;
96 extern BOOLEAN KeI386VirtualIntExtensions;
97 extern KIDTENTRY KiIdt[];
98 extern KGDTENTRY KiBootGdt[];
99 extern FAST_MUTEX KernelAddressSpaceLock;
100 extern ULONG KiMaximumDpcQueueDepth;
101 extern ULONG KiMinimumDpcRate;
102 extern ULONG KiAdjustDpcThreshold;
103 extern ULONG KiIdealDpcRate;
104 extern LARGE_INTEGER KiTimeIncrementReciprocal;
105 extern UCHAR KiTimeIncrementShiftCount;
106 extern LIST_ENTRY BugcheckCallbackListHead, BugcheckReasonCallbackListHead;
107 extern KSPIN_LOCK BugCheckCallbackLock;
108 extern KDPC KiExpireTimerDpc;
109 extern KTIMER_TABLE_ENTRY KiTimerTableListHead[TIMER_TABLE_SIZE];
110 extern LIST_ENTRY KiTimerListHead;
111 extern KMUTEX KiGenericCallDpcMutex;
112 extern LIST_ENTRY KiProfileListHead, KiProfileSourceListHead;
113 extern KSPIN_LOCK KiProfileLock;
114 extern LIST_ENTRY KiProcessInSwapListHead, KiProcessOutSwapListHead;
115 extern LIST_ENTRY KiStackInSwapListHead;
116 extern KEVENT KiSwapEvent;
117 extern PKPRCB KiProcessorBlock[];
118 extern ULONG KiMask32Array[MAXIMUM_PRIORITY];
119 extern ULONG IdleProcessorMask;
120 extern ULONG trap_stack_top;
121 extern VOID KiTrap8(VOID);
122
123 /* MACROS *************************************************************************/
124
125 /*
126 * On UP machines, we don't actually have a spinlock, we merely raise
127 * IRQL to DPC level.
128 */
129 #ifdef CONFIG_SMP
130 #define KeInitializeDispatcher() KeInitializeSpinLock(&DispatcherDatabaseLock);
131 #define KeAcquireDispatcherDatabaseLock() KfAcquireSpinLock(&DispatcherDatabaseLock);
132 #define KeAcquireDispatcherDatabaseLockAtDpcLevel() \
133 KeAcquireSpinLockAtDpcLevel (&DispatcherDatabaseLock);
134 #define KeReleaseDispatcherDatabaseLockFromDpcLevel() \
135 KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock);
136 #define KeReleaseDispatcherDatabaseLock(OldIrql) \
137 KiExitDispatcher(OldIrql);
138 #else
139 #define KeInitializeDispatcher()
140 #define KeAcquireDispatcherDatabaseLock() KeRaiseIrqlToDpcLevel();
141 #define KeReleaseDispatcherDatabaseLock(OldIrql) KiExitDispatcher(OldIrql);
142 #define KeAcquireDispatcherDatabaseLockAtDpcLevel()
143 #define KeReleaseDispatcherDatabaseLockFromDpcLevel()
144 #endif
145
146 #define AFFINITY_MASK(Id) KiMask32Array[Id]
147
148 /* The following macro initializes a dispatcher object's header */
149 #define KeInitializeDispatcherHeader(Header, t, s, State) \
150 { \
151 (Header)->Type = t; \
152 (Header)->Absolute = 0; \
153 (Header)->Inserted = 0; \
154 (Header)->Size = s; \
155 (Header)->SignalState = State; \
156 InitializeListHead(&((Header)->WaitListHead)); \
157 }
158
159 extern KSPIN_LOCK DispatcherDatabaseLock;
160
161 #define KeEnterCriticalRegion() \
162 { \
163 PKTHREAD _Thread = KeGetCurrentThread(); \
164 if (_Thread) _Thread->KernelApcDisable--; \
165 }
166
167 #define KeLeaveCriticalRegion() \
168 { \
169 PKTHREAD _Thread = KeGetCurrentThread(); \
170 if((_Thread) && (++_Thread->KernelApcDisable == 0)) \
171 { \
172 if (!IsListEmpty(&_Thread->ApcState.ApcListHead[KernelMode]) && \
173 (_Thread->SpecialApcDisable == 0)) \
174 { \
175 KiCheckForKernelApcDelivery(); \
176 } \
177 } \
178 }
179
180 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
181 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
182 KeBugCheckWithTf(a,b,c,d,e,f)
183
184 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
185 #define TIMER_OR_EVENT_TYPE 0x7L
186
187 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
188 #define TIMER_WAIT_BLOCK 0x3L
189
190 /* IOPM Definitions */
191 #define IO_ACCESS_MAP_NONE 0
192 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
193 #define KiComputeIopmOffset(MapNumber) \
194 (MapNumber == IO_ACCESS_MAP_NONE) ? \
195 (USHORT)(sizeof(KTSS)) : \
196 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
197
198 #define SIZE_OF_FX_REGISTERS 32
199
200 /* INTERNAL KERNEL FUNCTIONS ************************************************/
201
202 /* threadsch.c ********************************************************************/
203
204 /* Thread Scheduler Functions */
205
206 /* Readies a Thread for Execution. */
207 BOOLEAN
208 STDCALL
209 KiDispatchThreadNoLock(ULONG NewThreadStatus);
210
211 /* Readies a Thread for Execution. */
212 VOID
213 STDCALL
214 KiDispatchThread(ULONG NewThreadStatus);
215
216 /* Finds a new thread to run */
217 NTSTATUS
218 NTAPI
219 KiSwapThread(
220 VOID
221 );
222
223 VOID
224 NTAPI
225 KiReadyThread(IN PKTHREAD Thread);
226
227 NTSTATUS
228 STDCALL
229 KeSuspendThread(PKTHREAD Thread);
230
231 NTSTATUS
232 FASTCALL
233 KiSwapContext(
234 IN PKTHREAD CurrentThread,
235 IN PKTHREAD NewThread
236 );
237
238 VOID
239 STDCALL
240 KiAdjustQuantumThread(IN PKTHREAD Thread);
241
242 VOID
243 FASTCALL
244 KiExitDispatcher(KIRQL OldIrql);
245
246 /* gmutex.c ********************************************************************/
247
248 VOID
249 FASTCALL
250 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex);
251
252 /* gate.c **********************************************************************/
253
254 VOID
255 FASTCALL
256 KeInitializeGate(PKGATE Gate);
257
258 VOID
259 FASTCALL
260 KeSignalGateBoostPriority(PKGATE Gate);
261
262 VOID
263 FASTCALL
264 KeWaitForGate(
265 PKGATE Gate,
266 KWAIT_REASON WaitReason,
267 KPROCESSOR_MODE WaitMode
268 );
269
270 /* ipi.c ********************************************************************/
271
272 VOID
273 NTAPI
274 KiIpiSendRequest(
275 KAFFINITY TargetSet,
276 ULONG IpiRequest
277 );
278
279 /* next file ***************************************************************/
280
281 UCHAR
282 NTAPI
283 KeFindNextRightSetAffinity(
284 IN UCHAR Number,
285 IN ULONG Set
286 );
287
288 VOID
289 STDCALL
290 DbgBreakPointNoBugCheck(VOID);
291
292 VOID
293 STDCALL
294 KeInitializeProfile(
295 struct _KPROFILE* Profile,
296 struct _KPROCESS* Process,
297 PVOID ImageBase,
298 ULONG ImageSize,
299 ULONG BucketSize,
300 KPROFILE_SOURCE ProfileSource,
301 KAFFINITY Affinity
302 );
303
304 VOID
305 STDCALL
306 KeStartProfile(
307 struct _KPROFILE* Profile,
308 PVOID Buffer
309 );
310
311 BOOLEAN
312 STDCALL
313 KeStopProfile(struct _KPROFILE* Profile);
314
315 ULONG
316 STDCALL
317 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource);
318
319 VOID
320 STDCALL
321 KeSetIntervalProfile(
322 KPROFILE_SOURCE ProfileSource,
323 ULONG Interval
324 );
325
326 VOID
327 STDCALL
328 KeProfileInterrupt(
329 PKTRAP_FRAME TrapFrame
330 );
331
332 VOID
333 STDCALL
334 KeProfileInterruptWithSource(
335 IN PKTRAP_FRAME TrapFrame,
336 IN KPROFILE_SOURCE Source
337 );
338
339 BOOLEAN
340 STDCALL
341 KiRosPrintAddress(PVOID Address);
342
343 VOID
344 STDCALL
345 KeUpdateRunTime(
346 PKTRAP_FRAME TrapFrame,
347 KIRQL Irql
348 );
349
350 VOID
351 STDCALL
352 KiExpireTimers(
353 PKDPC Dpc,
354 PVOID DeferredContext,
355 PVOID SystemArgument1,
356 PVOID SystemArgument2
357 );
358
359 VOID
360 NTAPI
361 KeInitializeThread(
362 IN PKPROCESS Process,
363 IN OUT PKTHREAD Thread,
364 IN PKSYSTEM_ROUTINE SystemRoutine,
365 IN PKSTART_ROUTINE StartRoutine,
366 IN PVOID StartContext,
367 IN PCONTEXT Context,
368 IN PVOID Teb,
369 IN PVOID KernelStack
370 );
371
372 VOID
373 NTAPI
374 KeUninitThread(
375 IN PKTHREAD Thread
376 );
377
378 NTSTATUS
379 NTAPI
380 KeInitThread(
381 IN OUT PKTHREAD Thread,
382 IN PVOID KernelStack,
383 IN PKSYSTEM_ROUTINE SystemRoutine,
384 IN PKSTART_ROUTINE StartRoutine,
385 IN PVOID StartContext,
386 IN PCONTEXT Context,
387 IN PVOID Teb,
388 IN PKPROCESS Process
389 );
390
391 VOID
392 NTAPI
393 KeStartThread(
394 IN OUT PKTHREAD Thread
395 );
396
397 BOOLEAN
398 NTAPI
399 KeAlertThread(
400 IN PKTHREAD Thread,
401 IN KPROCESSOR_MODE AlertMode
402 );
403
404 ULONG
405 NTAPI
406 KeAlertResumeThread(
407 IN PKTHREAD Thread
408 );
409
410 ULONG
411 NTAPI
412 KeResumeThread(
413 IN PKTHREAD Thread
414 );
415
416 PVOID
417 NTAPI
418 KeSwitchKernelStack(
419 IN PVOID StackBase,
420 IN PVOID StackLimit
421 );
422
423 VOID
424 STDCALL
425 KeRundownThread(VOID);
426
427 NTSTATUS
428 NTAPI
429 KeReleaseThread(PKTHREAD Thread);
430
431 LONG
432 STDCALL
433 KeQueryBasePriorityThread(IN PKTHREAD Thread);
434
435 VOID
436 STDCALL
437 KiSetPriorityThread(
438 PKTHREAD Thread,
439 KPRIORITY Priority,
440 PBOOLEAN Released
441 );
442
443 BOOLEAN
444 NTAPI
445 KiDispatcherObjectWake(
446 DISPATCHER_HEADER* hdr,
447 KPRIORITY increment
448 );
449
450 VOID
451 STDCALL
452 KeExpireTimers(
453 PKDPC Apc,
454 PVOID Arg1,
455 PVOID Arg2,
456 PVOID Arg3
457 );
458
459 VOID
460 NTAPI
461 KeDumpStackFrames(PULONG Frame);
462
463 BOOLEAN
464 NTAPI
465 KiTestAlert(VOID);
466
467 VOID
468 FASTCALL
469 KiAbortWaitThread(
470 IN PKTHREAD Thread,
471 IN NTSTATUS WaitStatus,
472 IN KPRIORITY Increment
473 );
474
475 VOID
476 STDCALL
477 KeInitializeProcess(
478 struct _KPROCESS *Process,
479 KPRIORITY Priority,
480 KAFFINITY Affinity,
481 LARGE_INTEGER DirectoryTableBase
482 );
483
484 VOID
485 NTAPI
486 KeSetQuantumProcess(
487 IN PKPROCESS Process,
488 IN UCHAR Quantum
489 );
490
491 KPRIORITY
492 NTAPI
493 KeSetPriorityAndQuantumProcess(
494 IN PKPROCESS Process,
495 IN KPRIORITY Priority,
496 IN UCHAR Quantum OPTIONAL
497 );
498
499 ULONG
500 STDCALL
501 KeForceResumeThread(IN PKTHREAD Thread);
502
503 BOOLEAN
504 STDCALL
505 KeDisableThreadApcQueueing(IN PKTHREAD Thread);
506
507 BOOLEAN
508 STDCALL
509 KiInsertTimer(
510 PKTIMER Timer,
511 LARGE_INTEGER DueTime
512 );
513
514 VOID
515 FASTCALL
516 KiWaitTest(
517 PVOID Object,
518 KPRIORITY Increment
519 );
520
521 PULONG
522 NTAPI
523 KeGetStackTopThread(struct _ETHREAD* Thread);
524
525 VOID
526 STDCALL
527 KeContextToTrapFrame(
528 PCONTEXT Context,
529 PKEXCEPTION_FRAME ExeptionFrame,
530 PKTRAP_FRAME TrapFrame,
531 ULONG ContextFlags,
532 KPROCESSOR_MODE PreviousMode
533 );
534
535 VOID
536 STDCALL
537 KiDeliverApc(
538 KPROCESSOR_MODE PreviousMode,
539 PVOID Reserved,
540 PKTRAP_FRAME TrapFrame
541 );
542
543 VOID
544 STDCALL
545 KiCheckForKernelApcDelivery(VOID);
546
547 LONG
548 STDCALL
549 KiInsertQueue(
550 IN PKQUEUE Queue,
551 IN PLIST_ENTRY Entry,
552 BOOLEAN Head
553 );
554
555 ULONG
556 STDCALL
557 KeSetProcess(
558 struct _KPROCESS* Process,
559 KPRIORITY Increment,
560 BOOLEAN InWait
561 );
562
563 VOID
564 STDCALL
565 KeInitializeEventPair(PKEVENT_PAIR EventPair);
566
567 VOID
568 STDCALL
569 KiInitializeUserApc(
570 IN PKEXCEPTION_FRAME Reserved,
571 IN PKTRAP_FRAME TrapFrame,
572 IN PKNORMAL_ROUTINE NormalRoutine,
573 IN PVOID NormalContext,
574 IN PVOID SystemArgument1,
575 IN PVOID SystemArgument2
576 );
577
578 PLIST_ENTRY
579 STDCALL
580 KeFlushQueueApc(
581 IN PKTHREAD Thread,
582 IN KPROCESSOR_MODE PreviousMode
583 );
584
585 VOID
586 STDCALL
587 KiAttachProcess(
588 struct _KTHREAD *Thread,
589 struct _KPROCESS *Process,
590 KIRQL ApcLock,
591 struct _KAPC_STATE *SavedApcState
592 );
593
594 VOID
595 STDCALL
596 KiSwapProcess(
597 struct _KPROCESS *NewProcess,
598 struct _KPROCESS *OldProcess
599 );
600
601 BOOLEAN
602 STDCALL
603 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode);
604
605 BOOLEAN
606 STDCALL
607 KeRemoveQueueApc(PKAPC Apc);
608
609 VOID
610 FASTCALL
611 KiWakeQueue(IN PKQUEUE Queue);
612
613 /* INITIALIZATION FUNCTIONS *************************************************/
614
615 VOID
616 NTAPI
617 KeInitExceptions(VOID);
618
619 VOID
620 NTAPI
621 KeInitInterrupts(VOID);
622
623 VOID
624 NTAPI
625 KeInitTimer(VOID);
626
627 VOID
628 NTAPI
629 KeInitDispatcher(VOID);
630
631 VOID
632 NTAPI
633 KiInitializeSystemClock(VOID);
634
635 VOID
636 NTAPI
637 KiInitializeBugCheck(VOID);
638
639 VOID
640 NTAPI
641 Phase1Initialization(PVOID Context);
642
643 VOID
644 NTAPI
645 KiSystemStartup(
646 IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock
647 );
648
649 VOID
650 NTAPI
651 KeInit2(VOID);
652
653 BOOLEAN
654 NTAPI
655 KiDeliverUserApc(PKTRAP_FRAME TrapFrame);
656
657 VOID
658 STDCALL
659 KiMoveApcState(
660 PKAPC_STATE OldState,
661 PKAPC_STATE NewState
662 );
663
664 VOID
665 NTAPI
666 KiAddProfileEvent(
667 KPROFILE_SOURCE Source,
668 ULONG Pc
669 );
670
671 VOID
672 NTAPI
673 KiDispatchException(
674 PEXCEPTION_RECORD ExceptionRecord,
675 PKEXCEPTION_FRAME ExceptionFrame,
676 PKTRAP_FRAME Tf,
677 KPROCESSOR_MODE PreviousMode,
678 BOOLEAN SearchFrames
679 );
680
681 VOID
682 NTAPI
683 KeTrapFrameToContext(
684 IN PKTRAP_FRAME TrapFrame,
685 IN PKEXCEPTION_FRAME ExceptionFrame,
686 IN OUT PCONTEXT Context
687 );
688
689 VOID
690 NTAPI
691 KeApplicationProcessorInit(VOID);
692
693 VOID
694 NTAPI
695 KePrepareForApplicationProcessorInit(ULONG id);
696
697 ULONG
698 NTAPI
699 KiUserTrapHandler(
700 PKTRAP_FRAME Tf,
701 ULONG ExceptionNr,
702 PVOID Cr2
703 );
704
705 VOID
706 STDCALL
707 KePushAndStackSwitchAndSysRet(
708 ULONG Push,
709 PVOID NewStack
710 );
711
712 VOID
713 STDCALL
714 KeStackSwitchAndRet(PVOID NewStack);
715
716 VOID
717 STDCALL
718 KeBugCheckWithTf(
719 ULONG BugCheckCode,
720 ULONG BugCheckParameter1,
721 ULONG BugCheckParameter2,
722 ULONG BugCheckParameter3,
723 ULONG BugCheckParameter4,
724 PKTRAP_FRAME Tf
725 );
726
727 VOID
728 NTAPI
729 KeFlushCurrentTb(VOID);
730
731 VOID
732 STDCALL
733 KeRosDumpStackFrames(
734 PULONG Frame,
735 ULONG FrameCount
736 );
737
738 VOID
739 NTAPI
740 KiSetSystemTime(PLARGE_INTEGER NewSystemTime);
741
742 ULONG
743 NTAPI
744 KeV86Exception(
745 ULONG ExceptionNr,
746 PKTRAP_FRAME Tf,
747 ULONG address
748 );
749
750 VOID
751 NTAPI
752 KiStartUnexpectedRange(
753 VOID
754 );
755
756 VOID
757 NTAPI
758 KiEndUnexpectedRange(
759 VOID
760 );
761
762 VOID
763 NTAPI
764 KiInterruptDispatch(
765 VOID
766 );
767
768 VOID
769 NTAPI
770 KiChainedDispatch(
771 VOID
772 );
773
774 VOID
775 NTAPI
776 Ki386AdjustEsp0(
777 IN PKTRAP_FRAME TrapFrame
778 );
779
780 VOID
781 NTAPI
782 Ki386SetupAndExitToV86Mode(
783 OUT PTEB VdmTeb
784 );
785
786 VOID
787 NTAPI
788 KeI386VdmInitialize(
789 VOID
790 );
791
792 VOID
793 NTAPI
794 KiFlushNPXState(
795 IN FLOATING_SAVE_AREA *SaveArea
796 );
797
798 #include "ke_x.h"
799
800 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */