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 /* INTERNAL KERNEL FUNCTIONS ************************************************/
17 struct _KIRQ_TRAPFRAME
;
20 struct _KEXCEPTION_FRAME
;
22 extern PVOID KeUserApcDispatcher
;
23 extern PVOID KeUserCallbackDispatcher
;
24 extern PVOID KeUserExceptionDispatcher
;
25 extern PVOID KeRaiseUserExceptionDispatcher
;
27 #define IPI_REQUEST_FUNCTIONCALL 0
28 #define IPI_REQUEST_APC 1
29 #define IPI_REQUEST_DPC 2
30 #define IPI_REQUEST_FREEZE 3
32 /* MACROS *************************************************************************/
34 #define KeEnterCriticalRegion() \
36 PKTHREAD _Thread = KeGetCurrentThread(); \
37 if (_Thread) _Thread->KernelApcDisable--; \
40 #define KeLeaveCriticalRegion() \
42 PKTHREAD _Thread = KeGetCurrentThread(); \
43 if((_Thread) && (++_Thread->KernelApcDisable == 0)) \
45 if (!IsListEmpty(&_Thread->ApcState.ApcListHead[KernelMode])) \
47 KiKernelApcDeliveryCheck(); \
52 /* threadsch.c ********************************************************************/
54 /* Thread Scheduler Functions */
56 /* Readies a Thread for Execution. */
59 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
61 /* Readies a Thread for Execution. */
64 KiDispatchThread(ULONG NewThreadStatus
);
66 /* Puts a Thread into a block state. */
69 KiBlockThread(PNTSTATUS Status
,
74 /* Removes a thread out of a block state. */
77 KiUnblockThread(PKTHREAD Thread
,
83 KeSuspendThread(PKTHREAD Thread
);
87 KiSwapContext(PKTHREAD NewThread
);
91 KiAdjustQuantumThread(IN PKTHREAD Thread
);
93 /* gmutex.c ********************************************************************/
97 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
99 /* gate.c **********************************************************************/
103 KeInitializeGate(PKGATE Gate
);
107 KeSignalGateBoostPriority(PKGATE Gate
);
111 KeWaitForGate(PKGATE Gate
,
112 KWAIT_REASON WaitReason
,
113 KPROCESSOR_MODE WaitMode
);
115 /* ipi.c ********************************************************************/
118 KiIpiServiceRoutine(IN PKTRAP_FRAME TrapFrame
,
119 IN
struct _KEXCEPTION_FRAME
* ExceptionFrame
);
122 KiIpiSendRequest(KAFFINITY TargetSet
,
126 KeIpiGenericCall(VOID (STDCALL
*WorkerRoutine
)(PVOID
),
129 /* next file ***************************************************************/
131 typedef struct _KPROFILE_SOURCE_OBJECT
133 KPROFILE_SOURCE Source
;
134 LIST_ENTRY ListEntry
;
135 } KPROFILE_SOURCE_OBJECT
, *PKPROFILE_SOURCE_OBJECT
;
137 /* Cached modules from the loader block */
138 typedef enum _CACHED_MODULE_TYPE
145 MaximumCachedModuleType
,
146 } CACHED_MODULE_TYPE
, *PCACHED_MODULE_TYPE
;
147 extern PLOADER_MODULE CachedModules
[MaximumCachedModuleType
];
151 DbgBreakPointNoBugCheck(VOID
);
155 KeInitializeProfile(struct _KPROFILE
* Profile
,
156 struct _KPROCESS
* Process
,
160 KPROFILE_SOURCE ProfileSource
,
165 KeStartProfile(struct _KPROFILE
* Profile
,
170 KeStopProfile(struct _KPROFILE
* Profile
);
174 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
178 KeSetIntervalProfile(KPROFILE_SOURCE ProfileSource
,
184 PKTRAP_FRAME TrapFrame
189 KeProfileInterruptWithSource(
190 IN PKTRAP_FRAME TrapFrame
,
191 IN KPROFILE_SOURCE Source
196 KiRosPrintAddress(PVOID Address
);
198 VOID STDCALL
KeUpdateSystemTime(PKTRAP_FRAME TrapFrame
, KIRQL Irql
);
199 VOID STDCALL
KeUpdateRunTime(PKTRAP_FRAME TrapFrame
, KIRQL Irql
);
201 VOID STDCALL
KiExpireTimers(PKDPC Dpc
, PVOID DeferredContext
, PVOID SystemArgument1
, PVOID SystemArgument2
);
203 KIRQL
inline FASTCALL
KeAcquireDispatcherDatabaseLock(VOID
);
204 VOID
inline FASTCALL
KeAcquireDispatcherDatabaseLockAtDpcLevel(VOID
);
205 VOID
inline FASTCALL
KeReleaseDispatcherDatabaseLock(KIRQL Irql
);
206 VOID
inline FASTCALL
KeReleaseDispatcherDatabaseLockFromDpcLevel(VOID
);
210 KeInitializeThread(struct _KPROCESS
* Process
,
212 PKSYSTEM_ROUTINE SystemRoutine
,
213 PKSTART_ROUTINE StartRoutine
,
221 KeRundownThread(VOID
);
223 NTSTATUS
KeReleaseThread(PKTHREAD Thread
);
227 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
231 KiSetPriorityThread(PKTHREAD Thread
,
237 KeStackAttachProcess (
238 IN
struct _KPROCESS
* Process
,
239 OUT PKAPC_STATE ApcState
244 KeUnstackDetachProcess (
245 IN PKAPC_STATE ApcState
248 BOOLEAN
KiDispatcherObjectWake(DISPATCHER_HEADER
* hdr
, KPRIORITY increment
);
249 VOID STDCALL
KeExpireTimers(PKDPC Apc
,
253 VOID
inline FASTCALL
KeInitializeDispatcherHeader(DISPATCHER_HEADER
* Header
, ULONG Type
,
254 ULONG Size
, ULONG SignalState
);
255 VOID
KeDumpStackFrames(PULONG Frame
);
256 BOOLEAN
KiTestAlert(VOID
);
260 KiAbortWaitThread(PKTHREAD Thread
,
262 KPRIORITY Increment
);
266 KeInitializeProcess(struct _KPROCESS
*Process
,
269 LARGE_INTEGER DirectoryTableBase
);
273 KeForceResumeThread(IN PKTHREAD Thread
);
277 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
279 BOOLEAN STDCALL
KiInsertTimer(PKTIMER Timer
, LARGE_INTEGER DueTime
);
281 VOID
inline FASTCALL
KiSatisfyObjectWait(PDISPATCHER_HEADER Object
, PKTHREAD Thread
);
283 BOOLEAN
inline FASTCALL
KiIsObjectSignaled(PDISPATCHER_HEADER Object
, PKTHREAD Thread
);
285 VOID
inline FASTCALL
KiSatisifyMultipleObjectWaits(PKWAIT_BLOCK WaitBlock
);
287 VOID FASTCALL
KiWaitTest(PDISPATCHER_HEADER Object
, KPRIORITY Increment
);
289 PULONG
KeGetStackTopThread(struct _ETHREAD
* Thread
);
290 BOOLEAN STDCALL
KeContextToTrapFrame(PCONTEXT Context
, PKEXCEPTION_FRAME ExeptionFrame
, PKTRAP_FRAME TrapFrame
);
291 VOID STDCALL
KiDeliverApc(KPROCESSOR_MODE PreviousMode
,
293 PKTRAP_FRAME TrapFrame
);
296 KiKernelApcDeliveryCheck(VOID
);
299 KiInsertQueue(IN PKQUEUE Queue
,
300 IN PLIST_ENTRY Entry
,
305 KeSetProcess(struct _KPROCESS
* Process
,
306 KPRIORITY Increment
);
309 VOID STDCALL
KeInitializeEventPair(PKEVENT_PAIR EventPair
);
311 VOID STDCALL
KiInitializeUserApc(IN PKEXCEPTION_FRAME Reserved
,
312 IN PKTRAP_FRAME TrapFrame
,
313 IN PKNORMAL_ROUTINE NormalRoutine
,
314 IN PVOID NormalContext
,
315 IN PVOID SystemArgument1
,
316 IN PVOID SystemArgument2
);
320 KeFlushQueueApc(IN PKTHREAD Thread
,
321 IN KPROCESSOR_MODE PreviousMode
);
324 VOID STDCALL
KiAttachProcess(struct _KTHREAD
*Thread
, struct _KPROCESS
*Process
, KIRQL ApcLock
, struct _KAPC_STATE
*SavedApcState
);
326 VOID STDCALL
KiSwapProcess(struct _KPROCESS
*NewProcess
, struct _KPROCESS
*OldProcess
);
330 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
332 BOOLEAN STDCALL
KeRemoveQueueApc (PKAPC Apc
);
333 VOID FASTCALL
KiWakeQueue(IN PKQUEUE Queue
);
334 PLIST_ENTRY STDCALL
KeRundownQueue(IN PKQUEUE Queue
);
336 extern LARGE_INTEGER SystemBootTime
;
338 /* INITIALIZATION FUNCTIONS *************************************************/
340 extern ULONG_PTR KERNEL_BASE
;
342 VOID
KeInitExceptions(VOID
);
343 VOID
KeInitInterrupts(VOID
);
344 VOID
KeInitTimer(VOID
);
345 VOID
KeInitDpc(struct _KPRCB
* Prcb
);
346 VOID
KeInitDispatcher(VOID
);
347 VOID
inline FASTCALL
KeInitializeDispatcher(VOID
);
348 VOID
KiInitializeSystemClock(VOID
);
349 VOID
KiInitializeBugCheck(VOID
);
350 VOID
Phase1Initialization(PVOID Context
);
352 VOID
KeInit1(PCHAR CommandLine
, PULONG LastKernelAddress
);
355 BOOLEAN
KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
359 KiMoveApcState (PKAPC_STATE OldState
,
360 PKAPC_STATE NewState
);
363 KiAddProfileEvent(KPROFILE_SOURCE Source
, ULONG Pc
);
366 KiDispatchException(PEXCEPTION_RECORD ExceptionRecord
,
367 PKEXCEPTION_FRAME ExceptionFrame
,
369 KPROCESSOR_MODE PreviousMode
,
370 BOOLEAN SearchFrames
);
371 VOID
KeTrapFrameToContext(PKTRAP_FRAME TrapFrame
,
374 KeApplicationProcessorInit(VOID
);
376 KePrepareForApplicationProcessorInit(ULONG id
);
378 KiUserTrapHandler(PKTRAP_FRAME Tf
, ULONG ExceptionNr
, PVOID Cr2
);
380 KePushAndStackSwitchAndSysRet(ULONG Push
, PVOID NewStack
);
382 KeStackSwitchAndRet(PVOID NewStack
);
384 KeBugCheckWithTf(ULONG BugCheckCode
,
385 ULONG BugCheckParameter1
,
386 ULONG BugCheckParameter2
,
387 ULONG BugCheckParameter3
,
388 ULONG BugCheckParameter4
,
390 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), KeBugCheckWithTf(a,b,c,d,e,f)
392 KiDumpTrapFrame(PKTRAP_FRAME Tf
, ULONG ExceptionNr
, ULONG cr2
);
396 KeFlushCurrentTb(VOID
);
398 /* REACTOS SPECIFIC */
401 KeRosDumpStackFrames(
411 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
413 #define MAXIMUM_PROCESSORS 32
415 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */