move from branch
[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_ 0x01
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, ...) DPRINT(__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 // Initialization Functions
75 //
76 VOID
77 NTAPI
78 PspShutdownProcessManager(
79 VOID
80 );
81
82 BOOLEAN
83 NTAPI
84 PsInitSystem(
85 IN PLOADER_PARAMETER_BLOCK LoaderBlock
86 );
87
88 //
89 // Utility Routines
90 //
91 PETHREAD
92 NTAPI
93 PsGetNextProcessThread(
94 IN PEPROCESS Process,
95 IN PETHREAD Thread OPTIONAL
96 );
97
98 PEPROCESS
99 NTAPI
100 PsGetNextProcess(
101 IN PEPROCESS OldProcess OPTIONAL
102 );
103
104 NTSTATUS
105 NTAPI
106 PspMapSystemDll(
107 IN PEPROCESS Process,
108 OUT PVOID *DllBase
109 );
110
111 NTSTATUS
112 NTAPI
113 PsLocateSystemDll(
114 VOID
115 );
116
117 NTSTATUS
118 NTAPI
119 PspGetSystemDllEntryPoints(
120 VOID
121 );
122
123 VOID
124 NTAPI
125 PsChangeQuantumTable(
126 IN BOOLEAN Immediate,
127 IN ULONG PrioritySeparation
128 );
129
130 NTSTATUS
131 NTAPI
132 PsReferenceProcessFilePointer(
133 IN PEPROCESS Process,
134 OUT PFILE_OBJECT *FileObject
135 );
136
137 //
138 // Process Routines
139 //
140 NTSTATUS
141 NTAPI
142 PspCreateProcess(
143 OUT PHANDLE ProcessHandle,
144 IN ACCESS_MASK DesiredAccess,
145 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
146 IN HANDLE ParentProcess OPTIONAL,
147 IN ULONG Flags,
148 IN HANDLE SectionHandle OPTIONAL,
149 IN HANDLE DebugPort OPTIONAL,
150 IN HANDLE ExceptionPort OPTIONAL,
151 IN BOOLEAN InJob
152 );
153
154 //
155 // Security Routines
156 //
157 PACCESS_TOKEN
158 NTAPI
159 PsReferenceEffectiveToken(
160 IN PETHREAD Thread,
161 OUT PTOKEN_TYPE TokenType,
162 OUT PUCHAR b,
163 OUT PSECURITY_IMPERSONATION_LEVEL Level
164 );
165
166 NTSTATUS
167 NTAPI
168 PsOpenTokenOfProcess(
169 IN HANDLE ProcessHandle,
170 OUT PACCESS_TOKEN* Token
171 );
172
173 NTSTATUS
174 NTAPI
175 PspSetPrimaryToken(
176 IN PEPROCESS Process,
177 IN HANDLE TokenHandle OPTIONAL,
178 IN PACCESS_TOKEN Token OPTIONAL
179 );
180
181 NTSTATUS
182 NTAPI
183 PspInitializeProcessSecurity(
184 IN PEPROCESS Process,
185 IN PEPROCESS Parent OPTIONAL
186 );
187
188 VOID
189 NTAPI
190 PspDeleteProcessSecurity(
191 IN PEPROCESS Process
192 );
193
194 VOID
195 NTAPI
196 PspDeleteThreadSecurity(
197 IN PETHREAD Thread
198 );
199
200 //
201 // Reaping and Deletion
202 //
203 VOID
204 NTAPI
205 PsExitSpecialApc(
206 PKAPC Apc,
207 PKNORMAL_ROUTINE *NormalRoutine,
208 PVOID *NormalContext,
209 PVOID *SystemArgument1,
210 PVOID *SystemArgument2
211 );
212
213 VOID
214 NTAPI
215 PspReapRoutine(
216 IN PVOID Context
217 );
218
219 VOID
220 NTAPI
221 PspExitThread(
222 IN NTSTATUS ExitStatus
223 );
224
225 NTSTATUS
226 NTAPI
227 PspTerminateThreadByPointer(
228 IN PETHREAD Thread,
229 IN NTSTATUS ExitStatus,
230 IN BOOLEAN bSelf
231 );
232
233 VOID
234 NTAPI
235 PspExitProcess(
236 IN BOOLEAN LastThread,
237 IN PEPROCESS Process
238 );
239
240 NTSTATUS
241 NTAPI
242 PsTerminateProcess(
243 IN PEPROCESS Process,
244 IN NTSTATUS ExitStatus
245 );
246
247 VOID
248 NTAPI
249 PspDeleteProcess(
250 IN PVOID ObjectBody
251 );
252
253 VOID
254 NTAPI
255 PspDeleteThread(
256 IN PVOID ObjectBody
257 );
258
259 //
260 // Thread/Process Startup
261 //
262 VOID
263 NTAPI
264 PspSystemThreadStartup(
265 PKSTART_ROUTINE StartRoutine,
266 PVOID StartContext
267 );
268
269 VOID
270 NTAPI
271 PsIdleThreadMain(
272 IN PVOID Context
273 );
274
275 //
276 // Quota Support
277 //
278 VOID
279 NTAPI
280 PspInheritQuota(
281 IN PEPROCESS Process,
282 IN PEPROCESS ParentProcess
283 );
284
285 VOID
286 NTAPI
287 PspDestroyQuotaBlock(
288 IN PEPROCESS Process
289 );
290
291 //
292 // VDM Support
293 //
294 NTSTATUS
295 NTAPI
296 PspDeleteLdt(
297 IN PEPROCESS Process
298 );
299
300 NTSTATUS
301 NTAPI
302 PspDeleteVdmObjects(
303 IN PEPROCESS Process
304 );
305
306 //
307 // Job Routines
308 //
309 VOID
310 NTAPI
311 PspExitProcessFromJob(
312 IN PEJOB Job,
313 IN PEPROCESS Process
314 );
315
316 VOID
317 NTAPI
318 PspRemoveProcessFromJob(
319 IN PEPROCESS Process,
320 IN PEJOB Job
321 );
322
323 VOID
324 NTAPI
325 PspInitializeJobStructures(
326 VOID
327 );
328
329 VOID
330 NTAPI
331 PspDeleteJob(
332 IN PVOID ObjectBody
333 );
334
335 //
336 // State routines
337 //
338 NTSTATUS
339 NTAPI
340 PsResumeThread(
341 IN PETHREAD Thread,
342 OUT PULONG PreviousCount OPTIONAL
343 );
344
345 NTSTATUS
346 NTAPI
347 PsSuspendThread(
348 IN PETHREAD Thread,
349 OUT PULONG PreviousCount OPTIONAL
350 );
351
352 //
353 // Global data inside the Process Manager
354 //
355 extern ULONG PspTraceLevel;
356 extern LCID PsDefaultThreadLocaleId;
357 extern LCID PsDefaultSystemLocaleId;
358 extern LIST_ENTRY PspReaperListHead;
359 extern WORK_QUEUE_ITEM PspReaperWorkItem;
360 extern BOOLEAN PspReaping;
361 extern PEPROCESS PsInitialSystemProcess;
362 extern PEPROCESS PsIdleProcess;
363 extern LIST_ENTRY PsActiveProcessHead;
364 extern KGUARDED_MUTEX PspActiveProcessMutex;
365 extern LARGE_INTEGER ShortPsLockDelay;
366 extern EPROCESS_QUOTA_BLOCK PspDefaultQuotaBlock;
367 extern PHANDLE_TABLE PspCidTable;
368 extern EX_CALLBACK PspThreadNotifyRoutine[PSP_MAX_CREATE_THREAD_NOTIFY];
369 extern EX_CALLBACK PspProcessNotifyRoutine[PSP_MAX_CREATE_PROCESS_NOTIFY];
370 extern EX_CALLBACK PspLoadImageNotifyRoutine[PSP_MAX_LOAD_IMAGE_NOTIFY];
371 extern PLEGO_NOTIFY_ROUTINE PspLegoNotifyRoutine;
372 extern ULONG PspThreadNotifyRoutineCount, PspProcessNotifyRoutineCount;
373 extern BOOLEAN PsImageNotifyEnabled;
374 extern PKWIN32_PROCESS_CALLOUT PspW32ProcessCallout;
375 extern PKWIN32_THREAD_CALLOUT PspW32ThreadCallout;
376 extern PVOID PspSystemDllEntryPoint;
377 extern PVOID PspSystemDllBase;
378 extern BOOLEAN PspUseJobSchedulingClasses;
379 extern CHAR PspJobSchedulingClasses[PSP_JOB_SCHEDULING_CLASSES];
380 extern ULONG PsRawPrioritySeparation;
381 extern POBJECT_TYPE _PsThreadType, _PsProcessType;
382 extern PTOKEN PspBootAccessToken;
383 extern GENERIC_MAPPING PspJobMapping;
384 extern POBJECT_TYPE PsJobType;
385 extern LARGE_INTEGER ShortPsLockDelay;
386 extern UNICODE_STRING PsNtDllPathName;
387 extern LIST_ENTRY PriorityListHead[MAXIMUM_PRIORITY];
388
389 //
390 // Inlined Functions
391 //
392 #include "ps_x.h"