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