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 ADDRESS_RANGE KeMemoryMap
[64];
71 extern ULONG KeMemoryMapRangeCount
;
72 extern ULONG_PTR FirstKrnlPhysAddr
;
73 extern ULONG_PTR LastKrnlPhysAddr
;
74 extern ULONG_PTR LastKernelAddress
;
76 extern PVOID KeUserApcDispatcher
;
77 extern PVOID KeUserCallbackDispatcher
;
78 extern PVOID KeUserExceptionDispatcher
;
79 extern PVOID KeRaiseUserExceptionDispatcher
;
80 extern LARGE_INTEGER SystemBootTime
;
81 extern ULONG_PTR KERNEL_BASE
;
82 extern ULONG KeI386NpxPresent
;
83 extern ULONG KeI386XMMIPresent
;
84 extern ULONG KeI386FxsrPresent
;
85 extern ULONG KiMXCsrMask
;
86 extern ULONG KeI386CpuType
;
87 extern ULONG KeI386CpuStep
;
88 extern ULONG KeProcessorArchitecture
;
89 extern ULONG KeProcessorLevel
;
90 extern ULONG KeProcessorRevision
;
91 extern ULONG KeFeatureBits
;
92 extern ULONG Ke386GlobalPagesEnabled
;
93 extern BOOLEAN KiI386PentiumLockErrataPresent
;
95 extern PKNODE KeNodeBlock
[1];
96 extern UCHAR KeNumberNodes
;
97 extern UCHAR KeProcessNodeSeed
;
98 extern ETHREAD KiInitialThread
;
99 extern EPROCESS KiInitialProcess
;
100 extern ULONG KiInterruptTemplate
[KINTERRUPT_DISPATCH_CODES
];
101 extern PULONG KiInterruptTemplateObject
;
102 extern PULONG KiInterruptTemplateDispatch
;
103 extern PULONG KiInterruptTemplate2ndDispatch
;
104 extern ULONG KiUnexpectedEntrySize
;
105 extern PVOID Ki386IopmSaveArea
;
106 extern ULONG KeI386EFlagsAndMaskV86
;
107 extern ULONG KeI386EFlagsOrMaskV86
;
108 extern BOOLEAN KeI386VirtualIntExtensions
;
109 extern KIDTENTRY KiIdt
[];
110 extern KGDTENTRY KiBootGdt
[];
111 extern KDESCRIPTOR KiGdtDescriptor
;
112 extern KDESCRIPTOR KiIdtDescriptor
;
113 extern KTSS KiBootTss
;
114 extern UCHAR P0BootStack
[];
115 extern UCHAR KiDoubleFaultStack
[];
116 extern FAST_MUTEX KernelAddressSpaceLock
;
117 extern ULONG KiMaximumDpcQueueDepth
;
118 extern ULONG KiMinimumDpcRate
;
119 extern ULONG KiAdjustDpcThreshold
;
120 extern ULONG KiIdealDpcRate
;
121 extern BOOLEAN KeThreadDpcEnable
;
122 extern LARGE_INTEGER KiTimeIncrementReciprocal
;
123 extern UCHAR KiTimeIncrementShiftCount
;
124 extern ULONG KiTimeLimitIsrMicroseconds
;
125 extern LIST_ENTRY BugcheckCallbackListHead
, BugcheckReasonCallbackListHead
;
126 extern KSPIN_LOCK BugCheckCallbackLock
;
127 extern KDPC KiExpireTimerDpc
;
128 extern KTIMER_TABLE_ENTRY KiTimerTableListHead
[TIMER_TABLE_SIZE
];
129 extern LIST_ENTRY KiTimerListHead
;
130 extern KMUTEX KiGenericCallDpcMutex
;
131 extern LIST_ENTRY KiProfileListHead
, KiProfileSourceListHead
;
132 extern KSPIN_LOCK KiProfileLock
;
133 extern LIST_ENTRY KiProcessListHead
;
134 extern LIST_ENTRY KiProcessInSwapListHead
, KiProcessOutSwapListHead
;
135 extern LIST_ENTRY KiStackInSwapListHead
;
136 extern KEVENT KiSwapEvent
;
137 extern PKPRCB KiProcessorBlock
[];
138 extern ULONG KiMask32Array
[MAXIMUM_PRIORITY
];
139 extern ULONG KiIdleSummary
;
140 extern VOID
KiTrap8(VOID
);
141 extern VOID
KiTrap2(VOID
);
142 extern VOID
KiFastCallEntry(VOID
);
143 extern PVOID KeUserApcDispatcher
;
144 extern PVOID KeUserCallbackDispatcher
;
145 extern PVOID KeUserExceptionDispatcher
;
146 extern PVOID KeRaiseUserExceptionDispatcher
;
148 /* MACROS *************************************************************************/
150 #define AFFINITY_MASK(Id) KiMask32Array[Id]
151 #define PRIORITY_MASK(Id) KiMask32Array[Id]
153 /* The following macro initializes a dispatcher object's header */
154 #define KeInitializeDispatcherHeader(Header, t, s, State) \
156 (Header)->Type = t; \
157 (Header)->Absolute = 0; \
158 (Header)->Inserted = 0; \
159 (Header)->Size = s; \
160 (Header)->SignalState = State; \
161 InitializeListHead(&((Header)->WaitListHead)); \
164 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
165 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
166 KeBugCheckWithTf(a,b,c,d,e,f)
168 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
169 #define TIMER_OR_EVENT_TYPE 0x7L
171 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
172 #define TIMER_WAIT_BLOCK 0x3L
174 /* IOPM Definitions */
175 #define IO_ACCESS_MAP_NONE 0
176 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
177 #define KiComputeIopmOffset(MapNumber) \
178 (MapNumber == IO_ACCESS_MAP_NONE) ? \
179 (USHORT)(sizeof(KTSS)) : \
180 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
182 #define SIZE_OF_FX_REGISTERS 32
184 /* INTERNAL KERNEL FUNCTIONS ************************************************/
186 /* Readies a Thread for Execution. */
189 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
191 /* Readies a Thread for Execution. */
194 KiDispatchThread(ULONG NewThreadStatus
);
196 /* Finds a new thread to run */
212 KiReadyThread(IN PKTHREAD Thread
);
216 KeSuspendThread(PKTHREAD Thread
);
221 IN PKTHREAD CurrentThread
,
222 IN PKTHREAD NewThread
227 KiAdjustQuantumThread(IN PKTHREAD Thread
);
231 KiExitDispatcher(KIRQL OldIrql
);
235 KiDeferredReadyThread(IN PKTHREAD Thread
);
241 IN KAFFINITY Affinity
,
242 IN PBOOLEAN Released
// hack
251 /* gmutex.c ********************************************************************/
255 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
257 /* gate.c **********************************************************************/
261 KeInitializeGate(PKGATE Gate
);
265 KeSignalGateBoostPriority(PKGATE Gate
);
271 KWAIT_REASON WaitReason
,
272 KPROCESSOR_MODE WaitMode
275 /* ipi.c ********************************************************************/
284 /* next file ***************************************************************/
288 KeFindNextRightSetAffinity(
295 DbgBreakPointNoBugCheck(VOID
);
300 struct _KPROFILE
* Profile
,
301 struct _KPROCESS
* Process
,
305 KPROFILE_SOURCE ProfileSource
,
312 struct _KPROFILE
* Profile
,
318 KeStopProfile(struct _KPROFILE
* Profile
);
322 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
326 KeSetIntervalProfile(
327 KPROFILE_SOURCE ProfileSource
,
334 PKTRAP_FRAME TrapFrame
339 KeProfileInterruptWithSource(
340 IN PKTRAP_FRAME TrapFrame
,
341 IN KPROFILE_SOURCE Source
346 KiRosPrintAddress(PVOID Address
);
351 PKTRAP_FRAME TrapFrame
,
359 PVOID DeferredContext
,
360 PVOID SystemArgument1
,
361 PVOID SystemArgument2
367 IN PKPROCESS Process
,
368 IN OUT PKTHREAD Thread
,
369 IN PKSYSTEM_ROUTINE SystemRoutine
,
370 IN PKSTART_ROUTINE StartRoutine
,
371 IN PVOID StartContext
,
386 IN OUT PKTHREAD Thread
,
387 IN PVOID KernelStack
,
388 IN PKSYSTEM_ROUTINE SystemRoutine
,
389 IN PKSTART_ROUTINE StartRoutine
,
390 IN PVOID StartContext
,
399 IN OUT PKTHREAD Thread
406 IN KPROCESSOR_MODE AlertMode
430 KeRundownThread(VOID
);
434 KeReleaseThread(PKTHREAD Thread
);
446 IN PKNORMAL_ROUTINE
*NormalRoutine
,
447 IN PVOID
*NormalContext
,
448 IN PVOID
*SystemArgument1
,
449 IN PVOID
*SystemArgument2
455 IN PVOID NormalContext
,
456 IN PVOID SystemArgument1
,
457 IN PVOID SystemArgument2
462 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
468 IN KPRIORITY Priority
,
469 IN PBOOLEAN Released
// hack
474 KiDispatcherObjectWake(
475 DISPATCHER_HEADER
* hdr
,
483 IN NTSTATUS WaitStatus
497 KeDumpStackFrames(PULONG Frame
);
507 IN NTSTATUS WaitStatus
,
508 IN KPRIORITY Increment
514 struct _KPROCESS
*Process
,
517 PLARGE_INTEGER DirectoryTableBase
,
524 IN PKPROCESS Process
,
530 KeSetPriorityAndQuantumProcess(
531 IN PKPROCESS Process
,
532 IN KPRIORITY Priority
,
533 IN UCHAR Quantum OPTIONAL
538 KeForceResumeThread(IN PKTHREAD Thread
);
542 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
548 LARGE_INTEGER DueTime
560 KeContextToTrapFrame(
562 PKEXCEPTION_FRAME ExeptionFrame
,
563 PKTRAP_FRAME TrapFrame
,
565 KPROCESSOR_MODE PreviousMode
570 KiCheckForKernelApcDelivery(VOID
);
576 IN PLIST_ENTRY Entry
,
583 struct _KPROCESS
* Process
,
590 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
595 IN PKEXCEPTION_FRAME Reserved
,
596 IN PKTRAP_FRAME TrapFrame
,
597 IN PKNORMAL_ROUTINE NormalRoutine
,
598 IN PVOID NormalContext
,
599 IN PVOID SystemArgument1
,
600 IN PVOID SystemArgument2
607 IN KPROCESSOR_MODE PreviousMode
613 struct _KTHREAD
*Thread
,
614 struct _KPROCESS
*Process
,
615 PKLOCK_QUEUE_HANDLE ApcLock
,
616 struct _KAPC_STATE
*SavedApcState
622 struct _KPROCESS
*NewProcess
,
623 struct _KPROCESS
*OldProcess
628 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
632 KeRemoveQueueApc(PKAPC Apc
);
636 KiActivateWaiterQueue(IN PKQUEUE Queue
);
638 /* INITIALIZATION FUNCTIONS *************************************************/
646 KeInitExceptions(VOID
);
650 KeInitInterrupts(VOID
);
654 KiInitializeBugCheck(VOID
);
658 KiInitializeSystemClock(VOID
);
663 IN PLOADER_PARAMETER_BLOCK LoaderBlock
668 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
673 PKAPC_STATE OldState
,
680 KPROFILE_SOURCE Source
,
687 PEXCEPTION_RECORD ExceptionRecord
,
688 PKEXCEPTION_FRAME ExceptionFrame
,
690 KPROCESSOR_MODE PreviousMode
,
696 KeTrapFrameToContext(
697 IN PKTRAP_FRAME TrapFrame
,
698 IN PKEXCEPTION_FRAME ExceptionFrame
,
699 IN OUT PCONTEXT Context
706 ULONG BugCheckParameter1
,
707 ULONG BugCheckParameter2
,
708 ULONG BugCheckParameter3
,
709 ULONG BugCheckParameter4
,
715 KeFlushCurrentTb(VOID
);
719 KeRosDumpStackFrames(
726 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
738 KiStartUnexpectedRange(
744 KiEndUnexpectedRange(
763 IN PKTRAP_FRAME TrapFrame
768 Ki386SetupAndExitToV86Mode(
780 KiInitializeMachineType(
787 IN FLOATING_SAVE_AREA
*SaveArea
814 IN KPRIORITY PriorityBoost
820 IN PVOID
*OutputBuffer
,
821 IN PULONG OutputLength
826 KiGetUserModeStackAddress(
832 Ki386EnableGlobalPage(IN
volatile ULONG_PTR Context
);
836 KiInitializePAT(VOID
);
840 KiInitializeMTRR(IN BOOLEAN FinalCpu
);
844 KiAmdK6InitializeMTRR(VOID
);
848 KiRestoreFastSyscallReturnState(VOID
);
852 Ki386EnableDE(IN ULONG_PTR Context
);
856 Ki386EnableFxsr(IN ULONG_PTR Context
);
860 Ki386EnableXMMIExceptions(IN ULONG_PTR Context
);
864 KiInitMachineDependent(VOID
);
868 KiI386PentiumLockErrataFixup(VOID
);
878 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */