3 * Copyright (C) 2000 David Welch <welch@cwcom.net>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #ifndef __NTOSKRNL_INCLUDE_INTERNAL_KE_H
21 #define __NTOSKRNL_INCLUDE_INTERNAL_KE_H
23 /* INCLUDES *****************************************************************/
26 #include <ddk/ntifs.h>
28 #endif /* not __ASM__ */
32 /* INTERNAL KERNEL TYPES ****************************************************/
38 typedef struct _KPROCESS
*PKPROCESS
;
39 typedef struct _DISPATCHER_HEADER
*PDISPATCHER_HEADER
;
43 typedef struct _KEVENT_PAIR
*PKEVENT_PAIR
;
45 #endif /* __USE_W32API */
47 typedef struct _HARDWARE_PTE_X86
{
51 ULONG WriteThrough
: 1;
52 ULONG CacheDisable
: 1;
57 ULONG CopyOnWrite
: 1;
60 ULONG PageFrameNumber
: 20;
61 } HARDWARE_PTE_X86
, *PHARDWARE_PTE_X86
;
63 typedef struct _WOW64_PROCESS
66 } WOW64_PROCESS
, *PWOW64_PROCESS
;
70 typedef struct _KTHREAD
72 /* For waiting on thread exit */
73 DISPATCHER_HEADER DispatcherHeader
; /* 00 */
75 /* List of mutants owned by the thread */
76 LIST_ENTRY MutantListHead
; /* 10 */
77 PVOID InitialStack
; /* 18 */
78 ULONG_PTR StackLimit
; /* 1C */
80 /* Pointer to the thread's environment block in user memory */
81 struct _TEB
*Teb
; /* 20 */
83 /* Pointer to the thread's TLS array */
84 PVOID TlsArray
; /* 24 */
85 PVOID KernelStack
; /* 28 */
86 UCHAR DebugActive
; /* 2C */
88 /* Thread state (one of THREAD_STATE_xxx constants below) */
90 BOOLEAN Alerted
[2]; /* 2E */
92 UCHAR NpxState
; /* 31 */
93 CHAR Saturation
; /* 32 */
94 CHAR Priority
; /* 33 */
95 KAPC_STATE ApcState
; /* 34 */
96 ULONG ContextSwitches
; /* 4C */
97 LONG WaitStatus
; /* 50 */
98 KIRQL WaitIrql
; /* 54 */
99 CHAR WaitMode
; /* 55 */
100 UCHAR WaitNext
; /* 56 */
101 UCHAR WaitReason
; /* 57 */
103 PKWAIT_BLOCK WaitBlockList
; /* 58 */
104 PKGATE GateObject
; /* 58 */
106 LIST_ENTRY WaitListEntry
; /* 5C */
107 ULONG WaitTime
; /* 64 */
108 CHAR BasePriority
; /* 68 */
109 UCHAR DecrementCount
; /* 69 */
110 UCHAR PriorityDecrement
; /* 6A */
111 CHAR Quantum
; /* 6B */
112 KWAIT_BLOCK WaitBlock
[4]; /* 6C */
113 PVOID LegoData
; /* CC */
116 USHORT KernelApcDisable
;
117 USHORT SpecialApcDisable
;
119 ULONG CombinedApcDisable
; /* D0 */
121 KAFFINITY UserAffinity
; /* D4 */
122 UCHAR SystemAffinityActive
;/* D8 */
123 UCHAR PowerState
; /* D9 */
124 UCHAR NpxIrql
; /* DA */
125 UCHAR Pad
[1]; /* DB */
126 PVOID ServiceTable
; /* DC */
127 PKQUEUE Queue
; /* E0 */
128 KSPIN_LOCK ApcQueueLock
; /* E4 */
129 KTIMER Timer
; /* E8 */
130 LIST_ENTRY QueueListEntry
; /* 110 */
131 KAFFINITY Affinity
; /* 118 */
132 UCHAR Preempted
; /* 11C */
133 UCHAR ProcessReadyQueue
; /* 11D */
134 UCHAR KernelStackResident
; /* 11E */
135 UCHAR NextProcessor
; /* 11F */
136 PVOID CallbackStack
; /* 120 */
137 struct _W32THREAD
*Win32Thread
; /* 124 */
138 struct _KTRAP_FRAME
*TrapFrame
; /* 128 */
139 PKAPC_STATE ApcStatePointer
[2]; /* 12C */
140 UCHAR EnableStackSwap
; /* 134 */
141 UCHAR LargeStack
; /* 135 */
142 UCHAR ResourceIndex
; /* 136 */
143 UCHAR PreviousMode
; /* 137 */
144 ULONG KernelTime
; /* 138 */
145 ULONG UserTime
; /* 13C */
146 KAPC_STATE SavedApcState
; /* 140 */
147 UCHAR Alertable
; /* 158 */
148 UCHAR ApcStateIndex
; /* 159 */
149 UCHAR ApcQueueable
; /* 15A */
150 UCHAR AutoAlignment
; /* 15B */
151 PVOID StackBase
; /* 15C */
152 KAPC SuspendApc
; /* 160 */
153 KSEMAPHORE SuspendSemaphore
; /* 190 */
154 LIST_ENTRY ThreadListEntry
; /* 1A4 */
155 CHAR FreezeCount
; /* 1AC */
156 UCHAR SuspendCount
; /* 1AD */
157 UCHAR IdealProcessor
; /* 1AE */
158 UCHAR DisableBoost
; /* 1AF */
159 UCHAR QuantumReset
; /* 1B0 */
164 typedef struct _KEXECUTE_OPTIONS
166 UCHAR ExecuteDisable
:1;
167 UCHAR ExecuteEnable
:1;
168 UCHAR DisableThunkEmulation
:1;
170 UCHAR ExecuteDispatchEnable
:1;
171 UCHAR ImageDispatchEnable
:1;
173 } KEXECUTE_OPTIONS
, *PKEXECUTE_OPTIONS
;
177 * DESCRIPTION: Internal Kernel Process Structure.
178 * PORTABILITY: Architecture Dependent.
179 * KERNEL VERSION: 5.2
180 * DOCUMENTATION: http://reactos.com/wiki/index.php/KPROCESS
182 typedef struct _KPROCESS
184 DISPATCHER_HEADER Header
; /* 000 */
185 LIST_ENTRY ProfileListHead
; /* 010 */
186 PHYSICAL_ADDRESS DirectoryTableBase
; /* 018 */
187 KGDTENTRY LdtDescriptor
; /* 020 */
188 KIDTENTRY Int21Descriptor
; /* 028 */
189 USHORT IopmOffset
; /* 030 */
190 UCHAR Iopl
; /* 032 */
191 UCHAR Unused
; /* 033 */
192 ULONG ActiveProcessors
; /* 034 */
193 ULONG KernelTime
; /* 038 */
194 ULONG UserTime
; /* 03C */
195 LIST_ENTRY ReadyListHead
; /* 040 */
196 LIST_ENTRY SwapListEntry
; /* 048 */
197 PVOID VdmTrapcHandler
; /* 04C */
198 LIST_ENTRY ThreadListHead
; /* 050 */
199 KSPIN_LOCK ProcessLock
; /* 058 */
200 KAFFINITY Affinity
; /* 05C */
203 ULONG AutoAlignment
:1; /* 060.0 */
204 ULONG DisableBoost
:1; /* 060.1 */
205 ULONG DisableQuantum
:1; /* 060.2 */
206 ULONG ReservedFlags
:29; /* 060.3 */
208 ULONG ProcessFlags
; /* 060 */
210 CHAR BasePriority
; /* 064 */
211 CHAR QuantumReset
; /* 065 */
212 UCHAR State
; /* 066 */
213 UCHAR ThreadSeed
; /* 067 */
214 UCHAR PowerState
; /* 068 */
215 UCHAR IdealNode
; /* 069 */
216 UCHAR Visited
; /* 06A */
217 KEXECUTE_OPTIONS Flags
; /* 06B */
218 ULONG StackCount
; /* 06C */
219 LIST_ENTRY ProcessListEntry
; /* 070 */
222 /* INTERNAL KERNEL FUNCTIONS ************************************************/
225 struct _KPROCESS
* KeGetCurrentProcess(VOID
);
226 VOID
KeSetGdtSelector(ULONG Entry
, ULONG Value1
, ULONG Value2
);
229 struct _KIRQ_TRAPFRAME
;
232 struct _KEXCEPTION_FRAME
;
234 #define IPI_REQUEST_FUNCTIONCALL 0
235 #define IPI_REQUEST_APC 1
236 #define IPI_REQUEST_DPC 2
237 #define IPI_REQUEST_FREEZE 3
240 typedef enum _KTHREAD_STATE
{
249 } THREAD_STATE
, *PTHREAD_STATE
;
252 /* MACROS *************************************************************************/
254 #define KeEnterCriticalRegion(X) \
256 PKTHREAD _Thread = KeGetCurrentThread(); \
257 if (_Thread) _Thread->KernelApcDisable--; \
260 #define KeLeaveCriticalRegion(X) \
262 PKTHREAD _Thread = KeGetCurrentThread(); \
263 if((_Thread) && (++_Thread->KernelApcDisable == 0)) \
265 if (!IsListEmpty(&_Thread->ApcState.ApcListHead[KernelMode])) \
267 KiKernelApcDeliveryCheck(); \
273 #define KeGetCurrentProcessorNumber() (KeGetCurrentKPCR()->Number)
276 /* threadsch.c ********************************************************************/
278 /* Thread Scheduler Functions */
280 /* Readies a Thread for Execution. */
283 KiDispatchThreadNoLock(ULONG NewThreadStatus
);
285 /* Readies a Thread for Execution. */
288 KiDispatchThread(ULONG NewThreadStatus
);
290 /* Puts a Thread into a block state. */
293 KiBlockThread(PNTSTATUS Status
,
298 /* Removes a thread out of a block state. */
301 KiUnblockThread(PKTHREAD Thread
,
302 PNTSTATUS WaitStatus
,
303 KPRIORITY Increment
);
307 KeSuspendThread(PKTHREAD Thread
);
311 KiSwapContext(PKTHREAD NewThread
);
313 /* gmutex.c ********************************************************************/
317 KiAcquireGuardedMutexContented(PKGUARDED_MUTEX GuardedMutex
);
319 /* gate.c **********************************************************************/
323 KeInitializeGate(PKGATE Gate
);
327 KeSignalGateBoostPriority(PKGATE Gate
);
331 KeWaitForGate(PKGATE Gate
,
332 KWAIT_REASON WaitReason
,
333 KPROCESSOR_MODE WaitMode
);
335 /* ipi.c ********************************************************************/
338 KiIpiServiceRoutine(IN PKTRAP_FRAME TrapFrame
,
339 IN
struct _KEXCEPTION_FRAME
* ExceptionFrame
);
342 KiIpiSendRequest(ULONG TargetSet
,
346 KeIpiGenericCall(VOID (STDCALL
*WorkerRoutine
)(PVOID
),
349 /* next file ***************************************************************/
351 typedef struct _KPROFILE_SOURCE_OBJECT
{
352 KPROFILE_SOURCE Source
;
353 LIST_ENTRY ListEntry
;
354 } KPROFILE_SOURCE_OBJECT
, *PKPROFILE_SOURCE_OBJECT
;
356 typedef struct _KPROFILE
{
359 LIST_ENTRY ListEntry
;
367 struct _KPROCESS
*Process
;
368 } KPROFILE
, *PKPROFILE
;
370 /* Cached modules from the loader block */
371 typedef enum _CACHED_MODULE_TYPE
{
377 MaximumCachedModuleType
,
378 } CACHED_MODULE_TYPE
, *PCACHED_MODULE_TYPE
;
379 extern PLOADER_MODULE CachedModules
[MaximumCachedModuleType
];
382 DbgBreakPointNoBugCheck(VOID
);
386 KeInitializeProfile(struct _KPROFILE
* Profile
,
387 struct _KPROCESS
* Process
,
391 KPROFILE_SOURCE ProfileSource
,
396 KeStartProfile(struct _KPROFILE
* Profile
,
401 KeStopProfile(struct _KPROFILE
* Profile
);
405 KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource
);
409 KeSetIntervalProfile(KPROFILE_SOURCE ProfileSource
,
415 PKTRAP_FRAME TrapFrame
420 KeProfileInterruptWithSource(
421 IN PKTRAP_FRAME TrapFrame
,
422 IN KPROFILE_SOURCE Source
427 KiRosPrintAddress(PVOID Address
);
429 VOID STDCALL
KeUpdateSystemTime(PKTRAP_FRAME TrapFrame
, KIRQL Irql
);
430 VOID STDCALL
KeUpdateRunTime(PKTRAP_FRAME TrapFrame
, KIRQL Irql
);
432 VOID STDCALL
KiExpireTimers(PKDPC Dpc
, PVOID DeferredContext
, PVOID SystemArgument1
, PVOID SystemArgument2
);
434 KIRQL
inline FASTCALL
KeAcquireDispatcherDatabaseLock(VOID
);
435 VOID
inline FASTCALL
KeAcquireDispatcherDatabaseLockAtDpcLevel(VOID
);
436 VOID
inline FASTCALL
KeReleaseDispatcherDatabaseLock(KIRQL Irql
);
437 VOID
inline FASTCALL
KeReleaseDispatcherDatabaseLockFromDpcLevel(VOID
);
441 KeInitializeThread(struct _KPROCESS
* Process
,
443 PKSYSTEM_ROUTINE SystemRoutine
,
444 PKSTART_ROUTINE StartRoutine
,
452 KeRundownThread(VOID
);
454 NTSTATUS
KeReleaseThread(PKTHREAD Thread
);
458 KeStackAttachProcess (
459 IN
struct _KPROCESS
* Process
,
460 OUT PKAPC_STATE ApcState
465 KeUnstackDetachProcess (
466 IN PKAPC_STATE ApcState
469 BOOLEAN
KiDispatcherObjectWake(DISPATCHER_HEADER
* hdr
, KPRIORITY increment
);
470 VOID STDCALL
KeExpireTimers(PKDPC Apc
,
474 VOID
inline FASTCALL
KeInitializeDispatcherHeader(DISPATCHER_HEADER
* Header
, ULONG Type
,
475 ULONG Size
, ULONG SignalState
);
476 VOID
KeDumpStackFrames(PULONG Frame
);
477 BOOLEAN
KiTestAlert(VOID
);
481 KiAbortWaitThread(PKTHREAD Thread
,
483 KPRIORITY Increment
);
487 KeInitializeProcess(struct _KPROCESS
*Process
,
490 LARGE_INTEGER DirectoryTableBase
);
494 KeForceResumeThread(IN PKTHREAD Thread
);
496 BOOLEAN STDCALL
KiInsertTimer(PKTIMER Timer
, LARGE_INTEGER DueTime
);
498 VOID
inline FASTCALL
KiSatisfyObjectWait(PDISPATCHER_HEADER Object
, PKTHREAD Thread
);
500 BOOLEAN
inline FASTCALL
KiIsObjectSignaled(PDISPATCHER_HEADER Object
, PKTHREAD Thread
);
502 VOID
inline FASTCALL
KiSatisifyMultipleObjectWaits(PKWAIT_BLOCK WaitBlock
);
504 VOID FASTCALL
KiWaitTest(PDISPATCHER_HEADER Object
, KPRIORITY Increment
);
506 PULONG
KeGetStackTopThread(struct _ETHREAD
* Thread
);
507 BOOLEAN STDCALL
KeContextToTrapFrame(PCONTEXT Context
, PKTRAP_FRAME TrapFrame
);
508 VOID STDCALL
KiDeliverApc(KPROCESSOR_MODE PreviousMode
,
510 PKTRAP_FRAME TrapFrame
);
513 KiKernelApcDeliveryCheck(VOID
);
516 KiInsertQueue(IN PKQUEUE Queue
,
517 IN PLIST_ENTRY Entry
,
522 KeSetProcess(struct _KPROCESS
* Process
,
523 KPRIORITY Increment
);
526 VOID STDCALL
KeInitializeEventPair(PKEVENT_PAIR EventPair
);
528 VOID STDCALL
KiInitializeUserApc(IN PVOID Reserved
,
529 IN PKTRAP_FRAME TrapFrame
,
530 IN PKNORMAL_ROUTINE NormalRoutine
,
531 IN PVOID NormalContext
,
532 IN PVOID SystemArgument1
,
533 IN PVOID SystemArgument2
);
535 VOID STDCALL
KiAttachProcess(struct _KTHREAD
*Thread
, struct _KPROCESS
*Process
, KIRQL ApcLock
, struct _KAPC_STATE
*SavedApcState
);
537 VOID STDCALL
KiSwapProcess(struct _KPROCESS
*NewProcess
, struct _KPROCESS
*OldProcess
);
541 KeTestAlertThread(IN KPROCESSOR_MODE AlertMode
);
543 BOOLEAN STDCALL
KeRemoveQueueApc (PKAPC Apc
);
544 VOID FASTCALL
KiWakeQueue(IN PKQUEUE Queue
);
545 PLIST_ENTRY STDCALL
KeRundownQueue(IN PKQUEUE Queue
);
547 extern LARGE_INTEGER SystemBootTime
;
549 /* INITIALIZATION FUNCTIONS *************************************************/
551 VOID
KeInitExceptions(VOID
);
552 VOID
KeInitInterrupts(VOID
);
553 VOID
KeInitTimer(VOID
);
554 VOID
KeInitDpc(struct _KPRCB
* Prcb
);
555 VOID
KeInitDispatcher(VOID
);
556 VOID
inline FASTCALL
KeInitializeDispatcher(VOID
);
557 VOID
KiInitializeSystemClock(VOID
);
558 VOID
KiInitializeBugCheck(VOID
);
559 VOID
Phase1Initialization(PVOID Context
);
561 VOID
KeInit1(PCHAR CommandLine
, PULONG LastKernelAddress
);
564 BOOLEAN
KiDeliverUserApc(PKTRAP_FRAME TrapFrame
);
568 KiMoveApcState (PKAPC_STATE OldState
,
569 PKAPC_STATE NewState
);
572 KiAddProfileEvent(KPROFILE_SOURCE Source
, ULONG Pc
);
574 KiDispatchException(PEXCEPTION_RECORD ExceptionRecord
,
577 KPROCESSOR_MODE PreviousMode
,
578 BOOLEAN SearchFrames
);
579 VOID
KeTrapFrameToContext(PKTRAP_FRAME TrapFrame
,
582 KeApplicationProcessorInit(VOID
);
584 KePrepareForApplicationProcessorInit(ULONG id
);
586 KiUserTrapHandler(PKTRAP_FRAME Tf
, ULONG ExceptionNr
, PVOID Cr2
);
588 KePushAndStackSwitchAndSysRet(ULONG Push
, PVOID NewStack
);
590 KeStackSwitchAndRet(PVOID NewStack
);
592 KeBugCheckWithTf(ULONG BugCheckCode
,
593 ULONG BugCheckParameter1
,
594 ULONG BugCheckParameter2
,
595 ULONG BugCheckParameter3
,
596 ULONG BugCheckParameter4
,
598 #define KEBUGCHECKWITHTF(a,b,c,d,e,f) DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), KeBugCheckWithTf(a,b,c,d,e,f)
600 KiDumpTrapFrame(PKTRAP_FRAME Tf
, ULONG ExceptionNr
, ULONG cr2
);
604 KeFlushCurrentTb(VOID
);
607 KiSetSystemTime(PLARGE_INTEGER NewSystemTime
);
609 #endif /* not __ASM__ */
611 #define MAXIMUM_PROCESSORS 32
613 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */