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