Reactos
1/*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/include/internal/ps.h
5 * PURPOSE: Internal header for the Process Manager
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7 */
8
9//
10// Define this if you want debugging support
11//
12#define _PS_DEBUG_ 0x00
13
14//
15// These define the Debug Masks Supported
16//
17#define PS_THREAD_DEBUG 0x01
18#define PS_PROCESS_DEBUG 0x02
19#define PS_SECURITY_DEBUG 0x04
20#define PS_JOB_DEBUG 0x08
21#define PS_NOTIFICATIONS_DEBUG 0x10
22#define PS_WIN32K_DEBUG 0x20
23#define PS_STATE_DEBUG 0x40
24#define PS_QUOTA_DEBUG 0x80
25#define PS_KILL_DEBUG 0x100
26#define PS_REF_DEBUG 0x200
27
28//
29// Debug/Tracing support
30//
31#if _PS_DEBUG_
32#ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
33#define PSTRACE(x, ...) \
34 { \
35 DbgPrintEx("%s [%.16s] - ", \
36 __FUNCTION__, \
37 PsGetCurrentProcess()->ImageFileName); \
38 DbgPrintEx(__VA_ARGS__); \
39 }
40#else
41#define PSTRACE(x, ...) \
42 if (x & PspTraceLevel) \
43 { \
44 DbgPrint("%s [%.16s] - ", \
45 __FUNCTION__, \
46 PsGetCurrentProcess()->ImageFileName); \
47 DbgPrint(__VA_ARGS__); \
48 }
49#endif
50#define PSREFTRACE(x) \
51 PSTRACE(PS_REF_DEBUG, \
52 "Pointer Count [%p] @%d: %lx\n", \
53 x, \
54 __LINE__, \
55 OBJECT_TO_OBJECT_HEADER(x)->PointerCount)
56#else
57#define PSTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
58#define PSREFTRACE(x)
59#endif
60
61//
62// Maximum Count of Notification Routines
63//
64#define PSP_MAX_CREATE_THREAD_NOTIFY 8
65#define PSP_MAX_LOAD_IMAGE_NOTIFY 8
66#define PSP_MAX_CREATE_PROCESS_NOTIFY 8
67
68//
69// Maximum Job Scheduling Classes
70//
71#define PSP_JOB_SCHEDULING_CLASSES 10
72
73//
74// Process Quota Threshold Values
75//
76#define PSP_NON_PAGED_POOL_QUOTA_THRESHOLD 0x10000
77#define PSP_PAGED_POOL_QUOTA_THRESHOLD 0x80000
78
79//
80// Thread "Set/Get Context" Context Structure
81//
82typedef struct _GET_SET_CTX_CONTEXT
83{
84 KAPC Apc;
85 KEVENT Event;
86 KPROCESSOR_MODE Mode;
87 CONTEXT Context;
88} GET_SET_CTX_CONTEXT, *PGET_SET_CTX_CONTEXT;
89
90//
91// Initialization Functions
92//
93VOID
94NTAPI
95PspShutdownProcessManager(
96 VOID
97);
98
99CODE_SEG("INIT")
100BOOLEAN
101NTAPI
102PsInitSystem(
103 IN PLOADER_PARAMETER_BLOCK LoaderBlock
104);
105
106//
107// Utility Routines
108//
109PETHREAD
110NTAPI
111PsGetNextProcessThread(
112 IN PEPROCESS Process,
113 IN PETHREAD Thread OPTIONAL
114);
115
116PEPROCESS
117NTAPI
118PsGetNextProcess(
119 IN PEPROCESS OldProcess OPTIONAL
120);
121
122NTSTATUS
123NTAPI
124PspMapSystemDll(
125 IN PEPROCESS Process,
126 OUT PVOID *DllBase,
127 IN BOOLEAN UseLargePages
128);
129
130CODE_SEG("INIT")
131NTSTATUS
132NTAPI
133PsLocateSystemDll(
134 VOID
135);
136
137VOID
138NTAPI
139PsChangeQuantumTable(
140 IN BOOLEAN Immediate,
141 IN ULONG PrioritySeparation
142);
143
144NTSTATUS
145NTAPI
146PsReferenceProcessFilePointer(
147 _In_ PEPROCESS Process,
148 _Outptr_ PFILE_OBJECT *FileObject
149);
150
151//
152// Process Routines
153//
154NTSTATUS
155NTAPI
156PspCreateProcess(
157 OUT PHANDLE ProcessHandle,
158 IN ACCESS_MASK DesiredAccess,
159 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
160 IN HANDLE ParentProcess OPTIONAL,
161 IN ULONG Flags,
162 IN HANDLE SectionHandle OPTIONAL,
163 IN HANDLE DebugPort OPTIONAL,
164 IN HANDLE ExceptionPort OPTIONAL,
165 IN BOOLEAN InJob
166);
167
168//
169// Security Routines
170//
171PACCESS_TOKEN
172NTAPI
173PsReferenceEffectiveToken(
174 IN PETHREAD Thread,
175 OUT IN PTOKEN_TYPE TokenType,
176 OUT PBOOLEAN EffectiveOnly,
177 OUT PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel
178);
179
180NTSTATUS
181NTAPI
182PsOpenTokenOfProcess(
183 IN HANDLE ProcessHandle,
184 OUT PACCESS_TOKEN* Token
185);
186
187NTSTATUS
188NTAPI
189PspSetPrimaryToken(
190 IN PEPROCESS Process,
191 IN HANDLE TokenHandle OPTIONAL,
192 IN PACCESS_TOKEN Token OPTIONAL
193);
194
195NTSTATUS
196NTAPI
197PspInitializeProcessSecurity(
198 IN PEPROCESS Process,
199 IN PEPROCESS Parent OPTIONAL
200);
201
202VOID
203NTAPI
204PspDeleteProcessSecurity(
205 IN PEPROCESS Process
206);
207
208VOID
209NTAPI
210PspDeleteThreadSecurity(
211 IN PETHREAD Thread
212);
213
214//
215// Reaping and Deletion
216//
217VOID
218NTAPI
219PsExitSpecialApc(
220 PKAPC Apc,
221 PKNORMAL_ROUTINE *NormalRoutine,
222 PVOID *NormalContext,
223 PVOID *SystemArgument1,
224 PVOID *SystemArgument2
225);
226
227VOID
228NTAPI
229PspReapRoutine(
230 IN PVOID Context
231);
232
233VOID
234NTAPI
235PspExitThread(
236 IN NTSTATUS ExitStatus
237);
238
239NTSTATUS
240NTAPI
241PspTerminateThreadByPointer(
242 IN PETHREAD Thread,
243 IN NTSTATUS ExitStatus,
244 IN BOOLEAN bSelf
245);
246
247VOID
248NTAPI
249PspExitProcess(
250 IN BOOLEAN LastThread,
251 IN PEPROCESS Process
252);
253
254NTSTATUS
255NTAPI
256PsTerminateProcess(
257 IN PEPROCESS Process,
258 IN NTSTATUS ExitStatus
259);
260
261VOID
262NTAPI
263PspDeleteProcess(
264 IN PVOID ObjectBody
265);
266
267VOID
268NTAPI
269PspDeleteThread(
270 IN PVOID ObjectBody
271);
272
273//
274// Thread/Process Startup
275//
276VOID
277NTAPI
278PspSystemThreadStartup(
279 PKSTART_ROUTINE StartRoutine,
280 PVOID StartContext
281);
282
283VOID
284NTAPI
285PsIdleThreadMain(
286 IN PVOID Context
287);
288
289//
290// Quota Support
291//
292VOID
293NTAPI
294PspInheritQuota(
295 _In_ PEPROCESS Process,
296 _In_ PEPROCESS ParentProcess
297);
298
299VOID
300NTAPI
301PspDereferenceQuotaBlock(
302 _In_opt_ PEPROCESS Process,
303 _In_ PEPROCESS_QUOTA_BLOCK QuotaBlock
304);
305
306NTSTATUS
307NTAPI
308PsReturnProcessPageFileQuota(
309 _In_ PEPROCESS Process,
310 _In_ SIZE_T Amount
311);
312
313NTSTATUS
314NTAPI
315PsChargeProcessPageFileQuota(
316 _In_ PEPROCESS Process,
317 _In_ SIZE_T Amount
318);
319
320VOID
321NTAPI
322PsReturnSharedPoolQuota(
323 _In_ PEPROCESS_QUOTA_BLOCK QuotaBlock,
324 _In_ SIZE_T AmountToReturnPaged,
325 _In_ SIZE_T AmountToReturnNonPaged
326);
327
328PEPROCESS_QUOTA_BLOCK
329NTAPI
330PsChargeSharedPoolQuota(
331 _In_ PEPROCESS Process,
332 _In_ SIZE_T AmountToChargePaged,
333 _In_ SIZE_T AmountToChargeNonPaged
334);
335
336NTSTATUS
337NTAPI
338PspSetQuotaLimits(
339 _In_ PEPROCESS Process,
340 _In_ ULONG Unused,
341 _In_ PVOID QuotaLimits,
342 _In_ ULONG QuotaLimitsLength,
343 _In_ KPROCESSOR_MODE PreviousMode);
344
345#if defined(_X86_)
346//
347// VDM and LDT Support
348//
349VOID
350NTAPI
351PspDeleteLdt(
352 IN PEPROCESS Process
353);
354
355VOID
356NTAPI
357PspDeleteVdmObjects(
358 IN PEPROCESS Process
359);
360
361NTSTATUS
362NTAPI
363PspQueryDescriptorThread(
364 IN PETHREAD Thread,
365 IN PVOID ThreadInformation,
366 IN ULONG ThreadInformationLength,
367 OUT PULONG ReturnLength OPTIONAL
368);
369#endif
370
371//
372// Job Routines
373//
374VOID
375NTAPI
376PspExitProcessFromJob(
377 IN PEJOB Job,
378 IN PEPROCESS Process
379);
380
381VOID
382NTAPI
383PspRemoveProcessFromJob(
384 IN PEPROCESS Process,
385 IN PEJOB Job
386);
387
388CODE_SEG("INIT")
389VOID
390NTAPI
391PspInitializeJobStructures(
392 VOID
393);
394
395VOID
396NTAPI
397PspDeleteJob(
398 IN PVOID ObjectBody
399);
400
401//
402// State routines
403//
404NTSTATUS
405NTAPI
406PsResumeThread(
407 IN PETHREAD Thread,
408 OUT PULONG PreviousCount OPTIONAL
409);
410
411NTSTATUS
412NTAPI
413PsSuspendThread(
414 IN PETHREAD Thread,
415 OUT PULONG PreviousCount OPTIONAL
416);
417
418VOID
419NTAPI
420PspGetOrSetContextKernelRoutine(
421 IN PKAPC Apc,
422 IN OUT PKNORMAL_ROUTINE* NormalRoutine,
423 IN OUT PVOID* NormalContext,
424 IN OUT PVOID* SystemArgument1,
425 IN OUT PVOID* SystemArgument2
426);
427
428BOOLEAN
429NTAPI
430PspIsProcessExiting(IN PEPROCESS Process);
431
432//
433// Apphelp functions
434//
435CODE_SEG("INIT")
436NTSTATUS
437NTAPI
438ApphelpCacheInitialize(VOID);
439
440VOID
441NTAPI
442ApphelpCacheShutdown(VOID);
443
444//
445// Global data inside the Process Manager
446//
447extern ULONG PspTraceLevel;
448extern LCID PsDefaultThreadLocaleId;
449extern LCID PsDefaultSystemLocaleId;
450extern LIST_ENTRY PspReaperListHead;
451extern WORK_QUEUE_ITEM PspReaperWorkItem;
452extern BOOLEAN PspReaping;
453extern PEPROCESS PsIdleProcess;
454extern LIST_ENTRY PsActiveProcessHead;
455extern KGUARDED_MUTEX PspActiveProcessMutex;
456extern LARGE_INTEGER ShortPsLockDelay;
457extern EPROCESS_QUOTA_BLOCK PspDefaultQuotaBlock;
458extern PHANDLE_TABLE PspCidTable;
459extern EX_CALLBACK PspThreadNotifyRoutine[PSP_MAX_CREATE_THREAD_NOTIFY];
460extern EX_CALLBACK PspProcessNotifyRoutine[PSP_MAX_CREATE_PROCESS_NOTIFY];
461extern EX_CALLBACK PspLoadImageNotifyRoutine[PSP_MAX_LOAD_IMAGE_NOTIFY];
462extern PLEGO_NOTIFY_ROUTINE PspLegoNotifyRoutine;
463extern ULONG PspThreadNotifyRoutineCount, PspProcessNotifyRoutineCount;
464extern BOOLEAN PsImageNotifyEnabled;
465extern PKWIN32_PROCESS_CALLOUT PspW32ProcessCallout;
466extern PKWIN32_THREAD_CALLOUT PspW32ThreadCallout;
467extern PVOID PspSystemDllEntryPoint;
468extern PVOID PspSystemDllBase;
469extern BOOLEAN PspUseJobSchedulingClasses;
470extern CHAR PspJobSchedulingClasses[PSP_JOB_SCHEDULING_CLASSES];
471extern ULONG PsRawPrioritySeparation;
472extern ULONG PsPrioritySeparation;
473extern POBJECT_TYPE _PsThreadType, _PsProcessType;
474extern PTOKEN PspBootAccessToken;
475extern GENERIC_MAPPING PspJobMapping;
476extern POBJECT_TYPE PsJobType;
477extern LARGE_INTEGER ShortPsLockDelay;
478extern UNICODE_STRING PsNtDllPathName;
479extern LIST_ENTRY PsLoadedModuleList;
480extern KSPIN_LOCK PsLoadedModuleSpinLock;
481extern ERESOURCE PsLoadedModuleResource;
482extern ULONG_PTR PsNtosImageBase;
483
484//
485// Inlined Functions
486//
487#include "ps_x.h"