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