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 _KI_SAMPLE_MAP
42 LARGE_INTEGER PerfStart
;
43 LARGE_INTEGER PerfEnd
;
45 LARGE_INTEGER PerfFreq
;
50 } KI_SAMPLE_MAP
, *PKI_SAMPLE_MAP
;
52 typedef struct _KTIMER_TABLE_ENTRY
56 } KTIMER_TABLE_ENTRY
, *PKTIMER_TABLE_ENTRY
;
58 #define MAX_TIMER_DPCS 16
60 typedef struct _DPC_QUEUE_ENTRY
63 PKDEFERRED_ROUTINE Routine
;
65 } DPC_QUEUE_ENTRY
, *PDPC_QUEUE_ENTRY
;
68 (NTAPI
*PKE_BUGCHECK_UNICODE_TO_ANSI
)(
69 IN PUNICODE_STRING Unicode
,
74 struct _KIRQ_TRAPFRAME
;
77 struct _KEXCEPTION_FRAME
;
79 extern ULONG_PTR MmFreeLdrFirstKrnlPhysAddr
;
80 extern ULONG_PTR MmFreeLdrLastKrnlPhysAddr
;
81 extern ULONG_PTR MmFreeLdrLastKernelAddress
;
83 extern PVOID KeUserApcDispatcher
;
84 extern PVOID KeUserCallbackDispatcher
;
85 extern PVOID KeUserExceptionDispatcher
;
86 extern PVOID KeRaiseUserExceptionDispatcher
;
87 extern LARGE_INTEGER KeBootTime
;
88 extern ULONGLONG KeBootTimeBias
;
89 extern BOOLEAN ExCmosClockIsSane
;
90 extern ULONG KeI386NpxPresent
;
91 extern ULONG KeI386XMMIPresent
;
92 extern ULONG KeI386FxsrPresent
;
93 extern ULONG KiMXCsrMask
;
94 extern ULONG KeI386CpuType
;
95 extern ULONG KeI386CpuStep
;
96 extern ULONG KeProcessorArchitecture
;
97 extern ULONG KeProcessorLevel
;
98 extern ULONG KeProcessorRevision
;
99 extern ULONG KeFeatureBits
;
100 extern ULONG Ke386GlobalPagesEnabled
;
101 extern BOOLEAN KiI386PentiumLockErrataPresent
;
102 extern KNODE KiNode0
;
103 extern PKNODE KeNodeBlock
[1];
104 extern UCHAR KeNumberNodes
;
105 extern UCHAR KeProcessNodeSeed
;
106 extern ETHREAD KiInitialThread
;
107 extern EPROCESS KiInitialProcess
;
108 extern ULONG KiInterruptTemplate
[KINTERRUPT_DISPATCH_CODES
];
109 extern PULONG KiInterruptTemplateObject
;
110 extern PULONG KiInterruptTemplateDispatch
;
111 extern PULONG KiInterruptTemplate2ndDispatch
;
112 extern ULONG KiUnexpectedEntrySize
;
113 extern PVOID Ki386IopmSaveArea
;
114 extern ULONG KeI386EFlagsAndMaskV86
;
115 extern ULONG KeI386EFlagsOrMaskV86
;
116 extern BOOLEAN KeI386VirtualIntExtensions
;
117 extern KIDTENTRY KiIdt
[];
118 extern KGDTENTRY KiBootGdt
[];
119 extern KDESCRIPTOR KiGdtDescriptor
;
120 extern KDESCRIPTOR KiIdtDescriptor
;
121 extern KTSS KiBootTss
;
122 extern UCHAR P0BootStack
[];
123 extern UCHAR KiDoubleFaultStack
[];
124 extern FAST_MUTEX KernelAddressSpaceLock
;
125 extern ULONG KiMaximumDpcQueueDepth
;
126 extern ULONG KiMinimumDpcRate
;
127 extern ULONG KiAdjustDpcThreshold
;
128 extern ULONG KiIdealDpcRate
;
129 extern BOOLEAN KeThreadDpcEnable
;
130 extern LARGE_INTEGER KiTimeIncrementReciprocal
;
131 extern UCHAR KiTimeIncrementShiftCount
;
132 extern ULONG KiTimeLimitIsrMicroseconds
;
133 extern ULONG KiServiceLimit
;
134 extern LIST_ENTRY BugcheckCallbackListHead
, BugcheckReasonCallbackListHead
;
135 extern KSPIN_LOCK BugCheckCallbackLock
;
136 extern KDPC KiTimerExpireDpc
;
137 extern KTIMER_TABLE_ENTRY KiTimerTableListHead
[TIMER_TABLE_SIZE
];
138 extern FAST_MUTEX KiGenericCallDpcMutex
;
139 extern LIST_ENTRY KiProfileListHead
, KiProfileSourceListHead
;
140 extern KSPIN_LOCK KiProfileLock
;
141 extern LIST_ENTRY KiProcessListHead
;
142 extern LIST_ENTRY KiProcessInSwapListHead
, KiProcessOutSwapListHead
;
143 extern LIST_ENTRY KiStackInSwapListHead
;
144 extern KEVENT KiSwapEvent
;
145 extern PKPRCB KiProcessorBlock
[];
146 extern ULONG KiMask32Array
[MAXIMUM_PRIORITY
];
147 extern ULONG KiIdleSummary
;
148 extern VOID
KiTrap8(VOID
);
149 extern VOID
KiTrap2(VOID
);
150 extern VOID
KiFastCallEntry(VOID
);
151 extern PVOID KeUserApcDispatcher
;
152 extern PVOID KeUserCallbackDispatcher
;
153 extern PVOID KeUserExceptionDispatcher
;
154 extern PVOID KeRaiseUserExceptionDispatcher
;
155 extern UCHAR KiDebugRegisterTrapOffsets
[9];
156 extern UCHAR KiDebugRegisterContextOffsets
[9];
158 /* MACROS *************************************************************************/
160 #define AFFINITY_MASK(Id) KiMask32Array[Id]
161 #define PRIORITY_MASK(Id) KiMask32Array[Id]
163 /* The following macro initializes a dispatcher object's header */
164 #define KeInitializeDispatcherHeader(Header, t, s, State) \
166 (Header)->Type = t; \
167 (Header)->Absolute = 0; \
168 (Header)->Inserted = 0; \
169 (Header)->Size = s; \
170 (Header)->SignalState = State; \
171 InitializeListHead(&((Header)->WaitListHead)); \
174 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
175 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
176 KeBugCheckWithTf(a,b,c,d,e,f)
178 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
179 #define TIMER_OR_EVENT_TYPE 0x7L
181 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
182 #define TIMER_WAIT_BLOCK 0x3L
184 /* IOPM Definitions */
185 #define IO_ACCESS_MAP_NONE 0
186 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
187 #define KiComputeIopmOffset(MapNumber) \
188 (MapNumber == IO_ACCESS_MAP_NONE) ? \
189 (USHORT)(sizeof(KTSS)) : \
190 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
192 #define SIZE_OF_FX_REGISTERS 32
194 /* INTERNAL KERNEL FUNCTIONS ************************************************/
196 /* Readies a Thread for Execution. */
199 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
201 /* Readies a Thread for Execution. */
204 KiDispatchThread(ULONG NewThreadStatus
);
206 /* Finds a new thread to run */
222 KeSetDisableBoostThread(
223 IN OUT PKTHREAD Thread
,
229 KeBalanceSetManager(IN PVOID Context
);
233 KiReadyThread(IN PKTHREAD Thread
);
237 KeSuspendThread(PKTHREAD Thread
);
241 KeReadStateThread(IN PKTHREAD Thread
);
246 IN PKTHREAD CurrentThread
,
247 IN PKTHREAD NewThread
252 KiAdjustQuantumThread(IN PKTHREAD Thread
);
256 KiExitDispatcher(KIRQL OldIrql
);
260 KiDeferredReadyThread(IN PKTHREAD Thread
);
266 IN KAFFINITY Affinity
278 OUT ULONG CpuInfo
[4],
293 IN LARGE_INTEGER Interval
300 IN PKSPIN_LOCK_QUEUE LockQueue
303 /* gmutex.c ********************************************************************/
307 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
309 /* gate.c **********************************************************************/
313 KeInitializeGate(PKGATE Gate
);
317 KeSignalGateBoostPriority(PKGATE Gate
);
323 KWAIT_REASON WaitReason
,
324 KPROCESSOR_MODE WaitMode
327 /* ipi.c ********************************************************************/
336 /* next file ***************************************************************/
340 KeFindNextRightSetAffinity(
347 DbgBreakPointNoBugCheck(VOID
);
352 struct _KPROFILE
* Profile
,
353 struct _KPROCESS
* Process
,
357 KPROFILE_SOURCE ProfileSource
,
364 struct _KPROFILE
* Profile
,
370 KeStopProfile(struct _KPROFILE
* Profile
);
374 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
378 KeSetIntervalProfile(
379 KPROFILE_SOURCE ProfileSource
,
386 PKTRAP_FRAME TrapFrame
391 KeProfileInterruptWithSource(
392 IN PKTRAP_FRAME TrapFrame
,
393 IN KPROFILE_SOURCE Source
398 KiRosPrintAddress(PVOID Address
);
403 PKTRAP_FRAME TrapFrame
,
411 PVOID DeferredContext
,
412 PVOID SystemArgument1
,
413 PVOID SystemArgument2
419 IN PKPROCESS Process
,
420 IN OUT PKTHREAD Thread
,
421 IN PKSYSTEM_ROUTINE SystemRoutine
,
422 IN PKSTART_ROUTINE StartRoutine
,
423 IN PVOID StartContext
,
438 IN OUT PKTHREAD Thread
,
439 IN PVOID KernelStack
,
440 IN PKSYSTEM_ROUTINE SystemRoutine
,
441 IN PKSTART_ROUTINE StartRoutine
,
442 IN PVOID StartContext
,
451 IN OUT PKTHREAD Thread
458 IN KPROCESSOR_MODE AlertMode
482 KeRundownThread(VOID
);
486 KeReleaseThread(PKTHREAD Thread
);
498 IN PKNORMAL_ROUTINE
*NormalRoutine
,
499 IN PVOID
*NormalContext
,
500 IN PVOID
*SystemArgument1
,
501 IN PVOID
*SystemArgument2
507 IN PVOID NormalContext
,
508 IN PVOID SystemArgument1
,
509 IN PVOID SystemArgument2
514 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
520 IN KPRIORITY Priority
525 KiDispatcherObjectWake(
526 DISPATCHER_HEADER
* hdr
,
534 IN NTSTATUS WaitStatus
548 KeDumpStackFrames(PULONG Frame
);
558 IN NTSTATUS WaitStatus
,
559 IN KPRIORITY Increment
565 struct _KPROCESS
*Process
,
568 PLARGE_INTEGER DirectoryTableBase
,
575 IN PKPROCESS Process
,
581 KeSetPriorityAndQuantumProcess(
582 IN PKPROCESS Process
,
583 IN KPRIORITY Priority
,
584 IN UCHAR Quantum OPTIONAL
589 KeForceResumeThread(IN PKTHREAD Thread
);
605 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
616 KeContextToTrapFrame(
618 PKEXCEPTION_FRAME ExeptionFrame
,
619 PKTRAP_FRAME TrapFrame
,
621 KPROCESSOR_MODE PreviousMode
626 KiCheckForKernelApcDelivery(VOID
);
632 IN PLIST_ENTRY Entry
,
640 IN PVOID DeferredContext
,
641 IN PVOID SystemArgument1
,
642 IN PVOID SystemArgument2
647 KiComputeTimerTableIndex(
648 IN LONGLONG TimeValue
654 struct _KPROCESS
* Process
,
661 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
666 IN PKEXCEPTION_FRAME Reserved
,
667 IN PKTRAP_FRAME TrapFrame
,
668 IN PKNORMAL_ROUTINE NormalRoutine
,
669 IN PVOID NormalContext
,
670 IN PVOID SystemArgument1
,
671 IN PVOID SystemArgument2
678 IN KPROCESSOR_MODE PreviousMode
684 struct _KTHREAD
*Thread
,
685 struct _KPROCESS
*Process
,
686 PKLOCK_QUEUE_HANDLE ApcLock
,
687 struct _KAPC_STATE
*SavedApcState
693 struct _KPROCESS
*NewProcess
,
694 struct _KPROCESS
*OldProcess
699 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
703 KeRemoveQueueApc(PKAPC Apc
);
707 KiActivateWaiterQueue(IN PKQUEUE Queue
);
709 /* INITIALIZATION FUNCTIONS *************************************************/
717 KeInitExceptions(VOID
);
721 KeInitInterrupts(VOID
);
725 KiInitializeBugCheck(VOID
);
729 KiInitializeSystemClock(VOID
);
734 IN PLOADER_PARAMETER_BLOCK LoaderBlock
739 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
744 PKAPC_STATE OldState
,
751 KPROFILE_SOURCE Source
,
758 PEXCEPTION_RECORD ExceptionRecord
,
759 PKEXCEPTION_FRAME ExceptionFrame
,
761 KPROCESSOR_MODE PreviousMode
,
767 KeTrapFrameToContext(
768 IN PKTRAP_FRAME TrapFrame
,
769 IN PKEXCEPTION_FRAME ExceptionFrame
,
770 IN OUT PCONTEXT Context
777 ULONG BugCheckParameter1
,
778 ULONG BugCheckParameter2
,
779 ULONG BugCheckParameter3
,
780 ULONG BugCheckParameter4
,
786 KeFlushCurrentTb(VOID
);
790 KeRosDumpStackFrames(
798 IN PLARGE_INTEGER NewSystemTime
,
799 OUT PLARGE_INTEGER OldSystemTime
,
800 IN BOOLEAN FixInterruptTime
,
801 IN PLARGE_INTEGER HalTime
814 KiStartUnexpectedRange(
820 KiEndUnexpectedRange(
839 IN PKTRAP_FRAME TrapFrame
844 Ki386SetupAndExitToV86Mode(
856 KiInitializeMachineType(
863 IN FLOATING_SAVE_AREA
*SaveArea
890 IN KPRIORITY PriorityBoost
896 IN PVOID
*OutputBuffer
,
897 IN PULONG OutputLength
902 KiGetUserModeStackAddress(
908 Ki386EnableGlobalPage(IN
volatile ULONG_PTR Context
);
912 KiInitializePAT(VOID
);
916 KiInitializeMTRR(IN BOOLEAN FinalCpu
);
920 KiAmdK6InitializeMTRR(VOID
);
924 KiRestoreFastSyscallReturnState(VOID
);
928 Ki386EnableDE(IN ULONG_PTR Context
);
932 Ki386EnableFxsr(IN ULONG_PTR Context
);
936 Ki386EnableXMMIExceptions(IN ULONG_PTR Context
);
940 KiInitMachineDependent(VOID
);
944 KiI386PentiumLockErrataFixup(VOID
);
954 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */