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 typedef struct _KTIMER_TABLE_ENTRY
56 } KTIMER_TABLE_ENTRY
, *PKTIMER_TABLE_ENTRY
;
59 (NTAPI
*PKE_BUGCHECK_UNICODE_TO_ANSI
)(
60 IN PUNICODE_STRING Unicode
,
65 struct _KIRQ_TRAPFRAME
;
68 struct _KEXCEPTION_FRAME
;
70 extern PVOID KeUserApcDispatcher
;
71 extern PVOID KeUserCallbackDispatcher
;
72 extern PVOID KeUserExceptionDispatcher
;
73 extern PVOID KeRaiseUserExceptionDispatcher
;
74 extern LARGE_INTEGER SystemBootTime
;
75 extern ULONG_PTR KERNEL_BASE
;
76 extern ULONG KeI386NpxPresent
;
77 extern ULONG KeI386XMMIPresent
;
78 extern ULONG KeI386FxsrPresent
;
79 extern ULONG KeI386CpuType
;
80 extern ULONG KeI386CpuStep
;
81 extern ULONG KeProcessorArchitecture
;
82 extern ULONG KeProcessorLevel
;
83 extern ULONG KeProcessorRevision
;
84 extern ULONG KeFeatureBits
;
85 extern PKNODE KeNodeBlock
[1];
86 extern UCHAR KeNumberNodes
;
87 extern UCHAR KeProcessNodeSeed
;
88 extern ULONG KiInterruptTemplate
[KINTERRUPT_DISPATCH_CODES
];
89 extern PULONG KiInterruptTemplateObject
;
90 extern PULONG KiInterruptTemplateDispatch
;
91 extern PULONG KiInterruptTemplate2ndDispatch
;
92 extern ULONG KiUnexpectedEntrySize
;
93 extern PVOID Ki386IopmSaveArea
;
94 extern ULONG KeI386EFlagsAndMaskV86
;
95 extern ULONG KeI386EFlagsOrMaskV86
;
96 extern BOOLEAN KeI386VirtualIntExtensions
;
97 extern KIDTENTRY KiIdt
[];
98 extern FAST_MUTEX KernelAddressSpaceLock
;
99 extern ULONG KiMaximumDpcQueueDepth
;
100 extern ULONG KiMinimumDpcRate
;
101 extern ULONG KiAdjustDpcThreshold
;
102 extern ULONG KiIdealDpcRate
;
103 extern LARGE_INTEGER KiTimeIncrementReciprocal
;
104 extern UCHAR KiTimeIncrementShiftCount
;
105 extern LIST_ENTRY BugcheckCallbackListHead
, BugcheckReasonCallbackListHead
;
106 extern KSPIN_LOCK BugCheckCallbackLock
;
107 extern KDPC KiExpireTimerDpc
;
108 extern KTIMER_TABLE_ENTRY KiTimerTableListHead
[TIMER_TABLE_SIZE
];
109 extern LIST_ENTRY KiTimerListHead
;
110 extern KMUTEX KiGenericCallDpcMutex
;
111 extern LIST_ENTRY KiProfileListHead
, KiProfileSourceListHead
;
112 extern KSPIN_LOCK KiProfileLock
;
113 extern LIST_ENTRY KiProcessInSwapListHead
, KiProcessOutSwapListHead
;
114 extern LIST_ENTRY KiStackInSwapListHead
;
115 extern KEVENT KiSwapEvent
;
117 /* MACROS *************************************************************************/
120 * On UP machines, we don't actually have a spinlock, we merely raise
124 #define KeInitializeDispatcher() KeInitializeSpinLock(&DispatcherDatabaseLock);
125 #define KeAcquireDispatcherDatabaseLock() KfAcquireSpinLock(&DispatcherDatabaseLock);
126 #define KeAcquireDispatcherDatabaseLockAtDpcLevel() \
127 KeAcquireSpinLockAtDpcLevel (&DispatcherDatabaseLock);
128 #define KeReleaseDispatcherDatabaseLockFromDpcLevel() \
129 KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock);
130 #define KeReleaseDispatcherDatabaseLock(OldIrql) \
131 KiExitDispatcher(OldIrql);
133 #define KeInitializeDispatcher()
134 #define KeAcquireDispatcherDatabaseLock() KeRaiseIrqlToDpcLevel();
135 #define KeReleaseDispatcherDatabaseLock(OldIrql) KiExitDispatcher(OldIrql);
136 #define KeAcquireDispatcherDatabaseLockAtDpcLevel()
137 #define KeReleaseDispatcherDatabaseLockFromDpcLevel()
140 #define AFFINITY_MASK(Id) KiMask32Array[Id]
142 /* The following macro initializes a dispatcher object's header */
143 #define KeInitializeDispatcherHeader(Header, t, s, State) \
145 (Header)->Type = t; \
146 (Header)->Absolute = 0; \
147 (Header)->Inserted = 0; \
148 (Header)->Size = s; \
149 (Header)->SignalState = State; \
150 InitializeListHead(&((Header)->WaitListHead)); \
153 extern KSPIN_LOCK DispatcherDatabaseLock
;
155 #define KeEnterCriticalRegion() \
157 PKTHREAD _Thread = KeGetCurrentThread(); \
158 if (_Thread) _Thread->KernelApcDisable--; \
161 #define KeLeaveCriticalRegion() \
163 PKTHREAD _Thread = KeGetCurrentThread(); \
164 if((_Thread) && (++_Thread->KernelApcDisable == 0)) \
166 if (!IsListEmpty(&_Thread->ApcState.ApcListHead[KernelMode]) && \
167 (_Thread->SpecialApcDisable == 0)) \
169 KiCheckForKernelApcDelivery(); \
174 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
175 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
176 KeBugCheckWithTf(a,b,c,d,e,f)
178 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
179 #define TIMER_OR_EVENT_TYPE 0x7L
181 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
182 #define TIMER_WAIT_BLOCK 0x3L
184 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
186 #define SIZE_OF_FX_REGISTERS 32
188 /* INTERNAL KERNEL FUNCTIONS ************************************************/
190 /* threadsch.c ********************************************************************/
192 /* Thread Scheduler Functions */
194 /* Readies a Thread for Execution. */
197 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
199 /* Readies a Thread for Execution. */
202 KiDispatchThread(ULONG NewThreadStatus
);
204 /* Finds a new thread to run */
213 KiReadyThread(IN PKTHREAD Thread
);
217 KeSuspendThread(PKTHREAD Thread
);
222 IN PKTHREAD CurrentThread
,
223 IN PKTHREAD NewThread
228 KiAdjustQuantumThread(IN PKTHREAD Thread
);
232 KiExitDispatcher(KIRQL OldIrql
);
234 /* gmutex.c ********************************************************************/
238 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
240 /* gate.c **********************************************************************/
244 KeInitializeGate(PKGATE Gate
);
248 KeSignalGateBoostPriority(PKGATE Gate
);
254 KWAIT_REASON WaitReason
,
255 KPROCESSOR_MODE WaitMode
258 /* ipi.c ********************************************************************/
267 /* next file ***************************************************************/
271 KeFindNextRightSetAffinity(
278 DbgBreakPointNoBugCheck(VOID
);
283 struct _KPROFILE
* Profile
,
284 struct _KPROCESS
* Process
,
288 KPROFILE_SOURCE ProfileSource
,
295 struct _KPROFILE
* Profile
,
301 KeStopProfile(struct _KPROFILE
* Profile
);
305 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
309 KeSetIntervalProfile(
310 KPROFILE_SOURCE ProfileSource
,
317 PKTRAP_FRAME TrapFrame
322 KeProfileInterruptWithSource(
323 IN PKTRAP_FRAME TrapFrame
,
324 IN KPROFILE_SOURCE Source
329 KiRosPrintAddress(PVOID Address
);
334 PKTRAP_FRAME TrapFrame
,
342 PVOID DeferredContext
,
343 PVOID SystemArgument1
,
344 PVOID SystemArgument2
350 IN PKPROCESS Process
,
351 IN OUT PKTHREAD Thread
,
352 IN PKSYSTEM_ROUTINE SystemRoutine
,
353 IN PKSTART_ROUTINE StartRoutine
,
354 IN PVOID StartContext
,
369 IN OUT PKTHREAD Thread
,
370 IN PVOID KernelStack
,
371 IN PKSYSTEM_ROUTINE SystemRoutine
,
372 IN PKSTART_ROUTINE StartRoutine
,
373 IN PVOID StartContext
,
382 IN OUT PKTHREAD Thread
389 IN KPROCESSOR_MODE AlertMode
413 KeRundownThread(VOID
);
417 KeReleaseThread(PKTHREAD Thread
);
421 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
433 KiDispatcherObjectWake(
434 DISPATCHER_HEADER
* hdr
,
449 KeDumpStackFrames(PULONG Frame
);
459 IN NTSTATUS WaitStatus
,
460 IN KPRIORITY Increment
466 struct _KPROCESS
*Process
,
469 LARGE_INTEGER DirectoryTableBase
475 IN PKPROCESS Process
,
481 KeSetPriorityAndQuantumProcess(
482 IN PKPROCESS Process
,
483 IN KPRIORITY Priority
,
484 IN UCHAR Quantum OPTIONAL
489 KeForceResumeThread(IN PKTHREAD Thread
);
493 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
499 LARGE_INTEGER DueTime
511 KeGetStackTopThread(struct _ETHREAD
* Thread
);
515 KeContextToTrapFrame(
517 PKEXCEPTION_FRAME ExeptionFrame
,
518 PKTRAP_FRAME TrapFrame
,
520 KPROCESSOR_MODE PreviousMode
526 KPROCESSOR_MODE PreviousMode
,
528 PKTRAP_FRAME TrapFrame
533 KiCheckForKernelApcDelivery(VOID
);
539 IN PLIST_ENTRY Entry
,
546 struct _KPROCESS
* Process
,
553 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
558 IN PKEXCEPTION_FRAME Reserved
,
559 IN PKTRAP_FRAME TrapFrame
,
560 IN PKNORMAL_ROUTINE NormalRoutine
,
561 IN PVOID NormalContext
,
562 IN PVOID SystemArgument1
,
563 IN PVOID SystemArgument2
570 IN KPROCESSOR_MODE PreviousMode
576 struct _KTHREAD
*Thread
,
577 struct _KPROCESS
*Process
,
579 struct _KAPC_STATE
*SavedApcState
585 struct _KPROCESS
*NewProcess
,
586 struct _KPROCESS
*OldProcess
591 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
595 KeRemoveQueueApc(PKAPC Apc
);
599 KiWakeQueue(IN PKQUEUE Queue
);
601 /* INITIALIZATION FUNCTIONS *************************************************/
605 KeInitExceptions(VOID
);
609 KeInitInterrupts(VOID
);
617 KeInitDispatcher(VOID
);
621 KiInitializeSystemClock(VOID
);
625 KiInitializeBugCheck(VOID
);
629 Phase1Initialization(PVOID Context
);
634 IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock
643 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
648 PKAPC_STATE OldState
,
655 KPROFILE_SOURCE Source
,
662 PEXCEPTION_RECORD ExceptionRecord
,
663 PKEXCEPTION_FRAME ExceptionFrame
,
665 KPROCESSOR_MODE PreviousMode
,
671 KeTrapFrameToContext(
672 IN PKTRAP_FRAME TrapFrame
,
673 IN PKEXCEPTION_FRAME ExceptionFrame
,
674 IN OUT PCONTEXT Context
679 KeApplicationProcessorInit(VOID
);
683 KePrepareForApplicationProcessorInit(ULONG id
);
695 KePushAndStackSwitchAndSysRet(
702 KeStackSwitchAndRet(PVOID NewStack
);
708 ULONG BugCheckParameter1
,
709 ULONG BugCheckParameter2
,
710 ULONG BugCheckParameter3
,
711 ULONG BugCheckParameter4
,
717 KeFlushCurrentTb(VOID
);
721 KeRosDumpStackFrames(
728 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
740 KiStartUnexpectedRange(
746 KiEndUnexpectedRange(
765 IN PKTRAP_FRAME TrapFrame
770 Ki386SetupAndExitToV86Mode(
783 IN FLOATING_SAVE_AREA
*SaveArea
788 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */