Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1154 lines
22 KiB

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
psp.h
Abstract:
Private Interfaces for process structure.
Author:
Mark Lucovsky (markl) 20-Apr-1989
Revision History:
--*/
#ifndef _PSP_
#define _PSP_
#pragma warning(disable:4054) // Cast of function pointer to PVOID
#pragma warning(disable:4055) // Cast of function pointer
#pragma warning(disable:4115) // named type definition in parentheses
#pragma warning(disable:4127) // condition expression is constant
#pragma warning(disable:4152) // Casting function pointers
#pragma warning(disable:4201) // nameless struct/union
#pragma warning(disable:4214) // bit field types other than int
#pragma warning(disable:4324) // alignment sensitive to declspec
#pragma warning(disable:4327) // alignment on assignment
#pragma warning(disable:4328) // alignment on assignment
#include "ntos.h"
#include "ntrtl.h"
#include "nturtl.h"
#include "zwapi.h"
#include "ki.h"
#if defined(_X86_)
#include <vdmntos.h>
#endif
#define NOEXTAPI
#include "wdbgexts.h"
#include "ntdbg.h"
#include <string.h>
#if defined(_WIN64)
#include <wow64t.h>
#endif
//
// Working Set Watcher is 8kb. This lets us watch about 4mb of working
// set.
//
#define WS_CATCH_SIZE 8192
#define WS_OVERHEAD 16
#define MAX_WS_CATCH_INDEX (((WS_CATCH_SIZE-WS_OVERHEAD)/sizeof(PROCESS_WS_WATCH_INFORMATION)) - 2)
//
// Process Quota Charges:
//
// PagedPool
// Directory Base Page - PAGE_SIZE
//
// NonPaged
// Object Body - sizeof(EPROCESS)
//
#define PSP_PROCESS_PAGED_CHARGE (PAGE_SIZE)
#define PSP_PROCESS_NONPAGED_CHARGE (sizeof(EPROCESS))
//
// Thread Quota Charges:
//
// PagedPool
// Kernel Stack - 0
//
// NonPaged
// Object Body - sizeof(ETHREAD)
//
#define PSP_THREAD_PAGED_CHARGE (0)
#define PSP_THREAD_NONPAGED_CHARGE (sizeof(ETHREAD))
//
// Define routines to get trap and exception frame addresses
//
#define PSPALIGN_DOWN(address,amt) ((ULONG)(address) & ~(( amt ) - 1))
#define PSPALIGN_UP(address,amt) (PSPALIGN_DOWN( (address + (amt) - 1), (amt) ))
#if defined(_IA64_)
#define PspGetBaseTrapFrame(Thread) (PKTRAP_FRAME)((ULONG_PTR)Thread->Tcb.InitialStack - \
KTHREAD_STATE_SAVEAREA_LENGTH - KTRAP_FRAME_LENGTH)
#define PspGetBaseExceptionFrame(Thread) ((PKEXCEPTION_FRAME)(((ULONG_PTR)PspGetBaseTrapFrame(Thread) + STACK_SCRATCH_AREA - \
sizeof(KEXCEPTION_FRAME)) & ~((ULONG_PTR)15)))
#elif defined(_AMD64_)
#define PspGetBaseTrapFrame(Thread) (PKTRAP_FRAME)((ULONG_PTR)Thread->Tcb.InitialStack - KTRAP_FRAME_LENGTH)
#define PspGetBaseExceptionFrame(Thread) ((PKEXCEPTION_FRAME)((ULONG_PTR)PspGetBaseTrapFrame(Thread) - \
KEXCEPTION_FRAME_LENGTH))
#elif defined(_X86_)
#define PspGetBaseTrapFrame(Thread) (PKTRAP_FRAME)((ULONG_PTR)Thread->Tcb.InitialStack - \
PSPALIGN_UP(sizeof(KTRAP_FRAME),KTRAP_FRAME_ALIGN) - \
sizeof(FX_SAVE_AREA))
#define PspGetBaseExceptionFrame(Thread) (NULL)
#else
#error "no target architecture"
#endif // defined(_IA64_)
typedef struct _GETSETCONTEXT {
KAPC Apc;
KPROCESSOR_MODE Mode;
KEVENT OperationComplete;
CONTEXT Context;
KNONVOLATILE_CONTEXT_POINTERS NonVolatileContext;
} GETSETCONTEXT, *PGETSETCONTEXT;
typedef struct _SYSTEM_DLL {
PVOID Section;
PVOID DllBase;
PKNORMAL_ROUTINE LoaderInitRoutine;
EX_PUSH_LOCK DllLock;
} SYSTEM_DLL, PSYSTEM_DLL;
typedef struct _JOB_WORKING_SET_CHANGE_HEAD {
LIST_ENTRY Links;
KGUARDED_MUTEX Lock;
SIZE_T MinimumWorkingSetSize;
SIZE_T MaximumWorkingSetSize;
} JOB_WORKING_SET_CHANGE_HEAD, *PJOB_WORKING_SET_CHANGE_HEAD;
typedef struct _JOB_WORKING_SET_CHANGE_RECORD {
LIST_ENTRY Links;
PEPROCESS Process;
} JOB_WORKING_SET_CHANGE_RECORD, *PJOB_WORKING_SET_CHANGE_RECORD;
JOB_WORKING_SET_CHANGE_HEAD PspWorkingSetChangeHead;
//
// Private Entry Points
//
VOID
PspProcessDump(
IN PVOID Object,
IN POB_DUMP_CONTROL Control OPTIONAL
);
VOID
PspProcessDelete(
IN PVOID Object
);
VOID
PspThreadDump(
IN PVOID Object,
IN POB_DUMP_CONTROL Control OPTIONAL
);
VOID
PspInheritQuota(
IN PEPROCESS NewProcess,
IN PEPROCESS ParentProcess
);
VOID
PspDereferenceQuota(
IN PEPROCESS Process
);
VOID
PspThreadDelete(
IN PVOID Object
);
NTSTATUS
PspWriteTebImpersonationInfo (
IN PETHREAD Thread,
IN PETHREAD CurrentThread
);
//
// Initialization and loader entrypoints
//
BOOLEAN
PspInitPhase0 (
IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
BOOLEAN
PspInitPhase1 (
IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
NTSTATUS
PspInitializeSystemDll( VOID );
NTSTATUS
PspLookupSystemDllEntryPoint(
IN PSZ EntryPointName,
OUT PVOID *EntryPointAddress
);
NTSTATUS
PspLookupKernelUserEntryPoints(
VOID
);
USHORT
PspNameToOrdinal(
IN PSZ EntryPointName,
IN ULONG DllBase,
IN ULONG NumberOfNames,
IN PULONG NameTableBase,
IN PUSHORT OrdinalTableBase
);
//
// Internal Creation Functions
//
NTSTATUS
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 ULONG JobMemberLevel
);
#define PSP_MAX_CREATE_PROCESS_NOTIFY 8
//
// Define process callouts. These are of type PCREATE_PROCESS_NOTIFY_ROUTINE
// Called on process create and delete.
//
ULONG PspCreateProcessNotifyRoutineCount;
EX_CALLBACK PspCreateProcessNotifyRoutine[PSP_MAX_CREATE_PROCESS_NOTIFY];
#define PSP_MAX_CREATE_THREAD_NOTIFY 8
//
// Define thread callouts. These are of type PCREATE_THREAD_NOTIFY_ROUTINE
// Called on thread create and delete.
//
ULONG PspCreateThreadNotifyRoutineCount;
EX_CALLBACK PspCreateThreadNotifyRoutine[PSP_MAX_CREATE_THREAD_NOTIFY];
#define PSP_MAX_LOAD_IMAGE_NOTIFY 8
//
// Define image load callbacks. These are of type PLOAD_IMAGE_NOTIFY_ROUTINE
// Called on image load.
//
ULONG PspLoadImageNotifyRoutineCount;
EX_CALLBACK PspLoadImageNotifyRoutine[PSP_MAX_LOAD_IMAGE_NOTIFY];
NTSTATUS
PspCreateThread(
OUT PHANDLE ThreadHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN HANDLE ProcessHandle,
IN PEPROCESS ProcessPointer,
OUT PCLIENT_ID ClientId OPTIONAL,
IN PCONTEXT ThreadContext OPTIONAL,
IN PINITIAL_TEB InitialTeb OPTIONAL,
IN BOOLEAN CreateSuspended,
IN PKSTART_ROUTINE StartRoutine OPTIONAL,
IN PVOID StartContext
);
//
// Startup Routines
//
VOID
PspUserThreadStartup(
IN PKSTART_ROUTINE StartRoutine,
IN PVOID StartContext
);
VOID
PspSystemThreadStartup(
IN PKSTART_ROUTINE StartRoutine,
IN PVOID StartContext
);
VOID
PspReaper(
IN PVOID StartContext
);
VOID
PspNullSpecialApc(
IN PKAPC Apc,
IN OUT PKNORMAL_ROUTINE *NormalRoutine,
IN OUT PVOID *NormalContext,
IN OUT PVOID *SystemArgument1,
IN OUT PVOID *SystemArgument2
);
//
// Thread Exit Support
//
VOID
PspExitApcRundown(
IN PKAPC Apc
);
DECLSPEC_NORETURN
VOID
PspExitThread(
IN NTSTATUS ExitStatus
);
NTSTATUS
PspTerminateThreadByPointer(
IN PETHREAD Thread,
IN NTSTATUS ExitStatus,
IN BOOLEAN DirectTerminate
);
VOID
PspExitSpecialApc(
IN PKAPC Apc,
IN OUT PKNORMAL_ROUTINE *NormalRoutine,
IN OUT PVOID *NormalContext,
IN OUT PVOID *SystemArgument1,
IN OUT PVOID *SystemArgument2
);
VOID
PspExitProcess(
IN BOOLEAN TrimAddressSpace,
IN PEPROCESS Process
);
NTSTATUS
PspWaitForUsermodeExit(
IN PEPROCESS Process
);
//
// Context Management
//
VOID
PspSetContext(
OUT PKTRAP_FRAME TrapFrame,
OUT PKNONVOLATILE_CONTEXT_POINTERS NonVolatileContext,
IN PCONTEXT Context,
KPROCESSOR_MODE Mode
);
VOID
PspGetContext(
IN PKTRAP_FRAME TrapFrame,
IN PKNONVOLATILE_CONTEXT_POINTERS NonVolatileContext,
IN OUT PCONTEXT Context
);
VOID
PspGetSetContextSpecialApc(
IN PKAPC Apc,
IN OUT PKNORMAL_ROUTINE *NormalRoutine,
IN OUT PVOID *NormalContext,
IN OUT PVOID *SystemArgument1,
IN OUT PVOID *SystemArgument2
);
VOID
PspExitNormalApc(
IN PVOID NormalContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
);
//
// private security routines
//
NTSTATUS
PspInitializeProcessSecurity(
IN PEPROCESS Parent OPTIONAL,
IN PEPROCESS Child
);
VOID
PspDeleteProcessSecurity(
IN PEPROCESS Process
);
VOID
PspInitializeThreadSecurity(
IN PEPROCESS Process,
IN PETHREAD Thread
);
VOID
PspDeleteThreadSecurity(
IN PETHREAD Thread
);
NTSTATUS
PspAssignPrimaryToken(
IN PEPROCESS Process,
IN HANDLE Token OPTIONAL,
IN PACCESS_TOKEN TokenPointer OPTIONAL
);
NTSTATUS
PspSetPrimaryToken(
IN HANDLE ProcessHandle,
IN PEPROCESS ProcessPointer OPTIONAL,
IN HANDLE TokenHandle OPTIONAL,
IN PACCESS_TOKEN TokenPointer OPTIONAL,
IN BOOLEAN PrivilegeChecked
);
//
// Ldt support routines
//
#if defined(i386)
NTSTATUS
PspLdtInitialize(
);
#endif
//
// Vdm support Routines
#if defined(i386)
NTSTATUS
PspVdmInitialize(
);
#endif
NTSTATUS
PspQueryLdtInformation(
IN PEPROCESS Process,
OUT PVOID LdtInformation,
IN ULONG LdtInformationLength,
OUT PULONG ReturnLength
);
NTSTATUS
PspSetLdtInformation(
IN PEPROCESS Process,
IN PVOID LdtInformation,
IN ULONG LdtInformationLength
);
NTSTATUS
PspSetLdtSize(
IN PEPROCESS Process,
IN PVOID LdtSize,
IN ULONG LdtSizeLength
);
VOID
PspDeleteLdt(
IN PEPROCESS Process
);
//
// Io handling support routines
//
NTSTATUS
PspSetProcessIoHandlers(
IN PEPROCESS Process,
IN PVOID IoHandlerInformation,
IN ULONG IoHandlerLength
);
VOID
PspDeleteVdmObjects(
IN PEPROCESS Process
);
NTSTATUS
PspQueryDescriptorThread (
PETHREAD Thread,
PVOID ThreadInformation,
ULONG ThreadInformationLength,
PULONG ReturnLength
);
//
// Job Object Support Routines
//
VOID
PspInitializeJobStructures(
VOID
);
VOID
PspInitializeJobStructuresPhase1(
VOID
);
VOID
PspJobTimeLimitsWork(
IN PVOID Context
);
VOID
PspJobTimeLimitsDpcRoutine(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
);
VOID
PspJobDelete(
IN PVOID Object
);
VOID
PspJobClose (
IN PEPROCESS Process,
IN PVOID Object,
IN ACCESS_MASK GrantedAccess,
IN ULONG_PTR ProcessHandleCount,
IN ULONG_PTR SystemHandleCount
);
NTSTATUS
PspAddProcessToJob(
PEJOB Job,
PEPROCESS Process
);
VOID
PspRemoveProcessFromJob(
PEJOB Job,
PEPROCESS Process
);
VOID
PspExitProcessFromJob(
PEJOB Job,
PEPROCESS Process
);
VOID
PspApplyJobLimitsToProcessSet(
PEJOB Job
);
VOID
PspApplyJobLimitsToProcess(
PEJOB Job,
PEPROCESS Process
);
BOOLEAN
PspTerminateAllProcessesInJob(
PEJOB Job,
NTSTATUS Status,
BOOLEAN IncCounter
);
VOID
PspFoldProcessAccountingIntoJob(
PEJOB Job,
PEPROCESS Process
);
NTSTATUS
PspCaptureTokenFilter(
KPROCESSOR_MODE PreviousMode,
PJOBOBJECT_SECURITY_LIMIT_INFORMATION SecurityLimitInfo,
PPS_JOB_TOKEN_FILTER * TokenFilter
);
VOID
PspShutdownJobLimits(
VOID
);
NTSTATUS
PspTerminateProcess(
PEPROCESS Process,
NTSTATUS Status
);
NTSTATUS
PspGetJobFromSet (
IN PEJOB ParentJob,
IN ULONG JobMemberLevel,
OUT PEJOB *pJob);
NTSTATUS
PspWin32SessionCallout(
IN PKWIN32_JOB_CALLOUT CalloutRoutine,
IN PKWIN32_JOBCALLOUT_PARAMETERS Parameters,
IN ULONG SessionId
);
//
// This test routine is called on checked systems to test this path
//
VOID
PspImageNotifyTest(
IN PUNICODE_STRING FullImageName,
IN HANDLE ProcessId,
IN PIMAGE_INFO ImageInfo
);
PEPROCESS
PspGetNextJobProcess (
IN PEJOB Job,
IN PEPROCESS Process
);
VOID
PspQuitNextJobProcess (
IN PEPROCESS Process
);
VOID
PspInsertQuotaBlock (
IN PEPROCESS_QUOTA_BLOCK QuotaBlock
);
VOID
FORCEINLINE
PspInitializeProcessLock (
IN PEPROCESS Process
)
{
ExInitializePushLock (&Process->ProcessLock);
}
VOID
FORCEINLINE
PspLockProcessExclusive (
IN PEPROCESS Process,
IN PETHREAD CurrentThread
)
{
KeEnterCriticalRegionThread (&CurrentThread->Tcb);
ExAcquirePushLockExclusive (&Process->ProcessLock);
}
VOID
FORCEINLINE
PspLockProcessShared (
IN PEPROCESS Process,
IN PETHREAD CurrentThread
)
{
KeEnterCriticalRegionThread (&CurrentThread->Tcb);
ExAcquirePushLockShared (&Process->ProcessLock);
}
VOID
FORCEINLINE
PspUnlockProcessShared (
IN PEPROCESS Process,
IN PETHREAD CurrentThread
)
{
ExReleasePushLockShared (&Process->ProcessLock);
KeLeaveCriticalRegionThread (&CurrentThread->Tcb);
}
VOID
FORCEINLINE
PspUnlockProcessExclusive (
IN PEPROCESS Process,
IN PETHREAD CurrentThread
)
{
ExReleasePushLockExclusive (&Process->ProcessLock);
KeLeaveCriticalRegionThread (&CurrentThread->Tcb);
}
//
// Define macros to lock the security fields of the process and thread
//
VOID
FORCEINLINE
PspLockProcessSecurityExclusive (
IN PEPROCESS Process,
IN PETHREAD CurrentThread
)
{
PspLockProcessExclusive (Process, CurrentThread);
}
VOID
FORCEINLINE
PspLockProcessSecurityShared (
IN PEPROCESS Process,
IN PETHREAD CurrentThread
)
{
PspLockProcessShared (Process, CurrentThread);
}
VOID
FORCEINLINE
PspUnlockProcessSecurityShared (
IN PEPROCESS Process,
IN PETHREAD CurrentThread
)
{
PspUnlockProcessShared (Process, CurrentThread);
}
VOID
FORCEINLINE
PspUnlockProcessSecurityExclusive (
IN PEPROCESS Process,
IN PETHREAD CurrentThread
)
{
PspUnlockProcessExclusive (Process, CurrentThread);
}
VOID
FORCEINLINE
PspInitializeThreadLock (
IN PETHREAD Thread
)
{
ExInitializePushLock (&Thread->ThreadLock);
}
VOID
FORCEINLINE
PspLockThreadSecurityExclusive (
IN PETHREAD Thread,
IN PETHREAD CurrentThread
)
{
KeEnterCriticalRegionThread (&CurrentThread->Tcb);
ExAcquirePushLockExclusive (&Thread->ThreadLock);
}
VOID
FORCEINLINE
PspLockThreadSecurityShared (
IN PETHREAD Thread,
IN PETHREAD CurrentThread
)
{
KeEnterCriticalRegionThread (&CurrentThread->Tcb);
ExAcquirePushLockShared (&Thread->ThreadLock);
}
VOID
FORCEINLINE
PspUnlockThreadSecurityShared (
IN PETHREAD Thread,
IN PETHREAD CurrentThread
)
{
ExReleasePushLockShared (&Thread->ThreadLock);
KeLeaveCriticalRegionThread (&CurrentThread->Tcb);
}
VOID
FORCEINLINE
PspUnlockThreadSecurityExclusive (
IN PETHREAD Thread,
IN PETHREAD CurrentThread
)
{
ExReleasePushLockExclusive (&Thread->ThreadLock);
KeLeaveCriticalRegionThread (&CurrentThread->Tcb);
}
//
// Define macros to lock the global process list
//
extern KGUARDED_MUTEX PspActiveProcessMutex;
VOID
FORCEINLINE
PspInitializeProcessListLock (
VOID
)
{
KeInitializeGuardedMutex (&PspActiveProcessMutex);
};
VOID
FORCEINLINE
PspLockProcessList (
IN PETHREAD CurrentThread
)
{
KeEnterGuardedRegionThread (&CurrentThread->Tcb);
KeAcquireGuardedMutexUnsafe (&PspActiveProcessMutex);
}
VOID
FORCEINLINE
PspUnlockProcessList (
IN PETHREAD CurrentThread
)
{
KeReleaseGuardedMutexUnsafe (&PspActiveProcessMutex);
KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
}
//
// Routines to lock and unlock the job list mutex
//
extern KGUARDED_MUTEX PspJobListLock;
VOID
FORCEINLINE
PspInitializeJobListLock (
VOID
)
{
KeInitializeGuardedMutex (&PspJobListLock);
}
VOID
FORCEINLINE
PspLockJobListExclusive (
IN PETHREAD CurrentThread
)
{
KeEnterGuardedRegionThread (&CurrentThread->Tcb);
KeAcquireGuardedMutexUnsafe (&PspJobListLock);
}
VOID
FORCEINLINE
PspLockJobListShared (
IN PETHREAD CurrentThread
)
{
KeEnterGuardedRegionThread (&CurrentThread->Tcb);
KeAcquireGuardedMutexUnsafe (&PspJobListLock);
}
VOID
FORCEINLINE
PspUnlockJobListExclusive (
IN PETHREAD CurrentThread
)
{
KeReleaseGuardedMutexUnsafe (&PspJobListLock);
KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
}
VOID
FORCEINLINE
PspUnlockJobListShared (
IN PETHREAD CurrentThread
)
{
KeReleaseGuardedMutexUnsafe (&PspJobListLock);
KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
}
//
// Routines to lock the job memory list lock
//
VOID
FORCEINLINE
PspInitializeJobLimitsLock (
IN PEJOB Job
)
{
KeInitializeGuardedMutex (&Job->MemoryLimitsLock);
}
VOID
FORCEINLINE
PspLockJobLimitsExclusive (
IN PEJOB Job,
IN PETHREAD CurrentThread
)
{
KeEnterGuardedRegionThread (&CurrentThread->Tcb);
KeAcquireGuardedMutexUnsafe (&Job->MemoryLimitsLock);
}
VOID
FORCEINLINE
PspLockJobLimitsExclusiveUnsafe (
IN PEJOB Job
)
{
ASSERT (KeAreAllApcsDisabled());
KeAcquireGuardedMutexUnsafe (&Job->MemoryLimitsLock);
}
VOID
FORCEINLINE
PspLockJobLimitsShared (
IN PEJOB Job,
IN PETHREAD CurrentThread
)
{
KeEnterGuardedRegionThread (&CurrentThread->Tcb);
KeAcquireGuardedMutexUnsafe (&Job->MemoryLimitsLock);
}
VOID
FORCEINLINE
PspLockJobLimitsSharedUnsafe (
IN PEJOB Job
)
{
ASSERT (KeAreAllApcsDisabled());
KeAcquireGuardedMutexUnsafe (&Job->MemoryLimitsLock);
}
VOID
FORCEINLINE
PspUnlockJobLimitsExclusive (
IN PEJOB Job,
IN PETHREAD CurrentThread
)
{
KeReleaseGuardedMutexUnsafe (&Job->MemoryLimitsLock);
KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
}
VOID
FORCEINLINE
PspUnlockJobLimitsExclusiveUnsafe (
IN PEJOB Job
)
{
ASSERT (KeAreAllApcsDisabled());
KeReleaseGuardedMutexUnsafe (&Job->MemoryLimitsLock);
}
VOID
FORCEINLINE
PspUnlockJobLimitsShared (
IN PEJOB Job,
IN PETHREAD CurrentThread
)
{
KeReleaseGuardedMutexUnsafe (&Job->MemoryLimitsLock);
KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
}
VOID
FORCEINLINE
PspUnlockJobLimitsSharedUnsafe (
IN PEJOB Job
)
{
ASSERT (KeAreAllApcsDisabled());
KeReleaseGuardedMutexUnsafe (&Job->MemoryLimitsLock);
}
//
// Routines to lock job time limits structures
//
extern KGUARDED_MUTEX PspJobTimeLimitsLock;
VOID
FORCEINLINE
PspInitializeJobTimeLimitsLock (
VOID
)
{
KeInitializeGuardedMutex (&PspJobTimeLimitsLock);
}
VOID
FORCEINLINE
PspLockJobTimeLimitsExclusive (
IN PETHREAD CurrentThread
)
{
KeEnterGuardedRegionThread (&CurrentThread->Tcb);
KeAcquireGuardedMutexUnsafe (&PspJobTimeLimitsLock);
}
VOID
FORCEINLINE
PspUnlockJobTimeLimitsExclusive (
IN PETHREAD CurrentThread
)
{
KeReleaseGuardedMutexUnsafe (&PspJobTimeLimitsLock);
KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
}
VOID
FORCEINLINE
PspLockJobTimeLimitsShared (
IN PETHREAD CurrentThread
)
{
KeEnterGuardedRegionThread (&CurrentThread->Tcb);
KeAcquireGuardedMutexUnsafe (&PspJobTimeLimitsLock);
}
VOID
FORCEINLINE
PspUnlockJobTimeLimitsShared (
IN PETHREAD CurrentThread
)
{
KeReleaseGuardedMutexUnsafe (&PspJobTimeLimitsLock);
KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
}
//
// Routines for locking working set change lock
//
VOID
FORCEINLINE
PspInitializeWorkingSetChangeLock (
VOID
)
{
KeInitializeGuardedMutex (&PspWorkingSetChangeHead.Lock);
}
VOID
FORCEINLINE
PspLockWorkingSetChangeExclusive (
IN PETHREAD CurrentThread
)
{
KeEnterGuardedRegionThread (&CurrentThread->Tcb);
KeAcquireGuardedMutexUnsafe (&PspWorkingSetChangeHead.Lock);
}
VOID
FORCEINLINE
PspUnlockWorkingSetChangeExclusive (
IN PETHREAD CurrentThread
)
{
KeReleaseGuardedMutexUnsafe (&PspWorkingSetChangeHead.Lock);
KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
}
VOID
FORCEINLINE
PspLockWorkingSetChangeExclusiveUnsafe (
VOID
)
{
ASSERT (KeAreAllApcsDisabled());
KeAcquireGuardedMutexUnsafe (&PspWorkingSetChangeHead.Lock);
}
VOID
FORCEINLINE
PspUnlockWorkingSetChangeExclusiveUnsafe (
VOID
)
{
KeReleaseGuardedMutexUnsafe (&PspWorkingSetChangeHead.Lock);
ASSERT (KeAreAllApcsDisabled());
}
//
//
// Global Data
//
extern PHANDLE_TABLE PspCidTable;
extern HANDLE PspInitialSystemProcessHandle;
extern PACCESS_TOKEN PspBootAccessToken;
extern KSPIN_LOCK PspEventPairLock;
extern SYSTEM_DLL PspSystemDll;
extern PETHREAD PspShutdownThread;
extern ULONG PspDefaultPagedLimit;
extern ULONG PspDefaultNonPagedLimit;
extern ULONG PspDefaultPagefileLimit;
extern ULONG PsMinimumWorkingSet;
extern EPROCESS_QUOTA_BLOCK PspDefaultQuotaBlock;
extern BOOLEAN PspDoingGiveBacks;
extern PKWIN32_PROCESS_CALLOUT PspW32ProcessCallout;
extern PKWIN32_THREAD_CALLOUT PspW32ThreadCallout;
extern PKWIN32_JOB_CALLOUT PspW32JobCallout;
extern ULONG PspW32ProcessSize;
extern ULONG PspW32ThreadSize;
extern SCHAR PspForegroundQuantum[3];
#define PSP_NUMBER_OF_SCHEDULING_CLASSES 10
#define PSP_DEFAULT_SCHEDULING_CLASSES 5
extern const SCHAR PspJobSchedulingClasses[PSP_NUMBER_OF_SCHEDULING_CLASSES];
extern BOOLEAN PspUseJobSchedulingClasses;
extern LIST_ENTRY PspJobList;
extern KDPC PspJobLimeLimitsDpc;
extern KTIMER PspJobTimeLimitsTimer;
extern WORK_QUEUE_ITEM PspJobTimeLimitsWorkItem;
extern KSPIN_LOCK PspQuotaLock;
#endif // _PSP_