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
;
45 /* MACROS *************************************************************************/
48 * On UP machines, we don't actually have a spinlock, we merely raise
52 #define KeInitializeDispatcher() KeInitializeSpinLock(&DispatcherDatabaseLock);
53 #define KeAcquireDispatcherDatabaseLock() KfAcquireSpinLock(&DispatcherDatabaseLock);
54 #define KeAcquireDispatcherDatabaseLockAtDpcLevel() \
55 KeAcquireSpinLockAtDpcLevel (&DispatcherDatabaseLock);
56 #define KeReleaseDispatcherDatabaseLockFromDpcLevel() \
57 KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock);
58 #define KeReleaseDispatcherDatabaseLock(OldIrql) \
59 KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock); \
60 KiExitDispatcher(OldIrql);
62 #define KeInitializeDispatcher()
63 #define KeAcquireDispatcherDatabaseLock() KeRaiseIrqlToDpcLevel();
64 #define KeReleaseDispatcherDatabaseLock(OldIrql) KiExitDispatcher(OldIrql);
65 #define KeAcquireDispatcherDatabaseLockAtDpcLevel()
66 #define KeReleaseDispatcherDatabaseLockFromDpcLevel()
69 /* The following macro initializes a dispatcher object's header */
70 #define KeInitializeDispatcherHeader(Header, t, s, State) \
73 (Header)->Absolute = 0; \
74 (Header)->Inserted = 0; \
76 (Header)->SignalState = State; \
77 InitializeListHead(&((Header)->WaitListHead)); \
80 /* The following macro satisfies the wait of any dispatcher object */
81 #define KiSatisfyObjectWait(Object, Thread) \
83 /* Special case for Mutants */ \
84 if ((Object)->Header.Type == MutantObject) \
86 /* Decrease the Signal State */ \
87 (Object)->Header.SignalState--; \
89 /* Check if it's now non-signaled */ \
90 if (!(Object)->Header.SignalState) \
92 /* Set the Owner Thread */ \
93 (Object)->OwnerThread = Thread; \
95 /* Disable APCs if needed */ \
96 Thread->KernelApcDisable -= (Object)->ApcDisable; \
98 /* Check if it's abandoned */ \
99 if ((Object)->Abandoned) \
102 (Object)->Abandoned = FALSE; \
104 /* Return Status */ \
105 Thread->WaitStatus = STATUS_ABANDONED; \
108 /* Insert it into the Mutant List */ \
109 InsertHeadList(&Thread->MutantListHead, \
110 &(Object)->MutantListEntry); \
113 else if (((Object)->Header.Type & TIMER_OR_EVENT_TYPE) == \
114 EventSynchronizationObject) \
116 /* Synchronization Timers and Events just get un-signaled */ \
117 (Object)->Header.SignalState = 0; \
119 else if ((Object)->Header.Type == SemaphoreObject) \
121 /* These ones can have multiple states, so we only decrease it */ \
122 (Object)->Header.SignalState--; \
126 /* The following macro satisfies the wait of a mutant dispatcher object */
127 #define KiSatisfyMutantWait(Object, Thread) \
129 /* Decrease the Signal State */ \
130 (Object)->Header.SignalState--; \
132 /* Check if it's now non-signaled */ \
133 if (!(Object)->Header.SignalState) \
135 /* Set the Owner Thread */ \
136 (Object)->OwnerThread = Thread; \
138 /* Disable APCs if needed */ \
139 Thread->KernelApcDisable -= (Object)->ApcDisable; \
141 /* Check if it's abandoned */ \
142 if ((Object)->Abandoned) \
145 (Object)->Abandoned = FALSE; \
147 /* Return Status */ \
148 Thread->WaitStatus = STATUS_ABANDONED; \
151 /* Insert it into the Mutant List */ \
152 InsertHeadList(&Thread->MutantListHead, \
153 &(Object)->MutantListEntry); \
157 /* The following macro satisfies the wait of any nonmutant dispatcher object */
158 #define KiSatisfyNonMutantWait(Object, Thread) \
160 if (((Object)->Header.Type & TIMER_OR_EVENT_TYPE) == \
161 EventSynchronizationObject) \
163 /* Synchronization Timers and Events just get un-signaled */ \
164 (Object)->Header.SignalState = 0; \
166 else if ((Object)->Header.Type == SemaphoreObject) \
168 /* These ones can have multiple states, so we only decrease it */ \
169 (Object)->Header.SignalState--; \
173 /* The following macro satisfies multiple objects in a wait state */
174 #define KiSatisifyMultipleObjectWaits(FirstBlock) \
176 PKWAIT_BLOCK WaitBlock = FirstBlock; \
177 PKTHREAD WaitThread = WaitBlock->Thread; \
179 /* Loop through all the Wait Blocks, and wake each Object */ \
182 /* Make sure it hasn't timed out */ \
183 if (WaitBlock->WaitKey != STATUS_TIMEOUT) \
185 /* Wake the Object */ \
186 KiSatisfyObjectWait((PKMUTANT)WaitBlock->Object, WaitThread); \
189 /* Move to the next block */ \
190 WaitBlock = WaitBlock->NextWaitBlock; \
191 } while (WaitBlock != FirstBlock); \
194 extern KSPIN_LOCK DispatcherDatabaseLock
;
196 #define KeEnterCriticalRegion() \
198 PKTHREAD _Thread = KeGetCurrentThread(); \
199 if (_Thread) _Thread->KernelApcDisable--; \
202 #define KeLeaveCriticalRegion() \
204 PKTHREAD _Thread = KeGetCurrentThread(); \
205 if((_Thread) && (++_Thread->KernelApcDisable == 0)) \
207 if (!IsListEmpty(&_Thread->ApcState.ApcListHead[KernelMode]) && \
208 (_Thread->SpecialApcDisable == 0)) \
210 KiCheckForKernelApcDelivery(); \
215 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
216 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
217 KeBugCheckWithTf(a,b,c,d,e,f)
219 /* INTERNAL KERNEL FUNCTIONS ************************************************/
221 /* threadsch.c ********************************************************************/
223 /* Thread Scheduler Functions */
225 /* Readies a Thread for Execution. */
228 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
230 /* Readies a Thread for Execution. */
233 KiDispatchThread(ULONG NewThreadStatus
);
235 /* Finds a new thread to run */
242 /* Removes a thread out of a block state. */
247 PNTSTATUS WaitStatus
,
253 KeSuspendThread(PKTHREAD Thread
);
257 KiSwapContext(PKTHREAD NewThread
);
261 KiAdjustQuantumThread(IN PKTHREAD Thread
);
265 KiExitDispatcher(KIRQL OldIrql
);
267 /* gmutex.c ********************************************************************/
271 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
273 /* gate.c **********************************************************************/
277 KeInitializeGate(PKGATE Gate
);
281 KeSignalGateBoostPriority(PKGATE Gate
);
287 KWAIT_REASON WaitReason
,
288 KPROCESSOR_MODE WaitMode
291 /* ipi.c ********************************************************************/
296 IN PKTRAP_FRAME TrapFrame
,
297 IN
struct _KEXCEPTION_FRAME
* ExceptionFrame
307 /* next file ***************************************************************/
311 DbgBreakPointNoBugCheck(VOID
);
316 struct _KPROFILE
* Profile
,
317 struct _KPROCESS
* Process
,
321 KPROFILE_SOURCE ProfileSource
,
328 struct _KPROFILE
* Profile
,
334 KeStopProfile(struct _KPROFILE
* Profile
);
338 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
342 KeSetIntervalProfile(
343 KPROFILE_SOURCE ProfileSource
,
350 PKTRAP_FRAME TrapFrame
355 KeProfileInterruptWithSource(
356 IN PKTRAP_FRAME TrapFrame
,
357 IN KPROFILE_SOURCE Source
362 KiRosPrintAddress(PVOID Address
);
367 PKTRAP_FRAME TrapFrame
,
374 PKTRAP_FRAME TrapFrame
,
382 PVOID DeferredContext
,
383 PVOID SystemArgument1
,
384 PVOID SystemArgument2
390 struct _KPROCESS
* Process
,
392 PKSYSTEM_ROUTINE SystemRoutine
,
393 PKSTART_ROUTINE StartRoutine
,
402 KeRundownThread(VOID
);
406 KeReleaseThread(PKTHREAD Thread
);
410 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
422 KiDispatcherObjectWake(
423 DISPATCHER_HEADER
* hdr
,
438 KeDumpStackFrames(PULONG Frame
);
455 struct _KPROCESS
*Process
,
458 LARGE_INTEGER DirectoryTableBase
463 KeForceResumeThread(IN PKTHREAD Thread
);
467 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
473 LARGE_INTEGER DueTime
485 KeGetStackTopThread(struct _ETHREAD
* Thread
);
489 KeContextToTrapFrame(
491 PKEXCEPTION_FRAME ExeptionFrame
,
492 PKTRAP_FRAME TrapFrame
,
493 KPROCESSOR_MODE PreviousMode
499 KPROCESSOR_MODE PreviousMode
,
501 PKTRAP_FRAME TrapFrame
506 KiCheckForKernelApcDelivery(VOID
);
512 IN PLIST_ENTRY Entry
,
519 struct _KPROCESS
* Process
,
525 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
530 IN PKEXCEPTION_FRAME Reserved
,
531 IN PKTRAP_FRAME TrapFrame
,
532 IN PKNORMAL_ROUTINE NormalRoutine
,
533 IN PVOID NormalContext
,
534 IN PVOID SystemArgument1
,
535 IN PVOID SystemArgument2
542 IN KPROCESSOR_MODE PreviousMode
548 struct _KTHREAD
*Thread
,
549 struct _KPROCESS
*Process
,
551 struct _KAPC_STATE
*SavedApcState
557 struct _KPROCESS
*NewProcess
,
558 struct _KPROCESS
*OldProcess
563 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
567 KeRemoveQueueApc(PKAPC Apc
);
571 KiWakeQueue(IN PKQUEUE Queue
);
573 /* INITIALIZATION FUNCTIONS *************************************************/
577 KeInitExceptions(VOID
);
581 KeInitInterrupts(VOID
);
589 KeInitDpc(struct _KPRCB
* Prcb
);
593 KeInitDispatcher(VOID
);
597 KiInitializeSystemClock(VOID
);
601 KiInitializeBugCheck(VOID
);
605 Phase1Initialization(PVOID Context
);
611 PULONG LastKernelAddress
620 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
625 PKAPC_STATE OldState
,
632 KPROFILE_SOURCE Source
,
639 PEXCEPTION_RECORD ExceptionRecord
,
640 PKEXCEPTION_FRAME ExceptionFrame
,
642 KPROCESSOR_MODE PreviousMode
,
648 KeTrapFrameToContext(
649 IN PKTRAP_FRAME TrapFrame
,
650 IN PKEXCEPTION_FRAME ExceptionFrame
,
651 IN OUT PCONTEXT Context
656 KeApplicationProcessorInit(VOID
);
660 KePrepareForApplicationProcessorInit(ULONG id
);
672 KePushAndStackSwitchAndSysRet(
679 KeStackSwitchAndRet(PVOID NewStack
);
685 ULONG BugCheckParameter1
,
686 ULONG BugCheckParameter2
,
687 ULONG BugCheckParameter3
,
688 ULONG BugCheckParameter4
,
702 KeFlushCurrentTb(VOID
);
706 KeRosDumpStackFrames(
720 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
726 PKV86M_REGISTERS Regs
737 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */