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