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