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