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