[NTOS]: We don't actually need wrappers for NtContinue/NtRaiseException. These are...
[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 typedef enum _CONNECT_TYPE
22 {
23 NoConnect,
24 NormalConnect,
25 ChainConnect,
26 UnknownConnect
27 } CONNECT_TYPE, *PCONNECT_TYPE;
28
29 typedef struct _DISPATCH_INFO
30 {
31 CONNECT_TYPE Type;
32 PKINTERRUPT Interrupt;
33 PKINTERRUPT_ROUTINE NoDispatch;
34 PKINTERRUPT_ROUTINE InterruptDispatch;
35 PKINTERRUPT_ROUTINE FloatingDispatch;
36 PKINTERRUPT_ROUTINE ChainedDispatch;
37 PKINTERRUPT_ROUTINE *FlatDispatch;
38 } DISPATCH_INFO, *PDISPATCH_INFO;
39
40 typedef struct _KI_SAMPLE_MAP
41 {
42 LARGE_INTEGER PerfStart;
43 LARGE_INTEGER PerfEnd;
44 LONGLONG PerfDelta;
45 LARGE_INTEGER PerfFreq;
46 LONGLONG TSCStart;
47 LONGLONG TSCEnd;
48 LONGLONG TSCDelta;
49 ULONG MHz;
50 } KI_SAMPLE_MAP, *PKI_SAMPLE_MAP;
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 #define MAX_TIMER_DPCS 16
59
60 typedef struct _DPC_QUEUE_ENTRY
61 {
62 PKDPC Dpc;
63 PKDEFERRED_ROUTINE Routine;
64 PVOID Context;
65 } DPC_QUEUE_ENTRY, *PDPC_QUEUE_ENTRY;
66
67 typedef struct _KNMI_HANDLER_CALLBACK
68 {
69 struct _KNMI_HANDLER_CALLBACK* Next;
70 PNMI_CALLBACK Callback;
71 PVOID Context;
72 PVOID Handle;
73 } KNMI_HANDLER_CALLBACK, *PKNMI_HANDLER_CALLBACK;
74
75 typedef PCHAR
76 (NTAPI *PKE_BUGCHECK_UNICODE_TO_ANSI)(
77 IN PUNICODE_STRING Unicode,
78 IN PCHAR Ansi,
79 IN ULONG Length
80 );
81
82 extern PKNMI_HANDLER_CALLBACK KiNmiCallbackListHead;
83 extern KSPIN_LOCK KiNmiCallbackListLock;
84 extern PVOID KeUserApcDispatcher;
85 extern PVOID KeUserCallbackDispatcher;
86 extern PVOID KeUserExceptionDispatcher;
87 extern PVOID KeRaiseUserExceptionDispatcher;
88 extern LARGE_INTEGER KeBootTime;
89 extern ULONGLONG KeBootTimeBias;
90 extern BOOLEAN ExCmosClockIsSane;
91 extern ULONG KeProcessorArchitecture;
92 extern ULONG KeProcessorLevel;
93 extern ULONG KeProcessorRevision;
94 extern ULONG KeFeatureBits;
95 extern KNODE KiNode0;
96 extern PKNODE KeNodeBlock[1];
97 extern UCHAR KeNumberNodes;
98 extern UCHAR KeProcessNodeSeed;
99 extern ETHREAD KiInitialThread;
100 extern EPROCESS KiInitialProcess;
101 extern ULONG KiInterruptTemplate[KINTERRUPT_DISPATCH_CODES];
102 extern PULONG KiInterruptTemplateObject;
103 extern PULONG KiInterruptTemplateDispatch;
104 extern PULONG KiInterruptTemplate2ndDispatch;
105 extern ULONG KiUnexpectedEntrySize;
106 extern UCHAR P0BootStack[];
107 extern UCHAR KiDoubleFaultStack[];
108 extern EX_PUSH_LOCK KernelAddressSpaceLock;
109 extern ULONG KiMaximumDpcQueueDepth;
110 extern ULONG KiMinimumDpcRate;
111 extern ULONG KiAdjustDpcThreshold;
112 extern ULONG KiIdealDpcRate;
113 extern BOOLEAN KeThreadDpcEnable;
114 extern LARGE_INTEGER KiTimeIncrementReciprocal;
115 extern UCHAR KiTimeIncrementShiftCount;
116 extern ULONG KiTimeLimitIsrMicroseconds;
117 extern ULONG KiServiceLimit;
118 extern LIST_ENTRY KeBugcheckCallbackListHead, KeBugcheckReasonCallbackListHead;
119 extern KSPIN_LOCK BugCheckCallbackLock;
120 extern KDPC KiTimerExpireDpc;
121 extern KTIMER_TABLE_ENTRY KiTimerTableListHead[TIMER_TABLE_SIZE];
122 extern FAST_MUTEX KiGenericCallDpcMutex;
123 extern LIST_ENTRY KiProfileListHead, KiProfileSourceListHead;
124 extern KSPIN_LOCK KiProfileLock;
125 extern LIST_ENTRY KiProcessListHead;
126 extern LIST_ENTRY KiProcessInSwapListHead, KiProcessOutSwapListHead;
127 extern LIST_ENTRY KiStackInSwapListHead;
128 extern KEVENT KiSwapEvent;
129 extern PKPRCB KiProcessorBlock[];
130 extern ULONG KiMask32Array[MAXIMUM_PRIORITY];
131 extern ULONG KiIdleSummary;
132 extern PVOID KeUserApcDispatcher;
133 extern PVOID KeUserCallbackDispatcher;
134 extern PVOID KeUserExceptionDispatcher;
135 extern PVOID KeRaiseUserExceptionDispatcher;
136 extern ULONG KeTimeIncrement;
137 extern ULONG KeTimeAdjustment;
138 extern ULONG_PTR KiBugCheckData[5];
139 extern ULONG KiFreezeFlag;
140 extern ULONG KiDPCTimeout;
141
142 /* MACROS *************************************************************************/
143
144 #define AFFINITY_MASK(Id) KiMask32Array[Id]
145 #define PRIORITY_MASK(Id) KiMask32Array[Id]
146
147 /* The following macro initializes a dispatcher object's header */
148 #define KeInitializeDispatcherHeader(Header, t, s, State) \
149 { \
150 (Header)->Type = t; \
151 (Header)->Absolute = 0; \
152 (Header)->Size = s; \
153 (Header)->Inserted = 0; \
154 (Header)->SignalState = State; \
155 InitializeListHead(&((Header)->WaitListHead)); \
156 }
157
158 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
159 #define TIMER_OR_EVENT_TYPE 0x7L
160
161 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
162 #define TIMER_WAIT_BLOCK 0x3L
163
164 #ifdef _M_ARM // FIXME: remove this once our headers are cleaned up
165 //
166 // A system call ID is formatted as such:
167 // .________________________________________________________________.
168 // | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
169 // |--------------|-------------------------------------------------|
170 // | TABLE NUMBER | TABLE OFFSET |
171 // \----------------------------------------------------------------/
172 //
173 //
174 // The table number is then used as an index into the service descriptor table.
175 #define TABLE_NUMBER_BITS 3
176 #define TABLE_OFFSET_BITS 12
177
178 //
179 // There are 2 tables (kernel and shadow, used by Win32K)
180 //
181 #define NUMBER_SERVICE_TABLES 2
182 #define NTOS_SERVICE_INDEX 0
183 #define WIN32K_SERVICE_INDEX 1
184
185 //
186 // NB. From assembly code, the table number must be computed as an offset into
187 // the service descriptor table.
188 //
189 // Each entry into the table is 16 bytes long on 32-bit architectures, and
190 // 32 bytes long on 64-bit architectures.
191 //
192 // Thus, Table Number 1 is offset 16 (0x10) on x86, and offset 32 (0x20) on
193 // x64.
194 //
195 #ifdef _WIN64
196 #define BITS_PER_ENTRY 5 // (1 << 5) = 32 bytes
197 #else
198 #define BITS_PER_ENTRY 4 // (1 << 4) = 16 bytes
199 #endif
200
201 //
202 // We want the table number, but leave some extra bits to we can have the offset
203 // into the descriptor table.
204 //
205 #define SERVICE_TABLE_SHIFT (12 - BITS_PER_ENTRY)
206
207 //
208 // Now the table number (as an offset) is corrupted with part of the table offset
209 // This mask will remove the extra unwanted bits, and give us the offset into the
210 // descriptor table proper.
211 //
212 #define SERVICE_TABLE_MASK (((1 << TABLE_NUMBER_BITS) - 1) << BITS_PER_ENTRY)
213
214 //
215 // To get the table offset (ie: the service call number), just keep the 12 bits
216 //
217 #define SERVICE_NUMBER_MASK ((1 << TABLE_OFFSET_BITS) - 1)
218
219 //
220 // We'll often need to check if this is a graphics call. This is done by comparing
221 // the table number offset with the known Win32K table number offset.
222 // This is usually index 1, so table number offset 0x10 (x86) or 0x20 (x64)
223 //
224 #define SERVICE_TABLE_TEST (WIN32K_SERVICE_INDEX << BITS_PER_ENTRY)
225
226 #endif
227
228 #define KTS_SYSCALL_BIT (((KTRAP_STATE_BITS) { { .SystemCall = TRUE } }).Bits)
229 #define KTS_PM_BIT (((KTRAP_STATE_BITS) { { .PreviousMode = TRUE } }).Bits)
230 #define KTS_SEG_BIT (((KTRAP_STATE_BITS) { { .Segments = TRUE } }).Bits)
231 #define KTS_VOL_BIT (((KTRAP_STATE_BITS) { { .Volatiles = TRUE } }).Bits)
232 #define KTS_FULL_BIT (((KTRAP_STATE_BITS) { { .Full = TRUE } }).Bits)
233
234 /* INTERNAL KERNEL FUNCTIONS ************************************************/
235
236 VOID
237 NTAPI
238 CPUID(
239 IN ULONG InfoType,
240 OUT PULONG CpuInfoEax,
241 OUT PULONG CpuInfoEbx,
242 OUT PULONG CpuInfoEcx,
243 OUT PULONG CpuInfoEdx
244 );
245
246 LONGLONG
247 FASTCALL
248 RDMSR(
249 IN ULONG Register
250 );
251
252 VOID
253 NTAPI
254 WRMSR(
255 IN ULONG Register,
256 IN LONGLONG Value
257 );
258
259 /* Finds a new thread to run */
260 LONG_PTR
261 FASTCALL
262 KiSwapThread(
263 IN PKTHREAD Thread,
264 IN PKPRCB Prcb
265 );
266
267 VOID
268 NTAPI
269 KeReadyThread(
270 IN PKTHREAD Thread
271 );
272
273 BOOLEAN
274 NTAPI
275 KeSetDisableBoostThread(
276 IN OUT PKTHREAD Thread,
277 IN BOOLEAN Disable
278 );
279
280 VOID
281 NTAPI
282 KeBalanceSetManager(IN PVOID Context);
283
284 VOID
285 NTAPI
286 KiReadyThread(IN PKTHREAD Thread);
287
288 ULONG
289 NTAPI
290 KeSuspendThread(PKTHREAD Thread);
291
292 BOOLEAN
293 NTAPI
294 KeReadStateThread(IN PKTHREAD Thread);
295
296 BOOLEAN
297 FASTCALL
298 KiSwapContext(
299 IN PKTHREAD CurrentThread,
300 IN PKTHREAD NewThread
301 );
302
303 VOID
304 NTAPI
305 KiAdjustQuantumThread(IN PKTHREAD Thread);
306
307 VOID
308 FASTCALL
309 KiExitDispatcher(KIRQL OldIrql);
310
311 VOID
312 FASTCALL
313 KiDeferredReadyThread(IN PKTHREAD Thread);
314
315 PKTHREAD
316 FASTCALL
317 KiIdleSchedule(
318 IN PKPRCB Prcb
319 );
320
321 VOID
322 FASTCALL
323 KiProcessDeferredReadyList(
324 IN PKPRCB Prcb
325 );
326
327 KAFFINITY
328 FASTCALL
329 KiSetAffinityThread(
330 IN PKTHREAD Thread,
331 IN KAFFINITY Affinity
332 );
333
334 PKTHREAD
335 FASTCALL
336 KiSelectNextThread(
337 IN PKPRCB Prcb
338 );
339
340 BOOLEAN
341 FASTCALL
342 KiInsertTimerTable(
343 IN PKTIMER Timer,
344 IN ULONG Hand
345 );
346
347 VOID
348 FASTCALL
349 KiTimerListExpire(
350 IN PLIST_ENTRY ExpiredListHead,
351 IN KIRQL OldIrql
352 );
353
354 BOOLEAN
355 FASTCALL
356 KiInsertTreeTimer(
357 IN PKTIMER Timer,
358 IN LARGE_INTEGER Interval
359 );
360
361 VOID
362 FASTCALL
363 KiCompleteTimer(
364 IN PKTIMER Timer,
365 IN PKSPIN_LOCK_QUEUE LockQueue
366 );
367
368 /* gmutex.c ********************************************************************/
369
370 VOID
371 FASTCALL
372 KiAcquireGuardedMutex(
373 IN OUT PKGUARDED_MUTEX GuardedMutex
374 );
375
376 VOID
377 FASTCALL
378 KiAcquireFastMutex(
379 IN PFAST_MUTEX FastMutex
380 );
381
382 /* gate.c **********************************************************************/
383
384 VOID
385 FASTCALL
386 KeInitializeGate(PKGATE Gate);
387
388 VOID
389 FASTCALL
390 KeSignalGateBoostPriority(PKGATE Gate);
391
392 VOID
393 FASTCALL
394 KeWaitForGate(
395 PKGATE Gate,
396 KWAIT_REASON WaitReason,
397 KPROCESSOR_MODE WaitMode
398 );
399
400 /* ipi.c ********************************************************************/
401
402 VOID
403 FASTCALL
404 KiIpiSend(
405 KAFFINITY TargetSet,
406 ULONG IpiRequest
407 );
408
409 VOID
410 NTAPI
411 KiIpiSendPacket(
412 IN KAFFINITY TargetProcessors,
413 IN PKIPI_WORKER WorkerFunction,
414 IN PKIPI_BROADCAST_WORKER BroadcastFunction,
415 IN ULONG_PTR Context,
416 IN PULONG Count
417 );
418
419 VOID
420 FASTCALL
421 KiIpiSignalPacketDone(
422 IN PKIPI_CONTEXT PacketContext
423 );
424
425 VOID
426 FASTCALL
427 KiIpiSignalPacketDoneAndStall(
428 IN PKIPI_CONTEXT PacketContext,
429 IN volatile PULONG ReverseStall
430 );
431
432 /* next file ***************************************************************/
433
434 UCHAR
435 NTAPI
436 KeFindNextRightSetAffinity(
437 IN UCHAR Number,
438 IN ULONG Set
439 );
440
441 VOID
442 NTAPI
443 DbgBreakPointNoBugCheck(VOID);
444
445 VOID
446 NTAPI
447 KeInitializeProfile(
448 struct _KPROFILE* Profile,
449 struct _KPROCESS* Process,
450 PVOID ImageBase,
451 ULONG ImageSize,
452 ULONG BucketSize,
453 KPROFILE_SOURCE ProfileSource,
454 KAFFINITY Affinity
455 );
456
457 BOOLEAN
458 NTAPI
459 KeStartProfile(
460 struct _KPROFILE* Profile,
461 PVOID Buffer
462 );
463
464 BOOLEAN
465 NTAPI
466 KeStopProfile(struct _KPROFILE* Profile);
467
468 ULONG
469 NTAPI
470 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource);
471
472 VOID
473 NTAPI
474 KeSetIntervalProfile(
475 KPROFILE_SOURCE ProfileSource,
476 ULONG Interval
477 );
478
479 VOID
480 NTAPI
481 KeProfileInterrupt(
482 PKTRAP_FRAME TrapFrame
483 );
484
485 VOID
486 NTAPI
487 KeProfileInterruptWithSource(
488 IN PKTRAP_FRAME TrapFrame,
489 IN KPROFILE_SOURCE Source
490 );
491
492 VOID
493 NTAPI
494 KeUpdateRunTime(
495 PKTRAP_FRAME TrapFrame,
496 KIRQL Irql
497 );
498
499 VOID
500 NTAPI
501 KiExpireTimers(
502 PKDPC Dpc,
503 PVOID DeferredContext,
504 PVOID SystemArgument1,
505 PVOID SystemArgument2
506 );
507
508 VOID
509 NTAPI
510 KeInitializeThread(
511 IN PKPROCESS Process,
512 IN OUT PKTHREAD Thread,
513 IN PKSYSTEM_ROUTINE SystemRoutine,
514 IN PKSTART_ROUTINE StartRoutine,
515 IN PVOID StartContext,
516 IN PCONTEXT Context,
517 IN PVOID Teb,
518 IN PVOID KernelStack
519 );
520
521 VOID
522 NTAPI
523 KeUninitThread(
524 IN PKTHREAD Thread
525 );
526
527 NTSTATUS
528 NTAPI
529 KeInitThread(
530 IN OUT PKTHREAD Thread,
531 IN PVOID KernelStack,
532 IN PKSYSTEM_ROUTINE SystemRoutine,
533 IN PKSTART_ROUTINE StartRoutine,
534 IN PVOID StartContext,
535 IN PCONTEXT Context,
536 IN PVOID Teb,
537 IN PKPROCESS Process
538 );
539
540 VOID
541 NTAPI
542 KiInitializeContextThread(
543 PKTHREAD Thread,
544 PKSYSTEM_ROUTINE SystemRoutine,
545 PKSTART_ROUTINE StartRoutine,
546 PVOID StartContext,
547 PCONTEXT Context
548 );
549
550 VOID
551 NTAPI
552 KeStartThread(
553 IN OUT PKTHREAD Thread
554 );
555
556 BOOLEAN
557 NTAPI
558 KeAlertThread(
559 IN PKTHREAD Thread,
560 IN KPROCESSOR_MODE AlertMode
561 );
562
563 ULONG
564 NTAPI
565 KeAlertResumeThread(
566 IN PKTHREAD Thread
567 );
568
569 ULONG
570 NTAPI
571 KeResumeThread(
572 IN PKTHREAD Thread
573 );
574
575 PVOID
576 NTAPI
577 KeSwitchKernelStack(
578 IN PVOID StackBase,
579 IN PVOID StackLimit
580 );
581
582 VOID
583 NTAPI
584 KeRundownThread(VOID);
585
586 NTSTATUS
587 NTAPI
588 KeReleaseThread(PKTHREAD Thread);
589
590 VOID
591 NTAPI
592 KiSuspendRundown(
593 IN PKAPC Apc
594 );
595
596 VOID
597 NTAPI
598 KiSuspendNop(
599 IN PKAPC Apc,
600 IN PKNORMAL_ROUTINE *NormalRoutine,
601 IN PVOID *NormalContext,
602 IN PVOID *SystemArgument1,
603 IN PVOID *SystemArgument2
604 );
605
606 VOID
607 NTAPI
608 KiSuspendThread(
609 IN PVOID NormalContext,
610 IN PVOID SystemArgument1,
611 IN PVOID SystemArgument2
612 );
613
614 LONG
615 NTAPI
616 KeQueryBasePriorityThread(IN PKTHREAD Thread);
617
618 VOID
619 FASTCALL
620 KiSetPriorityThread(
621 IN PKTHREAD Thread,
622 IN KPRIORITY Priority
623 );
624
625 VOID
626 FASTCALL
627 KiUnlinkThread(
628 IN PKTHREAD Thread,
629 IN NTSTATUS WaitStatus
630 );
631
632 VOID
633 NTAPI
634 KeDumpStackFrames(PULONG Frame);
635
636 BOOLEAN
637 NTAPI
638 KiTestAlert(VOID);
639
640 VOID
641 FASTCALL
642 KiUnwaitThread(
643 IN PKTHREAD Thread,
644 IN LONG_PTR WaitStatus,
645 IN KPRIORITY Increment
646 );
647
648 VOID
649 NTAPI
650 KeInitializeProcess(
651 struct _KPROCESS *Process,
652 KPRIORITY Priority,
653 KAFFINITY Affinity,
654 PULONG DirectoryTableBase,
655 IN BOOLEAN Enable
656 );
657
658 VOID
659 NTAPI
660 KeSetQuantumProcess(
661 IN PKPROCESS Process,
662 IN UCHAR Quantum
663 );
664
665 KPRIORITY
666 NTAPI
667 KeSetPriorityAndQuantumProcess(
668 IN PKPROCESS Process,
669 IN KPRIORITY Priority,
670 IN UCHAR Quantum OPTIONAL
671 );
672
673 ULONG
674 NTAPI
675 KeForceResumeThread(IN PKTHREAD Thread);
676
677 VOID
678 NTAPI
679 KeThawAllThreads(
680 VOID
681 );
682
683 VOID
684 NTAPI
685 KeFreezeAllThreads(
686 VOID
687 );
688
689 BOOLEAN
690 NTAPI
691 KeDisableThreadApcQueueing(IN PKTHREAD Thread);
692
693 VOID
694 FASTCALL
695 KiWaitTest(
696 PVOID Object,
697 KPRIORITY Increment
698 );
699
700 VOID
701 NTAPI
702 KeContextToTrapFrame(
703 PCONTEXT Context,
704 PKEXCEPTION_FRAME ExeptionFrame,
705 PKTRAP_FRAME TrapFrame,
706 ULONG ContextFlags,
707 KPROCESSOR_MODE PreviousMode
708 );
709
710 VOID
711 NTAPI
712 KiCheckForKernelApcDelivery(VOID);
713
714 LONG
715 NTAPI
716 KiInsertQueue(
717 IN PKQUEUE Queue,
718 IN PLIST_ENTRY Entry,
719 BOOLEAN Head
720 );
721
722 VOID
723 NTAPI
724 KiTimerExpiration(
725 IN PKDPC Dpc,
726 IN PVOID DeferredContext,
727 IN PVOID SystemArgument1,
728 IN PVOID SystemArgument2
729 );
730
731 ULONG
732 NTAPI
733 KeSetProcess(
734 struct _KPROCESS* Process,
735 KPRIORITY Increment,
736 BOOLEAN InWait
737 );
738
739 VOID
740 NTAPI
741 KeInitializeEventPair(PKEVENT_PAIR EventPair);
742
743 VOID
744 NTAPI
745 KiInitializeUserApc(
746 IN PKEXCEPTION_FRAME Reserved,
747 IN PKTRAP_FRAME TrapFrame,
748 IN PKNORMAL_ROUTINE NormalRoutine,
749 IN PVOID NormalContext,
750 IN PVOID SystemArgument1,
751 IN PVOID SystemArgument2
752 );
753
754 PLIST_ENTRY
755 NTAPI
756 KeFlushQueueApc(
757 IN PKTHREAD Thread,
758 IN KPROCESSOR_MODE PreviousMode
759 );
760
761 VOID
762 NTAPI
763 KiAttachProcess(
764 struct _KTHREAD *Thread,
765 struct _KPROCESS *Process,
766 PKLOCK_QUEUE_HANDLE ApcLock,
767 struct _KAPC_STATE *SavedApcState
768 );
769
770 VOID
771 NTAPI
772 KiSwapProcess(
773 struct _KPROCESS *NewProcess,
774 struct _KPROCESS *OldProcess
775 );
776
777 BOOLEAN
778 NTAPI
779 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode);
780
781 BOOLEAN
782 NTAPI
783 KeRemoveQueueApc(PKAPC Apc);
784
785 VOID
786 FASTCALL
787 KiActivateWaiterQueue(IN PKQUEUE Queue);
788
789 ULONG
790 NTAPI
791 KeQueryRuntimeProcess(IN PKPROCESS Process,
792 OUT PULONG UserTime);
793
794 /* INITIALIZATION FUNCTIONS *************************************************/
795
796 BOOLEAN
797 NTAPI
798 KeInitSystem(VOID);
799
800 VOID
801 NTAPI
802 KeInitExceptions(VOID);
803
804 VOID
805 NTAPI
806 KeInitInterrupts(VOID);
807
808 VOID
809 NTAPI
810 KiInitializeBugCheck(VOID);
811
812 VOID
813 NTAPI
814 KiSystemStartupReal(
815 IN PLOADER_PARAMETER_BLOCK LoaderBlock
816 );
817
818 BOOLEAN
819 NTAPI
820 KiDeliverUserApc(PKTRAP_FRAME TrapFrame);
821
822 VOID
823 NTAPI
824 KiMoveApcState(
825 PKAPC_STATE OldState,
826 PKAPC_STATE NewState
827 );
828
829 VOID
830 NTAPI
831 KiAddProfileEvent(
832 KPROFILE_SOURCE Source,
833 ULONG Pc
834 );
835
836 VOID
837 NTAPI
838 KiDispatchException(
839 PEXCEPTION_RECORD ExceptionRecord,
840 PKEXCEPTION_FRAME ExceptionFrame,
841 PKTRAP_FRAME Tf,
842 KPROCESSOR_MODE PreviousMode,
843 BOOLEAN SearchFrames
844 );
845
846 VOID
847 NTAPI
848 KeTrapFrameToContext(
849 IN PKTRAP_FRAME TrapFrame,
850 IN PKEXCEPTION_FRAME ExceptionFrame,
851 IN OUT PCONTEXT Context
852 );
853
854 DECLSPEC_NORETURN
855 VOID
856 NTAPI
857 KeBugCheckWithTf(
858 ULONG BugCheckCode,
859 ULONG_PTR BugCheckParameter1,
860 ULONG_PTR BugCheckParameter2,
861 ULONG_PTR BugCheckParameter3,
862 ULONG_PTR BugCheckParameter4,
863 PKTRAP_FRAME Tf
864 );
865
866 VOID
867 NTAPI
868 KiDispatchExceptionFromTrapFrame(
869 IN NTSTATUS Code,
870 IN ULONG_PTR Address,
871 IN ULONG ParameterCount,
872 IN ULONG_PTR Parameter1,
873 IN ULONG_PTR Parameter2,
874 IN ULONG_PTR Parameter3,
875 IN PKTRAP_FRAME TrapFrame
876 );
877
878 BOOLEAN
879 NTAPI
880 KiHandleNmi(VOID);
881
882 VOID
883 NTAPI
884 KeFlushCurrentTb(VOID);
885
886 BOOLEAN
887 NTAPI
888 KeInvalidateAllCaches(VOID);
889
890 VOID
891 FASTCALL
892 KeZeroPages(IN PVOID Address,
893 IN ULONG Size);
894
895 BOOLEAN
896 FASTCALL
897 KeInvalidAccessAllowed(IN PVOID TrapInformation OPTIONAL);
898
899 VOID
900 NTAPI
901 KeRosDumpStackFrames(
902 PULONG Frame,
903 ULONG FrameCount
904 );
905
906 VOID
907 NTAPI
908 KeSetSystemTime(
909 IN PLARGE_INTEGER NewSystemTime,
910 OUT PLARGE_INTEGER OldSystemTime,
911 IN BOOLEAN FixInterruptTime,
912 IN PLARGE_INTEGER HalTime
913 );
914
915 ULONG
916 NTAPI
917 KeV86Exception(
918 ULONG ExceptionNr,
919 PKTRAP_FRAME Tf,
920 ULONG address
921 );
922
923 VOID
924 NTAPI
925 KiStartUnexpectedRange(
926 VOID
927 );
928
929 VOID
930 NTAPI
931 KiEndUnexpectedRange(
932 VOID
933 );
934
935 NTSTATUS
936 NTAPI
937 KiRaiseException(
938 IN PEXCEPTION_RECORD ExceptionRecord,
939 IN PCONTEXT Context,
940 IN PKEXCEPTION_FRAME ExceptionFrame,
941 IN PKTRAP_FRAME TrapFrame,
942 IN BOOLEAN SearchFrames
943 );
944
945 NTSTATUS
946 NTAPI
947 KiContinue(
948 IN PCONTEXT Context,
949 IN PKEXCEPTION_FRAME ExceptionFrame,
950 IN PKTRAP_FRAME TrapFrame
951 );
952
953 VOID
954 FASTCALL
955 KiServiceExit(
956 IN PKTRAP_FRAME TrapFrame
957 );
958
959 VOID
960 FASTCALL
961 KiServiceExit2(
962 IN PKTRAP_FRAME TrapFrame
963 );
964
965 #ifndef HAL_INTERRUPT_SUPPORT_IN_C
966 VOID
967 NTAPI
968 KiInterruptDispatch(
969 VOID
970 );
971
972 VOID
973 NTAPI
974 KiChainedDispatch(
975 VOID
976 );
977 #else
978 VOID
979 FASTCALL
980 KiInterruptDispatch(
981 IN PKTRAP_FRAME TrapFrame,
982 IN PKINTERRUPT Interrupt
983 );
984
985 VOID
986 FASTCALL
987 KiChainedDispatch(
988 IN PKTRAP_FRAME TrapFrame,
989 IN PKINTERRUPT Interrupt
990 );
991 #endif
992
993 VOID
994 NTAPI
995 KiInitializeMachineType(
996 VOID
997 );
998
999 VOID
1000 NTAPI
1001 KiSetupStackAndInitializeKernel(
1002 IN PKPROCESS InitProcess,
1003 IN PKTHREAD InitThread,
1004 IN PVOID IdleStack,
1005 IN PKPRCB Prcb,
1006 IN CCHAR Number,
1007 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1008 );
1009
1010 VOID
1011 NTAPI
1012 KiInitSpinLocks(
1013 IN PKPRCB Prcb,
1014 IN CCHAR Number
1015 );
1016
1017 LARGE_INTEGER
1018 NTAPI
1019 KiComputeReciprocal(
1020 IN LONG Divisor,
1021 OUT PUCHAR Shift
1022 );
1023
1024 VOID
1025 NTAPI
1026 KiInitSystem(
1027 VOID
1028 );
1029
1030 VOID
1031 FASTCALL
1032 KiInsertQueueApc(
1033 IN PKAPC Apc,
1034 IN KPRIORITY PriorityBoost
1035 );
1036
1037 NTSTATUS
1038 NTAPI
1039 KiCallUserMode(
1040 IN PVOID *OutputBuffer,
1041 IN PULONG OutputLength
1042 );
1043
1044 PULONG
1045 NTAPI
1046 KiGetUserModeStackAddress(
1047 VOID
1048 );
1049
1050 VOID
1051 NTAPI
1052 KiInitMachineDependent(VOID);
1053
1054 BOOLEAN
1055 NTAPI
1056 KeFreezeExecution(IN PKTRAP_FRAME TrapFrame,
1057 IN PKEXCEPTION_FRAME ExceptionFrame);
1058
1059 VOID
1060 NTAPI
1061 KeThawExecution(IN BOOLEAN Enable);
1062
1063 BOOLEAN
1064 NTAPI
1065 KeDisableInterrupts(
1066 VOID
1067 );
1068
1069 VOID
1070 FASTCALL
1071 KeAcquireQueuedSpinLockAtDpcLevel(
1072 IN OUT PKSPIN_LOCK_QUEUE LockQueue
1073 );
1074
1075 VOID
1076 FASTCALL
1077 KeReleaseQueuedSpinLockFromDpcLevel(
1078 IN OUT PKSPIN_LOCK_QUEUE LockQueue
1079 );
1080
1081 VOID
1082 NTAPI
1083 KiRestoreProcessorControlState(
1084 IN PKPROCESSOR_STATE ProcessorState
1085 );
1086
1087 VOID
1088 NTAPI
1089 KiSaveProcessorControlState(
1090 OUT PKPROCESSOR_STATE ProcessorState
1091 );
1092
1093 VOID
1094 NTAPI
1095 KiSaveProcessorState(
1096 IN PKTRAP_FRAME TrapFrame,
1097 IN PKEXCEPTION_FRAME ExceptionFrame
1098 );
1099
1100 VOID
1101 FASTCALL
1102 KiRetireDpcList(
1103 IN PKPRCB Prcb
1104 );
1105
1106 VOID
1107 NTAPI
1108 KiQuantumEnd(
1109 VOID
1110 );
1111
1112 VOID
1113 KiSystemService(
1114 IN PKTHREAD Thread,
1115 IN PKTRAP_FRAME TrapFrame,
1116 IN ULONG Instruction
1117 );
1118
1119 VOID
1120 KiIdleLoop(
1121 VOID
1122 );
1123
1124 #include "ke_x.h"
1125
1126 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */