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 KGDTENTRY KiBootGdt
[];
99 extern FAST_MUTEX KernelAddressSpaceLock
;
100 extern ULONG KiMaximumDpcQueueDepth
;
101 extern ULONG KiMinimumDpcRate
;
102 extern ULONG KiAdjustDpcThreshold
;
103 extern ULONG KiIdealDpcRate
;
104 extern LARGE_INTEGER KiTimeIncrementReciprocal
;
105 extern UCHAR KiTimeIncrementShiftCount
;
106 extern LIST_ENTRY BugcheckCallbackListHead
, BugcheckReasonCallbackListHead
;
107 extern KSPIN_LOCK BugCheckCallbackLock
;
108 extern KDPC KiExpireTimerDpc
;
109 extern KTIMER_TABLE_ENTRY KiTimerTableListHead
[TIMER_TABLE_SIZE
];
110 extern LIST_ENTRY KiTimerListHead
;
111 extern KMUTEX KiGenericCallDpcMutex
;
112 extern LIST_ENTRY KiProfileListHead
, KiProfileSourceListHead
;
113 extern KSPIN_LOCK KiProfileLock
;
114 extern LIST_ENTRY KiProcessInSwapListHead
, KiProcessOutSwapListHead
;
115 extern LIST_ENTRY KiStackInSwapListHead
;
116 extern KEVENT KiSwapEvent
;
117 extern PKPRCB KiProcessorBlock
[];
118 extern ULONG KiMask32Array
[MAXIMUM_PRIORITY
];
119 extern ULONG IdleProcessorMask
;
120 extern ULONG trap_stack_top
;
121 extern VOID
KiTrap8(VOID
);
123 /* MACROS *************************************************************************/
126 * On UP machines, we don't actually have a spinlock, we merely raise
130 #define KeInitializeDispatcher() KeInitializeSpinLock(&DispatcherDatabaseLock);
131 #define KeAcquireDispatcherDatabaseLock() KfAcquireSpinLock(&DispatcherDatabaseLock);
132 #define KeAcquireDispatcherDatabaseLockAtDpcLevel() \
133 KeAcquireSpinLockAtDpcLevel (&DispatcherDatabaseLock);
134 #define KeReleaseDispatcherDatabaseLockFromDpcLevel() \
135 KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock);
136 #define KeReleaseDispatcherDatabaseLock(OldIrql) \
137 KiExitDispatcher(OldIrql);
139 #define KeInitializeDispatcher()
140 #define KeAcquireDispatcherDatabaseLock() KeRaiseIrqlToDpcLevel();
141 #define KeReleaseDispatcherDatabaseLock(OldIrql) KiExitDispatcher(OldIrql);
142 #define KeAcquireDispatcherDatabaseLockAtDpcLevel()
143 #define KeReleaseDispatcherDatabaseLockFromDpcLevel()
146 #define AFFINITY_MASK(Id) KiMask32Array[Id]
148 /* The following macro initializes a dispatcher object's header */
149 #define KeInitializeDispatcherHeader(Header, t, s, State) \
151 (Header)->Type = t; \
152 (Header)->Absolute = 0; \
153 (Header)->Inserted = 0; \
154 (Header)->Size = s; \
155 (Header)->SignalState = State; \
156 InitializeListHead(&((Header)->WaitListHead)); \
159 extern KSPIN_LOCK DispatcherDatabaseLock
;
161 #define KeEnterCriticalRegion() \
163 PKTHREAD _Thread = KeGetCurrentThread(); \
164 if (_Thread) _Thread->KernelApcDisable--; \
167 #define KeLeaveCriticalRegion() \
169 PKTHREAD _Thread = KeGetCurrentThread(); \
170 if((_Thread) && (++_Thread->KernelApcDisable == 0)) \
172 if (!IsListEmpty(&_Thread->ApcState.ApcListHead[KernelMode]) && \
173 (_Thread->SpecialApcDisable == 0)) \
175 KiCheckForKernelApcDelivery(); \
180 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
181 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
182 KeBugCheckWithTf(a,b,c,d,e,f)
184 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
185 #define TIMER_OR_EVENT_TYPE 0x7L
187 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
188 #define TIMER_WAIT_BLOCK 0x3L
190 /* IOPM Definitions */
191 #define IO_ACCESS_MAP_NONE 0
192 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
193 #define KiComputeIopmOffset(MapNumber) \
194 (MapNumber == IO_ACCESS_MAP_NONE) ? \
195 (USHORT)(sizeof(KTSS)) : \
196 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
198 #define SIZE_OF_FX_REGISTERS 32
200 /* INTERNAL KERNEL FUNCTIONS ************************************************/
202 /* threadsch.c ********************************************************************/
204 /* Thread Scheduler Functions */
206 /* Readies a Thread for Execution. */
209 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
211 /* Readies a Thread for Execution. */
214 KiDispatchThread(ULONG NewThreadStatus
);
216 /* Finds a new thread to run */
225 KiReadyThread(IN PKTHREAD Thread
);
229 KeSuspendThread(PKTHREAD Thread
);
234 IN PKTHREAD CurrentThread
,
235 IN PKTHREAD NewThread
240 KiAdjustQuantumThread(IN PKTHREAD Thread
);
244 KiExitDispatcher(KIRQL OldIrql
);
246 /* gmutex.c ********************************************************************/
250 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
252 /* gate.c **********************************************************************/
256 KeInitializeGate(PKGATE Gate
);
260 KeSignalGateBoostPriority(PKGATE Gate
);
266 KWAIT_REASON WaitReason
,
267 KPROCESSOR_MODE WaitMode
270 /* ipi.c ********************************************************************/
279 /* next file ***************************************************************/
283 KeFindNextRightSetAffinity(
290 DbgBreakPointNoBugCheck(VOID
);
295 struct _KPROFILE
* Profile
,
296 struct _KPROCESS
* Process
,
300 KPROFILE_SOURCE ProfileSource
,
307 struct _KPROFILE
* Profile
,
313 KeStopProfile(struct _KPROFILE
* Profile
);
317 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
321 KeSetIntervalProfile(
322 KPROFILE_SOURCE ProfileSource
,
329 PKTRAP_FRAME TrapFrame
334 KeProfileInterruptWithSource(
335 IN PKTRAP_FRAME TrapFrame
,
336 IN KPROFILE_SOURCE Source
341 KiRosPrintAddress(PVOID Address
);
346 PKTRAP_FRAME TrapFrame
,
354 PVOID DeferredContext
,
355 PVOID SystemArgument1
,
356 PVOID SystemArgument2
362 IN PKPROCESS Process
,
363 IN OUT PKTHREAD Thread
,
364 IN PKSYSTEM_ROUTINE SystemRoutine
,
365 IN PKSTART_ROUTINE StartRoutine
,
366 IN PVOID StartContext
,
381 IN OUT PKTHREAD Thread
,
382 IN PVOID KernelStack
,
383 IN PKSYSTEM_ROUTINE SystemRoutine
,
384 IN PKSTART_ROUTINE StartRoutine
,
385 IN PVOID StartContext
,
394 IN OUT PKTHREAD Thread
401 IN KPROCESSOR_MODE AlertMode
425 KeRundownThread(VOID
);
429 KeReleaseThread(PKTHREAD Thread
);
433 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
445 KiDispatcherObjectWake(
446 DISPATCHER_HEADER
* hdr
,
461 KeDumpStackFrames(PULONG Frame
);
471 IN NTSTATUS WaitStatus
,
472 IN KPRIORITY Increment
478 struct _KPROCESS
*Process
,
481 LARGE_INTEGER DirectoryTableBase
487 IN PKPROCESS Process
,
493 KeSetPriorityAndQuantumProcess(
494 IN PKPROCESS Process
,
495 IN KPRIORITY Priority
,
496 IN UCHAR Quantum OPTIONAL
501 KeForceResumeThread(IN PKTHREAD Thread
);
505 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
511 LARGE_INTEGER DueTime
523 KeGetStackTopThread(struct _ETHREAD
* Thread
);
527 KeContextToTrapFrame(
529 PKEXCEPTION_FRAME ExeptionFrame
,
530 PKTRAP_FRAME TrapFrame
,
532 KPROCESSOR_MODE PreviousMode
538 KPROCESSOR_MODE PreviousMode
,
540 PKTRAP_FRAME TrapFrame
545 KiCheckForKernelApcDelivery(VOID
);
551 IN PLIST_ENTRY Entry
,
558 struct _KPROCESS
* Process
,
565 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
570 IN PKEXCEPTION_FRAME Reserved
,
571 IN PKTRAP_FRAME TrapFrame
,
572 IN PKNORMAL_ROUTINE NormalRoutine
,
573 IN PVOID NormalContext
,
574 IN PVOID SystemArgument1
,
575 IN PVOID SystemArgument2
582 IN KPROCESSOR_MODE PreviousMode
588 struct _KTHREAD
*Thread
,
589 struct _KPROCESS
*Process
,
591 struct _KAPC_STATE
*SavedApcState
597 struct _KPROCESS
*NewProcess
,
598 struct _KPROCESS
*OldProcess
603 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
607 KeRemoveQueueApc(PKAPC Apc
);
611 KiWakeQueue(IN PKQUEUE Queue
);
613 /* INITIALIZATION FUNCTIONS *************************************************/
617 KeInitExceptions(VOID
);
621 KeInitInterrupts(VOID
);
629 KeInitDispatcher(VOID
);
633 KiInitializeSystemClock(VOID
);
637 KiInitializeBugCheck(VOID
);
641 Phase1Initialization(PVOID Context
);
646 IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock
655 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
660 PKAPC_STATE OldState
,
667 KPROFILE_SOURCE Source
,
674 PEXCEPTION_RECORD ExceptionRecord
,
675 PKEXCEPTION_FRAME ExceptionFrame
,
677 KPROCESSOR_MODE PreviousMode
,
683 KeTrapFrameToContext(
684 IN PKTRAP_FRAME TrapFrame
,
685 IN PKEXCEPTION_FRAME ExceptionFrame
,
686 IN OUT PCONTEXT Context
691 KeApplicationProcessorInit(VOID
);
695 KePrepareForApplicationProcessorInit(ULONG id
);
707 KePushAndStackSwitchAndSysRet(
714 KeStackSwitchAndRet(PVOID NewStack
);
720 ULONG BugCheckParameter1
,
721 ULONG BugCheckParameter2
,
722 ULONG BugCheckParameter3
,
723 ULONG BugCheckParameter4
,
729 KeFlushCurrentTb(VOID
);
733 KeRosDumpStackFrames(
740 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
752 KiStartUnexpectedRange(
758 KiEndUnexpectedRange(
777 IN PKTRAP_FRAME TrapFrame
782 Ki386SetupAndExitToV86Mode(
795 IN FLOATING_SAVE_AREA
*SaveArea
800 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */