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.
19 /* $Id: ps.h,v 1.49 2003/07/15 16:26:18 silverblade Exp $
21 * FILE: ntoskrnl/ke/kthread.c
22 * PURPOSE: Process manager definitions
23 * PROGRAMMER: David Welch (welch@cwcom.net)
28 #ifndef __INCLUDE_INTERNAL_PS_H
29 #define __INCLUDE_INTERNAL_PS_H
33 /* Forward declarations. */
39 #include <internal/arch/ps.h>
43 #include <internal/mm.h>
47 #define KeGetCurrentProcessorNumber() (KeGetCurrentKPCR()->ProcessorNumber)
50 extern HANDLE SystemProcessHandle
;
52 extern LCID PsDefaultThreadLocaleId
;
53 extern LCID PsDefaultSystemLocaleId
;
57 typedef struct _KAPC_STATE
59 LIST_ENTRY ApcListHead
[2];
60 struct _KPROCESS
* Process
;
61 UCHAR KernelApcInProgress
;
62 UCHAR KernelApcPending
;
63 USHORT UserApcPending
;
64 } __attribute__((packed
)) KAPC_STATE
, *PKAPC_STATE
;
66 #endif /* __USE_W32API */
68 typedef struct _KTHREAD
70 /* For waiting on thread exit */
71 DISPATCHER_HEADER DispatcherHeader
; /* 00 */
73 /* List of mutants owned by the thread */
74 LIST_ENTRY MutantListHead
; /* 10 */
75 PVOID InitialStack
; /* 18 */
76 ULONG StackLimit
; /* 1C */
78 /* Pointer to the thread's environment block in user memory */
81 /* Pointer to the thread's TLS array */
82 PVOID TlsArray
; /* 24 */
83 PVOID KernelStack
; /* 28 */
84 UCHAR DebugActive
; /* 2C */
86 /* Thread state (one of THREAD_STATE_xxx constants below) */
88 UCHAR Alerted
[2]; /* 2E */
90 UCHAR NpxState
; /* 31 */
91 UCHAR Saturation
; /* 32 */
92 CHAR Priority
; /* 33 */
93 KAPC_STATE ApcState
; /* 34 */
94 ULONG ContextSwitches
; /* 4C */
95 ULONG WaitStatus
; /* 50 */
96 KIRQL WaitIrql
; /* 54 */
97 UCHAR WaitMode
; /* 55 */
98 UCHAR WaitNext
; /* 56 */
99 UCHAR WaitReason
; /* 57 */
100 PKWAIT_BLOCK WaitBlockList
; /* 58 */
101 LIST_ENTRY WaitListEntry
; /* 5C */
102 ULONG WaitTime
; /* 64 */
103 CHAR BasePriority
; /* 68 */
104 UCHAR DecrementCount
; /* 69 */
105 UCHAR PriorityDecrement
; /* 6A */
106 UCHAR Quantum
; /* 6B */
107 KWAIT_BLOCK WaitBlock
[4]; /* 6C */
108 PVOID LegoData
; /* CC */
109 LONG KernelApcDisable
; /* D0 */
110 KAFFINITY UserAffinity
; /* D4 */
111 UCHAR SystemAffinityActive
;/* D8 */
112 UCHAR PowerState
; /* D9 */
113 UCHAR NpxIrql
; /* DA */
115 SSDT_ENTRY
*ServiceTable
; /* DC */
116 PKQUEUE Queue
; /* E0 */
117 KSPIN_LOCK ApcQueueLock
; /* E4 */
118 KTIMER Timer
; /* E8 */
119 LIST_ENTRY QueueListEntry
; /* 110 */
120 KAFFINITY Affinity
; /* 118 */
121 UCHAR Preempted
; /* 11C */
122 UCHAR ProcessReadyQueue
; /* 11D */
123 UCHAR KernelStackResident
; /* 11E */
124 UCHAR NextProcessor
; /* 11F */
125 PVOID CallbackStack
; /* 120 */
126 BOOL Win32Thread
; /* 124 */
127 struct _KTRAP_FRAME
* TrapFrame
; /* 128 */
128 PVOID ApcStatePointer
[2]; /* 12C */
129 UCHAR EnableStackSwap
; /* 134 */
130 UCHAR LargeStack
; /* 135 */
131 UCHAR ResourceIndex
; /* 136 */
132 UCHAR PreviousMode
; /* 137 */
133 ULONG KernelTime
; /* 138 */
134 ULONG UserTime
; /* 13C */
135 KAPC_STATE SavedApcState
; /* 140 */
136 UCHAR Alertable
; /* 158 */
137 UCHAR ApcStateIndex
; /* 159 */
138 UCHAR ApcQueueable
; /* 15A */
139 UCHAR AutoAlignment
; /* 15B */
140 PVOID StackBase
; /* 15C */
141 KAPC SuspendApc
; /* 160 */
142 KSEMAPHORE SuspendSemaphore
; /* 190 */
143 LIST_ENTRY ThreadListEntry
; /* 1A4 */
144 CHAR FreezeCount
; /* 1AC */
145 UCHAR SuspendCount
; /* 1AD */
146 UCHAR IdealProcessor
; /* 1AE */
147 UCHAR DisableBoost
; /* 1AF */
150 * Below here are thread structure members that are specific to ReactOS
153 /* Added by Phillip Susi for list of threads in a process */
154 LIST_ENTRY ProcessThreadListEntry
; /* 1B0 */
155 } __attribute__((packed
)) KTHREAD
;
157 /* Top level irp definitions. */
158 #define FSRTL_FSP_TOP_LEVEL_IRP (0x01)
159 #define FSRTL_CACHE_TOP_LEVEL_IRP (0x02)
160 #define FSRTL_MOD_WRITE_TOP_LEVEL_IRP (0x03)
161 #define FSRTL_FAST_IO_TOP_LEVEL_IRP (0x04)
162 #define FSRTL_MAX_TOP_LEVEL_IRP_FLAG (0x04)
164 typedef struct _TOP_LEVEL_IRP
167 ULONG TopLevelIrpConst
;
172 PACCESS_TOKEN Token
; // 0x0
173 UCHAR Unknown1
; // 0x4
174 UCHAR Unknown2
; // 0x5
176 SECURITY_IMPERSONATION_LEVEL Level
; // 0x8
177 } PS_IMPERSONATION_INFO
, *PPS_IMPERSONATION_INFO
;
179 typedef struct _ETHREAD
181 KTHREAD Tcb
; /* 000 */
182 TIME CreateTime
; /* 1B0/1B8 */
185 TIME ExitTime
; /* 1B8/1E4 */
186 LIST_ENTRY LpcReplyChain
; /* 1B8/1E4 */
188 NTSTATUS ExitStatus
; /* 1C0/1EC */
189 LIST_ENTRY PostBlockList
; /* 1C4/1F0 */
190 LIST_ENTRY TerminationPortList
; /* 1CC/1F8 */
191 KSPIN_LOCK ActiveTimerListLock
; /* 1D4/200 */
192 LIST_ENTRY ActiveTimerListHead
; /* 1D8/204 */
193 CLIENT_ID Cid
; /* 1E0/20C */
194 KSEMAPHORE LpcReplySemaphore
; /* 1E8/214 */
195 PVOID LpcReplyMessage
; /* 1FC/228 */
196 PLARGE_INTEGER LpcReplyMessageId
; /* 200/22C */
197 ULONG PerformanceCounterLow
; /* 204/230 */
198 PPS_IMPERSONATION_INFO ImpersonationInfo
; /* 208/234 */
199 LIST_ENTRY IrpList
; /* 20C/238 */
200 TOP_LEVEL_IRP
* TopLevelIrp
; /* 214/240 */
201 PDEVICE_OBJECT DeviceToVerify
; /* 218/244 */
202 ULONG ReadClusterSize
; /* 21C/248 */
203 UCHAR ForwardClusterOnly
; /* 220/24C */
204 UCHAR DisablePageFaultClustering
; /* 221/24D */
205 UCHAR DeadThread
; /* 222/24E */
206 UCHAR HasTerminated
; /* 223/24F */
207 PVOID EventPair
; /* 224/250 */
208 ACCESS_MASK GrantedAccess
; /* 228/254 */
209 struct _EPROCESS
* ThreadsProcess
; /* 22C/258 */
210 PKSTART_ROUTINE StartAddress
; /* 230/25C */
213 LPTHREAD_START_ROUTINE Win32StartAddress
; /* 234/260 */
214 ULONG LpcReceiveMessageId
; /* 234/260 */
216 UCHAR LpcExitThreadCalled
; /* 238/264 */
217 UCHAR HardErrorsAreDisabled
; /* 239/265 */
218 UCHAR LpcReceivedMsgIdValid
; /* 23A/266 */
219 UCHAR ActiveImpersonationInfo
; /* 23B/267 */
220 ULONG PerformanceCountHigh
; /* 23C/268 */
223 * Added by David Welch (welch@cwcom.net)
225 struct _EPROCESS
* OldProcess
; /* 240/26C */
227 struct _W32THREAD
* Win32Thread
;
229 } __attribute__((packed
)) ETHREAD
;
233 typedef struct _ETHREAD
*PETHREAD
;
235 #endif /* __USE_W32API */
238 typedef struct _KPROCESS
240 /* So it's possible to wait for the process to terminate */
241 DISPATCHER_HEADER DispatcherHeader
; /* 000 */
243 * Presumably a list of profile objects associated with this process,
246 LIST_ENTRY ProfileListHead
; /* 010 */
248 * We use the first member of this array to hold the physical address of
249 * the page directory for this process.
251 PHYSICAL_ADDRESS DirectoryTableBase
; /* 018 */
253 * Presumably a descriptor for the process's LDT, currently unused.
255 ULONG LdtDescriptor
[2]; /* 020 */
257 * Presumably for processing int 0x21 from V86 mode DOS, currently
260 ULONG Int21Descriptor
[2]; /* 028 */
262 USHORT IopmOffset
; /* 030 */
264 * Presumably I/O privilege level to be used for this process, currently
267 UCHAR Iopl
; /* 032 */
268 /* Set if this process is a virtual dos machine? */
269 UCHAR VdmFlag
; /* 033 */
270 /* Bitmask of the processors being used by this process's threads? */
271 ULONG ActiveProcessors
; /* 034 */
272 /* Aggregate of the time this process's threads have spent in kernel mode? */
273 ULONG KernelTime
; /* 038 */
274 /* Aggregate of the time this process's threads have spent in user mode? */
275 ULONG UserTime
; /* 03C */
276 /* List of this process's threads that are ready for execution? */
277 LIST_ENTRY ReadyListHead
; /* 040 */
278 /* List of this process's threads that have their stacks swapped out? */
279 LIST_ENTRY SwapListEntry
; /* 048 */
280 /* List of this process's threads? */
281 LIST_ENTRY ThreadListHead
; /* 050 */
282 /* Maybe a lock for this data structure, the type is assumed. */
283 KSPIN_LOCK ProcessLock
; /* 058 */
284 /* Default affinity mask for this process's threads? */
285 ULONG Affinity
; /* 05C */
286 /* Count of the stacks allocated for this process's threads? */
287 USHORT StackCount
; /* 060 */
288 /* Base priority for this process's threads? */
289 KPRIORITY BasePriority
; /* 062 */
290 /* Default quantum for this process's threads */
291 UCHAR ThreadQuantum
; /* 063 */
293 UCHAR AutoAlignment
; /* 064 */
294 /* Process execution state, currently either active or terminated. */
295 UCHAR State
; /* 065 */
296 /* Seed for generating thread ids for this process's threads? */
297 UCHAR ThreadSeed
; /* 066 */
298 /* Disable priority boosts? */
299 UCHAR DisableBoost
; /* 067 */
304 typedef struct _KPROCESS
*PKPROCESS
;
306 #endif /* __USE_W32API */
310 /* Microkernel specific process state. */
311 KPROCESS Pcb
; /* 000 */
312 /* Exit status of the process. */
313 NTSTATUS ExitStatus
; /* 068 */
315 KEVENT LockEvent
; /* 06C */
317 ULONG LockCount
; /* 07C */
318 /* Time of process creation. */
319 TIME CreateTime
; /* 080 */
320 /* Time of process exit. */
321 TIME ExitTime
; /* 088 */
323 PVOID LockOwner
; /* 090 */
325 ULONG UniqueProcessId
; /* 094 */
327 LIST_ENTRY ActiveProcessLinks
; /* 098 */
329 ULONG QuotaPeakPoolUsage
[2]; /* 0A0 */
331 ULONG QuotaPoolUsage
[2]; /* 0A8 */
333 ULONG PagefileUsage
; /* 0B0 */
335 ULONG CommitCharge
; /* 0B4 */
337 ULONG PeakPagefileUsage
; /* 0B8 */
339 ULONG PeakVirtualSize
; /* 0BC */
341 LARGE_INTEGER VirtualSize
; /* 0C0 */
345 ULONG LastTrimFaultCount
;
346 ULONG PageFaultCount
;
347 ULONG PeakWorkingSetSize
;
348 ULONG WorkingSetSize
;
349 ULONG MinimumWorkingSetSize
;
350 ULONG MaximumWorkingSetSize
;
351 ULONG VmWorkingSetList
;
352 LIST_ENTRY WorkingSetExpansionList
;
353 UCHAR AllowWorkingSetAdjustment
;
354 UCHAR AddressSpaceBeingDeleted
;
355 UCHAR ForegroundPrioritySwitch
;
356 UCHAR MemoryPriority
;
358 PVOID LastProtoPteFault
;
359 struct _EPORT
* DebugPort
;
360 struct _EPORT
* ExceptionPort
;
363 /* FAST_MUTEX WorkingSetLock; */
364 KMUTEX WorkingSetLock
;
365 PVOID WorkingSetPage
;
366 UCHAR ProcessOutswapEnabled
;
367 UCHAR ProcessOutswapped
;
368 UCHAR AddressSpaceInitialized
;
369 UCHAR AddressSpaceDeleted
;
370 FAST_MUTEX AddressCreationLock
;
371 KSPIN_LOCK HyperSpaceLock
;
372 PETHREAD ForkInProgress
;
374 UCHAR ForkWasSuccessful
;
375 UCHAR MmAgressiveWsTrimMask
;
376 PKEVENT VmOperationEvent
;
377 PVOID PageDirectoryPte
;
378 ULONG LastFaultCount
;
382 ULONG NumberOfPrivatePages
;
383 ULONG NumberOfLockedPages
;
384 USHORT NextProcessColour
;
385 UCHAR ExitProcessCalled
;
386 UCHAR CreateProcessReported
;
387 HANDLE SectionHandle
;
389 PVOID SectionBaseAddress
;
391 NTSTATUS LastThreadExitStatus
;
392 PVOID WorkingSetWatch
;
393 HANDLE InheritedFromUniqueProcessId
;
394 ACCESS_MASK GrantedAccess
;
395 ULONG DefaultHardErrorProcessing
;
396 PVOID LdtInformation
;
399 KMUTANT ProcessMutant
;
400 CHAR ImageFileName
[16];
401 ULONG VmTrimFaultValue
;
402 UCHAR SetTimerResolution
;
404 UCHAR SubSystemMinorVersion
;
405 UCHAR SubSystemMajorVersion
;
406 USHORT SubSystemVersion
;
407 struct _W32PROCESS
* Win32Process
;
408 HANDLE Win32WindowStation
;
411 * Added by David Welch (welch@mcmail.com)
414 MADDRESS_SPACE AddressSpace
;
415 HANDLE_TABLE HandleTable
;
416 LIST_ENTRY ProcessListEntry
;
419 * Added by Philip Susi for list of threads in process
421 LIST_ENTRY ThreadListHead
;
424 #define PROCESS_STATE_TERMINATED (1)
425 #define PROCESS_STATE_ACTIVE (2)
427 VOID
PiInitDefaultLocale(VOID
);
428 VOID
PiInitProcessManager(VOID
);
429 VOID
PiShutdownProcessManager(VOID
);
430 VOID
PsInitThreadManagment(VOID
);
431 VOID
PsInitProcessManagment(VOID
);
432 VOID
PsInitIdleThread(VOID
);
433 VOID
PsDispatchThreadNoLock(ULONG NewThreadStatus
);
434 VOID
PiTerminateProcessThreads(PEPROCESS Process
, NTSTATUS ExitStatus
);
435 VOID
PsTerminateOtherThread(PETHREAD Thread
, NTSTATUS ExitStatus
);
436 VOID
PsReleaseThread(PETHREAD Thread
);
437 VOID
PsBeginThread(PKSTART_ROUTINE StartRoutine
, PVOID StartContext
);
438 VOID
PsBeginThreadWithContextInternal(VOID
);
439 VOID
PiKillMostProcesses(VOID
);
440 NTSTATUS STDCALL
PiTerminateProcess(PEPROCESS Process
, NTSTATUS ExitStatus
);
441 VOID
PiInitApcManagement(VOID
);
442 VOID STDCALL
PiDeleteThread(PVOID ObjectBody
);
443 VOID
PsReapThreads(VOID
);
445 PsInitializeThread(HANDLE ProcessHandle
,
447 PHANDLE ThreadHandle
,
448 ACCESS_MASK DesiredAccess
,
449 POBJECT_ATTRIBUTES ObjectAttributes
,
452 PACCESS_TOKEN
PsReferenceEffectiveToken(PETHREAD Thread
,
453 PTOKEN_TYPE TokenType
,
455 PSECURITY_IMPERSONATION_LEVEL Level
);
457 NTSTATUS
PsOpenTokenOfProcess(HANDLE ProcessHandle
,
458 PACCESS_TOKEN
* Token
);
460 NTSTATUS
PsSuspendThread(PETHREAD Thread
, PULONG PreviousCount
);
461 NTSTATUS
PsResumeThread(PETHREAD Thread
, PULONG PreviousCount
);
464 #define THREAD_STATE_INITIALIZED (0)
465 #define THREAD_STATE_READY (1)
466 #define THREAD_STATE_RUNNING (2)
467 #define THREAD_STATE_SUSPENDED (3)
468 #define THREAD_STATE_FROZEN (4)
469 #define THREAD_STATE_TERMINATED_1 (5)
470 #define THREAD_STATE_TERMINATED_2 (6)
471 #define THREAD_STATE_BLOCKED (7)
472 #define THREAD_STATE_MAX (8)
476 * Internal thread priorities, added by Phillip Susi
477 * TODO: rebalence these to make use of all priorities... the ones above 16
478 * can not all be used right now
480 #define PROCESS_PRIO_IDLE 3
481 #define PROCESS_PRIO_NORMAL 8
482 #define PROCESS_PRIO_HIGH 13
483 #define PROCESS_PRIO_RT 18
487 KeInitializeThread(PKPROCESS Process
, PKTHREAD Thread
, BOOLEAN First
);
488 NTSTATUS
KeReleaseThread(PETHREAD Thread
);
489 VOID STDCALL
PiDeleteProcess(PVOID ObjectBody
);
490 VOID
PsReapThreads(VOID
);
491 VOID
PsUnfreezeOtherThread(PETHREAD Thread
);
492 VOID
PsFreezeOtherThread(PETHREAD Thread
);
493 VOID
PsFreezeProcessThreads(PEPROCESS Process
);
494 VOID
PsUnfreezeProcessThreads(PEPROCESS Process
);
495 PEPROCESS
PsGetNextProcess(PEPROCESS OldProcess
);
497 PsBlockThread(PNTSTATUS Status
, UCHAR Alertable
, ULONG WaitMode
,
498 BOOLEAN DispatcherLock
, KIRQL WaitIrql
, UCHAR WaitReason
);
500 PsUnblockThread(PETHREAD Thread
, PNTSTATUS WaitStatus
);
502 PsApplicationProcessorInit(VOID
);
504 PsPrepareForApplicationProcessorInit(ULONG Id
);
506 PsIdleThreadMain(PVOID Context
);
509 PiSuspendThreadRundownRoutine(PKAPC Apc
);
511 PiSuspendThreadKernelRoutine(PKAPC Apc
,
512 PKNORMAL_ROUTINE
* NormalRoutine
,
513 PVOID
* NormalContext
,
514 PVOID
* SystemArgument1
,
515 PVOID
* SystemArguemnt2
);
517 PiSuspendThreadNormalRoutine(PVOID NormalContext
,
518 PVOID SystemArgument1
,
519 PVOID SystemArgument2
);
521 PsDispatchThread(ULONG NewThreadStatus
);
523 PsInitialiseSuspendImplementation(VOID
);
525 extern ULONG PiNrThreadsAwaitingReaping
;
529 PsInitWin32Thread (PETHREAD Thread
);
532 PsTerminateWin32Process (PEPROCESS Process
);
535 PsTerminateWin32Thread (PETHREAD Thread
);
537 #endif /* ASSEMBLER */
539 #endif /* __INCLUDE_INTERNAL_PS_H */