xref: /reactos/ntoskrnl/include/internal/ps.h (revision cdf90707)
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 //
82 typedef 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 //
93 VOID
94 NTAPI
95 PspShutdownProcessManager(
96     VOID
97 );
98 
99 CODE_SEG("INIT")
100 BOOLEAN
101 NTAPI
102 PsInitSystem(
103     IN PLOADER_PARAMETER_BLOCK LoaderBlock
104 );
105 
106 //
107 // Utility Routines
108 //
109 PETHREAD
110 NTAPI
111 PsGetNextProcessThread(
112     IN PEPROCESS Process,
113     IN PETHREAD Thread OPTIONAL
114 );
115 
116 PEPROCESS
117 NTAPI
118 PsGetNextProcess(
119     IN PEPROCESS OldProcess OPTIONAL
120 );
121 
122 NTSTATUS
123 NTAPI
124 PspMapSystemDll(
125     IN PEPROCESS Process,
126     OUT PVOID *DllBase,
127     IN BOOLEAN UseLargePages
128 );
129 
130 CODE_SEG("INIT")
131 NTSTATUS
132 NTAPI
133 PsLocateSystemDll(
134     VOID
135 );
136 
137 NTSTATUS
138 NTAPI
139 PspGetSystemDllEntryPoints(
140     VOID
141 );
142 
143 VOID
144 NTAPI
145 PsChangeQuantumTable(
146     IN BOOLEAN Immediate,
147     IN ULONG PrioritySeparation
148 );
149 
150 NTSTATUS
151 NTAPI
152 PsReferenceProcessFilePointer(
153     IN PEPROCESS Process,
154     OUT PFILE_OBJECT *FileObject
155 );
156 
157 //
158 // Process Routines
159 //
160 NTSTATUS
161 NTAPI
162 PspCreateProcess(
163     OUT PHANDLE ProcessHandle,
164     IN ACCESS_MASK DesiredAccess,
165     IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
166     IN HANDLE ParentProcess OPTIONAL,
167     IN ULONG Flags,
168     IN HANDLE SectionHandle OPTIONAL,
169     IN HANDLE DebugPort OPTIONAL,
170     IN HANDLE ExceptionPort OPTIONAL,
171     IN BOOLEAN InJob
172 );
173 
174 //
175 // Security Routines
176 //
177 PACCESS_TOKEN
178 NTAPI
179 PsReferenceEffectiveToken(
180     IN PETHREAD Thread,
181     OUT IN PTOKEN_TYPE TokenType,
182     OUT PBOOLEAN EffectiveOnly,
183     OUT PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel
184 );
185 
186 NTSTATUS
187 NTAPI
188 PsOpenTokenOfProcess(
189     IN HANDLE ProcessHandle,
190     OUT PACCESS_TOKEN* Token
191 );
192 
193 NTSTATUS
194 NTAPI
195 PspSetPrimaryToken(
196     IN PEPROCESS Process,
197     IN HANDLE TokenHandle OPTIONAL,
198     IN PACCESS_TOKEN Token OPTIONAL
199 );
200 
201 NTSTATUS
202 NTAPI
203 PspInitializeProcessSecurity(
204     IN PEPROCESS Process,
205     IN PEPROCESS Parent OPTIONAL
206 );
207 
208 VOID
209 NTAPI
210 PspDeleteProcessSecurity(
211     IN PEPROCESS Process
212 );
213 
214 VOID
215 NTAPI
216 PspDeleteThreadSecurity(
217     IN PETHREAD Thread
218 );
219 
220 //
221 // Reaping and Deletion
222 //
223 VOID
224 NTAPI
225 PsExitSpecialApc(
226     PKAPC Apc,
227     PKNORMAL_ROUTINE *NormalRoutine,
228     PVOID *NormalContext,
229     PVOID *SystemArgument1,
230     PVOID *SystemArgument2
231 );
232 
233 VOID
234 NTAPI
235 PspReapRoutine(
236     IN PVOID Context
237 );
238 
239 VOID
240 NTAPI
241 PspExitThread(
242     IN NTSTATUS ExitStatus
243 );
244 
245 NTSTATUS
246 NTAPI
247 PspTerminateThreadByPointer(
248     IN PETHREAD Thread,
249     IN NTSTATUS ExitStatus,
250     IN BOOLEAN bSelf
251 );
252 
253 VOID
254 NTAPI
255 PspExitProcess(
256     IN BOOLEAN LastThread,
257     IN PEPROCESS Process
258 );
259 
260 NTSTATUS
261 NTAPI
262 PsTerminateProcess(
263     IN PEPROCESS Process,
264     IN NTSTATUS ExitStatus
265 );
266 
267 VOID
268 NTAPI
269 PspDeleteProcess(
270     IN PVOID ObjectBody
271 );
272 
273 VOID
274 NTAPI
275 PspDeleteThread(
276     IN PVOID ObjectBody
277 );
278 
279 //
280 // Thread/Process Startup
281 //
282 VOID
283 NTAPI
284 PspSystemThreadStartup(
285     PKSTART_ROUTINE StartRoutine,
286     PVOID StartContext
287 );
288 
289 VOID
290 NTAPI
291 PsIdleThreadMain(
292     IN PVOID Context
293 );
294 
295 //
296 // Quota Support
297 //
298 VOID
299 NTAPI
300 PspInheritQuota(
301     _In_ PEPROCESS Process,
302     _In_ PEPROCESS ParentProcess
303 );
304 
305 VOID
306 NTAPI
307 PspDereferenceQuotaBlock(
308     _In_opt_ PEPROCESS Process,
309     _In_ PEPROCESS_QUOTA_BLOCK QuotaBlock
310 );
311 
312 NTSTATUS
313 NTAPI
314 PsReturnProcessPageFileQuota(
315     _In_ PEPROCESS Process,
316     _In_ SIZE_T Amount
317 );
318 
319 NTSTATUS
320 NTAPI
321 PsChargeProcessPageFileQuota(
322     _In_ PEPROCESS Process,
323     _In_ SIZE_T Amount
324 );
325 
326 VOID
327 NTAPI
328 PsReturnSharedPoolQuota(
329     _In_ PEPROCESS_QUOTA_BLOCK QuotaBlock,
330     _In_ SIZE_T AmountToReturnPaged,
331     _In_ SIZE_T AmountToReturnNonPaged
332 );
333 
334 PEPROCESS_QUOTA_BLOCK
335 NTAPI
336 PsChargeSharedPoolQuota(
337     _In_ PEPROCESS Process,
338     _In_ SIZE_T AmountToChargePaged,
339     _In_ SIZE_T AmountToChargeNonPaged
340 );
341 
342 NTSTATUS
343 NTAPI
344 PspSetQuotaLimits(
345     _In_ PEPROCESS Process,
346     _In_ ULONG Unused,
347     _In_ PVOID QuotaLimits,
348     _In_ ULONG QuotaLimitsLength,
349     _In_ KPROCESSOR_MODE PreviousMode);
350 
351 #if defined(_X86_)
352 //
353 // VDM and LDT Support
354 //
355 VOID
356 NTAPI
357 PspDeleteLdt(
358     IN PEPROCESS Process
359 );
360 
361 VOID
362 NTAPI
363 PspDeleteVdmObjects(
364     IN PEPROCESS Process
365 );
366 
367 NTSTATUS
368 NTAPI
369 PspQueryDescriptorThread(
370     IN PETHREAD Thread,
371     IN PVOID ThreadInformation,
372     IN ULONG ThreadInformationLength,
373     OUT PULONG ReturnLength OPTIONAL
374 );
375 #endif
376 
377 //
378 // Job Routines
379 //
380 VOID
381 NTAPI
382 PspExitProcessFromJob(
383     IN PEJOB Job,
384     IN PEPROCESS Process
385 );
386 
387 VOID
388 NTAPI
389 PspRemoveProcessFromJob(
390     IN PEPROCESS Process,
391     IN PEJOB Job
392 );
393 
394 CODE_SEG("INIT")
395 VOID
396 NTAPI
397 PspInitializeJobStructures(
398     VOID
399 );
400 
401 VOID
402 NTAPI
403 PspDeleteJob(
404     IN PVOID ObjectBody
405 );
406 
407 //
408 // State routines
409 //
410 NTSTATUS
411 NTAPI
412 PsResumeThread(
413     IN PETHREAD Thread,
414     OUT PULONG PreviousCount OPTIONAL
415 );
416 
417 NTSTATUS
418 NTAPI
419 PsSuspendThread(
420     IN PETHREAD Thread,
421     OUT PULONG PreviousCount OPTIONAL
422 );
423 
424 VOID
425 NTAPI
426 PspGetOrSetContextKernelRoutine(
427     IN PKAPC Apc,
428     IN OUT PKNORMAL_ROUTINE* NormalRoutine,
429     IN OUT PVOID* NormalContext,
430     IN OUT PVOID* SystemArgument1,
431     IN OUT PVOID* SystemArgument2
432 );
433 
434 BOOLEAN
435 NTAPI
436 PspIsProcessExiting(IN PEPROCESS Process);
437 
438 //
439 // Apphelp functions
440 //
441 CODE_SEG("INIT")
442 NTSTATUS
443 NTAPI
444 ApphelpCacheInitialize(VOID);
445 
446 VOID
447 NTAPI
448 ApphelpCacheShutdown(VOID);
449 
450 //
451 // Global data inside the Process Manager
452 //
453 extern ULONG PspTraceLevel;
454 extern LCID PsDefaultThreadLocaleId;
455 extern LCID PsDefaultSystemLocaleId;
456 extern LIST_ENTRY PspReaperListHead;
457 extern WORK_QUEUE_ITEM PspReaperWorkItem;
458 extern BOOLEAN PspReaping;
459 extern PEPROCESS PsIdleProcess;
460 extern LIST_ENTRY PsActiveProcessHead;
461 extern KGUARDED_MUTEX PspActiveProcessMutex;
462 extern LARGE_INTEGER ShortPsLockDelay;
463 extern EPROCESS_QUOTA_BLOCK PspDefaultQuotaBlock;
464 extern PHANDLE_TABLE PspCidTable;
465 extern EX_CALLBACK PspThreadNotifyRoutine[PSP_MAX_CREATE_THREAD_NOTIFY];
466 extern EX_CALLBACK PspProcessNotifyRoutine[PSP_MAX_CREATE_PROCESS_NOTIFY];
467 extern EX_CALLBACK PspLoadImageNotifyRoutine[PSP_MAX_LOAD_IMAGE_NOTIFY];
468 extern PLEGO_NOTIFY_ROUTINE PspLegoNotifyRoutine;
469 extern ULONG PspThreadNotifyRoutineCount, PspProcessNotifyRoutineCount;
470 extern BOOLEAN PsImageNotifyEnabled;
471 extern PKWIN32_PROCESS_CALLOUT PspW32ProcessCallout;
472 extern PKWIN32_THREAD_CALLOUT PspW32ThreadCallout;
473 extern PVOID PspSystemDllEntryPoint;
474 extern PVOID PspSystemDllBase;
475 extern BOOLEAN PspUseJobSchedulingClasses;
476 extern CHAR PspJobSchedulingClasses[PSP_JOB_SCHEDULING_CLASSES];
477 extern ULONG PsRawPrioritySeparation;
478 extern ULONG PsPrioritySeparation;
479 extern POBJECT_TYPE _PsThreadType, _PsProcessType;
480 extern PTOKEN PspBootAccessToken;
481 extern GENERIC_MAPPING PspJobMapping;
482 extern POBJECT_TYPE PsJobType;
483 extern LARGE_INTEGER ShortPsLockDelay;
484 extern UNICODE_STRING PsNtDllPathName;
485 extern LIST_ENTRY PsLoadedModuleList;
486 extern KSPIN_LOCK PsLoadedModuleSpinLock;
487 extern ERESOURCE PsLoadedModuleResource;
488 extern ULONG_PTR PsNtosImageBase;
489 
490 //
491 // Inlined Functions
492 //
493 #include "ps_x.h"
494