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
;
109 extern PVOID Ki386IopmSaveArea
;
110 extern ULONG KeI386EFlagsAndMaskV86
;
111 extern ULONG KeI386EFlagsOrMaskV86
;
112 extern BOOLEAN KeI386VirtualIntExtensions
;
113 extern KIDTENTRY KiIdt
[];
114 extern KGDTENTRY KiBootGdt
[];
115 extern KDESCRIPTOR KiGdtDescriptor
;
116 extern KDESCRIPTOR KiIdtDescriptor
;
117 extern KTSS KiBootTss
;
119 extern UCHAR P0BootStack
[];
120 extern UCHAR KiDoubleFaultStack
[];
121 extern EX_PUSH_LOCK KernelAddressSpaceLock
;
122 extern ULONG KiMaximumDpcQueueDepth
;
123 extern ULONG KiMinimumDpcRate
;
124 extern ULONG KiAdjustDpcThreshold
;
125 extern ULONG KiIdealDpcRate
;
126 extern BOOLEAN KeThreadDpcEnable
;
127 extern LARGE_INTEGER KiTimeIncrementReciprocal
;
128 extern UCHAR KiTimeIncrementShiftCount
;
129 extern ULONG KiTimeLimitIsrMicroseconds
;
130 extern ULONG KiServiceLimit
;
131 extern LIST_ENTRY KeBugcheckCallbackListHead
, KeBugcheckReasonCallbackListHead
;
132 extern KSPIN_LOCK BugCheckCallbackLock
;
133 extern KDPC KiTimerExpireDpc
;
134 extern KTIMER_TABLE_ENTRY KiTimerTableListHead
[TIMER_TABLE_SIZE
];
135 extern FAST_MUTEX KiGenericCallDpcMutex
;
136 extern LIST_ENTRY KiProfileListHead
, KiProfileSourceListHead
;
137 extern KSPIN_LOCK KiProfileLock
;
138 extern LIST_ENTRY KiProcessListHead
;
139 extern LIST_ENTRY KiProcessInSwapListHead
, KiProcessOutSwapListHead
;
140 extern LIST_ENTRY KiStackInSwapListHead
;
141 extern KEVENT KiSwapEvent
;
142 extern PKPRCB KiProcessorBlock
[];
143 extern ULONG KiMask32Array
[MAXIMUM_PRIORITY
];
144 extern ULONG KiIdleSummary
;
145 extern VOID __cdecl
KiTrap19(VOID
);
146 extern VOID __cdecl
KiTrap8(VOID
);
147 extern VOID __cdecl
KiTrap2(VOID
);
148 extern VOID __cdecl
KiFastCallEntry(VOID
);
149 extern PVOID KeUserApcDispatcher
;
150 extern PVOID KeUserCallbackDispatcher
;
151 extern PVOID KeUserExceptionDispatcher
;
152 extern PVOID KeRaiseUserExceptionDispatcher
;
153 extern UCHAR KiDebugRegisterTrapOffsets
[9];
154 extern UCHAR KiDebugRegisterContextOffsets
[9];
155 extern ULONG KeTimeIncrement
;
156 extern ULONG KeTimeAdjustment
;
157 extern ULONG_PTR KiBugCheckData
[5];
158 extern ULONG KiFreezeFlag
;
159 extern ULONG KiDPCTimeout
;
161 /* MACROS *************************************************************************/
163 #define AFFINITY_MASK(Id) KiMask32Array[Id]
164 #define PRIORITY_MASK(Id) KiMask32Array[Id]
166 /* The following macro initializes a dispatcher object's header */
167 #define KeInitializeDispatcherHeader(Header, t, s, State) \
169 (Header)->Type = t; \
170 (Header)->Absolute = 0; \
171 (Header)->Size = s; \
172 (Header)->Inserted = 0; \
173 (Header)->SignalState = State; \
174 InitializeListHead(&((Header)->WaitListHead)); \
177 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
178 #define TIMER_OR_EVENT_TYPE 0x7L
180 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
181 #define TIMER_WAIT_BLOCK 0x3L
183 /* IOPM Definitions */
184 #define IO_ACCESS_MAP_NONE 0
185 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
186 #define KiComputeIopmOffset(MapNumber) \
187 (MapNumber == IO_ACCESS_MAP_NONE) ? \
188 (USHORT)(sizeof(KTSS)) : \
189 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
191 #define SIZE_OF_FX_REGISTERS 32
193 /* INTERNAL KERNEL FUNCTIONS ************************************************/
199 OUT PULONG CpuInfoEax
,
200 OUT PULONG CpuInfoEbx
,
201 OUT PULONG CpuInfoEcx
,
202 OUT PULONG CpuInfoEdx
218 /* Finds a new thread to run */
234 KeSetDisableBoostThread(
235 IN OUT PKTHREAD Thread
,
241 KeBalanceSetManager(IN PVOID Context
);
245 KiReadyThread(IN PKTHREAD Thread
);
249 KeSuspendThread(PKTHREAD Thread
);
253 KeReadStateThread(IN PKTHREAD Thread
);
258 IN PKTHREAD CurrentThread
,
259 IN PKTHREAD NewThread
264 KiAdjustQuantumThread(IN PKTHREAD Thread
);
268 KiExitDispatcher(KIRQL OldIrql
);
272 KiDeferredReadyThread(IN PKTHREAD Thread
);
282 KiProcessDeferredReadyList(
290 IN KAFFINITY Affinity
309 IN PLIST_ENTRY ExpiredListHead
,
317 IN LARGE_INTEGER Interval
324 IN PKSPIN_LOCK_QUEUE LockQueue
327 /* gmutex.c ********************************************************************/
331 KiAcquireGuardedMutex(
332 IN OUT PKGUARDED_MUTEX GuardedMutex
338 IN PFAST_MUTEX FastMutex
341 /* gate.c **********************************************************************/
345 KeInitializeGate(PKGATE Gate
);
349 KeSignalGateBoostPriority(PKGATE Gate
);
355 KWAIT_REASON WaitReason
,
356 KPROCESSOR_MODE WaitMode
359 /* ipi.c ********************************************************************/
371 IN KAFFINITY TargetProcessors
,
372 IN PKIPI_WORKER WorkerFunction
,
373 IN PKIPI_BROADCAST_WORKER BroadcastFunction
,
374 IN ULONG_PTR Context
,
380 KiIpiSignalPacketDone(
381 IN PKIPI_CONTEXT PacketContext
386 KiIpiSignalPacketDoneAndStall(
387 IN PKIPI_CONTEXT PacketContext
,
388 IN
volatile PULONG ReverseStall
391 /* next file ***************************************************************/
395 KeFindNextRightSetAffinity(
402 DbgBreakPointNoBugCheck(VOID
);
407 struct _KPROFILE
* Profile
,
408 struct _KPROCESS
* Process
,
412 KPROFILE_SOURCE ProfileSource
,
419 struct _KPROFILE
* Profile
,
425 KeStopProfile(struct _KPROFILE
* Profile
);
429 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
433 KeSetIntervalProfile(
434 KPROFILE_SOURCE ProfileSource
,
441 PKTRAP_FRAME TrapFrame
446 KeProfileInterruptWithSource(
447 IN PKTRAP_FRAME TrapFrame
,
448 IN KPROFILE_SOURCE Source
454 PKTRAP_FRAME TrapFrame
,
462 PVOID DeferredContext
,
463 PVOID SystemArgument1
,
464 PVOID SystemArgument2
470 IN PKPROCESS Process
,
471 IN OUT PKTHREAD Thread
,
472 IN PKSYSTEM_ROUTINE SystemRoutine
,
473 IN PKSTART_ROUTINE StartRoutine
,
474 IN PVOID StartContext
,
489 IN OUT PKTHREAD Thread
,
490 IN PVOID KernelStack
,
491 IN PKSYSTEM_ROUTINE SystemRoutine
,
492 IN PKSTART_ROUTINE StartRoutine
,
493 IN PVOID StartContext
,
501 KiInitializeContextThread(
503 PKSYSTEM_ROUTINE SystemRoutine
,
504 PKSTART_ROUTINE StartRoutine
,
512 IN OUT PKTHREAD Thread
519 IN KPROCESSOR_MODE AlertMode
543 KeRundownThread(VOID
);
547 KeReleaseThread(PKTHREAD Thread
);
559 IN PKNORMAL_ROUTINE
*NormalRoutine
,
560 IN PVOID
*NormalContext
,
561 IN PVOID
*SystemArgument1
,
562 IN PVOID
*SystemArgument2
568 IN PVOID NormalContext
,
569 IN PVOID SystemArgument1
,
570 IN PVOID SystemArgument2
575 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
581 IN KPRIORITY Priority
588 IN NTSTATUS WaitStatus
593 KeDumpStackFrames(PULONG Frame
);
603 IN NTSTATUS WaitStatus
,
604 IN KPRIORITY Increment
610 struct _KPROCESS
*Process
,
613 PULONG DirectoryTableBase
,
620 IN PKPROCESS Process
,
626 KeSetPriorityAndQuantumProcess(
627 IN PKPROCESS Process
,
628 IN KPRIORITY Priority
,
629 IN UCHAR Quantum OPTIONAL
634 KeForceResumeThread(IN PKTHREAD Thread
);
650 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
661 KeContextToTrapFrame(
663 PKEXCEPTION_FRAME ExeptionFrame
,
664 PKTRAP_FRAME TrapFrame
,
666 KPROCESSOR_MODE PreviousMode
671 KiCheckForKernelApcDelivery(VOID
);
677 IN PLIST_ENTRY Entry
,
685 IN PVOID DeferredContext
,
686 IN PVOID SystemArgument1
,
687 IN PVOID SystemArgument2
692 KiComputeTimerTableIndex(
693 IN LONGLONG TimeValue
699 struct _KPROCESS
* Process
,
706 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
711 IN PKEXCEPTION_FRAME Reserved
,
712 IN PKTRAP_FRAME TrapFrame
,
713 IN PKNORMAL_ROUTINE NormalRoutine
,
714 IN PVOID NormalContext
,
715 IN PVOID SystemArgument1
,
716 IN PVOID SystemArgument2
723 IN KPROCESSOR_MODE PreviousMode
729 struct _KTHREAD
*Thread
,
730 struct _KPROCESS
*Process
,
731 PKLOCK_QUEUE_HANDLE ApcLock
,
732 struct _KAPC_STATE
*SavedApcState
738 struct _KPROCESS
*NewProcess
,
739 struct _KPROCESS
*OldProcess
744 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
748 KeRemoveQueueApc(PKAPC Apc
);
752 KiActivateWaiterQueue(IN PKQUEUE Queue
);
756 KeQueryRuntimeProcess(IN PKPROCESS Process
,
757 OUT PULONG UserTime
);
759 /* INITIALIZATION FUNCTIONS *************************************************/
767 KeInitExceptions(VOID
);
771 KeInitInterrupts(VOID
);
775 KiInitializeBugCheck(VOID
);
780 IN PLOADER_PARAMETER_BLOCK LoaderBlock
785 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
790 PKAPC_STATE OldState
,
797 KPROFILE_SOURCE Source
,
804 PEXCEPTION_RECORD ExceptionRecord
,
805 PKEXCEPTION_FRAME ExceptionFrame
,
807 KPROCESSOR_MODE PreviousMode
,
813 KeTrapFrameToContext(
814 IN PKTRAP_FRAME TrapFrame
,
815 IN PKEXCEPTION_FRAME ExceptionFrame
,
816 IN OUT PCONTEXT Context
824 ULONG_PTR BugCheckParameter1
,
825 ULONG_PTR BugCheckParameter2
,
826 ULONG_PTR BugCheckParameter3
,
827 ULONG_PTR BugCheckParameter4
,
833 KeFlushCurrentTb(VOID
);
837 KeInvalidateAllCaches(VOID
);
841 KeZeroPages(IN PVOID Address
,
846 KeInvalidAccessAllowed(IN PVOID TrapInformation OPTIONAL
);
850 KeRosDumpStackFrames(
858 IN PLARGE_INTEGER NewSystemTime
,
859 OUT PLARGE_INTEGER OldSystemTime
,
860 IN BOOLEAN FixInterruptTime
,
861 IN PLARGE_INTEGER HalTime
874 KiStartUnexpectedRange(
880 KiEndUnexpectedRange(
899 IN PKTRAP_FRAME TrapFrame
904 Ki386SetupAndExitToV86Mode(
916 KiInitializeMachineType(
921 // We need to do major portability work
927 IN FLOATING_SAVE_AREA
*SaveArea
933 KiSetupStackAndInitializeKernel(
934 IN PKPROCESS InitProcess
,
935 IN PKTHREAD InitThread
,
939 IN PLOADER_PARAMETER_BLOCK LoaderBlock
966 IN KPRIORITY PriorityBoost
972 IN PVOID
*OutputBuffer
,
973 IN PULONG OutputLength
978 KiGetUserModeStackAddress(
984 Ki386EnableGlobalPage(IN
volatile ULONG_PTR Context
);
988 KiInitializePAT(VOID
);
992 KiInitializeMTRR(IN BOOLEAN FinalCpu
);
996 KiAmdK6InitializeMTRR(VOID
);
1000 KiRestoreFastSyscallReturnState(VOID
);
1004 Ki386EnableDE(IN ULONG_PTR Context
);
1008 Ki386EnableFxsr(IN ULONG_PTR Context
);
1012 Ki386EnableXMMIExceptions(IN ULONG_PTR Context
);
1016 KiInitMachineDependent(VOID
);
1020 KiI386PentiumLockErrataFixup(VOID
);
1024 KeFreezeExecution(IN PKTRAP_FRAME TrapFrame
,
1025 IN PKEXCEPTION_FRAME ExceptionFrame
);
1029 KeThawExecution(IN BOOLEAN Enable
);
1033 KeDisableInterrupts(
1039 KeAcquireQueuedSpinLockAtDpcLevel(
1040 IN OUT PKSPIN_LOCK_QUEUE LockQueue
1045 KeReleaseQueuedSpinLockFromDpcLevel(
1046 IN OUT PKSPIN_LOCK_QUEUE LockQueue
1051 KiRestoreProcessorControlState(
1052 IN PKPROCESSOR_STATE ProcessorState
1057 KiSaveProcessorControlState(
1058 OUT PKPROCESSOR_STATE ProcessorState
1076 IN PKTRAP_FRAME TrapFrame
,
1077 IN ULONG Instruction
1087 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */