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()
53 #define KeAcquireDispatcherDatabaseLock() KeRaiseIrqlToDpcLevel();
54 #define KeAcquireDispatcherDatabaseLockAtDpcLevel()
55 #define KeReleaseDispatcherDatabaseLockFromDpcLevel()
57 #define KeInitializeDispatcher() KeInitializeSpinLock(&DispatcherDatabaseLock);
58 #define KeAcquireDispatcherDatabaseLock() KfAcquireSpinLock(&DispatcherDatabaseLock);
59 #define KeAcquireDispatcherDatabaseLockAtDpcLevel() \
60 KeAcquireSpinLockAtDpcLevel (&DispatcherDatabaseLock);
61 #define KeReleaseDispatcherDatabaseLockFromDpcLevel() \
62 KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock);
65 /* The following macro initializes a dispatcher object's header */
66 #define KeInitializeDispatcherHeader(Header, t, s, State) \
69 (Header)->Absolute = 0; \
70 (Header)->Inserted = 0; \
72 (Header)->SignalState = State; \
73 InitializeListHead(&((Header)->WaitListHead)); \
76 /* The following macro satisfies the wait of any dispatcher object */
77 #define KiSatisfyObjectWait(Object, Thread) \
79 /* Special case for Mutants */ \
80 if ((Object)->Header.Type == MutantObject) \
82 /* Decrease the Signal State */ \
83 (Object)->Header.SignalState--; \
85 /* Check if it's now non-signaled */ \
86 if (!(Object)->Header.SignalState) \
88 /* Set the Owner Thread */ \
89 (Object)->OwnerThread = Thread; \
91 /* Disable APCs if needed */ \
92 Thread->KernelApcDisable -= (Object)->ApcDisable; \
94 /* Check if it's abandoned */ \
95 if ((Object)->Abandoned) \
98 (Object)->Abandoned = FALSE; \
100 /* Return Status */ \
101 Thread->WaitStatus = STATUS_ABANDONED; \
104 /* Insert it into the Mutant List */ \
105 InsertHeadList(&Thread->MutantListHead, \
106 &(Object)->MutantListEntry); \
109 else if (((Object)->Header.Type & TIMER_OR_EVENT_TYPE) == \
110 EventSynchronizationObject) \
112 /* Synchronization Timers and Events just get un-signaled */ \
113 (Object)->Header.SignalState = 0; \
115 else if ((Object)->Header.Type == SemaphoreObject) \
117 /* These ones can have multiple states, so we only decrease it */ \
118 (Object)->Header.SignalState--; \
122 /* The following macro satisfies the wait of a mutant dispatcher object */
123 #define KiSatisfyMutantWait(Object, Thread) \
125 /* Decrease the Signal State */ \
126 (Object)->Header.SignalState--; \
128 /* Check if it's now non-signaled */ \
129 if (!(Object)->Header.SignalState) \
131 /* Set the Owner Thread */ \
132 (Object)->OwnerThread = Thread; \
134 /* Disable APCs if needed */ \
135 Thread->KernelApcDisable -= (Object)->ApcDisable; \
137 /* Check if it's abandoned */ \
138 if ((Object)->Abandoned) \
141 (Object)->Abandoned = FALSE; \
143 /* Return Status */ \
144 Thread->WaitStatus = STATUS_ABANDONED; \
147 /* Insert it into the Mutant List */ \
148 InsertHeadList(&Thread->MutantListHead, \
149 &(Object)->MutantListEntry); \
153 /* The following macro satisfies the wait of any nonmutant dispatcher object */
154 #define KiSatisfyNonMutantWait(Object, Thread) \
156 if (((Object)->Header.Type & TIMER_OR_EVENT_TYPE) == \
157 EventSynchronizationObject) \
159 /* Synchronization Timers and Events just get un-signaled */ \
160 (Object)->Header.SignalState = 0; \
162 else if ((Object)->Header.Type == SemaphoreObject) \
164 /* These ones can have multiple states, so we only decrease it */ \
165 (Object)->Header.SignalState--; \
169 /* The following macro satisfies multiple objects in a wait state */
170 #define KiSatisifyMultipleObjectWaits(FirstBlock) \
172 PKWAIT_BLOCK WaitBlock = FirstBlock; \
173 PKTHREAD WaitThread = WaitBlock->Thread; \
175 /* Loop through all the Wait Blocks, and wake each Object */ \
178 /* Make sure it hasn't timed out */ \
179 if (WaitBlock->WaitKey != STATUS_TIMEOUT) \
181 /* Wake the Object */ \
182 KiSatisfyObjectWait((PKMUTANT)WaitBlock->Object, WaitThread); \
185 /* Move to the next block */ \
186 WaitBlock = WaitBlock->NextWaitBlock; \
187 } while (WaitBlock != FirstBlock); \
190 extern KSPIN_LOCK DispatcherDatabaseLock
;
192 #define KeEnterCriticalRegion() \
194 PKTHREAD _Thread = KeGetCurrentThread(); \
195 if (_Thread) _Thread->KernelApcDisable--; \
198 #define KeLeaveCriticalRegion() \
200 PKTHREAD _Thread = KeGetCurrentThread(); \
201 if((_Thread) && (++_Thread->KernelApcDisable == 0)) \
203 if (!IsListEmpty(&_Thread->ApcState.ApcListHead[KernelMode]) && \
204 (_Thread->SpecialApcDisable == 0)) \
206 KiCheckForKernelApcDelivery(); \
211 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
212 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
213 KeBugCheckWithTf(a,b,c,d,e,f)
215 /* INTERNAL KERNEL FUNCTIONS ************************************************/
217 /* threadsch.c ********************************************************************/
219 /* Thread Scheduler Functions */
221 /* Readies a Thread for Execution. */
224 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
226 /* Readies a Thread for Execution. */
229 KiDispatchThread(ULONG NewThreadStatus
);
231 /* Puts a Thread into a block state. */
241 /* Removes a thread out of a block state. */
246 PNTSTATUS WaitStatus
,
252 KeSuspendThread(PKTHREAD Thread
);
256 KiSwapContext(PKTHREAD NewThread
);
260 KiAdjustQuantumThread(IN PKTHREAD Thread
);
262 /* gmutex.c ********************************************************************/
266 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
268 /* gate.c **********************************************************************/
272 KeInitializeGate(PKGATE Gate
);
276 KeSignalGateBoostPriority(PKGATE Gate
);
282 KWAIT_REASON WaitReason
,
283 KPROCESSOR_MODE WaitMode
286 /* ipi.c ********************************************************************/
291 IN PKTRAP_FRAME TrapFrame
,
292 IN
struct _KEXCEPTION_FRAME
* ExceptionFrame
305 VOID (STDCALL
*WorkerRoutine
)(PVOID
),
309 /* next file ***************************************************************/
313 DbgBreakPointNoBugCheck(VOID
);
318 struct _KPROFILE
* Profile
,
319 struct _KPROCESS
* Process
,
323 KPROFILE_SOURCE ProfileSource
,
330 struct _KPROFILE
* Profile
,
336 KeStopProfile(struct _KPROFILE
* Profile
);
340 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
344 KeSetIntervalProfile(
345 KPROFILE_SOURCE ProfileSource
,
352 PKTRAP_FRAME TrapFrame
357 KeProfileInterruptWithSource(
358 IN PKTRAP_FRAME TrapFrame
,
359 IN KPROFILE_SOURCE Source
364 KiRosPrintAddress(PVOID Address
);
369 PKTRAP_FRAME TrapFrame
,
376 PKTRAP_FRAME TrapFrame
,
384 PVOID DeferredContext
,
385 PVOID SystemArgument1
,
386 PVOID SystemArgument2
391 KeReleaseDispatcherDatabaseLock(KIRQL Irql
);
396 struct _KPROCESS
* Process
,
398 PKSYSTEM_ROUTINE SystemRoutine
,
399 PKSTART_ROUTINE StartRoutine
,
408 KeRundownThread(VOID
);
412 KeReleaseThread(PKTHREAD Thread
);
416 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
428 KiDispatcherObjectWake(
429 DISPATCHER_HEADER
* hdr
,
444 KeDumpStackFrames(PULONG Frame
);
461 struct _KPROCESS
*Process
,
464 LARGE_INTEGER DirectoryTableBase
469 KeForceResumeThread(IN PKTHREAD Thread
);
473 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
479 LARGE_INTEGER DueTime
486 PDISPATCHER_HEADER Object
,
499 KeGetStackTopThread(struct _ETHREAD
* Thread
);
503 KeContextToTrapFrame(
505 PKEXCEPTION_FRAME ExeptionFrame
,
506 PKTRAP_FRAME TrapFrame
,
507 KPROCESSOR_MODE PreviousMode
513 KPROCESSOR_MODE PreviousMode
,
515 PKTRAP_FRAME TrapFrame
520 KiCheckForKernelApcDelivery(VOID
);
526 IN PLIST_ENTRY Entry
,
533 struct _KPROCESS
* Process
,
539 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
544 IN PKEXCEPTION_FRAME Reserved
,
545 IN PKTRAP_FRAME TrapFrame
,
546 IN PKNORMAL_ROUTINE NormalRoutine
,
547 IN PVOID NormalContext
,
548 IN PVOID SystemArgument1
,
549 IN PVOID SystemArgument2
556 IN KPROCESSOR_MODE PreviousMode
562 struct _KTHREAD
*Thread
,
563 struct _KPROCESS
*Process
,
565 struct _KAPC_STATE
*SavedApcState
571 struct _KPROCESS
*NewProcess
,
572 struct _KPROCESS
*OldProcess
577 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
581 KeRemoveQueueApc(PKAPC Apc
);
585 KiWakeQueue(IN PKQUEUE Queue
);
589 KeRundownQueue(IN PKQUEUE Queue
);
591 /* INITIALIZATION FUNCTIONS *************************************************/
595 KeInitExceptions(VOID
);
599 KeInitInterrupts(VOID
);
607 KeInitDpc(struct _KPRCB
* Prcb
);
611 KeInitDispatcher(VOID
);
615 KiInitializeSystemClock(VOID
);
619 KiInitializeBugCheck(VOID
);
623 Phase1Initialization(PVOID Context
);
629 PULONG LastKernelAddress
638 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
643 PKAPC_STATE OldState
,
650 KPROFILE_SOURCE Source
,
657 PEXCEPTION_RECORD ExceptionRecord
,
658 PKEXCEPTION_FRAME ExceptionFrame
,
660 KPROCESSOR_MODE PreviousMode
,
666 KeTrapFrameToContext(
667 IN PKTRAP_FRAME TrapFrame
,
668 IN PKEXCEPTION_FRAME ExceptionFrame
,
669 IN OUT PCONTEXT Context
674 KeApplicationProcessorInit(VOID
);
678 KePrepareForApplicationProcessorInit(ULONG id
);
690 KePushAndStackSwitchAndSysRet(
697 KeStackSwitchAndRet(PVOID NewStack
);
703 ULONG BugCheckParameter1
,
704 ULONG BugCheckParameter2
,
705 ULONG BugCheckParameter3
,
706 ULONG BugCheckParameter4
,
720 KeFlushCurrentTb(VOID
);
724 KeRosDumpStackFrames(
738 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
744 PKV86M_REGISTERS Regs
755 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */