3 * Copyright (C) 2000 David Welch <welch@cwcom.net>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #ifndef __NTOSKRNL_INCLUDE_INTERNAL_KE_H
21 #define __NTOSKRNL_INCLUDE_INTERNAL_KE_H
23 /* INCLUDES *****************************************************************/
26 #include <ddk/ntifs.h>
28 #endif /* not __ASM__ */
32 /* INTERNAL KERNEL FUNCTIONS ************************************************/
35 struct _KPROCESS
* KeGetCurrentProcess(VOID
);
36 VOID
KeSetGdtSelector(ULONG Entry
, ULONG Value1
, ULONG Value2
);
42 struct _KIRQ_TRAPFRAME
;
45 struct _KEXCEPTION_FRAME
;
47 #define IPI_REQUEST_FUNCTIONCALL 0
48 #define IPI_REQUEST_APC 1
49 #define IPI_REQUEST_DPC 2
50 #define IPI_REQUEST_FREEZE 3
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
,
81 /* ipi.c ********************************************************************/
84 KiIpiServiceRoutine(IN PKTRAP_FRAME TrapFrame
,
85 IN
struct _KEXCEPTION_FRAME
* ExceptionFrame
);
88 KiIpiSendRequest(ULONG TargetSet
,
92 KeIpiGenericCall(VOID (STDCALL
*WorkerRoutine
)(PVOID
),
95 /* next file ***************************************************************/
97 typedef struct _KPROFILE_SOURCE_OBJECT
{
98 KPROFILE_SOURCE Source
;
100 } KPROFILE_SOURCE_OBJECT
, *PKPROFILE_SOURCE_OBJECT
;
102 typedef struct _KPROFILE
{
105 LIST_ENTRY ListEntry
;
113 struct _KPROCESS
*Process
;
114 } KPROFILE
, *PKPROFILE
;
116 /* Cached modules from the loader block */
117 typedef enum _CACHED_MODULE_TYPE
{
123 MaximumCachedModuleType
,
124 } CACHED_MODULE_TYPE
, *PCACHED_MODULE_TYPE
;
125 extern PLOADER_MODULE CachedModules
[MaximumCachedModuleType
];
128 DbgBreakPointNoBugCheck(VOID
);
132 KeInitializeProfile(struct _KPROFILE
* Profile
,
133 struct _KPROCESS
* Process
,
137 KPROFILE_SOURCE ProfileSource
,
142 KeStartProfile(struct _KPROFILE
* Profile
,
147 KeStopProfile(struct _KPROFILE
* Profile
);
151 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
155 KeSetIntervalProfile(KPROFILE_SOURCE ProfileSource
,
161 PKTRAP_FRAME TrapFrame
166 KeProfileInterruptWithSource(
167 IN PKTRAP_FRAME TrapFrame
,
168 IN KPROFILE_SOURCE Source
172 VOID STDCALL
KeUpdateSystemTime(PKTRAP_FRAME TrapFrame
, KIRQL Irql
);
173 VOID STDCALL
KeUpdateRunTime(PKTRAP_FRAME TrapFrame
, KIRQL Irql
);
175 VOID STDCALL
KiExpireTimers(PKDPC Dpc
, PVOID DeferredContext
, PVOID SystemArgument1
, PVOID SystemArgument2
);
177 KIRQL
inline FASTCALL
KeAcquireDispatcherDatabaseLock(VOID
);
178 VOID
inline FASTCALL
KeAcquireDispatcherDatabaseLockAtDpcLevel(VOID
);
179 VOID
inline FASTCALL
KeReleaseDispatcherDatabaseLock(KIRQL Irql
);
180 VOID
inline FASTCALL
KeReleaseDispatcherDatabaseLockFromDpcLevel(VOID
);
184 KeInitializeThread(struct _KPROCESS
* Process
, PKTHREAD Thread
, BOOLEAN First
);
188 KeRundownThread(VOID
);
190 NTSTATUS
KeReleaseThread(PKTHREAD Thread
);
194 KeStackAttachProcess (
195 IN
struct _KPROCESS
* Process
,
196 OUT PKAPC_STATE ApcState
201 KeUnstackDetachProcess (
202 IN PKAPC_STATE ApcState
205 BOOLEAN
KiDispatcherObjectWake(DISPATCHER_HEADER
* hdr
, KPRIORITY increment
);
206 VOID STDCALL
KeExpireTimers(PKDPC Apc
,
210 VOID
inline FASTCALL
KeInitializeDispatcherHeader(DISPATCHER_HEADER
* Header
, ULONG Type
,
211 ULONG Size
, ULONG SignalState
);
212 VOID
KeDumpStackFrames(PULONG Frame
);
213 BOOLEAN
KiTestAlert(VOID
);
217 KiAbortWaitThread(PKTHREAD Thread
,
219 KPRIORITY Increment
);
223 KeForceResumeThread(IN PKTHREAD Thread
);
225 BOOLEAN STDCALL
KiInsertTimer(PKTIMER Timer
, LARGE_INTEGER DueTime
);
227 VOID
inline FASTCALL
KiSatisfyObjectWait(PDISPATCHER_HEADER Object
, PKTHREAD Thread
);
229 BOOLEAN
inline FASTCALL
KiIsObjectSignaled(PDISPATCHER_HEADER Object
, PKTHREAD Thread
);
231 VOID
inline FASTCALL
KiSatisifyMultipleObjectWaits(PKWAIT_BLOCK WaitBlock
);
233 VOID FASTCALL
KiWaitTest(PDISPATCHER_HEADER Object
, KPRIORITY Increment
);
235 PULONG
KeGetStackTopThread(struct _ETHREAD
* Thread
);
236 VOID
KeContextToTrapFrame(PCONTEXT Context
, PKTRAP_FRAME TrapFrame
);
237 VOID STDCALL
KiDeliverApc(KPROCESSOR_MODE PreviousMode
,
239 PKTRAP_FRAME TrapFrame
);
243 KiInsertQueue(IN PKQUEUE Queue
,
244 IN PLIST_ENTRY Entry
,
249 KeSetProcess(struct _KPROCESS
* Process
,
250 KPRIORITY Increment
);
253 VOID STDCALL
KeInitializeEventPair(PKEVENT_PAIR EventPair
);
255 VOID STDCALL
KiInitializeUserApc(IN PVOID Reserved
,
256 IN PKTRAP_FRAME TrapFrame
,
257 IN PKNORMAL_ROUTINE NormalRoutine
,
258 IN PVOID NormalContext
,
259 IN PVOID SystemArgument1
,
260 IN PVOID SystemArgument2
);
262 VOID STDCALL
KiAttachProcess(struct _KTHREAD
*Thread
, struct _KPROCESS
*Process
, KIRQL ApcLock
, struct _KAPC_STATE
*SavedApcState
);
264 VOID STDCALL
KiSwapProcess(struct _KPROCESS
*NewProcess
, struct _KPROCESS
*OldProcess
);
268 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
270 BOOLEAN STDCALL
KeRemoveQueueApc (PKAPC Apc
);
271 VOID FASTCALL
KiWakeQueue(IN PKQUEUE Queue
);
272 PLIST_ENTRY STDCALL
KeRundownQueue(IN PKQUEUE Queue
);
274 extern LARGE_INTEGER SystemBootTime
;
276 /* INITIALIZATION FUNCTIONS *************************************************/
278 VOID
KeInitExceptions(VOID
);
279 VOID
KeInitInterrupts(VOID
);
280 VOID
KeInitTimer(VOID
);
281 VOID
KeInitDpc(struct _KPRCB
* Prcb
);
282 VOID
KeInitDispatcher(VOID
);
283 VOID
inline FASTCALL
KeInitializeDispatcher(VOID
);
284 VOID
KiInitializeSystemClock(VOID
);
285 VOID
KiInitializeBugCheck(VOID
);
286 VOID
Phase1Initialization(PVOID Context
);
288 VOID
KeInit1(PCHAR CommandLine
, PULONG LastKernelAddress
);
291 BOOLEAN
KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
295 KiMoveApcState (PKAPC_STATE OldState
,
296 PKAPC_STATE NewState
);
299 KiAddProfileEvent(KPROFILE_SOURCE Source
, ULONG Pc
);
301 KiDispatchException(PEXCEPTION_RECORD ExceptionRecord
,
304 KPROCESSOR_MODE PreviousMode
,
305 BOOLEAN SearchFrames
);
306 VOID
KeTrapFrameToContext(PKTRAP_FRAME TrapFrame
,
309 KeApplicationProcessorInit(VOID
);
311 KePrepareForApplicationProcessorInit(ULONG id
);
313 KiUserTrapHandler(PKTRAP_FRAME Tf
, ULONG ExceptionNr
, PVOID Cr2
);
315 KePushAndStackSwitchAndSysRet(ULONG Push
, PVOID NewStack
);
317 KeStackSwitchAndRet(PVOID NewStack
);
319 KeBugCheckWithTf(ULONG BugCheckCode
,
320 ULONG BugCheckParameter1
,
321 ULONG BugCheckParameter2
,
322 ULONG BugCheckParameter3
,
323 ULONG BugCheckParameter4
,
325 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), KeBugCheckWithTf(a,b,c,d,e,f)
327 KiDumpTrapFrame(PKTRAP_FRAME Tf
, ULONG ExceptionNr
, ULONG cr2
);
331 KeFlushCurrentTb(VOID
);
334 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
336 #endif /* not __ASM__ */
338 #define MAXIMUM_PROCESSORS 32
340 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */