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
;
53 (NTAPI
*PKE_BUGCHECK_UNICODE_TO_ANSI
)(
54 IN PUNICODE_STRING Unicode
,
59 struct _KIRQ_TRAPFRAME
;
62 struct _KEXCEPTION_FRAME
;
64 extern PVOID KeUserApcDispatcher
;
65 extern PVOID KeUserCallbackDispatcher
;
66 extern PVOID KeUserExceptionDispatcher
;
67 extern PVOID KeRaiseUserExceptionDispatcher
;
68 extern LARGE_INTEGER SystemBootTime
;
69 extern ULONG_PTR KERNEL_BASE
;
70 extern ULONG KeI386NpxPresent
;
71 extern ULONG KeI386XMMIPresent
;
72 extern ULONG KeI386FxsrPresent
;
73 extern ULONG KeI386CpuType
;
74 extern ULONG KeI386CpuStep
;
75 extern ULONG KeProcessorArchitecture
;
76 extern ULONG KeProcessorLevel
;
77 extern ULONG KeProcessorRevision
;
78 extern ULONG KeFeatureBits
;
79 extern PKNODE KeNodeBlock
[1];
80 extern UCHAR KeNumberNodes
;
81 extern UCHAR KeProcessNodeSeed
;
82 extern ULONG KiInterruptTemplate
[KINTERRUPT_DISPATCH_CODES
];
83 extern PULONG KiInterruptTemplateObject
;
84 extern PULONG KiInterruptTemplateDispatch
;
85 extern PULONG KiInterruptTemplate2ndDispatch
;
86 extern ULONG KiUnexpectedEntrySize
;
87 extern PVOID Ki386IopmSaveArea
;
88 extern ULONG KeI386EFlagsAndMaskV86
;
89 extern ULONG KeI386EFlagsOrMaskV86
;
90 extern BOOLEAN KeI386VirtualIntExtensions
;
91 extern KIDTENTRY KiIdt
[];
92 extern FAST_MUTEX KernelAddressSpaceLock
;
93 extern ULONG KiMaximumDpcQueueDepth
;
94 extern ULONG KiMinimumDpcRate
;
95 extern ULONG KiAdjustDpcThreshold
;
96 extern ULONG KiIdealDpcRate
;
98 /* MACROS *************************************************************************/
101 * On UP machines, we don't actually have a spinlock, we merely raise
105 #define KeInitializeDispatcher() KeInitializeSpinLock(&DispatcherDatabaseLock);
106 #define KeAcquireDispatcherDatabaseLock() KfAcquireSpinLock(&DispatcherDatabaseLock);
107 #define KeAcquireDispatcherDatabaseLockAtDpcLevel() \
108 KeAcquireSpinLockAtDpcLevel (&DispatcherDatabaseLock);
109 #define KeReleaseDispatcherDatabaseLockFromDpcLevel() \
110 KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock);
111 #define KeReleaseDispatcherDatabaseLock(OldIrql) \
112 KiExitDispatcher(OldIrql);
114 #define KeInitializeDispatcher()
115 #define KeAcquireDispatcherDatabaseLock() KeRaiseIrqlToDpcLevel();
116 #define KeReleaseDispatcherDatabaseLock(OldIrql) KiExitDispatcher(OldIrql);
117 #define KeAcquireDispatcherDatabaseLockAtDpcLevel()
118 #define KeReleaseDispatcherDatabaseLockFromDpcLevel()
121 #define AFFINITY_MASK(Id) KiMask32Array[Id]
123 /* The following macro initializes a dispatcher object's header */
124 #define KeInitializeDispatcherHeader(Header, t, s, State) \
126 (Header)->Type = t; \
127 (Header)->Absolute = 0; \
128 (Header)->Inserted = 0; \
129 (Header)->Size = s; \
130 (Header)->SignalState = State; \
131 InitializeListHead(&((Header)->WaitListHead)); \
134 extern KSPIN_LOCK DispatcherDatabaseLock
;
136 #define KeEnterCriticalRegion() \
138 PKTHREAD _Thread = KeGetCurrentThread(); \
139 if (_Thread) _Thread->KernelApcDisable--; \
142 #define KeLeaveCriticalRegion() \
144 PKTHREAD _Thread = KeGetCurrentThread(); \
145 if((_Thread) && (++_Thread->KernelApcDisable == 0)) \
147 if (!IsListEmpty(&_Thread->ApcState.ApcListHead[KernelMode]) && \
148 (_Thread->SpecialApcDisable == 0)) \
150 KiCheckForKernelApcDelivery(); \
155 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
156 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
157 KeBugCheckWithTf(a,b,c,d,e,f)
159 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
160 #define TIMER_OR_EVENT_TYPE 0x7L
162 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
163 #define TIMER_WAIT_BLOCK 0x3L
165 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
167 #define SIZE_OF_FX_REGISTERS 32
169 /* INTERNAL KERNEL FUNCTIONS ************************************************/
171 /* threadsch.c ********************************************************************/
173 /* Thread Scheduler Functions */
175 /* Readies a Thread for Execution. */
178 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
180 /* Readies a Thread for Execution. */
183 KiDispatchThread(ULONG NewThreadStatus
);
185 /* Finds a new thread to run */
194 KiReadyThread(IN PKTHREAD Thread
);
198 KeSuspendThread(PKTHREAD Thread
);
203 IN PKTHREAD CurrentThread
,
204 IN PKTHREAD NewThread
209 KiAdjustQuantumThread(IN PKTHREAD Thread
);
213 KiExitDispatcher(KIRQL OldIrql
);
215 /* gmutex.c ********************************************************************/
219 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
221 /* gate.c **********************************************************************/
225 KeInitializeGate(PKGATE Gate
);
229 KeSignalGateBoostPriority(PKGATE Gate
);
235 KWAIT_REASON WaitReason
,
236 KPROCESSOR_MODE WaitMode
239 /* ipi.c ********************************************************************/
248 /* next file ***************************************************************/
252 KeFindNextRightSetAffinity(
259 DbgBreakPointNoBugCheck(VOID
);
264 struct _KPROFILE
* Profile
,
265 struct _KPROCESS
* Process
,
269 KPROFILE_SOURCE ProfileSource
,
276 struct _KPROFILE
* Profile
,
282 KeStopProfile(struct _KPROFILE
* Profile
);
286 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
290 KeSetIntervalProfile(
291 KPROFILE_SOURCE ProfileSource
,
298 PKTRAP_FRAME TrapFrame
303 KeProfileInterruptWithSource(
304 IN PKTRAP_FRAME TrapFrame
,
305 IN KPROFILE_SOURCE Source
310 KiRosPrintAddress(PVOID Address
);
315 PKTRAP_FRAME TrapFrame
,
323 PVOID DeferredContext
,
324 PVOID SystemArgument1
,
325 PVOID SystemArgument2
331 IN PKPROCESS Process
,
332 IN OUT PKTHREAD Thread
,
333 IN PKSYSTEM_ROUTINE SystemRoutine
,
334 IN PKSTART_ROUTINE StartRoutine
,
335 IN PVOID StartContext
,
350 IN OUT PKTHREAD Thread
,
351 IN PVOID KernelStack
,
352 IN PKSYSTEM_ROUTINE SystemRoutine
,
353 IN PKSTART_ROUTINE StartRoutine
,
354 IN PVOID StartContext
,
363 IN OUT PKTHREAD Thread
370 IN KPROCESSOR_MODE AlertMode
394 KeRundownThread(VOID
);
398 KeReleaseThread(PKTHREAD Thread
);
402 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
414 KiDispatcherObjectWake(
415 DISPATCHER_HEADER
* hdr
,
430 KeDumpStackFrames(PULONG Frame
);
440 IN NTSTATUS WaitStatus
,
441 IN KPRIORITY Increment
447 struct _KPROCESS
*Process
,
450 LARGE_INTEGER DirectoryTableBase
456 IN PKPROCESS Process
,
462 KeSetPriorityAndQuantumProcess(
463 IN PKPROCESS Process
,
464 IN KPRIORITY Priority
,
465 IN UCHAR Quantum OPTIONAL
470 KeForceResumeThread(IN PKTHREAD Thread
);
474 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
480 LARGE_INTEGER DueTime
492 KeGetStackTopThread(struct _ETHREAD
* Thread
);
496 KeContextToTrapFrame(
498 PKEXCEPTION_FRAME ExeptionFrame
,
499 PKTRAP_FRAME TrapFrame
,
501 KPROCESSOR_MODE PreviousMode
507 KPROCESSOR_MODE PreviousMode
,
509 PKTRAP_FRAME TrapFrame
514 KiCheckForKernelApcDelivery(VOID
);
520 IN PLIST_ENTRY Entry
,
527 struct _KPROCESS
* Process
,
534 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
539 IN PKEXCEPTION_FRAME Reserved
,
540 IN PKTRAP_FRAME TrapFrame
,
541 IN PKNORMAL_ROUTINE NormalRoutine
,
542 IN PVOID NormalContext
,
543 IN PVOID SystemArgument1
,
544 IN PVOID SystemArgument2
551 IN KPROCESSOR_MODE PreviousMode
557 struct _KTHREAD
*Thread
,
558 struct _KPROCESS
*Process
,
560 struct _KAPC_STATE
*SavedApcState
566 struct _KPROCESS
*NewProcess
,
567 struct _KPROCESS
*OldProcess
572 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
576 KeRemoveQueueApc(PKAPC Apc
);
580 KiWakeQueue(IN PKQUEUE Queue
);
582 /* INITIALIZATION FUNCTIONS *************************************************/
586 KeInitExceptions(VOID
);
590 KeInitInterrupts(VOID
);
598 KeInitDispatcher(VOID
);
602 KiInitializeSystemClock(VOID
);
606 KiInitializeBugCheck(VOID
);
610 Phase1Initialization(PVOID Context
);
624 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
629 PKAPC_STATE OldState
,
636 KPROFILE_SOURCE Source
,
643 PEXCEPTION_RECORD ExceptionRecord
,
644 PKEXCEPTION_FRAME ExceptionFrame
,
646 KPROCESSOR_MODE PreviousMode
,
652 KeTrapFrameToContext(
653 IN PKTRAP_FRAME TrapFrame
,
654 IN PKEXCEPTION_FRAME ExceptionFrame
,
655 IN OUT PCONTEXT Context
660 KeApplicationProcessorInit(VOID
);
664 KePrepareForApplicationProcessorInit(ULONG id
);
676 KePushAndStackSwitchAndSysRet(
683 KeStackSwitchAndRet(PVOID NewStack
);
689 ULONG BugCheckParameter1
,
690 ULONG BugCheckParameter2
,
691 ULONG BugCheckParameter3
,
692 ULONG BugCheckParameter4
,
698 KeFlushCurrentTb(VOID
);
702 KeRosDumpStackFrames(
709 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
721 KiStartUnexpectedRange(
727 KiEndUnexpectedRange(
746 IN PKTRAP_FRAME TrapFrame
751 Ki386SetupAndExitToV86Mode(
764 IN FLOATING_SAVE_AREA
*SaveArea
769 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */