1 #ifndef __NTOSKRNL_INCLUDE_INTERNAL_KE_H
2 #define __NTOSKRNL_INCLUDE_INTERNAL_KE_H
4 /* INCLUDES *****************************************************************/
8 /* INTERNAL KERNEL TYPES ****************************************************/
10 typedef struct _WOW64_PROCESS
13 } WOW64_PROCESS
, *PWOW64_PROCESS
;
15 typedef struct _KPROFILE_SOURCE_OBJECT
17 KPROFILE_SOURCE Source
;
19 } KPROFILE_SOURCE_OBJECT
, *PKPROFILE_SOURCE_OBJECT
;
21 /* Cached modules from the loader block */
22 typedef enum _CACHED_MODULE_TYPE
29 MaximumCachedModuleType
,
30 } CACHED_MODULE_TYPE
, *PCACHED_MODULE_TYPE
;
31 extern PLOADER_MODULE CachedModules
[MaximumCachedModuleType
];
33 struct _KIRQ_TRAPFRAME
;
36 struct _KEXCEPTION_FRAME
;
38 extern PVOID KeUserApcDispatcher
;
39 extern PVOID KeUserCallbackDispatcher
;
40 extern PVOID KeUserExceptionDispatcher
;
41 extern PVOID KeRaiseUserExceptionDispatcher
;
42 extern LARGE_INTEGER SystemBootTime
;
43 extern ULONG_PTR KERNEL_BASE
;
44 extern ULONG KeI386NpxPresent
;
45 extern ULONG KeI386XMMIPresent
;
46 extern ULONG KeI386FxsrPresent
;
47 extern PKNODE KeNodeBlock
[1];
48 extern UCHAR KeNumberNodes
;
49 extern UCHAR KeProcessNodeSeed
;
51 /* MACROS *************************************************************************/
54 * On UP machines, we don't actually have a spinlock, we merely raise
58 #define KeInitializeDispatcher() KeInitializeSpinLock(&DispatcherDatabaseLock);
59 #define KeAcquireDispatcherDatabaseLock() KfAcquireSpinLock(&DispatcherDatabaseLock);
60 #define KeAcquireDispatcherDatabaseLockAtDpcLevel() \
61 KeAcquireSpinLockAtDpcLevel (&DispatcherDatabaseLock);
62 #define KeReleaseDispatcherDatabaseLockFromDpcLevel() \
63 KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock);
64 #define KeReleaseDispatcherDatabaseLock(OldIrql) \
65 KiExitDispatcher(OldIrql);
67 #define KeInitializeDispatcher()
68 #define KeAcquireDispatcherDatabaseLock() KeRaiseIrqlToDpcLevel();
69 #define KeReleaseDispatcherDatabaseLock(OldIrql) KiExitDispatcher(OldIrql);
70 #define KeAcquireDispatcherDatabaseLockAtDpcLevel()
71 #define KeReleaseDispatcherDatabaseLockFromDpcLevel()
74 #define AFFINITY_MASK(Id) KiMask32Array[Id]
76 /* The following macro initializes a dispatcher object's header */
77 #define KeInitializeDispatcherHeader(Header, t, s, State) \
80 (Header)->Absolute = 0; \
81 (Header)->Inserted = 0; \
83 (Header)->SignalState = State; \
84 InitializeListHead(&((Header)->WaitListHead)); \
87 extern KSPIN_LOCK DispatcherDatabaseLock
;
89 #define KeEnterCriticalRegion() \
91 PKTHREAD _Thread = KeGetCurrentThread(); \
92 if (_Thread) _Thread->KernelApcDisable--; \
95 #define KeLeaveCriticalRegion() \
97 PKTHREAD _Thread = KeGetCurrentThread(); \
98 if((_Thread) && (++_Thread->KernelApcDisable == 0)) \
100 if (!IsListEmpty(&_Thread->ApcState.ApcListHead[KernelMode]) && \
101 (_Thread->SpecialApcDisable == 0)) \
103 KiCheckForKernelApcDelivery(); \
108 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
109 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
110 KeBugCheckWithTf(a,b,c,d,e,f)
112 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
113 #define TIMER_OR_EVENT_TYPE 0x7L
115 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
116 #define TIMER_WAIT_BLOCK 0x3L
118 /* INTERNAL KERNEL FUNCTIONS ************************************************/
120 /* threadsch.c ********************************************************************/
122 /* Thread Scheduler Functions */
124 /* Readies a Thread for Execution. */
127 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
129 /* Readies a Thread for Execution. */
132 KiDispatchThread(ULONG NewThreadStatus
);
134 /* Finds a new thread to run */
143 KiReadyThread(IN PKTHREAD Thread
);
147 KeSuspendThread(PKTHREAD Thread
);
151 KiSwapContext(PKTHREAD NewThread
);
155 KiAdjustQuantumThread(IN PKTHREAD Thread
);
159 KiExitDispatcher(KIRQL OldIrql
);
161 /* gmutex.c ********************************************************************/
165 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
167 /* gate.c **********************************************************************/
171 KeInitializeGate(PKGATE Gate
);
175 KeSignalGateBoostPriority(PKGATE Gate
);
181 KWAIT_REASON WaitReason
,
182 KPROCESSOR_MODE WaitMode
185 /* ipi.c ********************************************************************/
194 /* next file ***************************************************************/
198 KeFindNextRightSetAffinity(
205 DbgBreakPointNoBugCheck(VOID
);
210 struct _KPROFILE
* Profile
,
211 struct _KPROCESS
* Process
,
215 KPROFILE_SOURCE ProfileSource
,
222 struct _KPROFILE
* Profile
,
228 KeStopProfile(struct _KPROFILE
* Profile
);
232 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
236 KeSetIntervalProfile(
237 KPROFILE_SOURCE ProfileSource
,
244 PKTRAP_FRAME TrapFrame
249 KeProfileInterruptWithSource(
250 IN PKTRAP_FRAME TrapFrame
,
251 IN KPROFILE_SOURCE Source
256 KiRosPrintAddress(PVOID Address
);
261 PKTRAP_FRAME TrapFrame
,
268 PKTRAP_FRAME TrapFrame
,
276 PVOID DeferredContext
,
277 PVOID SystemArgument1
,
278 PVOID SystemArgument2
284 IN PKPROCESS Process
,
285 IN OUT PKTHREAD Thread
,
286 IN PKSYSTEM_ROUTINE SystemRoutine
,
287 IN PKSTART_ROUTINE StartRoutine
,
288 IN PVOID StartContext
,
297 IN OUT PKTHREAD Thread
,
298 IN PVOID KernelStack
,
299 IN PKSYSTEM_ROUTINE SystemRoutine
,
300 IN PKSTART_ROUTINE StartRoutine
,
301 IN PVOID StartContext
,
310 IN OUT PKTHREAD Thread
315 KeRundownThread(VOID
);
319 KeReleaseThread(PKTHREAD Thread
);
323 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
335 KiDispatcherObjectWake(
336 DISPATCHER_HEADER
* hdr
,
351 KeDumpStackFrames(PULONG Frame
);
361 IN NTSTATUS WaitStatus
,
362 IN KPRIORITY Increment
368 struct _KPROCESS
*Process
,
371 LARGE_INTEGER DirectoryTableBase
376 KeForceResumeThread(IN PKTHREAD Thread
);
380 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
386 LARGE_INTEGER DueTime
398 KeGetStackTopThread(struct _ETHREAD
* Thread
);
402 KeContextToTrapFrame(
404 PKEXCEPTION_FRAME ExeptionFrame
,
405 PKTRAP_FRAME TrapFrame
,
407 KPROCESSOR_MODE PreviousMode
413 KPROCESSOR_MODE PreviousMode
,
415 PKTRAP_FRAME TrapFrame
420 KiCheckForKernelApcDelivery(VOID
);
426 IN PLIST_ENTRY Entry
,
433 struct _KPROCESS
* Process
,
440 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
445 IN PKEXCEPTION_FRAME Reserved
,
446 IN PKTRAP_FRAME TrapFrame
,
447 IN PKNORMAL_ROUTINE NormalRoutine
,
448 IN PVOID NormalContext
,
449 IN PVOID SystemArgument1
,
450 IN PVOID SystemArgument2
457 IN KPROCESSOR_MODE PreviousMode
463 struct _KTHREAD
*Thread
,
464 struct _KPROCESS
*Process
,
466 struct _KAPC_STATE
*SavedApcState
472 struct _KPROCESS
*NewProcess
,
473 struct _KPROCESS
*OldProcess
478 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
482 KeRemoveQueueApc(PKAPC Apc
);
486 KiWakeQueue(IN PKQUEUE Queue
);
488 /* INITIALIZATION FUNCTIONS *************************************************/
492 KeInitExceptions(VOID
);
496 KeInitInterrupts(VOID
);
504 KeInitDpc(struct _KPRCB
* Prcb
);
508 KeInitDispatcher(VOID
);
512 KiInitializeSystemClock(VOID
);
516 KiInitializeBugCheck(VOID
);
520 Phase1Initialization(PVOID Context
);
526 PULONG LastKernelAddress
535 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
540 PKAPC_STATE OldState
,
547 KPROFILE_SOURCE Source
,
554 PEXCEPTION_RECORD ExceptionRecord
,
555 PKEXCEPTION_FRAME ExceptionFrame
,
557 KPROCESSOR_MODE PreviousMode
,
563 KeTrapFrameToContext(
564 IN PKTRAP_FRAME TrapFrame
,
565 IN PKEXCEPTION_FRAME ExceptionFrame
,
566 IN OUT PCONTEXT Context
571 KeApplicationProcessorInit(VOID
);
575 KePrepareForApplicationProcessorInit(ULONG id
);
587 KePushAndStackSwitchAndSysRet(
594 KeStackSwitchAndRet(PVOID NewStack
);
600 ULONG BugCheckParameter1
,
601 ULONG BugCheckParameter2
,
602 ULONG BugCheckParameter3
,
603 ULONG BugCheckParameter4
,
617 KeFlushCurrentTb(VOID
);
621 KeRosDumpStackFrames(
635 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
647 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */