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 #define IPI_REQUEST_FUNCTIONCALL 0
23 #define IPI_REQUEST_APC 1
24 #define IPI_REQUEST_DPC 2
25 #define IPI_REQUEST_FREEZE 3
27 /* MACROS *************************************************************************/
29 #define KeEnterCriticalRegion() \
31 PKTHREAD _Thread = KeGetCurrentThread(); \
32 if (_Thread) _Thread->KernelApcDisable--; \
35 #define KeLeaveCriticalRegion() \
37 PKTHREAD _Thread = KeGetCurrentThread(); \
38 if((_Thread) && (++_Thread->KernelApcDisable == 0)) \
40 if (!IsListEmpty(&_Thread->ApcState.ApcListHead[KernelMode])) \
42 KiKernelApcDeliveryCheck(); \
47 /* threadsch.c ********************************************************************/
49 /* Thread Scheduler Functions */
51 /* Readies a Thread for Execution. */
54 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
56 /* Readies a Thread for Execution. */
59 KiDispatchThread(ULONG NewThreadStatus
);
61 /* Puts a Thread into a block state. */
64 KiBlockThread(PNTSTATUS Status
,
69 /* Removes a thread out of a block state. */
72 KiUnblockThread(PKTHREAD Thread
,
78 KeSuspendThread(PKTHREAD Thread
);
82 KiSwapContext(PKTHREAD NewThread
);
84 /* gmutex.c ********************************************************************/
88 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
90 /* gate.c **********************************************************************/
94 KeInitializeGate(PKGATE Gate
);
98 KeSignalGateBoostPriority(PKGATE Gate
);
102 KeWaitForGate(PKGATE Gate
,
103 KWAIT_REASON WaitReason
,
104 KPROCESSOR_MODE WaitMode
);
106 /* ipi.c ********************************************************************/
109 KiIpiServiceRoutine(IN PKTRAP_FRAME TrapFrame
,
110 IN
struct _KEXCEPTION_FRAME
* ExceptionFrame
);
113 KiIpiSendRequest(KAFFINITY TargetSet
,
117 KeIpiGenericCall(VOID (STDCALL
*WorkerRoutine
)(PVOID
),
120 /* next file ***************************************************************/
122 typedef struct _KPROFILE_SOURCE_OBJECT
124 KPROFILE_SOURCE Source
;
125 LIST_ENTRY ListEntry
;
126 } KPROFILE_SOURCE_OBJECT
, *PKPROFILE_SOURCE_OBJECT
;
128 /* Cached modules from the loader block */
129 typedef enum _CACHED_MODULE_TYPE
136 MaximumCachedModuleType
,
137 } CACHED_MODULE_TYPE
, *PCACHED_MODULE_TYPE
;
138 extern PLOADER_MODULE CachedModules
[MaximumCachedModuleType
];
142 DbgBreakPointNoBugCheck(VOID
);
146 KeInitializeProfile(struct _KPROFILE
* Profile
,
147 struct _KPROCESS
* Process
,
151 KPROFILE_SOURCE ProfileSource
,
156 KeStartProfile(struct _KPROFILE
* Profile
,
161 KeStopProfile(struct _KPROFILE
* Profile
);
165 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
169 KeSetIntervalProfile(KPROFILE_SOURCE ProfileSource
,
175 PKTRAP_FRAME TrapFrame
180 KeProfileInterruptWithSource(
181 IN PKTRAP_FRAME TrapFrame
,
182 IN KPROFILE_SOURCE Source
187 KiRosPrintAddress(PVOID Address
);
189 VOID STDCALL
KeUpdateSystemTime(PKTRAP_FRAME TrapFrame
, KIRQL Irql
);
190 VOID STDCALL
KeUpdateRunTime(PKTRAP_FRAME TrapFrame
, KIRQL Irql
);
192 VOID STDCALL
KiExpireTimers(PKDPC Dpc
, PVOID DeferredContext
, PVOID SystemArgument1
, PVOID SystemArgument2
);
194 KIRQL
inline FASTCALL
KeAcquireDispatcherDatabaseLock(VOID
);
195 VOID
inline FASTCALL
KeAcquireDispatcherDatabaseLockAtDpcLevel(VOID
);
196 VOID
inline FASTCALL
KeReleaseDispatcherDatabaseLock(KIRQL Irql
);
197 VOID
inline FASTCALL
KeReleaseDispatcherDatabaseLockFromDpcLevel(VOID
);
201 KeInitializeThread(struct _KPROCESS
* Process
,
203 PKSYSTEM_ROUTINE SystemRoutine
,
204 PKSTART_ROUTINE StartRoutine
,
212 KeRundownThread(VOID
);
214 NTSTATUS
KeReleaseThread(PKTHREAD Thread
);
218 KeStackAttachProcess (
219 IN
struct _KPROCESS
* Process
,
220 OUT PKAPC_STATE ApcState
225 KeUnstackDetachProcess (
226 IN PKAPC_STATE ApcState
229 BOOLEAN
KiDispatcherObjectWake(DISPATCHER_HEADER
* hdr
, KPRIORITY increment
);
230 VOID STDCALL
KeExpireTimers(PKDPC Apc
,
234 VOID
inline FASTCALL
KeInitializeDispatcherHeader(DISPATCHER_HEADER
* Header
, ULONG Type
,
235 ULONG Size
, ULONG SignalState
);
236 VOID
KeDumpStackFrames(PULONG Frame
);
237 BOOLEAN
KiTestAlert(VOID
);
241 KiAbortWaitThread(PKTHREAD Thread
,
243 KPRIORITY Increment
);
247 KeInitializeProcess(struct _KPROCESS
*Process
,
250 LARGE_INTEGER DirectoryTableBase
);
254 KeForceResumeThread(IN PKTHREAD Thread
);
256 BOOLEAN STDCALL
KiInsertTimer(PKTIMER Timer
, LARGE_INTEGER DueTime
);
258 VOID
inline FASTCALL
KiSatisfyObjectWait(PDISPATCHER_HEADER Object
, PKTHREAD Thread
);
260 BOOLEAN
inline FASTCALL
KiIsObjectSignaled(PDISPATCHER_HEADER Object
, PKTHREAD Thread
);
262 VOID
inline FASTCALL
KiSatisifyMultipleObjectWaits(PKWAIT_BLOCK WaitBlock
);
264 VOID FASTCALL
KiWaitTest(PDISPATCHER_HEADER Object
, KPRIORITY Increment
);
266 PULONG
KeGetStackTopThread(struct _ETHREAD
* Thread
);
267 BOOLEAN STDCALL
KeContextToTrapFrame(PCONTEXT Context
, PKTRAP_FRAME TrapFrame
);
268 VOID STDCALL
KiDeliverApc(KPROCESSOR_MODE PreviousMode
,
270 PKTRAP_FRAME TrapFrame
);
273 KiKernelApcDeliveryCheck(VOID
);
276 KiInsertQueue(IN PKQUEUE Queue
,
277 IN PLIST_ENTRY Entry
,
282 KeSetProcess(struct _KPROCESS
* Process
,
283 KPRIORITY Increment
);
286 VOID STDCALL
KeInitializeEventPair(PKEVENT_PAIR EventPair
);
288 VOID STDCALL
KiInitializeUserApc(IN PVOID Reserved
,
289 IN PKTRAP_FRAME TrapFrame
,
290 IN PKNORMAL_ROUTINE NormalRoutine
,
291 IN PVOID NormalContext
,
292 IN PVOID SystemArgument1
,
293 IN PVOID SystemArgument2
);
295 VOID STDCALL
KiAttachProcess(struct _KTHREAD
*Thread
, struct _KPROCESS
*Process
, KIRQL ApcLock
, struct _KAPC_STATE
*SavedApcState
);
297 VOID STDCALL
KiSwapProcess(struct _KPROCESS
*NewProcess
, struct _KPROCESS
*OldProcess
);
301 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
303 BOOLEAN STDCALL
KeRemoveQueueApc (PKAPC Apc
);
304 VOID FASTCALL
KiWakeQueue(IN PKQUEUE Queue
);
305 PLIST_ENTRY STDCALL
KeRundownQueue(IN PKQUEUE Queue
);
307 extern LARGE_INTEGER SystemBootTime
;
309 /* INITIALIZATION FUNCTIONS *************************************************/
311 extern ULONG_PTR KERNEL_BASE
;
313 VOID
KeInitExceptions(VOID
);
314 VOID
KeInitInterrupts(VOID
);
315 VOID
KeInitTimer(VOID
);
316 VOID
KeInitDpc(struct _KPRCB
* Prcb
);
317 VOID
KeInitDispatcher(VOID
);
318 VOID
inline FASTCALL
KeInitializeDispatcher(VOID
);
319 VOID
KiInitializeSystemClock(VOID
);
320 VOID
KiInitializeBugCheck(VOID
);
321 VOID
Phase1Initialization(PVOID Context
);
323 VOID
KeInit1(PCHAR CommandLine
, PULONG LastKernelAddress
);
326 BOOLEAN
KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
330 KiMoveApcState (PKAPC_STATE OldState
,
331 PKAPC_STATE NewState
);
334 KiAddProfileEvent(KPROFILE_SOURCE Source
, ULONG Pc
);
336 KiDispatchException(PEXCEPTION_RECORD ExceptionRecord
,
339 KPROCESSOR_MODE PreviousMode
,
340 BOOLEAN SearchFrames
);
341 VOID
KeTrapFrameToContext(PKTRAP_FRAME TrapFrame
,
344 KeApplicationProcessorInit(VOID
);
346 KePrepareForApplicationProcessorInit(ULONG id
);
348 KiUserTrapHandler(PKTRAP_FRAME Tf
, ULONG ExceptionNr
, PVOID Cr2
);
350 KePushAndStackSwitchAndSysRet(ULONG Push
, PVOID NewStack
);
352 KeStackSwitchAndRet(PVOID NewStack
);
354 KeBugCheckWithTf(ULONG BugCheckCode
,
355 ULONG BugCheckParameter1
,
356 ULONG BugCheckParameter2
,
357 ULONG BugCheckParameter3
,
358 ULONG BugCheckParameter4
,
360 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), KeBugCheckWithTf(a,b,c,d,e,f)
362 KiDumpTrapFrame(PKTRAP_FRAME Tf
, ULONG ExceptionNr
, ULONG cr2
);
366 KeFlushCurrentTb(VOID
);
368 /* REACTOS SPECIFIC */
371 KeRosDumpStackFrames(
381 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
383 #define MAXIMUM_PROCESSORS 32
385 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */