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 PVOID KeUserApcDispatcher
;
71 extern PVOID KeUserCallbackDispatcher
;
72 extern PVOID KeUserExceptionDispatcher
;
73 extern PVOID KeRaiseUserExceptionDispatcher
;
74 extern LARGE_INTEGER SystemBootTime
;
75 extern ULONG_PTR KERNEL_BASE
;
76 extern ULONG KeI386NpxPresent
;
77 extern ULONG KeI386XMMIPresent
;
78 extern ULONG KeI386FxsrPresent
;
79 extern ULONG KeI386CpuType
;
80 extern ULONG KeI386CpuStep
;
81 extern ULONG KeProcessorArchitecture
;
82 extern ULONG KeProcessorLevel
;
83 extern ULONG KeProcessorRevision
;
84 extern ULONG KeFeatureBits
;
85 extern ULONG Ke386GlobalPagesEnabled
;
87 extern PKNODE KeNodeBlock
[1];
88 extern UCHAR KeNumberNodes
;
89 extern UCHAR KeProcessNodeSeed
;
90 extern ETHREAD KiInitialThread
;
91 extern EPROCESS KiInitialProcess
;
92 extern ULONG KiInterruptTemplate
[KINTERRUPT_DISPATCH_CODES
];
93 extern PULONG KiInterruptTemplateObject
;
94 extern PULONG KiInterruptTemplateDispatch
;
95 extern PULONG KiInterruptTemplate2ndDispatch
;
96 extern ULONG KiUnexpectedEntrySize
;
97 extern PVOID Ki386IopmSaveArea
;
98 extern ULONG KeI386EFlagsAndMaskV86
;
99 extern ULONG KeI386EFlagsOrMaskV86
;
100 extern BOOLEAN KeI386VirtualIntExtensions
;
101 extern KIDTENTRY KiIdt
[];
102 extern KGDTENTRY KiBootGdt
[];
103 extern KDESCRIPTOR KiGdtDescriptor
;
104 extern KDESCRIPTOR KiIdtDescriptor
;
105 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 LARGE_INTEGER KiTimeIncrementReciprocal
;
114 extern UCHAR KiTimeIncrementShiftCount
;
115 extern LIST_ENTRY BugcheckCallbackListHead
, BugcheckReasonCallbackListHead
;
116 extern KSPIN_LOCK BugCheckCallbackLock
;
117 extern KDPC KiExpireTimerDpc
;
118 extern KTIMER_TABLE_ENTRY KiTimerTableListHead
[TIMER_TABLE_SIZE
];
119 extern LIST_ENTRY KiTimerListHead
;
120 extern KMUTEX KiGenericCallDpcMutex
;
121 extern LIST_ENTRY KiProfileListHead
, KiProfileSourceListHead
;
122 extern KSPIN_LOCK KiProfileLock
;
123 extern LIST_ENTRY KiProcessListHead
;
124 extern LIST_ENTRY KiProcessInSwapListHead
, KiProcessOutSwapListHead
;
125 extern LIST_ENTRY KiStackInSwapListHead
;
126 extern KEVENT KiSwapEvent
;
127 extern PKPRCB KiProcessorBlock
[];
128 extern ULONG KiMask32Array
[MAXIMUM_PRIORITY
];
129 extern ULONG KiIdleSummary
;
130 extern VOID
KiTrap8(VOID
);
131 extern VOID
KiTrap2(VOID
);
133 /* MACROS *************************************************************************/
135 #define AFFINITY_MASK(Id) KiMask32Array[Id]
136 #define PRIORITY_MASK(Id) KiMask32Array[Id]
138 /* The following macro initializes a dispatcher object's header */
139 #define KeInitializeDispatcherHeader(Header, t, s, State) \
141 (Header)->Type = t; \
142 (Header)->Absolute = 0; \
143 (Header)->Inserted = 0; \
144 (Header)->Size = s; \
145 (Header)->SignalState = State; \
146 InitializeListHead(&((Header)->WaitListHead)); \
149 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
150 DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
151 KeBugCheckWithTf(a,b,c,d,e,f)
153 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
154 #define TIMER_OR_EVENT_TYPE 0x7L
156 /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */
157 #define TIMER_WAIT_BLOCK 0x3L
159 /* IOPM Definitions */
160 #define IO_ACCESS_MAP_NONE 0
161 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
162 #define KiComputeIopmOffset(MapNumber) \
163 (MapNumber == IO_ACCESS_MAP_NONE) ? \
164 (USHORT)(sizeof(KTSS)) : \
165 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
167 #define SIZE_OF_FX_REGISTERS 32
169 /* INTERNAL KERNEL FUNCTIONS ************************************************/
171 /* Readies a Thread for Execution. */
174 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
176 /* Readies a Thread for Execution. */
179 KiDispatchThread(ULONG NewThreadStatus
);
181 /* Finds a new thread to run */
191 KiReadyThread(IN PKTHREAD Thread
);
195 KeSuspendThread(PKTHREAD Thread
);
200 IN PKTHREAD CurrentThread
,
201 IN PKTHREAD NewThread
206 KiAdjustQuantumThread(IN PKTHREAD Thread
);
210 KiExitDispatcher(KIRQL OldIrql
);
214 KiDeferredReadyThread(IN PKTHREAD Thread
);
220 IN KAFFINITY Affinity
,
221 IN PBOOLEAN Released
// hack
230 /* gmutex.c ********************************************************************/
234 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
236 /* gate.c **********************************************************************/
240 KeInitializeGate(PKGATE Gate
);
244 KeSignalGateBoostPriority(PKGATE Gate
);
250 KWAIT_REASON WaitReason
,
251 KPROCESSOR_MODE WaitMode
254 /* ipi.c ********************************************************************/
263 /* next file ***************************************************************/
267 KeFindNextRightSetAffinity(
274 DbgBreakPointNoBugCheck(VOID
);
279 struct _KPROFILE
* Profile
,
280 struct _KPROCESS
* Process
,
284 KPROFILE_SOURCE ProfileSource
,
291 struct _KPROFILE
* Profile
,
297 KeStopProfile(struct _KPROFILE
* Profile
);
301 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
305 KeSetIntervalProfile(
306 KPROFILE_SOURCE ProfileSource
,
313 PKTRAP_FRAME TrapFrame
318 KeProfileInterruptWithSource(
319 IN PKTRAP_FRAME TrapFrame
,
320 IN KPROFILE_SOURCE Source
325 KiRosPrintAddress(PVOID Address
);
330 PKTRAP_FRAME TrapFrame
,
338 PVOID DeferredContext
,
339 PVOID SystemArgument1
,
340 PVOID SystemArgument2
346 IN PKPROCESS Process
,
347 IN OUT PKTHREAD Thread
,
348 IN PKSYSTEM_ROUTINE SystemRoutine
,
349 IN PKSTART_ROUTINE StartRoutine
,
350 IN PVOID StartContext
,
365 IN OUT PKTHREAD Thread
,
366 IN PVOID KernelStack
,
367 IN PKSYSTEM_ROUTINE SystemRoutine
,
368 IN PKSTART_ROUTINE StartRoutine
,
369 IN PVOID StartContext
,
378 IN OUT PKTHREAD Thread
385 IN KPROCESSOR_MODE AlertMode
409 KeRundownThread(VOID
);
413 KeReleaseThread(PKTHREAD Thread
);
425 IN PKNORMAL_ROUTINE
*NormalRoutine
,
426 IN PVOID
*NormalContext
,
427 IN PVOID
*SystemArgument1
,
428 IN PVOID
*SystemArgument2
434 IN PVOID NormalContext
,
435 IN PVOID SystemArgument1
,
436 IN PVOID SystemArgument2
441 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
447 IN KPRIORITY Priority
,
448 IN PBOOLEAN Released
// hack
453 KiDispatcherObjectWake(
454 DISPATCHER_HEADER
* hdr
,
469 KeDumpStackFrames(PULONG Frame
);
479 IN NTSTATUS WaitStatus
,
480 IN KPRIORITY Increment
486 struct _KPROCESS
*Process
,
489 PLARGE_INTEGER DirectoryTableBase
,
496 IN PKPROCESS Process
,
502 KeSetPriorityAndQuantumProcess(
503 IN PKPROCESS Process
,
504 IN KPRIORITY Priority
,
505 IN UCHAR Quantum OPTIONAL
510 KeForceResumeThread(IN PKTHREAD Thread
);
514 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
520 LARGE_INTEGER DueTime
532 KeGetStackTopThread(struct _ETHREAD
* Thread
);
536 KeContextToTrapFrame(
538 PKEXCEPTION_FRAME ExeptionFrame
,
539 PKTRAP_FRAME TrapFrame
,
541 KPROCESSOR_MODE PreviousMode
547 KPROCESSOR_MODE PreviousMode
,
549 PKTRAP_FRAME TrapFrame
554 KiCheckForKernelApcDelivery(VOID
);
560 IN PLIST_ENTRY Entry
,
567 struct _KPROCESS
* Process
,
574 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
579 IN PKEXCEPTION_FRAME Reserved
,
580 IN PKTRAP_FRAME TrapFrame
,
581 IN PKNORMAL_ROUTINE NormalRoutine
,
582 IN PVOID NormalContext
,
583 IN PVOID SystemArgument1
,
584 IN PVOID SystemArgument2
591 IN KPROCESSOR_MODE PreviousMode
597 struct _KTHREAD
*Thread
,
598 struct _KPROCESS
*Process
,
599 PKLOCK_QUEUE_HANDLE ApcLock
,
600 struct _KAPC_STATE
*SavedApcState
606 struct _KPROCESS
*NewProcess
,
607 struct _KPROCESS
*OldProcess
612 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
616 KeRemoveQueueApc(PKAPC Apc
);
620 KiWakeQueue(IN PKQUEUE Queue
);
622 /* INITIALIZATION FUNCTIONS *************************************************/
626 KeInitExceptions(VOID
);
630 KeInitInterrupts(VOID
);
638 KeInitDispatcher(VOID
);
642 KiInitializeSystemClock(VOID
);
646 KiInitializeBugCheck(VOID
);
650 Phase1Initialization(PVOID Context
);
655 IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock
664 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
669 PKAPC_STATE OldState
,
676 KPROFILE_SOURCE Source
,
683 PEXCEPTION_RECORD ExceptionRecord
,
684 PKEXCEPTION_FRAME ExceptionFrame
,
686 KPROCESSOR_MODE PreviousMode
,
692 KeTrapFrameToContext(
693 IN PKTRAP_FRAME TrapFrame
,
694 IN PKEXCEPTION_FRAME ExceptionFrame
,
695 IN OUT PCONTEXT Context
700 KeApplicationProcessorInit(VOID
);
704 KePrepareForApplicationProcessorInit(ULONG id
);
716 KePushAndStackSwitchAndSysRet(
723 KeStackSwitchAndRet(PVOID NewStack
);
729 ULONG BugCheckParameter1
,
730 ULONG BugCheckParameter2
,
731 ULONG BugCheckParameter3
,
732 ULONG BugCheckParameter4
,
738 KeFlushCurrentTb(VOID
);
742 KeRosDumpStackFrames(
749 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
761 KiStartUnexpectedRange(
767 KiEndUnexpectedRange(
786 IN PKTRAP_FRAME TrapFrame
791 Ki386SetupAndExitToV86Mode(
804 IN FLOATING_SAVE_AREA
*SaveArea
831 IN KPRIORITY PriorityBoost
836 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */