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