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 ULONG Ke386GlobalPagesEnabled
;
87 extern PKNODE KeNodeBlock
[1];
88 extern UCHAR KeNumberNodes
;
89 extern UCHAR KeProcessNodeSeed
;
90 extern ETHREAD KiInitialThread
;
91 extern EPROCESS KiInitialProcess
;
92 extern ULONG KiInterruptTemplate
[KINTERRUPT_DISPATCH_CODES
];
93 extern PULONG KiInterruptTemplateObject
;
94 extern PULONG KiInterruptTemplateDispatch
;
95 extern PULONG KiInterruptTemplate2ndDispatch
;
96 extern ULONG KiUnexpectedEntrySize
;
97 extern PVOID Ki386IopmSaveArea
;
98 extern ULONG KeI386EFlagsAndMaskV86
;
99 extern ULONG KeI386EFlagsOrMaskV86
;
100 extern BOOLEAN KeI386VirtualIntExtensions
;
101 extern KIDTENTRY KiIdt
[];
102 extern KGDTENTRY KiBootGdt
[];
103 extern KDESCRIPTOR KiGdtDescriptor
;
104 extern KDESCRIPTOR KiIdtDescriptor
;
105 extern KTSS KiBootTss
;
106 extern UCHAR P0BootStack
[];
107 extern UCHAR KiDoubleFaultStack
[];
108 extern FAST_MUTEX KernelAddressSpaceLock
;
109 extern ULONG KiMaximumDpcQueueDepth
;
110 extern ULONG KiMinimumDpcRate
;
111 extern ULONG KiAdjustDpcThreshold
;
112 extern ULONG KiIdealDpcRate
;
113 extern LARGE_INTEGER KiTimeIncrementReciprocal
;
114 extern UCHAR KiTimeIncrementShiftCount
;
115 extern LIST_ENTRY BugcheckCallbackListHead
, BugcheckReasonCallbackListHead
;
116 extern KSPIN_LOCK BugCheckCallbackLock
;
117 extern KDPC KiExpireTimerDpc
;
118 extern KTIMER_TABLE_ENTRY KiTimerTableListHead
[TIMER_TABLE_SIZE
];
119 extern LIST_ENTRY KiTimerListHead
;
120 extern KMUTEX KiGenericCallDpcMutex
;
121 extern LIST_ENTRY KiProfileListHead
, KiProfileSourceListHead
;
122 extern KSPIN_LOCK KiProfileLock
;
123 extern LIST_ENTRY KiProcessListHead
;
124 extern LIST_ENTRY KiProcessInSwapListHead
, KiProcessOutSwapListHead
;
125 extern LIST_ENTRY KiStackInSwapListHead
;
126 extern KEVENT KiSwapEvent
;
127 extern PKPRCB KiProcessorBlock
[];
128 extern ULONG KiMask32Array
[MAXIMUM_PRIORITY
];
129 extern ULONG IdleProcessorMask
;
130 extern VOID
KiTrap8(VOID
);
131 extern VOID
KiTrap2(VOID
);
133 /* MACROS *************************************************************************/
136 * On UP machines, we don't actually have a spinlock, we merely raise
140 #define KeInitializeDispatcher() KeInitializeSpinLock(&DispatcherDatabaseLock);
141 #define KeAcquireDispatcherDatabaseLock() KfAcquireSpinLock(&DispatcherDatabaseLock);
142 #define KeAcquireDispatcherDatabaseLockAtDpcLevel() \
143 KeAcquireSpinLockAtDpcLevel (&DispatcherDatabaseLock);
144 #define KeReleaseDispatcherDatabaseLockFromDpcLevel() \
145 KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock);
146 #define KeReleaseDispatcherDatabaseLock(OldIrql) \
147 KiExitDispatcher(OldIrql);
149 #define KeInitializeDispatcher()
150 #define KeAcquireDispatcherDatabaseLock() KeRaiseIrqlToDpcLevel();
151 #define KeReleaseDispatcherDatabaseLock(OldIrql) KiExitDispatcher(OldIrql);
152 #define KeAcquireDispatcherDatabaseLockAtDpcLevel()
153 #define KeReleaseDispatcherDatabaseLockFromDpcLevel()
156 #define AFFINITY_MASK(Id) KiMask32Array[Id]
158 /* The following macro initializes a dispatcher object's header */
159 #define KeInitializeDispatcherHeader(Header, t, s, State) \
161 (Header)->Type = t; \
162 (Header)->Absolute = 0; \
163 (Header)->Inserted = 0; \
164 (Header)->Size = s; \
165 (Header)->SignalState = State; \
166 InitializeListHead(&((Header)->WaitListHead)); \
169 extern KSPIN_LOCK DispatcherDatabaseLock
;
171 #define KeEnterCriticalRegion() \
173 PKTHREAD _Thread = KeGetCurrentThread(); \
174 if (_Thread) _Thread->KernelApcDisable--; \
177 #define KeLeaveCriticalRegion() \
179 PKTHREAD _Thread = KeGetCurrentThread(); \
180 if((_Thread) && (++_Thread->KernelApcDisable == 0)) \
182 if (!IsListEmpty(&_Thread->ApcState.ApcListHead[KernelMode]) && \
183 (_Thread->SpecialApcDisable == 0)) \
185 KiCheckForKernelApcDelivery(); \
190 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
191 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
192 KeBugCheckWithTf(a,b,c,d,e,f)
194 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
195 #define TIMER_OR_EVENT_TYPE 0x7L
197 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
198 #define TIMER_WAIT_BLOCK 0x3L
200 /* IOPM Definitions */
201 #define IO_ACCESS_MAP_NONE 0
202 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
203 #define KiComputeIopmOffset(MapNumber) \
204 (MapNumber == IO_ACCESS_MAP_NONE) ? \
205 (USHORT)(sizeof(KTSS)) : \
206 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
208 #define SIZE_OF_FX_REGISTERS 32
210 /* INTERNAL KERNEL FUNCTIONS ************************************************/
212 /* threadsch.c ********************************************************************/
214 /* Thread Scheduler Functions */
216 /* Readies a Thread for Execution. */
219 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
221 /* Readies a Thread for Execution. */
224 KiDispatchThread(ULONG NewThreadStatus
);
226 /* Finds a new thread to run */
235 KiReadyThread(IN PKTHREAD Thread
);
239 KeSuspendThread(PKTHREAD Thread
);
244 IN PKTHREAD CurrentThread
,
245 IN PKTHREAD NewThread
250 KiAdjustQuantumThread(IN PKTHREAD Thread
);
254 KiExitDispatcher(KIRQL OldIrql
);
256 /* gmutex.c ********************************************************************/
260 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
262 /* gate.c **********************************************************************/
266 KeInitializeGate(PKGATE Gate
);
270 KeSignalGateBoostPriority(PKGATE Gate
);
276 KWAIT_REASON WaitReason
,
277 KPROCESSOR_MODE WaitMode
280 /* ipi.c ********************************************************************/
289 /* next file ***************************************************************/
293 KeFindNextRightSetAffinity(
300 DbgBreakPointNoBugCheck(VOID
);
305 struct _KPROFILE
* Profile
,
306 struct _KPROCESS
* Process
,
310 KPROFILE_SOURCE ProfileSource
,
317 struct _KPROFILE
* Profile
,
323 KeStopProfile(struct _KPROFILE
* Profile
);
327 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
331 KeSetIntervalProfile(
332 KPROFILE_SOURCE ProfileSource
,
339 PKTRAP_FRAME TrapFrame
344 KeProfileInterruptWithSource(
345 IN PKTRAP_FRAME TrapFrame
,
346 IN KPROFILE_SOURCE Source
351 KiRosPrintAddress(PVOID Address
);
356 PKTRAP_FRAME TrapFrame
,
364 PVOID DeferredContext
,
365 PVOID SystemArgument1
,
366 PVOID SystemArgument2
372 IN PKPROCESS Process
,
373 IN OUT PKTHREAD Thread
,
374 IN PKSYSTEM_ROUTINE SystemRoutine
,
375 IN PKSTART_ROUTINE StartRoutine
,
376 IN PVOID StartContext
,
391 IN OUT PKTHREAD Thread
,
392 IN PVOID KernelStack
,
393 IN PKSYSTEM_ROUTINE SystemRoutine
,
394 IN PKSTART_ROUTINE StartRoutine
,
395 IN PVOID StartContext
,
404 IN OUT PKTHREAD Thread
411 IN KPROCESSOR_MODE AlertMode
435 KeRundownThread(VOID
);
439 KeReleaseThread(PKTHREAD Thread
);
443 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
455 KiDispatcherObjectWake(
456 DISPATCHER_HEADER
* hdr
,
471 KeDumpStackFrames(PULONG Frame
);
481 IN NTSTATUS WaitStatus
,
482 IN KPRIORITY Increment
488 struct _KPROCESS
*Process
,
491 LARGE_INTEGER DirectoryTableBase
497 IN PKPROCESS Process
,
503 KeSetPriorityAndQuantumProcess(
504 IN PKPROCESS Process
,
505 IN KPRIORITY Priority
,
506 IN UCHAR Quantum OPTIONAL
511 KeForceResumeThread(IN PKTHREAD Thread
);
515 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
521 LARGE_INTEGER DueTime
533 KeGetStackTopThread(struct _ETHREAD
* Thread
);
537 KeContextToTrapFrame(
539 PKEXCEPTION_FRAME ExeptionFrame
,
540 PKTRAP_FRAME TrapFrame
,
542 KPROCESSOR_MODE PreviousMode
548 KPROCESSOR_MODE PreviousMode
,
550 PKTRAP_FRAME TrapFrame
555 KiCheckForKernelApcDelivery(VOID
);
561 IN PLIST_ENTRY Entry
,
568 struct _KPROCESS
* Process
,
575 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
580 IN PKEXCEPTION_FRAME Reserved
,
581 IN PKTRAP_FRAME TrapFrame
,
582 IN PKNORMAL_ROUTINE NormalRoutine
,
583 IN PVOID NormalContext
,
584 IN PVOID SystemArgument1
,
585 IN PVOID SystemArgument2
592 IN KPROCESSOR_MODE PreviousMode
598 struct _KTHREAD
*Thread
,
599 struct _KPROCESS
*Process
,
601 struct _KAPC_STATE
*SavedApcState
607 struct _KPROCESS
*NewProcess
,
608 struct _KPROCESS
*OldProcess
613 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
617 KeRemoveQueueApc(PKAPC Apc
);
621 KiWakeQueue(IN PKQUEUE Queue
);
623 /* INITIALIZATION FUNCTIONS *************************************************/
627 KeInitExceptions(VOID
);
631 KeInitInterrupts(VOID
);
639 KeInitDispatcher(VOID
);
643 KiInitializeSystemClock(VOID
);
647 KiInitializeBugCheck(VOID
);
651 Phase1Initialization(PVOID Context
);
656 IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock
665 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
670 PKAPC_STATE OldState
,
677 KPROFILE_SOURCE Source
,
684 PEXCEPTION_RECORD ExceptionRecord
,
685 PKEXCEPTION_FRAME ExceptionFrame
,
687 KPROCESSOR_MODE PreviousMode
,
693 KeTrapFrameToContext(
694 IN PKTRAP_FRAME TrapFrame
,
695 IN PKEXCEPTION_FRAME ExceptionFrame
,
696 IN OUT PCONTEXT Context
701 KeApplicationProcessorInit(VOID
);
705 KePrepareForApplicationProcessorInit(ULONG id
);
717 KePushAndStackSwitchAndSysRet(
724 KeStackSwitchAndRet(PVOID NewStack
);
730 ULONG BugCheckParameter1
,
731 ULONG BugCheckParameter2
,
732 ULONG BugCheckParameter3
,
733 ULONG BugCheckParameter4
,
739 KeFlushCurrentTb(VOID
);
743 KeRosDumpStackFrames(
750 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
762 KiStartUnexpectedRange(
768 KiEndUnexpectedRange(
787 IN PKTRAP_FRAME TrapFrame
792 Ki386SetupAndExitToV86Mode(
805 IN FLOATING_SAVE_AREA
*SaveArea
830 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */