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