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