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