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 ADDRESS_RANGE KeMemoryMap
[64];
59 extern ULONG KeMemoryMapRangeCount
;
60 extern ULONG_PTR FirstKrnlPhysAddr
;
61 extern ULONG_PTR LastKrnlPhysAddr
;
62 extern ULONG_PTR LastKernelAddress
;
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
;
71 extern ULONG KeI386NpxPresent
;
72 extern ULONG KeI386XMMIPresent
;
73 extern ULONG KeI386FxsrPresent
;
74 extern ULONG KiMXCsrMask
;
75 extern ULONG KeI386CpuType
;
76 extern ULONG KeI386CpuStep
;
78 extern ULONG KeProcessorArchitecture
;
79 extern ULONG KeProcessorLevel
;
80 extern ULONG KeProcessorRevision
;
81 extern ULONG KeFeatureBits
;
82 extern ULONG Ke386GlobalPagesEnabled
;
83 extern BOOLEAN KiI386PentiumLockErrataPresent
;
85 extern PKNODE KeNodeBlock
[1];
86 extern UCHAR KeNumberNodes
;
87 extern UCHAR KeProcessNodeSeed
;
88 extern ETHREAD KiInitialThread
;
89 extern EPROCESS KiInitialProcess
;
90 extern ULONG KiInterruptTemplate
[KINTERRUPT_DISPATCH_CODES
];
91 extern PULONG KiInterruptTemplateObject
;
92 extern PULONG KiInterruptTemplateDispatch
;
93 extern PULONG KiInterruptTemplate2ndDispatch
;
94 extern ULONG KiUnexpectedEntrySize
;
96 extern PVOID Ki386IopmSaveArea
;
97 extern ULONG KeI386EFlagsAndMaskV86
;
98 extern ULONG KeI386EFlagsOrMaskV86
;
99 extern BOOLEAN KeI386VirtualIntExtensions
;
100 extern KIDTENTRY KiIdt
[];
101 extern KGDTENTRY KiBootGdt
[];
102 extern KDESCRIPTOR KiGdtDescriptor
;
103 extern KDESCRIPTOR KiIdtDescriptor
;
104 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 BOOLEAN KeThreadDpcEnable
;
114 extern LARGE_INTEGER KiTimeIncrementReciprocal
;
115 extern UCHAR KiTimeIncrementShiftCount
;
116 extern ULONG KiTimeLimitIsrMicroseconds
;
117 extern ULONG KiServiceLimit
;
118 extern LIST_ENTRY BugcheckCallbackListHead
, BugcheckReasonCallbackListHead
;
119 extern KSPIN_LOCK BugCheckCallbackLock
;
120 extern KDPC KiExpireTimerDpc
;
121 extern KTIMER_TABLE_ENTRY KiTimerTableListHead
[TIMER_TABLE_SIZE
];
122 extern LIST_ENTRY KiTimerListHead
;
123 extern KMUTEX KiGenericCallDpcMutex
;
124 extern LIST_ENTRY KiProfileListHead
, KiProfileSourceListHead
;
125 extern KSPIN_LOCK KiProfileLock
;
126 extern LIST_ENTRY KiProcessListHead
;
127 extern LIST_ENTRY KiProcessInSwapListHead
, KiProcessOutSwapListHead
;
128 extern LIST_ENTRY KiStackInSwapListHead
;
129 extern KEVENT KiSwapEvent
;
130 extern PKPRCB KiProcessorBlock
[];
131 extern ULONG KiMask32Array
[MAXIMUM_PRIORITY
];
132 extern ULONG KiIdleSummary
;
133 extern VOID
KiTrap8(VOID
);
134 extern VOID
KiTrap2(VOID
);
135 extern VOID
KiFastCallEntry(VOID
);
136 extern PVOID KeUserApcDispatcher
;
137 extern PVOID KeUserCallbackDispatcher
;
138 extern PVOID KeUserExceptionDispatcher
;
139 extern PVOID KeRaiseUserExceptionDispatcher
;
141 /* MACROS *************************************************************************/
143 #define AFFINITY_MASK(Id) KiMask32Array[Id]
144 #define PRIORITY_MASK(Id) KiMask32Array[Id]
146 /* The following macro initializes a dispatcher object's header */
147 #define KeInitializeDispatcherHeader(Header, t, s, State) \
149 (Header)->Type = t; \
150 (Header)->Absolute = 0; \
151 (Header)->Inserted = 0; \
152 (Header)->Size = s; \
153 (Header)->SignalState = State; \
154 InitializeListHead(&((Header)->WaitListHead)); \
157 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
158 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
159 KeBugCheckWithTf(a,b,c,d,e,f)
161 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
162 #define TIMER_OR_EVENT_TYPE 0x7L
164 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
165 #define TIMER_WAIT_BLOCK 0x3L
167 /* IOPM Definitions */
168 #define IO_ACCESS_MAP_NONE 0
169 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
170 #define KiComputeIopmOffset(MapNumber) \
171 (MapNumber == IO_ACCESS_MAP_NONE) ? \
172 (USHORT)(sizeof(KTSS)) : \
173 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
175 #define SIZE_OF_FX_REGISTERS 32
177 /* INTERNAL KERNEL FUNCTIONS ************************************************/
179 /* Readies a Thread for Execution. */
182 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
184 /* Readies a Thread for Execution. */
187 KiDispatchThread(ULONG NewThreadStatus
);
189 /* Finds a new thread to run */
205 KiReadyThread(IN PKTHREAD Thread
);
209 KeSuspendThread(PKTHREAD Thread
);
214 IN PKTHREAD CurrentThread
,
215 IN PKTHREAD NewThread
220 KiAdjustQuantumThread(IN PKTHREAD Thread
);
224 KiExitDispatcher(KIRQL OldIrql
);
228 KiDeferredReadyThread(IN PKTHREAD Thread
);
234 IN KAFFINITY Affinity
,
235 IN PBOOLEAN Released
// hack
244 /* gmutex.c ********************************************************************/
248 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
250 /* gate.c **********************************************************************/
254 KeInitializeGate(PKGATE Gate
);
258 KeSignalGateBoostPriority(PKGATE Gate
);
264 KWAIT_REASON WaitReason
,
265 KPROCESSOR_MODE WaitMode
268 /* ipi.c ********************************************************************/
277 /* next file ***************************************************************/
281 KeFindNextRightSetAffinity(
288 DbgBreakPointNoBugCheck(VOID
);
293 struct _KPROFILE
* Profile
,
294 struct _KPROCESS
* Process
,
298 KPROFILE_SOURCE ProfileSource
,
305 struct _KPROFILE
* Profile
,
311 KeStopProfile(struct _KPROFILE
* Profile
);
315 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
319 KeSetIntervalProfile(
320 KPROFILE_SOURCE ProfileSource
,
327 PKTRAP_FRAME TrapFrame
332 KeProfileInterruptWithSource(
333 IN PKTRAP_FRAME TrapFrame
,
334 IN KPROFILE_SOURCE Source
339 KiRosPrintAddress(PVOID Address
);
344 PKTRAP_FRAME TrapFrame
,
352 PVOID DeferredContext
,
353 PVOID SystemArgument1
,
354 PVOID SystemArgument2
360 IN PKPROCESS Process
,
361 IN OUT PKTHREAD Thread
,
362 IN PKSYSTEM_ROUTINE SystemRoutine
,
363 IN PKSTART_ROUTINE StartRoutine
,
364 IN PVOID StartContext
,
379 IN OUT PKTHREAD Thread
,
380 IN PVOID KernelStack
,
381 IN PKSYSTEM_ROUTINE SystemRoutine
,
382 IN PKSTART_ROUTINE StartRoutine
,
383 IN PVOID StartContext
,
392 IN OUT PKTHREAD Thread
399 IN KPROCESSOR_MODE AlertMode
423 KeRundownThread(VOID
);
427 KeReleaseThread(PKTHREAD Thread
);
439 IN PKNORMAL_ROUTINE
*NormalRoutine
,
440 IN PVOID
*NormalContext
,
441 IN PVOID
*SystemArgument1
,
442 IN PVOID
*SystemArgument2
448 IN PVOID NormalContext
,
449 IN PVOID SystemArgument1
,
450 IN PVOID SystemArgument2
455 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
461 IN KPRIORITY Priority
,
462 IN PBOOLEAN Released
// hack
467 KiDispatcherObjectWake(
468 DISPATCHER_HEADER
* hdr
,
476 IN NTSTATUS WaitStatus
490 KeDumpStackFrames(PULONG Frame
);
500 IN NTSTATUS WaitStatus
,
501 IN KPRIORITY Increment
507 struct _KPROCESS
*Process
,
510 PLARGE_INTEGER DirectoryTableBase
,
517 IN PKPROCESS Process
,
523 KeSetPriorityAndQuantumProcess(
524 IN PKPROCESS Process
,
525 IN KPRIORITY Priority
,
526 IN UCHAR Quantum OPTIONAL
531 KeForceResumeThread(IN PKTHREAD Thread
);
535 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
541 LARGE_INTEGER DueTime
553 KeContextToTrapFrame(
555 PKEXCEPTION_FRAME ExeptionFrame
,
556 PKTRAP_FRAME TrapFrame
,
558 KPROCESSOR_MODE PreviousMode
563 KiCheckForKernelApcDelivery(VOID
);
569 IN PLIST_ENTRY Entry
,
576 struct _KPROCESS
* Process
,
583 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
588 IN PKEXCEPTION_FRAME Reserved
,
589 IN PKTRAP_FRAME TrapFrame
,
590 IN PKNORMAL_ROUTINE NormalRoutine
,
591 IN PVOID NormalContext
,
592 IN PVOID SystemArgument1
,
593 IN PVOID SystemArgument2
600 IN KPROCESSOR_MODE PreviousMode
606 struct _KTHREAD
*Thread
,
607 struct _KPROCESS
*Process
,
608 PKLOCK_QUEUE_HANDLE ApcLock
,
609 struct _KAPC_STATE
*SavedApcState
615 struct _KPROCESS
*NewProcess
,
616 struct _KPROCESS
*OldProcess
621 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
625 KeRemoveQueueApc(PKAPC Apc
);
629 KiActivateWaiterQueue(IN PKQUEUE Queue
);
631 /* INITIALIZATION FUNCTIONS *************************************************/
639 KeInitExceptions(VOID
);
643 KeInitInterrupts(VOID
);
647 KiInitializeBugCheck(VOID
);
651 KiInitializeSystemClock(VOID
);
656 IN PLOADER_PARAMETER_BLOCK LoaderBlock
661 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
666 PKAPC_STATE OldState
,
673 KPROFILE_SOURCE Source
,
680 PEXCEPTION_RECORD ExceptionRecord
,
681 PKEXCEPTION_FRAME ExceptionFrame
,
683 KPROCESSOR_MODE PreviousMode
,
689 KeTrapFrameToContext(
690 IN PKTRAP_FRAME TrapFrame
,
691 IN PKEXCEPTION_FRAME ExceptionFrame
,
692 IN OUT PCONTEXT Context
699 ULONG BugCheckParameter1
,
700 ULONG BugCheckParameter2
,
701 ULONG BugCheckParameter3
,
702 ULONG BugCheckParameter4
,
708 KeFlushCurrentTb(VOID
);
712 KeRosDumpStackFrames(
719 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
731 KiStartUnexpectedRange(
737 KiEndUnexpectedRange(
756 IN PKTRAP_FRAME TrapFrame
761 Ki386SetupAndExitToV86Mode(
773 KiInitializeMachineType(
780 IN FLOATING_SAVE_AREA
*SaveArea
804 #define KeHaltProcessor Ke386HaltProcessor
805 #define KeEnableInterrupts Ke386EnableInterrupts
806 #define KeDisableInterrupts Ke386DisableInterrupts
807 #elif defined(_M_PPC)
808 #define KeHaltProcessor KePPCHaltProcessor
809 #define KeEnableInterrupts KePPCEnableInterrupts
810 #define KeDisableInterrupts KePPCDisableInterrupts
817 IN KPRIORITY PriorityBoost
823 IN PVOID
*OutputBuffer
,
824 IN PULONG OutputLength
829 KiGetUserModeStackAddress(
835 Ki386EnableGlobalPage(IN
volatile ULONG_PTR Context
);
839 KiInitializePAT(VOID
);
843 KiInitializeMTRR(IN BOOLEAN FinalCpu
);
847 KiAmdK6InitializeMTRR(VOID
);
851 KiRestoreFastSyscallReturnState(VOID
);
855 Ki386EnableDE(IN ULONG_PTR Context
);
859 Ki386EnableFxsr(IN ULONG_PTR Context
);
863 Ki386EnableXMMIExceptions(IN ULONG_PTR Context
);
867 KiInitMachineDependent(VOID
);
871 KiI386PentiumLockErrataFixup(VOID
);
881 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */