reactos/ntoskrnl/include/internal/ps.h
Timo Kreuzer 71fefa32db
[NDK][NTOS] Add global definition of INIT_FUNCTION/INIT_SECTION (#779)
* Add an NDK header to define INIT_FUNCTION/INIT_SECTION globally
* Use _declspec(allocate(x)) and _declspec(code_seg(x)) on MSVC versions that support it
* Use INIT_FUNCTION on functions only and INIT_SECTION on data only (required by MSVC)
* Place INIT_FUNCTION before the return type (required by MSVC)
* Make sure declarations and implementations share the same modifiers (required by MSVC)
* Add a global linker option to suppress warnings about defined but unused INIT section
* Merge INIT section into .text in freeldr
2018-12-30 12:19:11 +01:00

474 lines
9 KiB
C

/*
* PROJECT: ReactOS Kernel
* LICENSE: GPL - See COPYING in the top level directory
* FILE: ntoskrnl/include/internal/ps.h
* PURPOSE: Internal header for the Process Manager
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
*/
//
// Define this if you want debugging support
//
#define _PS_DEBUG_ 0x00
//
// These define the Debug Masks Supported
//
#define PS_THREAD_DEBUG 0x01
#define PS_PROCESS_DEBUG 0x02
#define PS_SECURITY_DEBUG 0x04
#define PS_JOB_DEBUG 0x08
#define PS_NOTIFICATIONS_DEBUG 0x10
#define PS_WIN32K_DEBUG 0x20
#define PS_STATE_DEBUG 0x40
#define PS_QUOTA_DEBUG 0x80
#define PS_KILL_DEBUG 0x100
#define PS_REF_DEBUG 0x200
//
// Debug/Tracing support
//
#if _PS_DEBUG_
#ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
#define PSTRACE(x, ...) \
{ \
DbgPrintEx("%s [%.16s] - ", \
__FUNCTION__, \
PsGetCurrentProcess()->ImageFileName); \
DbgPrintEx(__VA_ARGS__); \
}
#else
#define PSTRACE(x, ...) \
if (x & PspTraceLevel) \
{ \
DbgPrint("%s [%.16s] - ", \
__FUNCTION__, \
PsGetCurrentProcess()->ImageFileName); \
DbgPrint(__VA_ARGS__); \
}
#endif
#define PSREFTRACE(x) \
PSTRACE(PS_REF_DEBUG, \
"Pointer Count [%p] @%d: %lx\n", \
x, \
__LINE__, \
OBJECT_TO_OBJECT_HEADER(x)->PointerCount)
#else
#define PSTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
#define PSREFTRACE(x)
#endif
//
// Maximum Count of Notification Routines
//
#define PSP_MAX_CREATE_THREAD_NOTIFY 8
#define PSP_MAX_LOAD_IMAGE_NOTIFY 8
#define PSP_MAX_CREATE_PROCESS_NOTIFY 8
//
// Maximum Job Scheduling Classes
//
#define PSP_JOB_SCHEDULING_CLASSES 10
//
// Thread "Set/Get Context" Context Structure
//
typedef struct _GET_SET_CTX_CONTEXT
{
KAPC Apc;
KEVENT Event;
KPROCESSOR_MODE Mode;
CONTEXT Context;
} GET_SET_CTX_CONTEXT, *PGET_SET_CTX_CONTEXT;
//
// Initialization Functions
//
VOID
NTAPI
PspShutdownProcessManager(
VOID
);
INIT_FUNCTION
BOOLEAN
NTAPI
PsInitSystem(
IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
//
// Utility Routines
//
PETHREAD
NTAPI
PsGetNextProcessThread(
IN PEPROCESS Process,
IN PETHREAD Thread OPTIONAL
);
PEPROCESS
NTAPI
PsGetNextProcess(
IN PEPROCESS OldProcess OPTIONAL
);
NTSTATUS
NTAPI
PspMapSystemDll(
IN PEPROCESS Process,
OUT PVOID *DllBase,
IN BOOLEAN UseLargePages
);
INIT_FUNCTION
NTSTATUS
NTAPI
PsLocateSystemDll(
VOID
);
NTSTATUS
NTAPI
PspGetSystemDllEntryPoints(
VOID
);
VOID
NTAPI
PsChangeQuantumTable(
IN BOOLEAN Immediate,
IN ULONG PrioritySeparation
);
NTSTATUS
NTAPI
PsReferenceProcessFilePointer(
IN PEPROCESS Process,
OUT PFILE_OBJECT *FileObject
);
//
// Process Routines
//
NTSTATUS
NTAPI
PspCreateProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN HANDLE ParentProcess OPTIONAL,
IN ULONG Flags,
IN HANDLE SectionHandle OPTIONAL,
IN HANDLE DebugPort OPTIONAL,
IN HANDLE ExceptionPort OPTIONAL,
IN BOOLEAN InJob
);
//
// Security Routines
//
PACCESS_TOKEN
NTAPI
PsReferenceEffectiveToken(
IN PETHREAD Thread,
OUT IN PTOKEN_TYPE TokenType,
OUT PBOOLEAN EffectiveOnly,
OUT PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel
);
NTSTATUS
NTAPI
PsOpenTokenOfProcess(
IN HANDLE ProcessHandle,
OUT PACCESS_TOKEN* Token
);
NTSTATUS
NTAPI
PspSetPrimaryToken(
IN PEPROCESS Process,
IN HANDLE TokenHandle OPTIONAL,
IN PACCESS_TOKEN Token OPTIONAL
);
NTSTATUS
NTAPI
PspInitializeProcessSecurity(
IN PEPROCESS Process,
IN PEPROCESS Parent OPTIONAL
);
VOID
NTAPI
PspDeleteProcessSecurity(
IN PEPROCESS Process
);
VOID
NTAPI
PspDeleteThreadSecurity(
IN PETHREAD Thread
);
//
// Reaping and Deletion
//
VOID
NTAPI
PsExitSpecialApc(
PKAPC Apc,
PKNORMAL_ROUTINE *NormalRoutine,
PVOID *NormalContext,
PVOID *SystemArgument1,
PVOID *SystemArgument2
);
VOID
NTAPI
PspReapRoutine(
IN PVOID Context
);
VOID
NTAPI
PspExitThread(
IN NTSTATUS ExitStatus
);
NTSTATUS
NTAPI
PspTerminateThreadByPointer(
IN PETHREAD Thread,
IN NTSTATUS ExitStatus,
IN BOOLEAN bSelf
);
VOID
NTAPI
PspExitProcess(
IN BOOLEAN LastThread,
IN PEPROCESS Process
);
NTSTATUS
NTAPI
PsTerminateProcess(
IN PEPROCESS Process,
IN NTSTATUS ExitStatus
);
VOID
NTAPI
PspDeleteProcess(
IN PVOID ObjectBody
);
VOID
NTAPI
PspDeleteThread(
IN PVOID ObjectBody
);
//
// Thread/Process Startup
//
VOID
NTAPI
PspSystemThreadStartup(
PKSTART_ROUTINE StartRoutine,
PVOID StartContext
);
VOID
NTAPI
PsIdleThreadMain(
IN PVOID Context
);
//
// Quota Support
//
VOID
NTAPI
PspInheritQuota(
IN PEPROCESS Process,
IN PEPROCESS ParentProcess
);
VOID
NTAPI
PspDestroyQuotaBlock(
IN PEPROCESS Process
);
NTSTATUS
NTAPI
PspSetQuotaLimits(
_In_ PEPROCESS Process,
_In_ ULONG Unused,
_In_ PVOID QuotaLimits,
_In_ ULONG QuotaLimitsLength,
_In_ KPROCESSOR_MODE PreviousMode);
#if defined(_X86_)
//
// VDM and LDT Support
//
VOID
NTAPI
PspDeleteLdt(
IN PEPROCESS Process
);
VOID
NTAPI
PspDeleteVdmObjects(
IN PEPROCESS Process
);
NTSTATUS
NTAPI
PspQueryDescriptorThread(
IN PETHREAD Thread,
IN PVOID ThreadInformation,
IN ULONG ThreadInformationLength,
OUT PULONG ReturnLength OPTIONAL
);
#endif
//
// Job Routines
//
VOID
NTAPI
PspExitProcessFromJob(
IN PEJOB Job,
IN PEPROCESS Process
);
VOID
NTAPI
PspRemoveProcessFromJob(
IN PEPROCESS Process,
IN PEJOB Job
);
INIT_FUNCTION
VOID
NTAPI
PspInitializeJobStructures(
VOID
);
VOID
NTAPI
PspDeleteJob(
IN PVOID ObjectBody
);
//
// State routines
//
NTSTATUS
NTAPI
PsResumeThread(
IN PETHREAD Thread,
OUT PULONG PreviousCount OPTIONAL
);
NTSTATUS
NTAPI
PsSuspendThread(
IN PETHREAD Thread,
OUT PULONG PreviousCount OPTIONAL
);
VOID
NTAPI
PspGetOrSetContextKernelRoutine(
IN PKAPC Apc,
IN OUT PKNORMAL_ROUTINE* NormalRoutine,
IN OUT PVOID* NormalContext,
IN OUT PVOID* SystemArgument1,
IN OUT PVOID* SystemArgument2
);
//
// Process Quotas
//
NTSTATUS
NTAPI
PsReturnProcessPageFileQuota(
IN PEPROCESS Process,
IN SIZE_T Amount
);
NTSTATUS
NTAPI
PsChargeProcessPageFileQuota(
IN PEPROCESS Process,
IN SIZE_T Amount
);
BOOLEAN
NTAPI
PspIsProcessExiting(IN PEPROCESS Process);
//
// Apphelp functions
//
INIT_FUNCTION
NTSTATUS
NTAPI
ApphelpCacheInitialize(VOID);
VOID
NTAPI
ApphelpCacheShutdown(VOID);
//
// Global data inside the Process Manager
//
extern ULONG PspTraceLevel;
extern LCID PsDefaultThreadLocaleId;
extern LCID PsDefaultSystemLocaleId;
extern LIST_ENTRY PspReaperListHead;
extern WORK_QUEUE_ITEM PspReaperWorkItem;
extern BOOLEAN PspReaping;
extern PEPROCESS PsIdleProcess;
extern LIST_ENTRY PsActiveProcessHead;
extern KGUARDED_MUTEX PspActiveProcessMutex;
extern LARGE_INTEGER ShortPsLockDelay;
extern EPROCESS_QUOTA_BLOCK PspDefaultQuotaBlock;
extern PHANDLE_TABLE PspCidTable;
extern EX_CALLBACK PspThreadNotifyRoutine[PSP_MAX_CREATE_THREAD_NOTIFY];
extern EX_CALLBACK PspProcessNotifyRoutine[PSP_MAX_CREATE_PROCESS_NOTIFY];
extern EX_CALLBACK PspLoadImageNotifyRoutine[PSP_MAX_LOAD_IMAGE_NOTIFY];
extern PLEGO_NOTIFY_ROUTINE PspLegoNotifyRoutine;
extern ULONG PspThreadNotifyRoutineCount, PspProcessNotifyRoutineCount;
extern BOOLEAN PsImageNotifyEnabled;
extern PKWIN32_PROCESS_CALLOUT PspW32ProcessCallout;
extern PKWIN32_THREAD_CALLOUT PspW32ThreadCallout;
extern PVOID PspSystemDllEntryPoint;
extern PVOID PspSystemDllBase;
extern BOOLEAN PspUseJobSchedulingClasses;
extern CHAR PspJobSchedulingClasses[PSP_JOB_SCHEDULING_CLASSES];
extern ULONG PsRawPrioritySeparation;
extern ULONG PsPrioritySeparation;
extern POBJECT_TYPE _PsThreadType, _PsProcessType;
extern PTOKEN PspBootAccessToken;
extern GENERIC_MAPPING PspJobMapping;
extern POBJECT_TYPE PsJobType;
extern LARGE_INTEGER ShortPsLockDelay;
extern UNICODE_STRING PsNtDllPathName;
extern LIST_ENTRY PsLoadedModuleList;
extern KSPIN_LOCK PsLoadedModuleSpinLock;
extern ERESOURCE PsLoadedModuleResource;
extern ULONG_PTR PsNtosImageBase;
//
// Inlined Functions
//
#include "ps_x.h"