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
;
44 struct _KEXCEPTION_FRAME
;
46 #define IPI_REQUEST_FUNCTIONCALL 0
47 #define IPI_REQUEST_APC 1
48 #define IPI_REQUEST_DPC 2
50 /* ipi.c ********************************************************************/
53 KiIpiServiceRoutine(IN PKTRAP_FRAME TrapFrame
,
54 IN
struct _KEXCEPTION_FRAME
* ExceptionFrame
);
57 KiIpiSendRequest(ULONG TargetSet
,
61 KeIpiGenericCall(VOID (STDCALL
*WorkerRoutine
)(PVOID
),
64 /* next file ***************************************************************/
66 typedef struct _KPROCESS_PROFILE
68 * List of the profile data structures associated with a process.
71 LIST_ENTRY ProfileListHead
;
74 } KPROCESS_PROFILE
, *PKPROCESS_PROFILE
;
76 typedef struct _KPROFILE
78 * Describes a contiguous region of process memory that is being profiled.
84 /* Entry in the list of profile data structures for this process. */
87 /* Base of the region being profiled. */
90 /* Size of the region being profiled. */
93 /* Shift of offsets from the region to buckets in the profiling buffer. */
96 /* MDL which described the buffer that receives profiling data. */
97 struct _MDL
*BufferMdl
;
99 /* System alias for the profiling buffer. */
102 /* Size of the buffer for profiling data. */
106 * Mask of processors for which profiling data should be collected.
111 /* TRUE if profiling has been started for this region. */
114 /* Pointer (and reference) to the process which is being profiled. */
115 struct _EPROCESS
*Process
;
116 } KPROFILE
, *PKPROFILE
;
118 /* Cached modules from the loader block */
119 typedef enum _CACHED_MODULE_TYPE
{
125 MaximumCachedModuleType
,
126 } CACHED_MODULE_TYPE
, *PCACHED_MODULE_TYPE
;
127 extern PLOADER_MODULE CachedModules
[MaximumCachedModuleType
];
130 DbgBreakPointNoBugCheck(VOID
);
135 PKTRAP_FRAME TrapFrame
140 KeProfileInterruptWithSource(
141 IN PKTRAP_FRAME TrapFrame
,
142 IN KPROFILE_SOURCE Source
145 VOID
KiAddProfileEventToProcess(PLIST_ENTRY ListHead
, PVOID Eip
);
146 VOID
KiAddProfileEvent(KPROFILE_SOURCE Source
, ULONG Eip
);
147 VOID
KiInsertProfileIntoProcess(PLIST_ENTRY ListHead
, PKPROFILE Profile
);
148 VOID
KiInsertProfile(PKPROFILE Profile
);
149 VOID
KiRemoveProfile(PKPROFILE Profile
);
150 VOID STDCALL
KiDeleteProfile(PVOID ObjectBody
);
153 VOID STDCALL
KeUpdateSystemTime(PKTRAP_FRAME TrapFrame
, KIRQL Irql
);
154 VOID STDCALL
KeUpdateRunTime(PKTRAP_FRAME TrapFrame
, KIRQL Irql
);
156 VOID STDCALL
KiExpireTimers(PKDPC Dpc
, PVOID DeferredContext
, PVOID SystemArgument1
, PVOID SystemArgument2
);
158 KIRQL
inline FASTCALL
KeAcquireDispatcherDatabaseLock(VOID
);
159 VOID
inline FASTCALL
KeAcquireDispatcherDatabaseLockAtDpcLevel(VOID
);
160 VOID
inline FASTCALL
KeReleaseDispatcherDatabaseLock(KIRQL Irql
);
161 VOID
inline FASTCALL
KeReleaseDispatcherDatabaseLockFromDpcLevel(VOID
);
163 BOOLEAN
KiDispatcherObjectWake(DISPATCHER_HEADER
* hdr
, KPRIORITY increment
);
164 VOID STDCALL
KeExpireTimers(PKDPC Apc
,
168 VOID
inline FASTCALL
KeInitializeDispatcherHeader(DISPATCHER_HEADER
* Header
, ULONG Type
,
169 ULONG Size
, ULONG SignalState
);
170 VOID
KeDumpStackFrames(PULONG Frame
);
171 BOOLEAN
KiTestAlert(VOID
);
173 VOID FASTCALL
KiAbortWaitThread(struct _KTHREAD
* Thread
, NTSTATUS WaitStatus
);
175 BOOLEAN STDCALL
KiInsertTimer(PKTIMER Timer
, LARGE_INTEGER DueTime
);
177 VOID
inline FASTCALL
KiSatisfyObjectWait(PDISPATCHER_HEADER Object
, PKTHREAD Thread
);
179 BOOLEAN
inline FASTCALL
KiIsObjectSignaled(PDISPATCHER_HEADER Object
, PKTHREAD Thread
);
181 VOID
inline FASTCALL
KiSatisifyMultipleObjectWaits(PKWAIT_BLOCK WaitBlock
);
183 VOID FASTCALL
KiWaitTest(PDISPATCHER_HEADER Object
, KPRIORITY Increment
);
185 PULONG
KeGetStackTopThread(struct _ETHREAD
* Thread
);
186 VOID
KeContextToTrapFrame(PCONTEXT Context
, PKTRAP_FRAME TrapFrame
);
187 VOID STDCALL
KiDeliverApc(KPROCESSOR_MODE PreviousMode
,
189 PKTRAP_FRAME TrapFrame
);
191 VOID STDCALL
KeInitializeEventPair(PKEVENT_PAIR EventPair
);
193 VOID STDCALL
KiInitializeUserApc(IN PVOID Reserved
,
194 IN PKTRAP_FRAME TrapFrame
,
195 IN PKNORMAL_ROUTINE NormalRoutine
,
196 IN PVOID NormalContext
,
197 IN PVOID SystemArgument1
,
198 IN PVOID SystemArgument2
);
200 VOID STDCALL
KiAttachProcess(struct _KTHREAD
*Thread
, struct _KPROCESS
*Process
, KIRQL ApcLock
, struct _KAPC_STATE
*SavedApcState
);
202 VOID STDCALL
KiSwapProcess(struct _KPROCESS
*NewProcess
, struct _KPROCESS
*OldProcess
);
206 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
208 BOOLEAN STDCALL
KeRemoveQueueApc (PKAPC Apc
);
209 VOID FASTCALL
KiWakeQueue(IN PKQUEUE Queue
);
210 PLIST_ENTRY STDCALL
KeRundownQueue(IN PKQUEUE Queue
);
212 extern LARGE_INTEGER SystemBootTime
;
214 /* INITIALIZATION FUNCTIONS *************************************************/
216 VOID
KeInitExceptions(VOID
);
217 VOID
KeInitInterrupts(VOID
);
218 VOID
KeInitTimer(VOID
);
219 VOID
KeInitDpc(struct _KPCR
* Pcr
);
220 VOID
KeInitDispatcher(VOID
);
221 VOID
inline FASTCALL
KeInitializeDispatcher(VOID
);
222 VOID
KiInitializeSystemClock(VOID
);
223 VOID
KeInitializeBugCheck(VOID
);
224 VOID
Phase1Initialization(PVOID Context
);
226 VOID
KeInit1(PCHAR CommandLine
, PULONG LastKernelAddress
);
229 BOOLEAN
KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
233 KiMoveApcState (PKAPC_STATE OldState
,
234 PKAPC_STATE NewState
);
237 KiAddProfileEvent(KPROFILE_SOURCE Source
, ULONG Pc
);
239 KiDispatchException(PEXCEPTION_RECORD ExceptionRecord
,
242 KPROCESSOR_MODE PreviousMode
,
243 BOOLEAN SearchFrames
);
244 VOID
KeTrapFrameToContext(PKTRAP_FRAME TrapFrame
,
247 KeApplicationProcessorInit(VOID
);
249 KePrepareForApplicationProcessorInit(ULONG id
);
251 KiUserTrapHandler(PKTRAP_FRAME Tf
, ULONG ExceptionNr
, PVOID Cr2
);
253 KePushAndStackSwitchAndSysRet(ULONG Push
, PVOID NewStack
);
255 KeStackSwitchAndRet(PVOID NewStack
);
257 KeBugCheckWithTf(ULONG BugCheckCode
,
258 ULONG BugCheckParameter1
,
259 ULONG BugCheckParameter2
,
260 ULONG BugCheckParameter3
,
261 ULONG BugCheckParameter4
,
263 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), KeBugCheckWithTf(a,b,c,d,e,f)
265 KiDumpTrapFrame(PKTRAP_FRAME Tf
, ULONG ExceptionNr
, ULONG cr2
);
269 KeFlushCurrentTb(VOID
);
272 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
274 #endif /* not __ASM__ */
276 #define MAXIMUM_PROCESSORS 32
278 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */