77d5b51dc8faab5a48e111aa27390312fe1e0c5e
[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 VOID
226 STDCALL
227 KeStackAttachProcess (
228 IN struct _KPROCESS* Process,
229 OUT PKAPC_STATE ApcState
230 );
231
232 VOID
233 STDCALL
234 KeUnstackDetachProcess (
235 IN PKAPC_STATE ApcState
236 );
237
238 BOOLEAN KiDispatcherObjectWake(DISPATCHER_HEADER* hdr, KPRIORITY increment);
239 VOID STDCALL KeExpireTimers(PKDPC Apc,
240 PVOID Arg1,
241 PVOID Arg2,
242 PVOID Arg3);
243 VOID inline FASTCALL KeInitializeDispatcherHeader(DISPATCHER_HEADER* Header, ULONG Type,
244 ULONG Size, ULONG SignalState);
245 VOID KeDumpStackFrames(PULONG Frame);
246 BOOLEAN KiTestAlert(VOID);
247
248 VOID
249 FASTCALL
250 KiAbortWaitThread(PKTHREAD Thread,
251 NTSTATUS WaitStatus,
252 KPRIORITY Increment);
253
254 VOID
255 STDCALL
256 KeInitializeProcess(struct _KPROCESS *Process,
257 KPRIORITY Priority,
258 KAFFINITY Affinity,
259 LARGE_INTEGER DirectoryTableBase);
260
261 ULONG
262 STDCALL
263 KeForceResumeThread(IN PKTHREAD Thread);
264
265 BOOLEAN
266 STDCALL
267 KeDisableThreadApcQueueing(IN PKTHREAD Thread);
268
269 BOOLEAN STDCALL KiInsertTimer(PKTIMER Timer, LARGE_INTEGER DueTime);
270
271 VOID inline FASTCALL KiSatisfyObjectWait(PDISPATCHER_HEADER Object, PKTHREAD Thread);
272
273 BOOLEAN inline FASTCALL KiIsObjectSignaled(PDISPATCHER_HEADER Object, PKTHREAD Thread);
274
275 VOID inline FASTCALL KiSatisifyMultipleObjectWaits(PKWAIT_BLOCK WaitBlock);
276
277 VOID FASTCALL KiWaitTest(PDISPATCHER_HEADER Object, KPRIORITY Increment);
278
279 PULONG KeGetStackTopThread(struct _ETHREAD* Thread);
280 BOOLEAN STDCALL KeContextToTrapFrame(PCONTEXT Context, PKTRAP_FRAME TrapFrame);
281 VOID STDCALL KiDeliverApc(KPROCESSOR_MODE PreviousMode,
282 PVOID Reserved,
283 PKTRAP_FRAME TrapFrame);
284 VOID
285 STDCALL
286 KiKernelApcDeliveryCheck(VOID);
287 LONG
288 STDCALL
289 KiInsertQueue(IN PKQUEUE Queue,
290 IN PLIST_ENTRY Entry,
291 BOOLEAN Head);
292
293 ULONG
294 STDCALL
295 KeSetProcess(struct _KPROCESS* Process,
296 KPRIORITY Increment);
297
298
299 VOID STDCALL KeInitializeEventPair(PKEVENT_PAIR EventPair);
300
301 VOID STDCALL KiInitializeUserApc(IN PVOID Reserved,
302 IN PKTRAP_FRAME TrapFrame,
303 IN PKNORMAL_ROUTINE NormalRoutine,
304 IN PVOID NormalContext,
305 IN PVOID SystemArgument1,
306 IN PVOID SystemArgument2);
307
308 PLIST_ENTRY
309 STDCALL
310 KeFlushQueueApc(IN PKTHREAD Thread,
311 IN KPROCESSOR_MODE PreviousMode);
312
313
314 VOID STDCALL KiAttachProcess(struct _KTHREAD *Thread, struct _KPROCESS *Process, KIRQL ApcLock, struct _KAPC_STATE *SavedApcState);
315
316 VOID STDCALL KiSwapProcess(struct _KPROCESS *NewProcess, struct _KPROCESS *OldProcess);
317
318 BOOLEAN
319 STDCALL
320 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode);
321
322 BOOLEAN STDCALL KeRemoveQueueApc (PKAPC Apc);
323 VOID FASTCALL KiWakeQueue(IN PKQUEUE Queue);
324 PLIST_ENTRY STDCALL KeRundownQueue(IN PKQUEUE Queue);
325
326 extern LARGE_INTEGER SystemBootTime;
327
328 /* INITIALIZATION FUNCTIONS *************************************************/
329
330 extern ULONG_PTR KERNEL_BASE;
331
332 VOID KeInitExceptions(VOID);
333 VOID KeInitInterrupts(VOID);
334 VOID KeInitTimer(VOID);
335 VOID KeInitDpc(struct _KPRCB* Prcb);
336 VOID KeInitDispatcher(VOID);
337 VOID inline FASTCALL KeInitializeDispatcher(VOID);
338 VOID KiInitializeSystemClock(VOID);
339 VOID KiInitializeBugCheck(VOID);
340 VOID Phase1Initialization(PVOID Context);
341
342 VOID KeInit1(PCHAR CommandLine, PULONG LastKernelAddress);
343 VOID KeInit2(VOID);
344
345 BOOLEAN KiDeliverUserApc(PKTRAP_FRAME TrapFrame);
346
347 VOID
348 STDCALL
349 KiMoveApcState (PKAPC_STATE OldState,
350 PKAPC_STATE NewState);
351
352 VOID
353 KiAddProfileEvent(KPROFILE_SOURCE Source, ULONG Pc);
354 VOID
355 KiDispatchException(PEXCEPTION_RECORD ExceptionRecord,
356 PCONTEXT Context,
357 PKTRAP_FRAME Tf,
358 KPROCESSOR_MODE PreviousMode,
359 BOOLEAN SearchFrames);
360 VOID KeTrapFrameToContext(PKTRAP_FRAME TrapFrame,
361 PCONTEXT Context);
362 VOID
363 KeApplicationProcessorInit(VOID);
364 VOID
365 KePrepareForApplicationProcessorInit(ULONG id);
366 ULONG
367 KiUserTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr, PVOID Cr2);
368 VOID STDCALL
369 KePushAndStackSwitchAndSysRet(ULONG Push, PVOID NewStack);
370 VOID STDCALL
371 KeStackSwitchAndRet(PVOID NewStack);
372 VOID STDCALL
373 KeBugCheckWithTf(ULONG BugCheckCode,
374 ULONG BugCheckParameter1,
375 ULONG BugCheckParameter2,
376 ULONG BugCheckParameter3,
377 ULONG BugCheckParameter4,
378 PKTRAP_FRAME Tf);
379 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), KeBugCheckWithTf(a,b,c,d,e,f)
380 VOID
381 KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG ExceptionNr, ULONG cr2);
382
383 VOID
384 STDCALL
385 KeFlushCurrentTb(VOID);
386
387 /* REACTOS SPECIFIC */
388
389 VOID STDCALL
390 KeRosDumpStackFrames(
391 PULONG Frame,
392 ULONG FrameCount);
393
394 ULONG STDCALL
395 KeRosGetStackFrames(
396 PULONG Frames,
397 ULONG FrameCount);
398
399 VOID
400 KiSetSystemTime(PLARGE_INTEGER NewSystemTime);
401
402 #define MAXIMUM_PROCESSORS 32
403
404 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */