- Added another MSVC intrinsic to gcc (BitScanReverse). Thanks to Vampyre.
[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 typedef struct _KPROFILE_SOURCE_OBJECT
16 {
17 KPROFILE_SOURCE Source;
18 LIST_ENTRY ListEntry;
19 } KPROFILE_SOURCE_OBJECT, *PKPROFILE_SOURCE_OBJECT;
20
21 /* Cached modules from the loader block */
22 typedef enum _CACHED_MODULE_TYPE
23 {
24 AnsiCodepage,
25 OemCodepage,
26 UnicodeCasemap,
27 SystemRegistry,
28 HardwareRegistry,
29 MaximumCachedModuleType,
30 } CACHED_MODULE_TYPE, *PCACHED_MODULE_TYPE;
31 extern PLOADER_MODULE CachedModules[MaximumCachedModuleType];
32
33 struct _KIRQ_TRAPFRAME;
34 struct _KPCR;
35 struct _KPRCB;
36 struct _KEXCEPTION_FRAME;
37
38 extern PVOID KeUserApcDispatcher;
39 extern PVOID KeUserCallbackDispatcher;
40 extern PVOID KeUserExceptionDispatcher;
41 extern PVOID KeRaiseUserExceptionDispatcher;
42 extern LARGE_INTEGER SystemBootTime;
43 extern ULONG_PTR KERNEL_BASE;
44 extern ULONG KeI386NpxPresent;
45 extern ULONG KeI386XMMIPresent;
46 extern ULONG KeI386FxsrPresent;
47 extern PKNODE KeNodeBlock[1];
48 extern UCHAR KeNumberNodes;
49 extern UCHAR KeProcessNodeSeed;
50
51 /* MACROS *************************************************************************/
52
53 /*
54 * On UP machines, we don't actually have a spinlock, we merely raise
55 * IRQL to DPC level.
56 */
57 #ifdef CONFIG_SMP
58 #define KeInitializeDispatcher() KeInitializeSpinLock(&DispatcherDatabaseLock);
59 #define KeAcquireDispatcherDatabaseLock() KfAcquireSpinLock(&DispatcherDatabaseLock);
60 #define KeAcquireDispatcherDatabaseLockAtDpcLevel() \
61 KeAcquireSpinLockAtDpcLevel (&DispatcherDatabaseLock);
62 #define KeReleaseDispatcherDatabaseLockFromDpcLevel() \
63 KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock);
64 #define KeReleaseDispatcherDatabaseLock(OldIrql) \
65 KiExitDispatcher(OldIrql);
66 #else
67 #define KeInitializeDispatcher()
68 #define KeAcquireDispatcherDatabaseLock() KeRaiseIrqlToDpcLevel();
69 #define KeReleaseDispatcherDatabaseLock(OldIrql) KiExitDispatcher(OldIrql);
70 #define KeAcquireDispatcherDatabaseLockAtDpcLevel()
71 #define KeReleaseDispatcherDatabaseLockFromDpcLevel()
72 #endif
73
74 #define AFFINITY_MASK(Id) KiMask32Array[Id]
75
76 /* The following macro initializes a dispatcher object's header */
77 #define KeInitializeDispatcherHeader(Header, t, s, State) \
78 { \
79 (Header)->Type = t; \
80 (Header)->Absolute = 0; \
81 (Header)->Inserted = 0; \
82 (Header)->Size = s; \
83 (Header)->SignalState = State; \
84 InitializeListHead(&((Header)->WaitListHead)); \
85 }
86
87 extern KSPIN_LOCK DispatcherDatabaseLock;
88
89 #define KeEnterCriticalRegion() \
90 { \
91 PKTHREAD _Thread = KeGetCurrentThread(); \
92 if (_Thread) _Thread->KernelApcDisable--; \
93 }
94
95 #define KeLeaveCriticalRegion() \
96 { \
97 PKTHREAD _Thread = KeGetCurrentThread(); \
98 if((_Thread) && (++_Thread->KernelApcDisable == 0)) \
99 { \
100 if (!IsListEmpty(&_Thread->ApcState.ApcListHead[KernelMode]) && \
101 (_Thread->SpecialApcDisable == 0)) \
102 { \
103 KiCheckForKernelApcDelivery(); \
104 } \
105 } \
106 }
107
108 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
109 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
110 KeBugCheckWithTf(a,b,c,d,e,f)
111
112 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
113 #define TIMER_OR_EVENT_TYPE 0x7L
114
115 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
116 #define TIMER_WAIT_BLOCK 0x3L
117
118 /* INTERNAL KERNEL FUNCTIONS ************************************************/
119
120 /* threadsch.c ********************************************************************/
121
122 /* Thread Scheduler Functions */
123
124 /* Readies a Thread for Execution. */
125 VOID
126 STDCALL
127 KiDispatchThreadNoLock(ULONG NewThreadStatus);
128
129 /* Readies a Thread for Execution. */
130 VOID
131 STDCALL
132 KiDispatchThread(ULONG NewThreadStatus);
133
134 /* Finds a new thread to run */
135 NTSTATUS
136 NTAPI
137 KiSwapThread(
138 VOID
139 );
140
141 VOID
142 NTAPI
143 KiReadyThread(IN PKTHREAD Thread);
144
145 NTSTATUS
146 STDCALL
147 KeSuspendThread(PKTHREAD Thread);
148
149 NTSTATUS
150 FASTCALL
151 KiSwapContext(PKTHREAD NewThread);
152
153 VOID
154 STDCALL
155 KiAdjustQuantumThread(IN PKTHREAD Thread);
156
157 VOID
158 FASTCALL
159 KiExitDispatcher(KIRQL OldIrql);
160
161 /* gmutex.c ********************************************************************/
162
163 VOID
164 FASTCALL
165 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex);
166
167 /* gate.c **********************************************************************/
168
169 VOID
170 FASTCALL
171 KeInitializeGate(PKGATE Gate);
172
173 VOID
174 FASTCALL
175 KeSignalGateBoostPriority(PKGATE Gate);
176
177 VOID
178 FASTCALL
179 KeWaitForGate(
180 PKGATE Gate,
181 KWAIT_REASON WaitReason,
182 KPROCESSOR_MODE WaitMode
183 );
184
185 /* ipi.c ********************************************************************/
186
187 VOID
188 NTAPI
189 KiIpiSendRequest(
190 KAFFINITY TargetSet,
191 ULONG IpiRequest
192 );
193
194 /* next file ***************************************************************/
195
196 UCHAR
197 NTAPI
198 KeFindNextRightSetAffinity(
199 IN UCHAR Number,
200 IN ULONG Set
201 );
202
203 VOID
204 STDCALL
205 DbgBreakPointNoBugCheck(VOID);
206
207 VOID
208 STDCALL
209 KeInitializeProfile(
210 struct _KPROFILE* Profile,
211 struct _KPROCESS* Process,
212 PVOID ImageBase,
213 ULONG ImageSize,
214 ULONG BucketSize,
215 KPROFILE_SOURCE ProfileSource,
216 KAFFINITY Affinity
217 );
218
219 VOID
220 STDCALL
221 KeStartProfile(
222 struct _KPROFILE* Profile,
223 PVOID Buffer
224 );
225
226 BOOLEAN
227 STDCALL
228 KeStopProfile(struct _KPROFILE* Profile);
229
230 ULONG
231 STDCALL
232 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource);
233
234 VOID
235 STDCALL
236 KeSetIntervalProfile(
237 KPROFILE_SOURCE ProfileSource,
238 ULONG Interval
239 );
240
241 VOID
242 STDCALL
243 KeProfileInterrupt(
244 PKTRAP_FRAME TrapFrame
245 );
246
247 VOID
248 STDCALL
249 KeProfileInterruptWithSource(
250 IN PKTRAP_FRAME TrapFrame,
251 IN KPROFILE_SOURCE Source
252 );
253
254 BOOLEAN
255 STDCALL
256 KiRosPrintAddress(PVOID Address);
257
258 VOID
259 STDCALL
260 KeUpdateSystemTime(
261 PKTRAP_FRAME TrapFrame,
262 KIRQL Irql
263 );
264
265 VOID
266 STDCALL
267 KeUpdateRunTime(
268 PKTRAP_FRAME TrapFrame,
269 KIRQL Irql
270 );
271
272 VOID
273 STDCALL
274 KiExpireTimers(
275 PKDPC Dpc,
276 PVOID DeferredContext,
277 PVOID SystemArgument1,
278 PVOID SystemArgument2
279 );
280
281 VOID
282 NTAPI
283 KeInitializeThread(
284 IN PKPROCESS Process,
285 IN OUT PKTHREAD Thread,
286 IN PKSYSTEM_ROUTINE SystemRoutine,
287 IN PKSTART_ROUTINE StartRoutine,
288 IN PVOID StartContext,
289 IN PCONTEXT Context,
290 IN PVOID Teb,
291 IN PVOID KernelStack
292 );
293
294 NTSTATUS
295 NTAPI
296 KeInitThread(
297 IN OUT PKTHREAD Thread,
298 IN PVOID KernelStack,
299 IN PKSYSTEM_ROUTINE SystemRoutine,
300 IN PKSTART_ROUTINE StartRoutine,
301 IN PVOID StartContext,
302 IN PCONTEXT Context,
303 IN PVOID Teb,
304 IN PKPROCESS Process
305 );
306
307 VOID
308 NTAPI
309 KeStartThread(
310 IN OUT PKTHREAD Thread
311 );
312
313 VOID
314 STDCALL
315 KeRundownThread(VOID);
316
317 NTSTATUS
318 NTAPI
319 KeReleaseThread(PKTHREAD Thread);
320
321 LONG
322 STDCALL
323 KeQueryBasePriorityThread(IN PKTHREAD Thread);
324
325 VOID
326 STDCALL
327 KiSetPriorityThread(
328 PKTHREAD Thread,
329 KPRIORITY Priority,
330 PBOOLEAN Released
331 );
332
333 BOOLEAN
334 NTAPI
335 KiDispatcherObjectWake(
336 DISPATCHER_HEADER* hdr,
337 KPRIORITY increment
338 );
339
340 VOID
341 STDCALL
342 KeExpireTimers(
343 PKDPC Apc,
344 PVOID Arg1,
345 PVOID Arg2,
346 PVOID Arg3
347 );
348
349 VOID
350 NTAPI
351 KeDumpStackFrames(PULONG Frame);
352
353 BOOLEAN
354 NTAPI
355 KiTestAlert(VOID);
356
357 VOID
358 FASTCALL
359 KiAbortWaitThread(
360 IN PKTHREAD Thread,
361 IN NTSTATUS WaitStatus,
362 IN KPRIORITY Increment
363 );
364
365 VOID
366 STDCALL
367 KeInitializeProcess(
368 struct _KPROCESS *Process,
369 KPRIORITY Priority,
370 KAFFINITY Affinity,
371 LARGE_INTEGER DirectoryTableBase
372 );
373
374 ULONG
375 STDCALL
376 KeForceResumeThread(IN PKTHREAD Thread);
377
378 BOOLEAN
379 STDCALL
380 KeDisableThreadApcQueueing(IN PKTHREAD Thread);
381
382 BOOLEAN
383 STDCALL
384 KiInsertTimer(
385 PKTIMER Timer,
386 LARGE_INTEGER DueTime
387 );
388
389 VOID
390 FASTCALL
391 KiWaitTest(
392 PVOID Object,
393 KPRIORITY Increment
394 );
395
396 PULONG
397 NTAPI
398 KeGetStackTopThread(struct _ETHREAD* Thread);
399
400 VOID
401 STDCALL
402 KeContextToTrapFrame(
403 PCONTEXT Context,
404 PKEXCEPTION_FRAME ExeptionFrame,
405 PKTRAP_FRAME TrapFrame,
406 ULONG ContextFlags,
407 KPROCESSOR_MODE PreviousMode
408 );
409
410 VOID
411 STDCALL
412 KiDeliverApc(
413 KPROCESSOR_MODE PreviousMode,
414 PVOID Reserved,
415 PKTRAP_FRAME TrapFrame
416 );
417
418 VOID
419 STDCALL
420 KiCheckForKernelApcDelivery(VOID);
421
422 LONG
423 STDCALL
424 KiInsertQueue(
425 IN PKQUEUE Queue,
426 IN PLIST_ENTRY Entry,
427 BOOLEAN Head
428 );
429
430 ULONG
431 STDCALL
432 KeSetProcess(
433 struct _KPROCESS* Process,
434 KPRIORITY Increment,
435 BOOLEAN InWait
436 );
437
438 VOID
439 STDCALL
440 KeInitializeEventPair(PKEVENT_PAIR EventPair);
441
442 VOID
443 STDCALL
444 KiInitializeUserApc(
445 IN PKEXCEPTION_FRAME Reserved,
446 IN PKTRAP_FRAME TrapFrame,
447 IN PKNORMAL_ROUTINE NormalRoutine,
448 IN PVOID NormalContext,
449 IN PVOID SystemArgument1,
450 IN PVOID SystemArgument2
451 );
452
453 PLIST_ENTRY
454 STDCALL
455 KeFlushQueueApc(
456 IN PKTHREAD Thread,
457 IN KPROCESSOR_MODE PreviousMode
458 );
459
460 VOID
461 STDCALL
462 KiAttachProcess(
463 struct _KTHREAD *Thread,
464 struct _KPROCESS *Process,
465 KIRQL ApcLock,
466 struct _KAPC_STATE *SavedApcState
467 );
468
469 VOID
470 STDCALL
471 KiSwapProcess(
472 struct _KPROCESS *NewProcess,
473 struct _KPROCESS *OldProcess
474 );
475
476 BOOLEAN
477 STDCALL
478 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode);
479
480 BOOLEAN
481 STDCALL
482 KeRemoveQueueApc(PKAPC Apc);
483
484 VOID
485 FASTCALL
486 KiWakeQueue(IN PKQUEUE Queue);
487
488 /* INITIALIZATION FUNCTIONS *************************************************/
489
490 VOID
491 NTAPI
492 KeInitExceptions(VOID);
493
494 VOID
495 NTAPI
496 KeInitInterrupts(VOID);
497
498 VOID
499 NTAPI
500 KeInitTimer(VOID);
501
502 VOID
503 NTAPI
504 KeInitDpc(struct _KPRCB* Prcb);
505
506 VOID
507 NTAPI
508 KeInitDispatcher(VOID);
509
510 VOID
511 NTAPI
512 KiInitializeSystemClock(VOID);
513
514 VOID
515 NTAPI
516 KiInitializeBugCheck(VOID);
517
518 VOID
519 NTAPI
520 Phase1Initialization(PVOID Context);
521
522 VOID
523 NTAPI
524 KeInit1(
525 PCHAR CommandLine,
526 PULONG LastKernelAddress
527 );
528
529 VOID
530 NTAPI
531 KeInit2(VOID);
532
533 BOOLEAN
534 NTAPI
535 KiDeliverUserApc(PKTRAP_FRAME TrapFrame);
536
537 VOID
538 STDCALL
539 KiMoveApcState(
540 PKAPC_STATE OldState,
541 PKAPC_STATE NewState
542 );
543
544 VOID
545 NTAPI
546 KiAddProfileEvent(
547 KPROFILE_SOURCE Source,
548 ULONG Pc
549 );
550
551 VOID
552 NTAPI
553 KiDispatchException(
554 PEXCEPTION_RECORD ExceptionRecord,
555 PKEXCEPTION_FRAME ExceptionFrame,
556 PKTRAP_FRAME Tf,
557 KPROCESSOR_MODE PreviousMode,
558 BOOLEAN SearchFrames
559 );
560
561 VOID
562 NTAPI
563 KeTrapFrameToContext(
564 IN PKTRAP_FRAME TrapFrame,
565 IN PKEXCEPTION_FRAME ExceptionFrame,
566 IN OUT PCONTEXT Context
567 );
568
569 VOID
570 NTAPI
571 KeApplicationProcessorInit(VOID);
572
573 VOID
574 NTAPI
575 KePrepareForApplicationProcessorInit(ULONG id);
576
577 ULONG
578 NTAPI
579 KiUserTrapHandler(
580 PKTRAP_FRAME Tf,
581 ULONG ExceptionNr,
582 PVOID Cr2
583 );
584
585 VOID
586 STDCALL
587 KePushAndStackSwitchAndSysRet(
588 ULONG Push,
589 PVOID NewStack
590 );
591
592 VOID
593 STDCALL
594 KeStackSwitchAndRet(PVOID NewStack);
595
596 VOID
597 STDCALL
598 KeBugCheckWithTf(
599 ULONG BugCheckCode,
600 ULONG BugCheckParameter1,
601 ULONG BugCheckParameter2,
602 ULONG BugCheckParameter3,
603 ULONG BugCheckParameter4,
604 PKTRAP_FRAME Tf
605 );
606
607 VOID
608 STDCALL
609 KiDumpTrapFrame(
610 PKTRAP_FRAME Tf,
611 ULONG ExceptionNr,
612 ULONG cr2
613 );
614
615 VOID
616 STDCALL
617 KeFlushCurrentTb(VOID);
618
619 VOID
620 STDCALL
621 KeRosDumpStackFrames(
622 PULONG Frame,
623 ULONG FrameCount
624 );
625
626 ULONG
627 STDCALL
628 KeRosGetStackFrames(
629 PULONG Frames,
630 ULONG FrameCount
631 );
632
633 VOID
634 NTAPI
635 KiSetSystemTime(PLARGE_INTEGER NewSystemTime);
636
637 ULONG
638 NTAPI
639 KeV86Exception(
640 ULONG ExceptionNr,
641 PKTRAP_FRAME Tf,
642 ULONG address
643 );
644
645 #include "ke_x.h"
646
647 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */