Sync to trunk HEAD (r45072)
[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 KiComputeTimerTableIndex(
734 IN LONGLONG TimeValue
735 );
736
737 ULONG
738 NTAPI
739 KeSetProcess(
740 struct _KPROCESS* Process,
741 KPRIORITY Increment,
742 BOOLEAN InWait
743 );
744
745 VOID
746 NTAPI
747 KeInitializeEventPair(PKEVENT_PAIR EventPair);
748
749 VOID
750 NTAPI
751 KiInitializeUserApc(
752 IN PKEXCEPTION_FRAME Reserved,
753 IN PKTRAP_FRAME TrapFrame,
754 IN PKNORMAL_ROUTINE NormalRoutine,
755 IN PVOID NormalContext,
756 IN PVOID SystemArgument1,
757 IN PVOID SystemArgument2
758 );
759
760 PLIST_ENTRY
761 NTAPI
762 KeFlushQueueApc(
763 IN PKTHREAD Thread,
764 IN KPROCESSOR_MODE PreviousMode
765 );
766
767 VOID
768 NTAPI
769 KiAttachProcess(
770 struct _KTHREAD *Thread,
771 struct _KPROCESS *Process,
772 PKLOCK_QUEUE_HANDLE ApcLock,
773 struct _KAPC_STATE *SavedApcState
774 );
775
776 VOID
777 NTAPI
778 KiSwapProcess(
779 struct _KPROCESS *NewProcess,
780 struct _KPROCESS *OldProcess
781 );
782
783 BOOLEAN
784 NTAPI
785 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode);
786
787 BOOLEAN
788 NTAPI
789 KeRemoveQueueApc(PKAPC Apc);
790
791 VOID
792 FASTCALL
793 KiActivateWaiterQueue(IN PKQUEUE Queue);
794
795 ULONG
796 NTAPI
797 KeQueryRuntimeProcess(IN PKPROCESS Process,
798 OUT PULONG UserTime);
799
800 /* INITIALIZATION FUNCTIONS *************************************************/
801
802 BOOLEAN
803 NTAPI
804 KeInitSystem(VOID);
805
806 VOID
807 NTAPI
808 KeInitExceptions(VOID);
809
810 VOID
811 NTAPI
812 KeInitInterrupts(VOID);
813
814 VOID
815 NTAPI
816 KiInitializeBugCheck(VOID);
817
818 VOID
819 NTAPI
820 KiSystemStartupReal(
821 IN PLOADER_PARAMETER_BLOCK LoaderBlock
822 );
823
824 BOOLEAN
825 NTAPI
826 KiDeliverUserApc(PKTRAP_FRAME TrapFrame);
827
828 VOID
829 NTAPI
830 KiMoveApcState(
831 PKAPC_STATE OldState,
832 PKAPC_STATE NewState
833 );
834
835 VOID
836 NTAPI
837 KiAddProfileEvent(
838 KPROFILE_SOURCE Source,
839 ULONG Pc
840 );
841
842 VOID
843 NTAPI
844 KiDispatchException(
845 PEXCEPTION_RECORD ExceptionRecord,
846 PKEXCEPTION_FRAME ExceptionFrame,
847 PKTRAP_FRAME Tf,
848 KPROCESSOR_MODE PreviousMode,
849 BOOLEAN SearchFrames
850 );
851
852 VOID
853 NTAPI
854 KeTrapFrameToContext(
855 IN PKTRAP_FRAME TrapFrame,
856 IN PKEXCEPTION_FRAME ExceptionFrame,
857 IN OUT PCONTEXT Context
858 );
859
860 DECLSPEC_NORETURN
861 VOID
862 NTAPI
863 KeBugCheckWithTf(
864 ULONG BugCheckCode,
865 ULONG_PTR BugCheckParameter1,
866 ULONG_PTR BugCheckParameter2,
867 ULONG_PTR BugCheckParameter3,
868 ULONG_PTR BugCheckParameter4,
869 PKTRAP_FRAME Tf
870 );
871
872 VOID
873 NTAPI
874 KiDispatchExceptionFromTrapFrame(
875 IN NTSTATUS Code,
876 IN ULONG_PTR Address,
877 IN ULONG ParameterCount,
878 IN ULONG_PTR Parameter1,
879 IN ULONG_PTR Parameter2,
880 IN ULONG_PTR Parameter3,
881 IN PKTRAP_FRAME TrapFrame
882 );
883
884 BOOLEAN
885 NTAPI
886 KiHandleNmi(VOID);
887
888 VOID
889 NTAPI
890 KeFlushCurrentTb(VOID);
891
892 BOOLEAN
893 NTAPI
894 KeInvalidateAllCaches(VOID);
895
896 VOID
897 FASTCALL
898 KeZeroPages(IN PVOID Address,
899 IN ULONG Size);
900
901 BOOLEAN
902 FASTCALL
903 KeInvalidAccessAllowed(IN PVOID TrapInformation OPTIONAL);
904
905 VOID
906 NTAPI
907 KeRosDumpStackFrames(
908 PULONG_PTR Frame,
909 ULONG FrameCount
910 );
911
912 VOID
913 NTAPI
914 KeSetSystemTime(
915 IN PLARGE_INTEGER NewSystemTime,
916 OUT PLARGE_INTEGER OldSystemTime,
917 IN BOOLEAN FixInterruptTime,
918 IN PLARGE_INTEGER HalTime
919 );
920
921 ULONG
922 NTAPI
923 KeV86Exception(
924 ULONG ExceptionNr,
925 PKTRAP_FRAME Tf,
926 ULONG address
927 );
928
929 VOID
930 NTAPI
931 KiStartUnexpectedRange(
932 VOID
933 );
934
935 VOID
936 NTAPI
937 KiEndUnexpectedRange(
938 VOID
939 );
940
941 #ifndef HAL_INTERRUPT_SUPPORT_IN_C
942 VOID
943 NTAPI
944 KiInterruptDispatch(
945 VOID
946 );
947
948 VOID
949 NTAPI
950 KiChainedDispatch(
951 VOID
952 );
953 #else
954 VOID
955 FASTCALL
956 KiInterruptDispatch(
957 IN PKTRAP_FRAME TrapFrame,
958 IN PKINTERRUPT Interrupt
959 );
960
961 VOID
962 FASTCALL
963 KiChainedDispatch(
964 IN PKTRAP_FRAME TrapFrame,
965 IN PKINTERRUPT Interrupt
966 );
967 #endif
968
969 VOID
970 NTAPI
971 KiInitializeMachineType(
972 VOID
973 );
974
975 VOID
976 NTAPI
977 KiSetupStackAndInitializeKernel(
978 IN PKPROCESS InitProcess,
979 IN PKTHREAD InitThread,
980 IN PVOID IdleStack,
981 IN PKPRCB Prcb,
982 IN CCHAR Number,
983 IN PLOADER_PARAMETER_BLOCK LoaderBlock
984 );
985
986 VOID
987 NTAPI
988 KiInitSpinLocks(
989 IN PKPRCB Prcb,
990 IN CCHAR Number
991 );
992
993 LARGE_INTEGER
994 NTAPI
995 KiComputeReciprocal(
996 IN LONG Divisor,
997 OUT PUCHAR Shift
998 );
999
1000 VOID
1001 NTAPI
1002 KiInitSystem(
1003 VOID
1004 );
1005
1006 VOID
1007 FASTCALL
1008 KiInsertQueueApc(
1009 IN PKAPC Apc,
1010 IN KPRIORITY PriorityBoost
1011 );
1012
1013 NTSTATUS
1014 NTAPI
1015 KiCallUserMode(
1016 IN PVOID *OutputBuffer,
1017 IN PULONG OutputLength
1018 );
1019
1020 PULONG
1021 NTAPI
1022 KiGetUserModeStackAddress(
1023 VOID
1024 );
1025
1026 VOID
1027 NTAPI
1028 KiInitMachineDependent(VOID);
1029
1030 BOOLEAN
1031 NTAPI
1032 KeFreezeExecution(IN PKTRAP_FRAME TrapFrame,
1033 IN PKEXCEPTION_FRAME ExceptionFrame);
1034
1035 VOID
1036 NTAPI
1037 KeThawExecution(IN BOOLEAN Enable);
1038
1039 BOOLEAN
1040 NTAPI
1041 KeDisableInterrupts(
1042 VOID
1043 );
1044
1045 VOID
1046 FASTCALL
1047 KeAcquireQueuedSpinLockAtDpcLevel(
1048 IN OUT PKSPIN_LOCK_QUEUE LockQueue
1049 );
1050
1051 VOID
1052 FASTCALL
1053 KeReleaseQueuedSpinLockFromDpcLevel(
1054 IN OUT PKSPIN_LOCK_QUEUE LockQueue
1055 );
1056
1057 VOID
1058 NTAPI
1059 KiRestoreProcessorControlState(
1060 IN PKPROCESSOR_STATE ProcessorState
1061 );
1062
1063 VOID
1064 NTAPI
1065 KiSaveProcessorControlState(
1066 OUT PKPROCESSOR_STATE ProcessorState
1067 );
1068
1069 VOID
1070 NTAPI
1071 KiSaveProcessorState(
1072 IN PKTRAP_FRAME TrapFrame,
1073 IN PKEXCEPTION_FRAME ExceptionFrame
1074 );
1075
1076 VOID
1077 FASTCALL
1078 KiRetireDpcList(
1079 IN PKPRCB Prcb
1080 );
1081
1082 VOID
1083 NTAPI
1084 KiQuantumEnd(
1085 VOID
1086 );
1087
1088 VOID
1089 KiSystemService(
1090 IN PKTHREAD Thread,
1091 IN PKTRAP_FRAME TrapFrame,
1092 IN ULONG Instruction
1093 );
1094
1095 VOID
1096 KiIdleLoop(
1097 VOID
1098 );
1099
1100 PVOID
1101 NTAPI
1102 KiPcToFileHeader(IN PVOID Eip,
1103 OUT PLDR_DATA_TABLE_ENTRY *LdrEntry,
1104 IN BOOLEAN DriversOnly,
1105 OUT PBOOLEAN InKernel);
1106
1107 PVOID
1108 NTAPI
1109 KiRosPcToUserFileHeader(IN PVOID Eip,
1110 OUT PLDR_DATA_TABLE_ENTRY *LdrEntry);
1111
1112 #include "ke_x.h"
1113
1114 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */