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 extern ULONG_PTR MmFreeLdrFirstKrnlPhysAddr
;
75 extern ULONG_PTR MmFreeLdrLastKrnlPhysAddr
;
76 extern ULONG_PTR MmFreeLdrLastKernelAddress
;
78 extern PVOID KeUserApcDispatcher
;
79 extern PVOID KeUserCallbackDispatcher
;
80 extern PVOID KeUserExceptionDispatcher
;
81 extern PVOID KeRaiseUserExceptionDispatcher
;
82 extern LARGE_INTEGER KeBootTime
;
83 extern ULONGLONG KeBootTimeBias
;
84 extern BOOLEAN ExCmosClockIsSane
;
85 extern ULONG KeI386NpxPresent
;
86 extern ULONG KeI386XMMIPresent
;
87 extern ULONG KeI386FxsrPresent
;
88 extern ULONG KiMXCsrMask
;
89 extern ULONG KeI386CpuType
;
90 extern ULONG KeI386CpuStep
;
91 extern ULONG KeProcessorArchitecture
;
92 extern ULONG KeProcessorLevel
;
93 extern ULONG KeProcessorRevision
;
94 extern ULONG KeFeatureBits
;
95 extern ULONG Ke386GlobalPagesEnabled
;
96 extern BOOLEAN KiI386PentiumLockErrataPresent
;
98 extern PKNODE KeNodeBlock
[1];
99 extern UCHAR KeNumberNodes
;
100 extern UCHAR KeProcessNodeSeed
;
101 extern ETHREAD KiInitialThread
;
102 extern EPROCESS KiInitialProcess
;
103 extern ULONG KiInterruptTemplate
[KINTERRUPT_DISPATCH_CODES
];
104 extern PULONG KiInterruptTemplateObject
;
105 extern PULONG KiInterruptTemplateDispatch
;
106 extern PULONG KiInterruptTemplate2ndDispatch
;
107 extern ULONG KiUnexpectedEntrySize
;
108 extern PVOID Ki386IopmSaveArea
;
109 extern ULONG KeI386EFlagsAndMaskV86
;
110 extern ULONG KeI386EFlagsOrMaskV86
;
111 extern BOOLEAN KeI386VirtualIntExtensions
;
112 extern KIDTENTRY KiIdt
[];
113 extern KGDTENTRY KiBootGdt
[];
114 extern KDESCRIPTOR KiGdtDescriptor
;
115 extern KDESCRIPTOR KiIdtDescriptor
;
116 extern KTSS KiBootTss
;
117 extern UCHAR P0BootStack
[];
118 extern UCHAR KiDoubleFaultStack
[];
119 extern FAST_MUTEX KernelAddressSpaceLock
;
120 extern ULONG KiMaximumDpcQueueDepth
;
121 extern ULONG KiMinimumDpcRate
;
122 extern ULONG KiAdjustDpcThreshold
;
123 extern ULONG KiIdealDpcRate
;
124 extern BOOLEAN KeThreadDpcEnable
;
125 extern LARGE_INTEGER KiTimeIncrementReciprocal
;
126 extern UCHAR KiTimeIncrementShiftCount
;
127 extern ULONG KiTimeLimitIsrMicroseconds
;
128 extern ULONG KiServiceLimit
;
129 extern LIST_ENTRY BugcheckCallbackListHead
, BugcheckReasonCallbackListHead
;
130 extern KSPIN_LOCK BugCheckCallbackLock
;
131 extern KDPC KiTimerExpireDpc
;
132 extern KTIMER_TABLE_ENTRY KiTimerTableListHead
[TIMER_TABLE_SIZE
];
133 extern FAST_MUTEX KiGenericCallDpcMutex
;
134 extern LIST_ENTRY KiProfileListHead
, KiProfileSourceListHead
;
135 extern KSPIN_LOCK KiProfileLock
;
136 extern LIST_ENTRY KiProcessListHead
;
137 extern LIST_ENTRY KiProcessInSwapListHead
, KiProcessOutSwapListHead
;
138 extern LIST_ENTRY KiStackInSwapListHead
;
139 extern KEVENT KiSwapEvent
;
140 extern PKPRCB KiProcessorBlock
[];
141 extern ULONG KiMask32Array
[MAXIMUM_PRIORITY
];
142 extern ULONG KiIdleSummary
;
143 extern VOID
KiTrap8(VOID
);
144 extern VOID
KiTrap2(VOID
);
145 extern VOID
KiFastCallEntry(VOID
);
146 extern PVOID KeUserApcDispatcher
;
147 extern PVOID KeUserCallbackDispatcher
;
148 extern PVOID KeUserExceptionDispatcher
;
149 extern PVOID KeRaiseUserExceptionDispatcher
;
150 extern UCHAR KiDebugRegisterTrapOffsets
[9];
151 extern UCHAR KiDebugRegisterContextOffsets
[9];
152 extern ULONG KiFreezeFlag
;
154 /* MACROS *************************************************************************/
156 #define AFFINITY_MASK(Id) KiMask32Array[Id]
157 #define PRIORITY_MASK(Id) KiMask32Array[Id]
159 /* The following macro initializes a dispatcher object's header */
160 #define KeInitializeDispatcherHeader(Header, t, s, State) \
162 (Header)->Type = t; \
163 (Header)->Absolute = 0; \
164 (Header)->Inserted = 0; \
165 (Header)->Size = s; \
166 (Header)->SignalState = State; \
167 InitializeListHead(&((Header)->WaitListHead)); \
170 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
171 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
172 KeBugCheckWithTf(a,b,c,d,e,f)
174 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
175 #define TIMER_OR_EVENT_TYPE 0x7L
177 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
178 #define TIMER_WAIT_BLOCK 0x3L
180 /* IOPM Definitions */
181 #define IO_ACCESS_MAP_NONE 0
182 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
183 #define KiComputeIopmOffset(MapNumber) \
184 (MapNumber == IO_ACCESS_MAP_NONE) ? \
185 (USHORT)(sizeof(KTSS)) : \
186 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
188 #define SIZE_OF_FX_REGISTERS 32
190 /* INTERNAL KERNEL FUNCTIONS ************************************************/
192 /* Finds a new thread to run */
208 KeSetDisableBoostThread(
209 IN OUT PKTHREAD Thread
,
215 KeBalanceSetManager(IN PVOID Context
);
219 KiReadyThread(IN PKTHREAD Thread
);
223 KeSuspendThread(PKTHREAD Thread
);
227 KeReadStateThread(IN PKTHREAD Thread
);
232 IN PKTHREAD CurrentThread
,
233 IN PKTHREAD NewThread
238 KiAdjustQuantumThread(IN PKTHREAD Thread
);
242 KiExitDispatcher(KIRQL OldIrql
);
246 KiDeferredReadyThread(IN PKTHREAD Thread
);
252 IN KAFFINITY Affinity
264 OUT ULONG CpuInfo
[4],
279 IN LARGE_INTEGER Interval
286 IN PKSPIN_LOCK_QUEUE LockQueue
289 /* gmutex.c ********************************************************************/
293 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
295 /* gate.c **********************************************************************/
299 KeInitializeGate(PKGATE Gate
);
303 KeSignalGateBoostPriority(PKGATE Gate
);
309 KWAIT_REASON WaitReason
,
310 KPROCESSOR_MODE WaitMode
313 /* ipi.c ********************************************************************/
322 /* next file ***************************************************************/
326 KeFindNextRightSetAffinity(
333 DbgBreakPointNoBugCheck(VOID
);
338 struct _KPROFILE
* Profile
,
339 struct _KPROCESS
* Process
,
343 KPROFILE_SOURCE ProfileSource
,
350 struct _KPROFILE
* Profile
,
356 KeStopProfile(struct _KPROFILE
* Profile
);
360 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
364 KeSetIntervalProfile(
365 KPROFILE_SOURCE ProfileSource
,
372 PKTRAP_FRAME TrapFrame
377 KeProfileInterruptWithSource(
378 IN PKTRAP_FRAME TrapFrame
,
379 IN KPROFILE_SOURCE Source
385 PKTRAP_FRAME TrapFrame
,
393 PVOID DeferredContext
,
394 PVOID SystemArgument1
,
395 PVOID SystemArgument2
401 IN PKPROCESS Process
,
402 IN OUT PKTHREAD Thread
,
403 IN PKSYSTEM_ROUTINE SystemRoutine
,
404 IN PKSTART_ROUTINE StartRoutine
,
405 IN PVOID StartContext
,
420 IN OUT PKTHREAD Thread
,
421 IN PVOID KernelStack
,
422 IN PKSYSTEM_ROUTINE SystemRoutine
,
423 IN PKSTART_ROUTINE StartRoutine
,
424 IN PVOID StartContext
,
433 IN OUT PKTHREAD Thread
440 IN KPROCESSOR_MODE AlertMode
464 KeRundownThread(VOID
);
468 KeReleaseThread(PKTHREAD Thread
);
480 IN PKNORMAL_ROUTINE
*NormalRoutine
,
481 IN PVOID
*NormalContext
,
482 IN PVOID
*SystemArgument1
,
483 IN PVOID
*SystemArgument2
489 IN PVOID NormalContext
,
490 IN PVOID SystemArgument1
,
491 IN PVOID SystemArgument2
496 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
502 IN KPRIORITY Priority
509 IN NTSTATUS WaitStatus
514 KeDumpStackFrames(PULONG Frame
);
524 IN NTSTATUS WaitStatus
,
525 IN KPRIORITY Increment
531 struct _KPROCESS
*Process
,
534 PLARGE_INTEGER DirectoryTableBase
,
541 IN PKPROCESS Process
,
547 KeSetPriorityAndQuantumProcess(
548 IN PKPROCESS Process
,
549 IN KPRIORITY Priority
,
550 IN UCHAR Quantum OPTIONAL
555 KeForceResumeThread(IN PKTHREAD Thread
);
571 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
582 KeContextToTrapFrame(
584 PKEXCEPTION_FRAME ExeptionFrame
,
585 PKTRAP_FRAME TrapFrame
,
587 KPROCESSOR_MODE PreviousMode
592 KiCheckForKernelApcDelivery(VOID
);
598 IN PLIST_ENTRY Entry
,
606 IN PVOID DeferredContext
,
607 IN PVOID SystemArgument1
,
608 IN PVOID SystemArgument2
613 KiComputeTimerTableIndex(
614 IN LONGLONG TimeValue
620 struct _KPROCESS
* Process
,
627 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
632 IN PKEXCEPTION_FRAME Reserved
,
633 IN PKTRAP_FRAME TrapFrame
,
634 IN PKNORMAL_ROUTINE NormalRoutine
,
635 IN PVOID NormalContext
,
636 IN PVOID SystemArgument1
,
637 IN PVOID SystemArgument2
644 IN KPROCESSOR_MODE PreviousMode
650 struct _KTHREAD
*Thread
,
651 struct _KPROCESS
*Process
,
652 PKLOCK_QUEUE_HANDLE ApcLock
,
653 struct _KAPC_STATE
*SavedApcState
659 struct _KPROCESS
*NewProcess
,
660 struct _KPROCESS
*OldProcess
665 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
669 KeRemoveQueueApc(PKAPC Apc
);
673 KiActivateWaiterQueue(IN PKQUEUE Queue
);
675 /* INITIALIZATION FUNCTIONS *************************************************/
683 KeInitExceptions(VOID
);
687 KeInitInterrupts(VOID
);
691 KiInitializeBugCheck(VOID
);
696 IN PLOADER_PARAMETER_BLOCK LoaderBlock
701 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
706 PKAPC_STATE OldState
,
713 KPROFILE_SOURCE Source
,
720 PEXCEPTION_RECORD ExceptionRecord
,
721 PKEXCEPTION_FRAME ExceptionFrame
,
723 KPROCESSOR_MODE PreviousMode
,
729 KeTrapFrameToContext(
730 IN PKTRAP_FRAME TrapFrame
,
731 IN PKEXCEPTION_FRAME ExceptionFrame
,
732 IN OUT PCONTEXT Context
739 ULONG BugCheckParameter1
,
740 ULONG BugCheckParameter2
,
741 ULONG BugCheckParameter3
,
742 ULONG BugCheckParameter4
,
748 KeFlushCurrentTb(VOID
);
752 KeRosDumpStackFrames(
760 IN PLARGE_INTEGER NewSystemTime
,
761 OUT PLARGE_INTEGER OldSystemTime
,
762 IN BOOLEAN FixInterruptTime
,
763 IN PLARGE_INTEGER HalTime
776 KiStartUnexpectedRange(
782 KiEndUnexpectedRange(
801 IN PKTRAP_FRAME TrapFrame
806 Ki386SetupAndExitToV86Mode(
818 KiInitializeMachineType(
825 IN FLOATING_SAVE_AREA
*SaveArea
852 IN KPRIORITY PriorityBoost
858 IN PVOID
*OutputBuffer
,
859 IN PULONG OutputLength
864 KiGetUserModeStackAddress(
870 Ki386EnableGlobalPage(IN
volatile ULONG_PTR Context
);
874 KiInitializePAT(VOID
);
878 KiInitializeMTRR(IN BOOLEAN FinalCpu
);
882 KiAmdK6InitializeMTRR(VOID
);
886 KiRestoreFastSyscallReturnState(VOID
);
890 Ki386EnableDE(IN ULONG_PTR Context
);
894 Ki386EnableFxsr(IN ULONG_PTR Context
);
898 Ki386EnableXMMIExceptions(IN ULONG_PTR Context
);
902 KiInitMachineDependent(VOID
);
906 KiI386PentiumLockErrataFixup(VOID
);
916 KeFreezeExecution(IN PKTRAP_FRAME TrapFrame
,
917 IN PKEXCEPTION_FRAME ExceptionFrame
);
921 KeThawExecution(IN BOOLEAN Enable
);
925 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */