My first CVS commit. Hope I get this right. I did put a few files in the CVS dir...
[reactos.git] / reactos / ntoskrnl / include / internal / ps.h
1 /*
2 * ReactOS kernel
3 * Copyright (C) 2000 David Welch <welch@cwcom.net>
4 *
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.
9 *
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.
14 *
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.
18 */
19 /* $Id: ps.h,v 1.49 2003/07/15 16:26:18 silverblade Exp $
20 *
21 * FILE: ntoskrnl/ke/kthread.c
22 * PURPOSE: Process manager definitions
23 * PROGRAMMER: David Welch (welch@cwcom.net)
24 * UPDATE HISTORY:
25 * Created 22/05/98
26 */
27
28 #ifndef __INCLUDE_INTERNAL_PS_H
29 #define __INCLUDE_INTERNAL_PS_H
30
31 #ifndef __ASM__
32
33 /* Forward declarations. */
34 struct _KTHREAD;
35 struct _KTRAPFRAME;
36
37 #endif /* __ASM__ */
38
39 #include <internal/arch/ps.h>
40
41 #ifndef __ASM__
42
43 #include <internal/mm.h>
44 #include <napi/teb.h>
45
46 #ifndef __USE_W32API
47 #define KeGetCurrentProcessorNumber() (KeGetCurrentKPCR()->ProcessorNumber)
48 #endif
49
50 extern HANDLE SystemProcessHandle;
51
52 extern LCID PsDefaultThreadLocaleId;
53 extern LCID PsDefaultSystemLocaleId;
54
55 #ifndef __USE_W32API
56
57 typedef struct _KAPC_STATE
58 {
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;
65
66 #endif /* __USE_W32API */
67
68 typedef struct _KTHREAD
69 {
70 /* For waiting on thread exit */
71 DISPATCHER_HEADER DispatcherHeader; /* 00 */
72
73 /* List of mutants owned by the thread */
74 LIST_ENTRY MutantListHead; /* 10 */
75 PVOID InitialStack; /* 18 */
76 ULONG StackLimit; /* 1C */
77
78 /* Pointer to the thread's environment block in user memory */
79 PTEB Teb; /* 20 */
80
81 /* Pointer to the thread's TLS array */
82 PVOID TlsArray; /* 24 */
83 PVOID KernelStack; /* 28 */
84 UCHAR DebugActive; /* 2C */
85
86 /* Thread state (one of THREAD_STATE_xxx constants below) */
87 UCHAR State; /* 2D */
88 UCHAR Alerted[2]; /* 2E */
89 UCHAR Iopl; /* 30 */
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 */
114 UCHAR Pad; /* DB */
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 */
148
149 /*
150 * Below here are thread structure members that are specific to ReactOS
151 */
152
153 /* Added by Phillip Susi for list of threads in a process */
154 LIST_ENTRY ProcessThreadListEntry; /* 1B0 */
155 } __attribute__((packed)) KTHREAD;
156
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)
163
164 typedef struct _TOP_LEVEL_IRP
165 {
166 PIRP TopLevelIrp;
167 ULONG TopLevelIrpConst;
168 } TOP_LEVEL_IRP;
169
170 typedef struct
171 {
172 PACCESS_TOKEN Token; // 0x0
173 UCHAR Unknown1; // 0x4
174 UCHAR Unknown2; // 0x5
175 UCHAR Pad[2]; // 0x6
176 SECURITY_IMPERSONATION_LEVEL Level; // 0x8
177 } PS_IMPERSONATION_INFO, *PPS_IMPERSONATION_INFO;
178
179 typedef struct _ETHREAD
180 {
181 KTHREAD Tcb; /* 000 */
182 TIME CreateTime; /* 1B0/1B8 */
183 union
184 {
185 TIME ExitTime; /* 1B8/1E4 */
186 LIST_ENTRY LpcReplyChain; /* 1B8/1E4 */
187 } u1;
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 */
211 union
212 {
213 LPTHREAD_START_ROUTINE Win32StartAddress; /* 234/260 */
214 ULONG LpcReceiveMessageId; /* 234/260 */
215 } u2;
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 */
221
222 /*
223 * Added by David Welch (welch@cwcom.net)
224 */
225 struct _EPROCESS* OldProcess; /* 240/26C */
226
227 struct _W32THREAD* Win32Thread;
228
229 } __attribute__((packed)) ETHREAD;
230
231 #ifndef __USE_W32API
232
233 typedef struct _ETHREAD *PETHREAD;
234
235 #endif /* __USE_W32API */
236
237
238 typedef struct _KPROCESS
239 {
240 /* So it's possible to wait for the process to terminate */
241 DISPATCHER_HEADER DispatcherHeader; /* 000 */
242 /*
243 * Presumably a list of profile objects associated with this process,
244 * currently unused.
245 */
246 LIST_ENTRY ProfileListHead; /* 010 */
247 /*
248 * We use the first member of this array to hold the physical address of
249 * the page directory for this process.
250 */
251 PHYSICAL_ADDRESS DirectoryTableBase; /* 018 */
252 /*
253 * Presumably a descriptor for the process's LDT, currently unused.
254 */
255 ULONG LdtDescriptor[2]; /* 020 */
256 /*
257 * Presumably for processing int 0x21 from V86 mode DOS, currently
258 * unused.
259 */
260 ULONG Int21Descriptor[2]; /* 028 */
261 /* Don't know. */
262 USHORT IopmOffset; /* 030 */
263 /*
264 * Presumably I/O privilege level to be used for this process, currently
265 * unused.
266 */
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 */
292 /* Unknown. */
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 */
300 } KPROCESS;
301
302 #ifndef __USE_W32API
303
304 typedef struct _KPROCESS *PKPROCESS;
305
306 #endif /* __USE_W32API */
307
308 struct _EPROCESS
309 {
310 /* Microkernel specific process state. */
311 KPROCESS Pcb; /* 000 */
312 /* Exit status of the process. */
313 NTSTATUS ExitStatus; /* 068 */
314 /* Unknown. */
315 KEVENT LockEvent; /* 06C */
316 /* Unknown. */
317 ULONG LockCount; /* 07C */
318 /* Time of process creation. */
319 TIME CreateTime; /* 080 */
320 /* Time of process exit. */
321 TIME ExitTime; /* 088 */
322 /* Unknown. */
323 PVOID LockOwner; /* 090 */
324 /* Process id. */
325 ULONG UniqueProcessId; /* 094 */
326 /* Unknown. */
327 LIST_ENTRY ActiveProcessLinks; /* 098 */
328 /* Unknown. */
329 ULONG QuotaPeakPoolUsage[2]; /* 0A0 */
330 /* Unknown. */
331 ULONG QuotaPoolUsage[2]; /* 0A8 */
332 /* Unknown. */
333 ULONG PagefileUsage; /* 0B0 */
334 /* Unknown. */
335 ULONG CommitCharge; /* 0B4 */
336 /* Unknown. */
337 ULONG PeakPagefileUsage; /* 0B8 */
338 /* Unknown. */
339 ULONG PeakVirtualSize; /* 0BC */
340 /* Unknown. */
341 LARGE_INTEGER VirtualSize; /* 0C0 */
342 struct
343 {
344 ULONG LastTrimTime;
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;
357 } Vm;
358 PVOID LastProtoPteFault;
359 struct _EPORT* DebugPort;
360 struct _EPORT* ExceptionPort;
361 PVOID ObjectTable;
362 PVOID Token;
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;
373 USHORT VmOperation;
374 UCHAR ForkWasSuccessful;
375 UCHAR MmAgressiveWsTrimMask;
376 PKEVENT VmOperationEvent;
377 PVOID PageDirectoryPte;
378 ULONG LastFaultCount;
379 PVOID VadRoot;
380 PVOID VadHint;
381 PVOID CloneRoot;
382 ULONG NumberOfPrivatePages;
383 ULONG NumberOfLockedPages;
384 USHORT NextProcessColour;
385 UCHAR ExitProcessCalled;
386 UCHAR CreateProcessReported;
387 HANDLE SectionHandle;
388 PPEB Peb;
389 PVOID SectionBaseAddress;
390 PVOID QuotaBlock;
391 NTSTATUS LastThreadExitStatus;
392 PVOID WorkingSetWatch;
393 HANDLE InheritedFromUniqueProcessId;
394 ACCESS_MASK GrantedAccess;
395 ULONG DefaultHardErrorProcessing;
396 PVOID LdtInformation;
397 ULONG VadFreeHint;
398 PVOID VdmObjects;
399 KMUTANT ProcessMutant;
400 CHAR ImageFileName[16];
401 ULONG VmTrimFaultValue;
402 UCHAR SetTimerResolution;
403 UCHAR PriorityClass;
404 UCHAR SubSystemMinorVersion;
405 UCHAR SubSystemMajorVersion;
406 USHORT SubSystemVersion;
407 struct _W32PROCESS* Win32Process;
408 HANDLE Win32WindowStation;
409
410 /*
411 * Added by David Welch (welch@mcmail.com)
412 */
413 HANDLE Win32Desktop;
414 MADDRESS_SPACE AddressSpace;
415 HANDLE_TABLE HandleTable;
416 LIST_ENTRY ProcessListEntry;
417
418 /*
419 * Added by Philip Susi for list of threads in process
420 */
421 LIST_ENTRY ThreadListHead;
422 };
423
424 #define PROCESS_STATE_TERMINATED (1)
425 #define PROCESS_STATE_ACTIVE (2)
426
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);
444 NTSTATUS
445 PsInitializeThread(HANDLE ProcessHandle,
446 PETHREAD* ThreadPtr,
447 PHANDLE ThreadHandle,
448 ACCESS_MASK DesiredAccess,
449 POBJECT_ATTRIBUTES ObjectAttributes,
450 BOOLEAN First);
451
452 PACCESS_TOKEN PsReferenceEffectiveToken(PETHREAD Thread,
453 PTOKEN_TYPE TokenType,
454 PUCHAR b,
455 PSECURITY_IMPERSONATION_LEVEL Level);
456
457 NTSTATUS PsOpenTokenOfProcess(HANDLE ProcessHandle,
458 PACCESS_TOKEN* Token);
459
460 NTSTATUS PsSuspendThread(PETHREAD Thread, PULONG PreviousCount);
461 NTSTATUS PsResumeThread(PETHREAD Thread, PULONG PreviousCount);
462
463
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)
473
474
475 /*
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
479 */
480 #define PROCESS_PRIO_IDLE 3
481 #define PROCESS_PRIO_NORMAL 8
482 #define PROCESS_PRIO_HIGH 13
483 #define PROCESS_PRIO_RT 18
484
485
486 VOID
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);
496 VOID
497 PsBlockThread(PNTSTATUS Status, UCHAR Alertable, ULONG WaitMode,
498 BOOLEAN DispatcherLock, KIRQL WaitIrql, UCHAR WaitReason);
499 VOID
500 PsUnblockThread(PETHREAD Thread, PNTSTATUS WaitStatus);
501 VOID
502 PsApplicationProcessorInit(VOID);
503 VOID
504 PsPrepareForApplicationProcessorInit(ULONG Id);
505 NTSTATUS STDCALL
506 PsIdleThreadMain(PVOID Context);
507
508 VOID STDCALL
509 PiSuspendThreadRundownRoutine(PKAPC Apc);
510 VOID STDCALL
511 PiSuspendThreadKernelRoutine(PKAPC Apc,
512 PKNORMAL_ROUTINE* NormalRoutine,
513 PVOID* NormalContext,
514 PVOID* SystemArgument1,
515 PVOID* SystemArguemnt2);
516 VOID STDCALL
517 PiSuspendThreadNormalRoutine(PVOID NormalContext,
518 PVOID SystemArgument1,
519 PVOID SystemArgument2);
520 VOID STDCALL
521 PsDispatchThread(ULONG NewThreadStatus);
522 VOID
523 PsInitialiseSuspendImplementation(VOID);
524
525 extern ULONG PiNrThreadsAwaitingReaping;
526
527
528 NTSTATUS
529 PsInitWin32Thread (PETHREAD Thread);
530
531 VOID
532 PsTerminateWin32Process (PEPROCESS Process);
533
534 VOID
535 PsTerminateWin32Thread (PETHREAD Thread);
536
537 #endif /* ASSEMBLER */
538
539 #endif /* __INCLUDE_INTERNAL_PS_H */