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 */
197 KiReadyThread(IN PKTHREAD Thread
);
201 KeSuspendThread(PKTHREAD Thread
);
206 IN PKTHREAD CurrentThread
,
207 IN PKTHREAD NewThread
212 KiAdjustQuantumThread(IN PKTHREAD Thread
);
216 KiExitDispatcher(KIRQL OldIrql
);
220 KiDeferredReadyThread(IN PKTHREAD Thread
);
226 IN KAFFINITY Affinity
,
227 IN PBOOLEAN Released
// hack
236 /* gmutex.c ********************************************************************/
240 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
242 /* gate.c **********************************************************************/
246 KeInitializeGate(PKGATE Gate
);
250 KeSignalGateBoostPriority(PKGATE Gate
);
256 KWAIT_REASON WaitReason
,
257 KPROCESSOR_MODE WaitMode
260 /* ipi.c ********************************************************************/
269 /* next file ***************************************************************/
273 KeFindNextRightSetAffinity(
280 DbgBreakPointNoBugCheck(VOID
);
285 struct _KPROFILE
* Profile
,
286 struct _KPROCESS
* Process
,
290 KPROFILE_SOURCE ProfileSource
,
297 struct _KPROFILE
* Profile
,
303 KeStopProfile(struct _KPROFILE
* Profile
);
307 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
311 KeSetIntervalProfile(
312 KPROFILE_SOURCE ProfileSource
,
319 PKTRAP_FRAME TrapFrame
324 KeProfileInterruptWithSource(
325 IN PKTRAP_FRAME TrapFrame
,
326 IN KPROFILE_SOURCE Source
331 KiRosPrintAddress(PVOID Address
);
336 PKTRAP_FRAME TrapFrame
,
344 PVOID DeferredContext
,
345 PVOID SystemArgument1
,
346 PVOID SystemArgument2
352 IN PKPROCESS Process
,
353 IN OUT PKTHREAD Thread
,
354 IN PKSYSTEM_ROUTINE SystemRoutine
,
355 IN PKSTART_ROUTINE StartRoutine
,
356 IN PVOID StartContext
,
371 IN OUT PKTHREAD Thread
,
372 IN PVOID KernelStack
,
373 IN PKSYSTEM_ROUTINE SystemRoutine
,
374 IN PKSTART_ROUTINE StartRoutine
,
375 IN PVOID StartContext
,
384 IN OUT PKTHREAD Thread
391 IN KPROCESSOR_MODE AlertMode
415 KeRundownThread(VOID
);
419 KeReleaseThread(PKTHREAD Thread
);
431 IN PKNORMAL_ROUTINE
*NormalRoutine
,
432 IN PVOID
*NormalContext
,
433 IN PVOID
*SystemArgument1
,
434 IN PVOID
*SystemArgument2
440 IN PVOID NormalContext
,
441 IN PVOID SystemArgument1
,
442 IN PVOID SystemArgument2
447 KeQueryBasePriorityThread(IN PKTHREAD Thread
);
453 IN KPRIORITY Priority
,
454 IN PBOOLEAN Released
// hack
459 KiDispatcherObjectWake(
460 DISPATCHER_HEADER
* hdr
,
468 IN NTSTATUS WaitStatus
482 KeDumpStackFrames(PULONG Frame
);
492 IN NTSTATUS WaitStatus
,
493 IN KPRIORITY Increment
499 struct _KPROCESS
*Process
,
502 PLARGE_INTEGER DirectoryTableBase
,
509 IN PKPROCESS Process
,
515 KeSetPriorityAndQuantumProcess(
516 IN PKPROCESS Process
,
517 IN KPRIORITY Priority
,
518 IN UCHAR Quantum OPTIONAL
523 KeForceResumeThread(IN PKTHREAD Thread
);
527 KeDisableThreadApcQueueing(IN PKTHREAD Thread
);
533 LARGE_INTEGER DueTime
545 KeGetStackTopThread(struct _ETHREAD
* Thread
);
549 KeContextToTrapFrame(
551 PKEXCEPTION_FRAME ExeptionFrame
,
552 PKTRAP_FRAME TrapFrame
,
554 KPROCESSOR_MODE PreviousMode
559 KiCheckForKernelApcDelivery(VOID
);
565 IN PLIST_ENTRY Entry
,
572 struct _KPROCESS
* Process
,
579 KeInitializeEventPair(PKEVENT_PAIR EventPair
);
584 IN PKEXCEPTION_FRAME Reserved
,
585 IN PKTRAP_FRAME TrapFrame
,
586 IN PKNORMAL_ROUTINE NormalRoutine
,
587 IN PVOID NormalContext
,
588 IN PVOID SystemArgument1
,
589 IN PVOID SystemArgument2
596 IN KPROCESSOR_MODE PreviousMode
602 struct _KTHREAD
*Thread
,
603 struct _KPROCESS
*Process
,
604 PKLOCK_QUEUE_HANDLE ApcLock
,
605 struct _KAPC_STATE
*SavedApcState
611 struct _KPROCESS
*NewProcess
,
612 struct _KPROCESS
*OldProcess
617 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
621 KeRemoveQueueApc(PKAPC Apc
);
625 KiWakeQueue(IN PKQUEUE Queue
);
627 /* INITIALIZATION FUNCTIONS *************************************************/
631 KeInitExceptions(VOID
);
635 KeInitInterrupts(VOID
);
643 KeInitDispatcher(VOID
);
647 KiInitializeSystemClock(VOID
);
651 KiInitializeBugCheck(VOID
);
655 Phase1Initialization(PVOID Context
);
660 IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock
669 KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
674 PKAPC_STATE OldState
,
681 KPROFILE_SOURCE Source
,
688 PEXCEPTION_RECORD ExceptionRecord
,
689 PKEXCEPTION_FRAME ExceptionFrame
,
691 KPROCESSOR_MODE PreviousMode
,
697 KeTrapFrameToContext(
698 IN PKTRAP_FRAME TrapFrame
,
699 IN PKEXCEPTION_FRAME ExceptionFrame
,
700 IN OUT PCONTEXT Context
705 KeApplicationProcessorInit(VOID
);
709 KePrepareForApplicationProcessorInit(ULONG id
);
721 KePushAndStackSwitchAndSysRet(
728 KeStackSwitchAndRet(PVOID NewStack
);
734 ULONG BugCheckParameter1
,
735 ULONG BugCheckParameter2
,
736 ULONG BugCheckParameter3
,
737 ULONG BugCheckParameter4
,
743 KeFlushCurrentTb(VOID
);
747 KeRosDumpStackFrames(
754 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
766 KiStartUnexpectedRange(
772 KiEndUnexpectedRange(
791 IN PKTRAP_FRAME TrapFrame
796 Ki386SetupAndExitToV86Mode(
809 IN FLOATING_SAVE_AREA
*SaveArea
836 IN KPRIORITY PriorityBoost
842 IN PVOID
*OutputBuffer
,
843 IN PULONG OutputLength
848 KiGetUserModeStackAddress(
854 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */