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
;
119 DbgBreakPointNoBugCheck(VOID
);
124 PKTRAP_FRAME TrapFrame
129 KeProfileInterruptWithSource(
130 IN PKTRAP_FRAME TrapFrame
,
131 IN KPROFILE_SOURCE Source
134 VOID
KiAddProfileEventToProcess(PLIST_ENTRY ListHead
, PVOID Eip
);
135 VOID
KiAddProfileEvent(KPROFILE_SOURCE Source
, ULONG Eip
);
136 VOID
KiInsertProfileIntoProcess(PLIST_ENTRY ListHead
, PKPROFILE Profile
);
137 VOID
KiInsertProfile(PKPROFILE Profile
);
138 VOID
KiRemoveProfile(PKPROFILE Profile
);
139 VOID STDCALL
KiDeleteProfile(PVOID ObjectBody
);
142 VOID STDCALL
KeUpdateSystemTime(PKTRAP_FRAME TrapFrame
, KIRQL Irql
);
143 VOID STDCALL
KeUpdateRunTime(PKTRAP_FRAME TrapFrame
, KIRQL Irql
);
145 KIRQL
KeAcquireDispatcherDatabaseLock(VOID
);
146 VOID
KeAcquireDispatcherDatabaseLockAtDpcLevel(VOID
);
147 VOID
KeReleaseDispatcherDatabaseLock(KIRQL Irql
);
148 VOID
KeReleaseDispatcherDatabaseLockFromDpcLevel(VOID
);
150 BOOLEAN
KiDispatcherObjectWake(DISPATCHER_HEADER
* hdr
);
151 VOID STDCALL
KeExpireTimers(PKDPC Apc
,
155 VOID
KeInitializeDispatcherHeader(DISPATCHER_HEADER
* Header
, ULONG Type
,
156 ULONG Size
, ULONG SignalState
);
157 VOID
KeDumpStackFrames(PULONG Frame
);
158 BOOLEAN
KiTestAlert(VOID
);
160 BOOLEAN
KiAbortWaitThread(struct _KTHREAD
* Thread
, NTSTATUS WaitStatus
);
162 PULONG
KeGetStackTopThread(struct _ETHREAD
* Thread
);
163 VOID
KeContextToTrapFrame(PCONTEXT Context
, PKTRAP_FRAME TrapFrame
);
164 VOID STDCALL
KiDeliverApc(KPROCESSOR_MODE PreviousMode
,
166 PKTRAP_FRAME TrapFrame
);
168 VOID
KiInitializeUserApc(IN PVOID Reserved
,
169 IN PKTRAP_FRAME TrapFrame
,
170 IN PKNORMAL_ROUTINE NormalRoutine
,
171 IN PVOID NormalContext
,
172 IN PVOID SystemArgument1
,
173 IN PVOID SystemArgument2
);
175 VOID STDCALL
KiAttachProcess(struct _KTHREAD
*Thread
, struct _KPROCESS
*Process
, KIRQL ApcLock
, struct _KAPC_STATE
*SavedApcState
);
177 VOID STDCALL
KiSwapProcess(struct _KPROCESS
*NewProcess
, struct _KPROCESS
*OldProcess
);
181 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
183 BOOLEAN STDCALL
KeRemoveQueueApc (PKAPC Apc
);
184 PLIST_ENTRY STDCALL
KeRundownQueue(IN PKQUEUE Queue
);
186 extern LARGE_INTEGER SystemBootTime
;
188 /* INITIALIZATION FUNCTIONS *************************************************/
190 VOID
KeInitExceptions(VOID
);
191 VOID
KeInitInterrupts(VOID
);
192 VOID
KeInitTimer(VOID
);
193 VOID
KeInitDpc(struct _KPCR
* Pcr
);
194 VOID
KeInitDispatcher(VOID
);
195 VOID
KeInitializeDispatcher(VOID
);
196 VOID
KeInitializeTimerImpl(VOID
);
197 VOID
KeInitializeBugCheck(VOID
);
198 VOID
Phase1Initialization(PVOID Context
);
200 VOID
KeInit1(PCHAR CommandLine
, PULONG LastKernelAddress
);
203 BOOLEAN
KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
207 KiMoveApcState (PKAPC_STATE OldState
,
208 PKAPC_STATE NewState
);
211 KiAddProfileEvent(KPROFILE_SOURCE Source
, ULONG Pc
);
213 KiDispatchException(PEXCEPTION_RECORD ExceptionRecord
,
216 KPROCESSOR_MODE PreviousMode
,
217 BOOLEAN SearchFrames
);
218 VOID
KeTrapFrameToContext(PKTRAP_FRAME TrapFrame
,
221 KeApplicationProcessorInit(VOID
);
223 KePrepareForApplicationProcessorInit(ULONG id
);
225 KiUserTrapHandler(PKTRAP_FRAME Tf
, ULONG ExceptionNr
, PVOID Cr2
);
227 KePushAndStackSwitchAndSysRet(ULONG Push
, PVOID NewStack
);
229 KeStackSwitchAndRet(PVOID NewStack
);
231 KeBugCheckWithTf(ULONG BugCheckCode
,
232 ULONG BugCheckParameter1
,
233 ULONG BugCheckParameter2
,
234 ULONG BugCheckParameter3
,
235 ULONG BugCheckParameter4
,
237 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), KeBugCheckWithTf(a,b,c,d,e,f)
239 KiDumpTrapFrame(PKTRAP_FRAME Tf
, ULONG ExceptionNr
, ULONG cr2
);
243 KeFlushCurrentTb(VOID
);
246 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
248 #endif /* not __ASM__ */
250 #define MAXIMUM_PROCESSORS 32
252 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */