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 typedef enum _CONNECT_TYPE
27 } CONNECT_TYPE
, *PCONNECT_TYPE
;
29 typedef struct _DISPATCH_INFO
32 PKINTERRUPT Interrupt
;
33 PKINTERRUPT_ROUTINE NoDispatch
;
34 PKINTERRUPT_ROUTINE InterruptDispatch
;
35 PKINTERRUPT_ROUTINE FloatingDispatch
;
36 PKINTERRUPT_ROUTINE ChainedDispatch
;
37 PKINTERRUPT_ROUTINE
*FlatDispatch
;
38 } DISPATCH_INFO
, *PDISPATCH_INFO
;
40 typedef struct _KTIMER_TABLE_ENTRY
44 } KTIMER_TABLE_ENTRY
, *PKTIMER_TABLE_ENTRY
;
47 (NTAPI
*PKE_BUGCHECK_UNICODE_TO_ANSI
)(
48 IN PUNICODE_STRING Unicode
,
53 struct _KIRQ_TRAPFRAME
;
56 struct _KEXCEPTION_FRAME
;
58 extern ULONG_PTR MmFreeLdrFirstKrnlPhysAddr
;
59 extern ULONG_PTR MmFreeLdrLastKrnlPhysAddr
;
60 extern ULONG_PTR MmFreeLdrLastKernelAddress
;
62 extern PVOID KeUserApcDispatcher
;
63 extern PVOID KeUserCallbackDispatcher
;
64 extern PVOID KeUserExceptionDispatcher
;
65 extern PVOID KeRaiseUserExceptionDispatcher
;
66 extern LARGE_INTEGER KeBootTime
;
67 extern ULONG KeI386NpxPresent
;
68 extern ULONG KeI386XMMIPresent
;
69 extern ULONG KeI386FxsrPresent
;
70 extern ULONG KiMXCsrMask
;
71 extern ULONG KeI386CpuType
;
72 extern ULONG KeI386CpuStep
;
73 extern ULONG KeProcessorArchitecture
;
74 extern ULONG KeProcessorLevel
;
75 extern ULONG KeProcessorRevision
;
76 extern ULONG KeFeatureBits
;
77 extern ULONG Ke386GlobalPagesEnabled
;
78 extern BOOLEAN KiI386PentiumLockErrataPresent
;
80 extern PKNODE KeNodeBlock
[1];
81 extern UCHAR KeNumberNodes
;
82 extern UCHAR KeProcessNodeSeed
;
83 extern ETHREAD KiInitialThread
;
84 extern EPROCESS KiInitialProcess
;
85 extern ULONG KiInterruptTemplate
[KINTERRUPT_DISPATCH_CODES
];
86 extern PULONG KiInterruptTemplateObject
;
87 extern PULONG KiInterruptTemplateDispatch
;
88 extern PULONG KiInterruptTemplate2ndDispatch
;
89 extern ULONG KiUnexpectedEntrySize
;
90 extern PVOID Ki386IopmSaveArea
;
91 extern ULONG KeI386EFlagsAndMaskV86
;
92 extern ULONG KeI386EFlagsOrMaskV86
;
93 extern BOOLEAN KeI386VirtualIntExtensions
;
94 extern KIDTENTRY KiIdt
[];
95 extern KGDTENTRY KiBootGdt
[];
96 extern KDESCRIPTOR KiGdtDescriptor
;
97 extern KDESCRIPTOR KiIdtDescriptor
;
98 extern KTSS KiBootTss
;
99 extern UCHAR P0BootStack
[];
100 extern UCHAR KiDoubleFaultStack
[];
101 extern FAST_MUTEX KernelAddressSpaceLock
;
102 extern ULONG KiMaximumDpcQueueDepth
;
103 extern ULONG KiMinimumDpcRate
;
104 extern ULONG KiAdjustDpcThreshold
;
105 extern ULONG KiIdealDpcRate
;
106 extern BOOLEAN KeThreadDpcEnable
;
107 extern LARGE_INTEGER KiTimeIncrementReciprocal
;
108 extern UCHAR KiTimeIncrementShiftCount
;
109 extern ULONG KiTimeLimitIsrMicroseconds
;
110 extern ULONG KiServiceLimit
;
111 extern LIST_ENTRY BugcheckCallbackListHead
, BugcheckReasonCallbackListHead
;
112 extern KSPIN_LOCK BugCheckCallbackLock
;
113 extern KDPC KiExpireTimerDpc
;
114 extern KTIMER_TABLE_ENTRY KiTimerTableListHead
[TIMER_TABLE_SIZE
];
115 extern LIST_ENTRY KiTimerListHead
;
116 extern KMUTEX KiGenericCallDpcMutex
;
117 extern LIST_ENTRY KiProfileListHead
, KiProfileSourceListHead
;
118 extern KSPIN_LOCK KiProfileLock
;
119 extern LIST_ENTRY KiProcessListHead
;
120 extern LIST_ENTRY KiProcessInSwapListHead
, KiProcessOutSwapListHead
;
121 extern LIST_ENTRY KiStackInSwapListHead
;
122 extern KEVENT KiSwapEvent
;
123 extern PKPRCB KiProcessorBlock
[];
124 extern ULONG KiMask32Array
[MAXIMUM_PRIORITY
];
125 extern ULONG KiIdleSummary
;
126 extern VOID
KiTrap8(VOID
);
127 extern VOID
KiTrap2(VOID
);
128 extern VOID
KiFastCallEntry(VOID
);
129 extern PVOID KeUserApcDispatcher
;
130 extern PVOID KeUserCallbackDispatcher
;
131 extern PVOID KeUserExceptionDispatcher
;
132 extern PVOID KeRaiseUserExceptionDispatcher
;
133 extern UCHAR KiDebugRegisterTrapOffsets
[9];
134 extern UCHAR KiDebugRegisterContextOffsets
[9];
136 /* MACROS *************************************************************************/
138 #define AFFINITY_MASK(Id) KiMask32Array[Id]
139 #define PRIORITY_MASK(Id) KiMask32Array[Id]
141 /* The following macro initializes a dispatcher object's header */
142 #define KeInitializeDispatcherHeader(Header, t, s, State) \
144 (Header)->Type = t; \
145 (Header)->Absolute = 0; \
146 (Header)->Inserted = 0; \
147 (Header)->Size = s; \
148 (Header)->SignalState = State; \
149 InitializeListHead(&((Header)->WaitListHead)); \
152 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
153 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
154 KeBugCheckWithTf(a,b,c,d,e,f)
156 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
157 #define TIMER_OR_EVENT_TYPE 0x7L
159 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
160 #define TIMER_WAIT_BLOCK 0x3L
162 /* IOPM Definitions */
163 #define IO_ACCESS_MAP_NONE 0
164 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
165 #define KiComputeIopmOffset(MapNumber) \
166 (MapNumber == IO_ACCESS_MAP_NONE) ? \
167 (USHORT)(sizeof(KTSS)) : \
168 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
170 #define SIZE_OF_FX_REGISTERS 32
172 /* INTERNAL KERNEL FUNCTIONS ************************************************/
174 /* Readies a Thread for Execution. */
177 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
179 /* Readies a Thread for Execution. */
182 KiDispatchThread(ULONG NewThreadStatus
);
184 /* Finds a new thread to run */
200 KiReadyThread(IN PKTHREAD Thread
);
204 KeSuspendThread(PKTHREAD Thread
);
209 IN PKTHREAD CurrentThread
,
210 IN PKTHREAD NewThread
215 KiAdjustQuantumThread(IN PKTHREAD Thread
);
219 KiExitDispatcher(KIRQL OldIrql
);
223 KiDeferredReadyThread(IN PKTHREAD Thread
);
229 IN KAFFINITY Affinity
238 /* gmutex.c ********************************************************************/
242 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
244 /* gate.c **********************************************************************/
248 KeInitializeGate(PKGATE Gate
);
252 KeSignalGateBoostPriority(PKGATE Gate
);
258 KWAIT_REASON WaitReason
,
259 KPROCESSOR_MODE WaitMode
262 /* ipi.c ********************************************************************/
271 /* next file ***************************************************************/
275 KeFindNextRightSetAffinity(
282 DbgBreakPointNoBugCheck(VOID
);
287 struct _KPROFILE
* Profile
,
288 struct _KPROCESS
* Process
,
292 KPROFILE_SOURCE ProfileSource
,
299 struct _KPROFILE
* Profile
,
305 KeStopProfile(struct _KPROFILE
* Profile
);
309 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
313 KeSetIntervalProfile(
314 KPROFILE_SOURCE ProfileSource
,
321 PKTRAP_FRAME TrapFrame
326 KeProfileInterruptWithSource(
327 IN PKTRAP_FRAME TrapFrame
,
328 IN KPROFILE_SOURCE Source
333 KiRosPrintAddress(PVOID Address
);
338 PKTRAP_FRAME TrapFrame
,
346 PVOID DeferredContext
,
347 PVOID SystemArgument1
,
348 PVOID SystemArgument2
354 IN PKPROCESS Process
,
355 IN OUT PKTHREAD Thread
,
356 IN PKSYSTEM_ROUTINE SystemRoutine
,
357 IN PKSTART_ROUTINE StartRoutine
,
358 IN PVOID StartContext
,
373 IN OUT PKTHREAD Thread
,
374 IN PVOID KernelStack
,
375 IN PKSYSTEM_ROUTINE SystemRoutine
,
376 IN PKSTART_ROUTINE StartRoutine
,
377 IN PVOID StartContext
,
386 IN OUT PKTHREAD Thread
393 IN KPROCESSOR_MODE AlertMode
417 KeRundownThread(VOID
);
421 KeReleaseThread(PKTHREAD Thread
);
433 IN PKNORMAL_ROUTINE
*NormalRoutine
,
434 IN PVOID
*NormalContext
,
435 IN PVOID
*SystemArgument1
,
436 IN PVOID
*SystemArgument2
442 IN PVOID NormalContext
,
443 IN PVOID SystemArgument1
,
444 IN PVOID SystemArgument2
449 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
455 IN KPRIORITY Priority
,
456 IN PBOOLEAN Released
// hack
461 KiDispatcherObjectWake(
462 DISPATCHER_HEADER
* hdr
,
470 IN NTSTATUS WaitStatus
484 KeDumpStackFrames(PULONG Frame
);
494 IN NTSTATUS WaitStatus
,
495 IN KPRIORITY Increment
501 struct _KPROCESS
*Process
,
504 PLARGE_INTEGER DirectoryTableBase
,
511 IN PKPROCESS Process
,
517 KeSetPriorityAndQuantumProcess(
518 IN PKPROCESS Process
,
519 IN KPRIORITY Priority
,
520 IN UCHAR Quantum OPTIONAL
525 KeForceResumeThread(IN PKTHREAD Thread
);
541 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
547 LARGE_INTEGER DueTime
559 KeContextToTrapFrame(
561 PKEXCEPTION_FRAME ExeptionFrame
,
562 PKTRAP_FRAME TrapFrame
,
564 KPROCESSOR_MODE PreviousMode
569 KiCheckForKernelApcDelivery(VOID
);
575 IN PLIST_ENTRY Entry
,
582 struct _KPROCESS
* Process
,
589 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
594 IN PKEXCEPTION_FRAME Reserved
,
595 IN PKTRAP_FRAME TrapFrame
,
596 IN PKNORMAL_ROUTINE NormalRoutine
,
597 IN PVOID NormalContext
,
598 IN PVOID SystemArgument1
,
599 IN PVOID SystemArgument2
606 IN KPROCESSOR_MODE PreviousMode
612 struct _KTHREAD
*Thread
,
613 struct _KPROCESS
*Process
,
614 PKLOCK_QUEUE_HANDLE ApcLock
,
615 struct _KAPC_STATE
*SavedApcState
621 struct _KPROCESS
*NewProcess
,
622 struct _KPROCESS
*OldProcess
627 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
631 KeRemoveQueueApc(PKAPC Apc
);
635 KiActivateWaiterQueue(IN PKQUEUE Queue
);
637 /* INITIALIZATION FUNCTIONS *************************************************/
645 KeInitExceptions(VOID
);
649 KeInitInterrupts(VOID
);
653 KiInitializeBugCheck(VOID
);
657 KiInitializeSystemClock(VOID
);
662 IN PLOADER_PARAMETER_BLOCK LoaderBlock
667 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
672 PKAPC_STATE OldState
,
679 KPROFILE_SOURCE Source
,
686 PEXCEPTION_RECORD ExceptionRecord
,
687 PKEXCEPTION_FRAME ExceptionFrame
,
689 KPROCESSOR_MODE PreviousMode
,
695 KeTrapFrameToContext(
696 IN PKTRAP_FRAME TrapFrame
,
697 IN PKEXCEPTION_FRAME ExceptionFrame
,
698 IN OUT PCONTEXT Context
705 ULONG BugCheckParameter1
,
706 ULONG BugCheckParameter2
,
707 ULONG BugCheckParameter3
,
708 ULONG BugCheckParameter4
,
714 KeFlushCurrentTb(VOID
);
718 KeRosDumpStackFrames(
725 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
737 KiStartUnexpectedRange(
743 KiEndUnexpectedRange(
762 IN PKTRAP_FRAME TrapFrame
767 Ki386SetupAndExitToV86Mode(
779 KiInitializeMachineType(
786 IN FLOATING_SAVE_AREA
*SaveArea
813 IN KPRIORITY PriorityBoost
819 IN PVOID
*OutputBuffer
,
820 IN PULONG OutputLength
825 KiGetUserModeStackAddress(
831 Ki386EnableGlobalPage(IN
volatile ULONG_PTR Context
);
835 KiInitializePAT(VOID
);
839 KiInitializeMTRR(IN BOOLEAN FinalCpu
);
843 KiAmdK6InitializeMTRR(VOID
);
847 KiRestoreFastSyscallReturnState(VOID
);
851 Ki386EnableDE(IN ULONG_PTR Context
);
855 Ki386EnableFxsr(IN ULONG_PTR Context
);
859 Ki386EnableXMMIExceptions(IN ULONG_PTR Context
);
863 KiInitMachineDependent(VOID
);
867 KiI386PentiumLockErrataFixup(VOID
);
877 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */