Major refactoring of the exception handling code + misc fixes:
[reactos.git] / reactos / ntoskrnl / include / internal / ke.h
1 #ifndef __NTOSKRNL_INCLUDE_INTERNAL_KE_H
2 #define __NTOSKRNL_INCLUDE_INTERNAL_KE_H
3
4 /* INCLUDES *****************************************************************/
5
6 #include "arch/ke.h"
7
8 /* INTERNAL KERNEL TYPES ****************************************************/
9
10 typedef struct _WOW64_PROCESS
11 {
12 PVOID Wow64;
13 } WOW64_PROCESS, *PWOW64_PROCESS;
14
15 /* INTERNAL KERNEL FUNCTIONS ************************************************/
16
17 struct _KIRQ_TRAPFRAME;
18 struct _KPCR;
19 struct _KPRCB;
20 struct _KEXCEPTION_FRAME;
21
22 extern PVOID KeUserApcDispatcher;
23 extern PVOID KeUserCallbackDispatcher;
24 extern PVOID KeUserExceptionDispatcher;
25 extern PVOID KeRaiseUserExceptionDispatcher;
26
27 #define IPI_REQUEST_FUNCTIONCALL 0
28 #define IPI_REQUEST_APC 1
29 #define IPI_REQUEST_DPC 2
30 #define IPI_REQUEST_FREEZE 3
31
32 /* MACROS *************************************************************************/
33
34 #define KeEnterCriticalRegion() \
35 { \
36 PKTHREAD _Thread = KeGetCurrentThread(); \
37 if (_Thread) _Thread->KernelApcDisable--; \
38 }
39
40 #define KeLeaveCriticalRegion() \
41 { \
42 PKTHREAD _Thread = KeGetCurrentThread(); \
43 if((_Thread) && (++_Thread->KernelApcDisable == 0)) \
44 { \
45 if (!IsListEmpty(&_Thread->ApcState.ApcListHead[KernelMode])) \
46 { \
47 KiKernelApcDeliveryCheck(); \
48 } \
49 } \
50 }
51
52 /* threadsch.c ********************************************************************/
53
54 /* Thread Scheduler Functions */
55
56 /* Readies a Thread for Execution. */
57 VOID
58 STDCALL
59 KiDispatchThreadNoLock(ULONG NewThreadStatus);
60
61 /* Readies a Thread for Execution. */
62 VOID
63 STDCALL
64 KiDispatchThread(ULONG NewThreadStatus);
65
66 /* Puts a Thread into a block state. */
67 VOID
68 STDCALL
69 KiBlockThread(PNTSTATUS Status,
70 UCHAR Alertable,
71 ULONG WaitMode,
72 UCHAR WaitReason);
73
74 /* Removes a thread out of a block state. */
75 VOID
76 STDCALL
77 KiUnblockThread(PKTHREAD Thread,
78 PNTSTATUS WaitStatus,
79 KPRIORITY Increment);
80
81 NTSTATUS
82 STDCALL
83 KeSuspendThread(PKTHREAD Thread);
84
85 NTSTATUS
86 FASTCALL
87 KiSwapContext(PKTHREAD NewThread);
88
89 VOID
90 STDCALL
91 KiAdjustQuantumThread(IN PKTHREAD Thread);
92
93 /* gmutex.c ********************************************************************/
94
95 VOID
96 FASTCALL
97 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex);
98
99 /* gate.c **********************************************************************/
100
101 VOID
102 FASTCALL
103 KeInitializeGate(PKGATE Gate);
104
105 VOID
106 FASTCALL
107 KeSignalGateBoostPriority(PKGATE Gate);
108
109 VOID
110 FASTCALL
111 KeWaitForGate(PKGATE Gate,
112 KWAIT_REASON WaitReason,
113 KPROCESSOR_MODE WaitMode);
114
115 /* ipi.c ********************************************************************/
116
117 BOOLEAN STDCALL
118 KiIpiServiceRoutine(IN PKTRAP_FRAME TrapFrame,
119 IN struct _KEXCEPTION_FRAME* ExceptionFrame);
120
121 VOID
122 KiIpiSendRequest(KAFFINITY TargetSet,
123 ULONG IpiRequest);
124
125 VOID
126 KeIpiGenericCall(VOID (STDCALL *WorkerRoutine)(PVOID),
127 PVOID Argument);
128
129 /* next file ***************************************************************/
130
131 typedef struct _KPROFILE_SOURCE_OBJECT
132 {
133 KPROFILE_SOURCE Source;
134 LIST_ENTRY ListEntry;
135 } KPROFILE_SOURCE_OBJECT, *PKPROFILE_SOURCE_OBJECT;
136
137 /* Cached modules from the loader block */
138 typedef enum _CACHED_MODULE_TYPE
139 {
140 AnsiCodepage,
141 OemCodepage,
142 UnicodeCasemap,
143 SystemRegistry,
144 HardwareRegistry,
145 MaximumCachedModuleType,
146 } CACHED_MODULE_TYPE, *PCACHED_MODULE_TYPE;
147 extern PLOADER_MODULE CachedModules[MaximumCachedModuleType];
148
149 VOID
150 STDCALL
151 DbgBreakPointNoBugCheck(VOID);
152
153 VOID
154 STDCALL
155 KeInitializeProfile(struct _KPROFILE* Profile,
156 struct _KPROCESS* Process,
157 PVOID ImageBase,
158 ULONG ImageSize,
159 ULONG BucketSize,
160 KPROFILE_SOURCE ProfileSource,
161 KAFFINITY Affinity);
162
163 VOID
164 STDCALL
165 KeStartProfile(struct _KPROFILE* Profile,
166 PVOID Buffer);
167
168 VOID
169 STDCALL
170 KeStopProfile(struct _KPROFILE* Profile);
171
172 ULONG
173 STDCALL
174 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource);
175
176 VOID
177 STDCALL
178 KeSetIntervalProfile(KPROFILE_SOURCE ProfileSource,
179 ULONG Interval);
180
181 VOID
182 STDCALL
183 KeProfileInterrupt(
184 PKTRAP_FRAME TrapFrame
185 );
186
187 VOID
188 STDCALL
189 KeProfileInterruptWithSource(
190 IN PKTRAP_FRAME TrapFrame,
191 IN KPROFILE_SOURCE Source
192 );
193
194 BOOLEAN
195 STDCALL
196 KiRosPrintAddress(PVOID Address);
197
198 VOID STDCALL KeUpdateSystemTime(PKTRAP_FRAME TrapFrame, KIRQL Irql);
199 VOID STDCALL KeUpdateRunTime(PKTRAP_FRAME TrapFrame, KIRQL Irql);
200
201 VOID STDCALL KiExpireTimers(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2);
202
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);
207
208 VOID
209 STDCALL
210 KeInitializeThread(struct _KPROCESS* Process,
211 PKTHREAD Thread,
212 PKSYSTEM_ROUTINE SystemRoutine,
213 PKSTART_ROUTINE StartRoutine,
214 PVOID StartContext,
215 PCONTEXT Context,
216 PVOID Teb,
217 PVOID KernelStack);
218
219 VOID
220 STDCALL
221 KeRundownThread(VOID);
222
223 NTSTATUS KeReleaseThread(PKTHREAD Thread);
224
225 LONG
226 STDCALL
227 KeQueryBasePriorityThread(IN PKTHREAD Thread);
228
229 VOID
230 STDCALL
231 KiSetPriorityThread(PKTHREAD Thread,
232 KPRIORITY Priority,
233 PBOOLEAN Released);
234
235 VOID
236 STDCALL
237 KeStackAttachProcess (
238 IN struct _KPROCESS* Process,
239 OUT PKAPC_STATE ApcState
240 );
241
242 VOID
243 STDCALL
244 KeUnstackDetachProcess (
245 IN PKAPC_STATE ApcState
246 );
247
248 BOOLEAN KiDispatcherObjectWake(DISPATCHER_HEADER* hdr, KPRIORITY increment);
249 VOID STDCALL KeExpireTimers(PKDPC Apc,
250 PVOID Arg1,
251 PVOID Arg2,
252 PVOID Arg3);
253 VOID inline FASTCALL KeInitializeDispatcherHeader(DISPATCHER_HEADER* Header, ULONG Type,
254 ULONG Size, ULONG SignalState);
255 VOID KeDumpStackFrames(PULONG Frame);
256 BOOLEAN KiTestAlert(VOID);
257
258 VOID
259 FASTCALL
260 KiAbortWaitThread(PKTHREAD Thread,
261 NTSTATUS WaitStatus,
262 KPRIORITY Increment);
263
264 VOID
265 STDCALL
266 KeInitializeProcess(struct _KPROCESS *Process,
267 KPRIORITY Priority,
268 KAFFINITY Affinity,
269 LARGE_INTEGER DirectoryTableBase);
270
271 ULONG
272 STDCALL
273 KeForceResumeThread(IN PKTHREAD Thread);
274
275 BOOLEAN
276 STDCALL
277 KeDisableThreadApcQueueing(IN PKTHREAD Thread);
278
279 BOOLEAN STDCALL KiInsertTimer(PKTIMER Timer, LARGE_INTEGER DueTime);
280
281 VOID inline FASTCALL KiSatisfyObjectWait(PDISPATCHER_HEADER Object, PKTHREAD Thread);
282
283 BOOLEAN inline FASTCALL KiIsObjectSignaled(PDISPATCHER_HEADER Object, PKTHREAD Thread);
284
285 VOID inline FASTCALL KiSatisifyMultipleObjectWaits(PKWAIT_BLOCK WaitBlock);
286
287 VOID FASTCALL KiWaitTest(PDISPATCHER_HEADER Object, KPRIORITY Increment);
288
289 PULONG KeGetStackTopThread(struct _ETHREAD* Thread);
290 BOOLEAN STDCALL KeContextToTrapFrame(PCONTEXT Context, PKEXCEPTION_FRAME ExeptionFrame, PKTRAP_FRAME TrapFrame);
291 VOID STDCALL KiDeliverApc(KPROCESSOR_MODE PreviousMode,
292 PVOID Reserved,
293 PKTRAP_FRAME TrapFrame);
294 VOID
295 STDCALL
296 KiKernelApcDeliveryCheck(VOID);
297 LONG
298 STDCALL
299 KiInsertQueue(IN PKQUEUE Queue,
300 IN PLIST_ENTRY Entry,
301 BOOLEAN Head);
302
303 ULONG
304 STDCALL
305 KeSetProcess(struct _KPROCESS* Process,
306 KPRIORITY Increment);
307
308
309 VOID STDCALL KeInitializeEventPair(PKEVENT_PAIR EventPair);
310
311 VOID STDCALL KiInitializeUserApc(IN PKEXCEPTION_FRAME Reserved,
312 IN PKTRAP_FRAME TrapFrame,
313 IN PKNORMAL_ROUTINE NormalRoutine,
314 IN PVOID NormalContext,
315 IN PVOID SystemArgument1,
316 IN PVOID SystemArgument2);
317
318 PLIST_ENTRY
319 STDCALL
320 KeFlushQueueApc(IN PKTHREAD Thread,
321 IN KPROCESSOR_MODE PreviousMode);
322
323
324 VOID STDCALL KiAttachProcess(struct _KTHREAD *Thread, struct _KPROCESS *Process, KIRQL ApcLock, struct _KAPC_STATE *SavedApcState);
325
326 VOID STDCALL KiSwapProcess(struct _KPROCESS *NewProcess, struct _KPROCESS *OldProcess);
327
328 BOOLEAN
329 STDCALL
330 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode);
331
332 BOOLEAN STDCALL KeRemoveQueueApc (PKAPC Apc);
333 VOID FASTCALL KiWakeQueue(IN PKQUEUE Queue);
334 PLIST_ENTRY STDCALL KeRundownQueue(IN PKQUEUE Queue);
335
336 extern LARGE_INTEGER SystemBootTime;
337
338 /* INITIALIZATION FUNCTIONS *************************************************/
339
340 extern ULONG_PTR KERNEL_BASE;
341
342 VOID KeInitExceptions(VOID);
343 VOID KeInitInterrupts(VOID);
344 VOID KeInitTimer(VOID);
345 VOID KeInitDpc(struct _KPRCB* Prcb);
346 VOID KeInitDispatcher(VOID);
347 VOID inline FASTCALL KeInitializeDispatcher(VOID);
348 VOID KiInitializeSystemClock(VOID);
349 VOID KiInitializeBugCheck(VOID);
350 VOID Phase1Initialization(PVOID Context);
351
352 VOID KeInit1(PCHAR CommandLine, PULONG LastKernelAddress);
353 VOID KeInit2(VOID);
354
355 BOOLEAN KiDeliverUserApc(PKTRAP_FRAME TrapFrame);
356
357 VOID
358 STDCALL
359 KiMoveApcState (PKAPC_STATE OldState,
360 PKAPC_STATE NewState);
361
362 VOID
363 KiAddProfileEvent(KPROFILE_SOURCE Source, ULONG Pc);
364 VOID
365 NTAPI
366 KiDispatchException(PEXCEPTION_RECORD ExceptionRecord,
367 PKEXCEPTION_FRAME ExceptionFrame,
368 PKTRAP_FRAME Tf,
369 KPROCESSOR_MODE PreviousMode,
370 BOOLEAN SearchFrames);
371 VOID KeTrapFrameToContext(PKTRAP_FRAME TrapFrame,
372 PCONTEXT Context);
373 VOID
374 KeApplicationProcessorInit(VOID);
375 VOID
376 KePrepareForApplicationProcessorInit(ULONG id);
377 ULONG
378 KiUserTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr, PVOID Cr2);
379 VOID STDCALL
380 KePushAndStackSwitchAndSysRet(ULONG Push, PVOID NewStack);
381 VOID STDCALL
382 KeStackSwitchAndRet(PVOID NewStack);
383 VOID STDCALL
384 KeBugCheckWithTf(ULONG BugCheckCode,
385 ULONG BugCheckParameter1,
386 ULONG BugCheckParameter2,
387 ULONG BugCheckParameter3,
388 ULONG BugCheckParameter4,
389 PKTRAP_FRAME Tf);
390 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), KeBugCheckWithTf(a,b,c,d,e,f)
391 VOID
392 KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG ExceptionNr, ULONG cr2);
393
394 VOID
395 STDCALL
396 KeFlushCurrentTb(VOID);
397
398 /* REACTOS SPECIFIC */
399
400 VOID STDCALL
401 KeRosDumpStackFrames(
402 PULONG Frame,
403 ULONG FrameCount);
404
405 ULONG STDCALL
406 KeRosGetStackFrames(
407 PULONG Frames,
408 ULONG FrameCount);
409
410 VOID
411 KiSetSystemTime(PLARGE_INTEGER NewSystemTime);
412
413 #define MAXIMUM_PROCESSORS 32
414
415 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */