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 KeStackAttachProcess (
228 IN
struct _KPROCESS
* Process
,
229 OUT PKAPC_STATE ApcState
234 KeUnstackDetachProcess (
235 IN PKAPC_STATE ApcState
238 BOOLEAN
KiDispatcherObjectWake(DISPATCHER_HEADER
* hdr
, KPRIORITY increment
);
239 VOID STDCALL
KeExpireTimers(PKDPC Apc
,
243 VOID
inline FASTCALL
KeInitializeDispatcherHeader(DISPATCHER_HEADER
* Header
, ULONG Type
,
244 ULONG Size
, ULONG SignalState
);
245 VOID
KeDumpStackFrames(PULONG Frame
);
246 BOOLEAN
KiTestAlert(VOID
);
250 KiAbortWaitThread(PKTHREAD Thread
,
252 KPRIORITY Increment
);
256 KeInitializeProcess(struct _KPROCESS
*Process
,
259 LARGE_INTEGER DirectoryTableBase
);
263 KeForceResumeThread(IN PKTHREAD Thread
);
267 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
269 BOOLEAN STDCALL
KiInsertTimer(PKTIMER Timer
, LARGE_INTEGER DueTime
);
271 VOID
inline FASTCALL
KiSatisfyObjectWait(PDISPATCHER_HEADER Object
, PKTHREAD Thread
);
273 BOOLEAN
inline FASTCALL
KiIsObjectSignaled(PDISPATCHER_HEADER Object
, PKTHREAD Thread
);
275 VOID
inline FASTCALL
KiSatisifyMultipleObjectWaits(PKWAIT_BLOCK WaitBlock
);
277 VOID FASTCALL
KiWaitTest(PDISPATCHER_HEADER Object
, KPRIORITY Increment
);
279 PULONG
KeGetStackTopThread(struct _ETHREAD
* Thread
);
280 BOOLEAN STDCALL
KeContextToTrapFrame(PCONTEXT Context
, PKTRAP_FRAME TrapFrame
);
281 VOID STDCALL
KiDeliverApc(KPROCESSOR_MODE PreviousMode
,
283 PKTRAP_FRAME TrapFrame
);
286 KiKernelApcDeliveryCheck(VOID
);
289 KiInsertQueue(IN PKQUEUE Queue
,
290 IN PLIST_ENTRY Entry
,
295 KeSetProcess(struct _KPROCESS
* Process
,
296 KPRIORITY Increment
);
299 VOID STDCALL
KeInitializeEventPair(PKEVENT_PAIR EventPair
);
301 VOID STDCALL
KiInitializeUserApc(IN PVOID Reserved
,
302 IN PKTRAP_FRAME TrapFrame
,
303 IN PKNORMAL_ROUTINE NormalRoutine
,
304 IN PVOID NormalContext
,
305 IN PVOID SystemArgument1
,
306 IN PVOID SystemArgument2
);
310 KeFlushQueueApc(IN PKTHREAD Thread
,
311 IN KPROCESSOR_MODE PreviousMode
);
314 VOID STDCALL
KiAttachProcess(struct _KTHREAD
*Thread
, struct _KPROCESS
*Process
, KIRQL ApcLock
, struct _KAPC_STATE
*SavedApcState
);
316 VOID STDCALL
KiSwapProcess(struct _KPROCESS
*NewProcess
, struct _KPROCESS
*OldProcess
);
320 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
322 BOOLEAN STDCALL
KeRemoveQueueApc (PKAPC Apc
);
323 VOID FASTCALL
KiWakeQueue(IN PKQUEUE Queue
);
324 PLIST_ENTRY STDCALL
KeRundownQueue(IN PKQUEUE Queue
);
326 extern LARGE_INTEGER SystemBootTime
;
328 /* INITIALIZATION FUNCTIONS *************************************************/
330 extern ULONG_PTR KERNEL_BASE
;
332 VOID
KeInitExceptions(VOID
);
333 VOID
KeInitInterrupts(VOID
);
334 VOID
KeInitTimer(VOID
);
335 VOID
KeInitDpc(struct _KPRCB
* Prcb
);
336 VOID
KeInitDispatcher(VOID
);
337 VOID
inline FASTCALL
KeInitializeDispatcher(VOID
);
338 VOID
KiInitializeSystemClock(VOID
);
339 VOID
KiInitializeBugCheck(VOID
);
340 VOID
Phase1Initialization(PVOID Context
);
342 VOID
KeInit1(PCHAR CommandLine
, PULONG LastKernelAddress
);
345 BOOLEAN
KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
349 KiMoveApcState (PKAPC_STATE OldState
,
350 PKAPC_STATE NewState
);
353 KiAddProfileEvent(KPROFILE_SOURCE Source
, ULONG Pc
);
355 KiDispatchException(PEXCEPTION_RECORD ExceptionRecord
,
358 KPROCESSOR_MODE PreviousMode
,
359 BOOLEAN SearchFrames
);
360 VOID
KeTrapFrameToContext(PKTRAP_FRAME TrapFrame
,
363 KeApplicationProcessorInit(VOID
);
365 KePrepareForApplicationProcessorInit(ULONG id
);
367 KiUserTrapHandler(PKTRAP_FRAME Tf
, ULONG ExceptionNr
, PVOID Cr2
);
369 KePushAndStackSwitchAndSysRet(ULONG Push
, PVOID NewStack
);
371 KeStackSwitchAndRet(PVOID NewStack
);
373 KeBugCheckWithTf(ULONG BugCheckCode
,
374 ULONG BugCheckParameter1
,
375 ULONG BugCheckParameter2
,
376 ULONG BugCheckParameter3
,
377 ULONG BugCheckParameter4
,
379 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), KeBugCheckWithTf(a,b,c,d,e,f)
381 KiDumpTrapFrame(PKTRAP_FRAME Tf
, ULONG ExceptionNr
, ULONG cr2
);
385 KeFlushCurrentTb(VOID
);
387 /* REACTOS SPECIFIC */
390 KeRosDumpStackFrames(
400 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
402 #define MAXIMUM_PROCESSORS 32
404 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */