1 #ifndef __NTOSKRNL_INCLUDE_INTERNAL_KE_H
2 #define __NTOSKRNL_INCLUDE_INTERNAL_KE_H
4 /* INCLUDES *****************************************************************/
8 /* INTERNAL KERNEL TYPES ****************************************************/
10 typedef struct _WOW64_PROCESS
13 } WOW64_PROCESS
, *PWOW64_PROCESS
;
15 typedef struct _KPROFILE_SOURCE_OBJECT
17 KPROFILE_SOURCE Source
;
19 } KPROFILE_SOURCE_OBJECT
, *PKPROFILE_SOURCE_OBJECT
;
21 /* Cached modules from the loader block */
22 typedef enum _CACHED_MODULE_TYPE
29 MaximumCachedModuleType
,
30 } CACHED_MODULE_TYPE
, *PCACHED_MODULE_TYPE
;
31 extern PLOADER_MODULE CachedModules
[MaximumCachedModuleType
];
33 typedef enum _CONNECT_TYPE
39 } CONNECT_TYPE
, *PCONNECT_TYPE
;
41 typedef struct _DISPATCH_INFO
44 PKINTERRUPT Interrupt
;
45 PKINTERRUPT_ROUTINE NoDispatch
;
46 PKINTERRUPT_ROUTINE InterruptDispatch
;
47 PKINTERRUPT_ROUTINE FloatingDispatch
;
48 PKINTERRUPT_ROUTINE ChainedDispatch
;
49 PKINTERRUPT_ROUTINE
*FlatDispatch
;
50 } DISPATCH_INFO
, *PDISPATCH_INFO
;
52 struct _KIRQ_TRAPFRAME
;
55 struct _KEXCEPTION_FRAME
;
57 extern PVOID KeUserApcDispatcher
;
58 extern PVOID KeUserCallbackDispatcher
;
59 extern PVOID KeUserExceptionDispatcher
;
60 extern PVOID KeRaiseUserExceptionDispatcher
;
61 extern LARGE_INTEGER SystemBootTime
;
62 extern ULONG_PTR KERNEL_BASE
;
63 extern ULONG KeI386NpxPresent
;
64 extern ULONG KeI386XMMIPresent
;
65 extern ULONG KeI386FxsrPresent
;
66 extern PKNODE KeNodeBlock
[1];
67 extern UCHAR KeNumberNodes
;
68 extern UCHAR KeProcessNodeSeed
;
69 extern ULONG KiInterruptTemplate
[KINTERRUPT_DISPATCH_CODES
];
70 extern PULONG KiInterruptTemplateObject
;
71 extern PULONG KiInterruptTemplateDispatch
;
72 extern PULONG KiInterruptTemplate2ndDispatch
;
73 extern ULONG KiUnexpectedEntrySize
;
74 extern PVOID Ki386IopmSaveArea
;
75 extern ULONG KeI386EFlagsAndMaskV86
;
76 extern ULONG KeI386EFlagsOrMaskV86
;
77 extern BOOLEAN KeI386VirtualIntExtensions
;
78 extern KIDTENTRY KiIdt
[];
80 /* MACROS *************************************************************************/
83 * On UP machines, we don't actually have a spinlock, we merely raise
87 #define KeInitializeDispatcher() KeInitializeSpinLock(&DispatcherDatabaseLock);
88 #define KeAcquireDispatcherDatabaseLock() KfAcquireSpinLock(&DispatcherDatabaseLock);
89 #define KeAcquireDispatcherDatabaseLockAtDpcLevel() \
90 KeAcquireSpinLockAtDpcLevel (&DispatcherDatabaseLock);
91 #define KeReleaseDispatcherDatabaseLockFromDpcLevel() \
92 KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock);
93 #define KeReleaseDispatcherDatabaseLock(OldIrql) \
94 KiExitDispatcher(OldIrql);
96 #define KeInitializeDispatcher()
97 #define KeAcquireDispatcherDatabaseLock() KeRaiseIrqlToDpcLevel();
98 #define KeReleaseDispatcherDatabaseLock(OldIrql) KiExitDispatcher(OldIrql);
99 #define KeAcquireDispatcherDatabaseLockAtDpcLevel()
100 #define KeReleaseDispatcherDatabaseLockFromDpcLevel()
103 #define AFFINITY_MASK(Id) KiMask32Array[Id]
105 /* The following macro initializes a dispatcher object's header */
106 #define KeInitializeDispatcherHeader(Header, t, s, State) \
108 (Header)->Type = t; \
109 (Header)->Absolute = 0; \
110 (Header)->Inserted = 0; \
111 (Header)->Size = s; \
112 (Header)->SignalState = State; \
113 InitializeListHead(&((Header)->WaitListHead)); \
116 extern KSPIN_LOCK DispatcherDatabaseLock
;
118 #define KeEnterCriticalRegion() \
120 PKTHREAD _Thread = KeGetCurrentThread(); \
121 if (_Thread) _Thread->KernelApcDisable--; \
124 #define KeLeaveCriticalRegion() \
126 PKTHREAD _Thread = KeGetCurrentThread(); \
127 if((_Thread) && (++_Thread->KernelApcDisable == 0)) \
129 if (!IsListEmpty(&_Thread->ApcState.ApcListHead[KernelMode]) && \
130 (_Thread->SpecialApcDisable == 0)) \
132 KiCheckForKernelApcDelivery(); \
137 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
138 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
139 KeBugCheckWithTf(a,b,c,d,e,f)
141 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
142 #define TIMER_OR_EVENT_TYPE 0x7L
144 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
145 #define TIMER_WAIT_BLOCK 0x3L
147 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
149 #define SIZE_OF_FX_REGISTERS 32
151 /* INTERNAL KERNEL FUNCTIONS ************************************************/
153 /* threadsch.c ********************************************************************/
155 /* Thread Scheduler Functions */
157 /* Readies a Thread for Execution. */
160 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
162 /* Readies a Thread for Execution. */
165 KiDispatchThread(ULONG NewThreadStatus
);
167 /* Finds a new thread to run */
176 KiReadyThread(IN PKTHREAD Thread
);
180 KeSuspendThread(PKTHREAD Thread
);
185 IN PKTHREAD CurrentThread
,
186 IN PKTHREAD NewThread
191 KiAdjustQuantumThread(IN PKTHREAD Thread
);
195 KiExitDispatcher(KIRQL OldIrql
);
197 /* gmutex.c ********************************************************************/
201 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
203 /* gate.c **********************************************************************/
207 KeInitializeGate(PKGATE Gate
);
211 KeSignalGateBoostPriority(PKGATE Gate
);
217 KWAIT_REASON WaitReason
,
218 KPROCESSOR_MODE WaitMode
221 /* ipi.c ********************************************************************/
230 /* next file ***************************************************************/
234 KeFindNextRightSetAffinity(
241 DbgBreakPointNoBugCheck(VOID
);
246 struct _KPROFILE
* Profile
,
247 struct _KPROCESS
* Process
,
251 KPROFILE_SOURCE ProfileSource
,
258 struct _KPROFILE
* Profile
,
264 KeStopProfile(struct _KPROFILE
* Profile
);
268 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
272 KeSetIntervalProfile(
273 KPROFILE_SOURCE ProfileSource
,
280 PKTRAP_FRAME TrapFrame
285 KeProfileInterruptWithSource(
286 IN PKTRAP_FRAME TrapFrame
,
287 IN KPROFILE_SOURCE Source
292 KiRosPrintAddress(PVOID Address
);
297 PKTRAP_FRAME TrapFrame
,
305 PVOID DeferredContext
,
306 PVOID SystemArgument1
,
307 PVOID SystemArgument2
313 IN PKPROCESS Process
,
314 IN OUT PKTHREAD Thread
,
315 IN PKSYSTEM_ROUTINE SystemRoutine
,
316 IN PKSTART_ROUTINE StartRoutine
,
317 IN PVOID StartContext
,
332 IN OUT PKTHREAD Thread
,
333 IN PVOID KernelStack
,
334 IN PKSYSTEM_ROUTINE SystemRoutine
,
335 IN PKSTART_ROUTINE StartRoutine
,
336 IN PVOID StartContext
,
345 IN OUT PKTHREAD Thread
352 IN KPROCESSOR_MODE AlertMode
376 KeRundownThread(VOID
);
380 KeReleaseThread(PKTHREAD Thread
);
384 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
396 KiDispatcherObjectWake(
397 DISPATCHER_HEADER
* hdr
,
412 KeDumpStackFrames(PULONG Frame
);
422 IN NTSTATUS WaitStatus
,
423 IN KPRIORITY Increment
429 struct _KPROCESS
*Process
,
432 LARGE_INTEGER DirectoryTableBase
438 IN PKPROCESS Process
,
444 KeSetPriorityAndQuantumProcess(
445 IN PKPROCESS Process
,
446 IN KPRIORITY Priority
,
447 IN UCHAR Quantum OPTIONAL
452 KeForceResumeThread(IN PKTHREAD Thread
);
456 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
462 LARGE_INTEGER DueTime
474 KeGetStackTopThread(struct _ETHREAD
* Thread
);
478 KeContextToTrapFrame(
480 PKEXCEPTION_FRAME ExeptionFrame
,
481 PKTRAP_FRAME TrapFrame
,
483 KPROCESSOR_MODE PreviousMode
489 KPROCESSOR_MODE PreviousMode
,
491 PKTRAP_FRAME TrapFrame
496 KiCheckForKernelApcDelivery(VOID
);
502 IN PLIST_ENTRY Entry
,
509 struct _KPROCESS
* Process
,
516 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
521 IN PKEXCEPTION_FRAME Reserved
,
522 IN PKTRAP_FRAME TrapFrame
,
523 IN PKNORMAL_ROUTINE NormalRoutine
,
524 IN PVOID NormalContext
,
525 IN PVOID SystemArgument1
,
526 IN PVOID SystemArgument2
533 IN KPROCESSOR_MODE PreviousMode
539 struct _KTHREAD
*Thread
,
540 struct _KPROCESS
*Process
,
542 struct _KAPC_STATE
*SavedApcState
548 struct _KPROCESS
*NewProcess
,
549 struct _KPROCESS
*OldProcess
554 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
558 KeRemoveQueueApc(PKAPC Apc
);
562 KiWakeQueue(IN PKQUEUE Queue
);
564 /* INITIALIZATION FUNCTIONS *************************************************/
568 KeInitExceptions(VOID
);
572 KeInitInterrupts(VOID
);
580 KeInitDpc(struct _KPRCB
* Prcb
);
584 KeInitDispatcher(VOID
);
588 KiInitializeSystemClock(VOID
);
592 KiInitializeBugCheck(VOID
);
596 Phase1Initialization(PVOID Context
);
602 PULONG LastKernelAddress
611 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
616 PKAPC_STATE OldState
,
623 KPROFILE_SOURCE Source
,
630 PEXCEPTION_RECORD ExceptionRecord
,
631 PKEXCEPTION_FRAME ExceptionFrame
,
633 KPROCESSOR_MODE PreviousMode
,
639 KeTrapFrameToContext(
640 IN PKTRAP_FRAME TrapFrame
,
641 IN PKEXCEPTION_FRAME ExceptionFrame
,
642 IN OUT PCONTEXT Context
647 KeApplicationProcessorInit(VOID
);
651 KePrepareForApplicationProcessorInit(ULONG id
);
663 KePushAndStackSwitchAndSysRet(
670 KeStackSwitchAndRet(PVOID NewStack
);
676 ULONG BugCheckParameter1
,
677 ULONG BugCheckParameter2
,
678 ULONG BugCheckParameter3
,
679 ULONG BugCheckParameter4
,
685 KeFlushCurrentTb(VOID
);
689 KeRosDumpStackFrames(
696 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
708 KiStartUnexpectedRange(
714 KiEndUnexpectedRange(
733 IN PKTRAP_FRAME TrapFrame
738 Ki386SetupAndExitToV86Mode(
751 IN FLOATING_SAVE_AREA
*SaveArea
756 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */