mirror of https://github.com/lianthony/NT4.0
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.
454 lines
7.8 KiB
454 lines
7.8 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_
|
|
|
|
#include "ntos.h"
|
|
#include "ntrtl.h"
|
|
#include "nturtl.h"
|
|
#include "zwapi.h"
|
|
#include "ki.h"
|
|
#ifdef _X86_
|
|
#include <vdmntos.h>
|
|
#endif
|
|
#include "ntdbg.h"
|
|
#include <string.h>
|
|
|
|
#ifdef POOL_TAGGING
|
|
#define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,' sP')
|
|
#define ExAllocatePoolWithQuota(a,b) ExAllocatePoolWithQuotaTag(a,b,' sP')
|
|
#endif
|
|
|
|
//
|
|
// 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))
|
|
|
|
typedef struct _TERMINATION_PORT {
|
|
LIST_ENTRY Links;
|
|
PVOID Port;
|
|
} TERMINATION_PORT, *PTERMINATION_PORT;
|
|
|
|
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;
|
|
} SYSTEM_DLL, PSYSTEM_DLL;
|
|
|
|
|
|
//
|
|
// 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
|
|
);
|
|
|
|
//
|
|
// 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
|
|
);
|
|
|
|
NTSTATUS
|
|
PspMapSystemDll(
|
|
IN PEPROCESS Process,
|
|
OUT PVOID *DllBase OPTIONAL
|
|
);
|
|
|
|
//
|
|
// Internal Creation Functions
|
|
//
|
|
|
|
#define PSP_MAX_CREATE_PROCESS_NOTIFY 8
|
|
|
|
ULONG PspCreateProcessNotifyRoutineCount;
|
|
PCREATE_PROCESS_NOTIFY_ROUTINE PspCreateProcessNotifyRoutine[ PSP_MAX_CREATE_PROCESS_NOTIFY ];
|
|
|
|
NTSTATUS
|
|
PspCreateProcess(
|
|
OUT PHANDLE ProcessHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
|
IN HANDLE ParentProcess OPTIONAL,
|
|
IN BOOLEAN InheritObjectTable,
|
|
IN HANDLE SectionHandle OPTIONAL,
|
|
IN HANDLE DebugPort OPTIONAL,
|
|
IN HANDLE ExceptionPort OPTIONAL
|
|
);
|
|
|
|
#define PSP_MAX_CREATE_THREAD_NOTIFY 8
|
|
|
|
ULONG PspCreateThreadNotifyRoutineCount;
|
|
PCREATE_THREAD_NOTIFY_ROUTINE PspCreateThreadNotifyRoutine[ PSP_MAX_CREATE_THREAD_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
|
|
PspExitThread(
|
|
IN NTSTATUS ExitStatus
|
|
);
|
|
|
|
NTSTATUS
|
|
PspTerminateThreadByPointer(
|
|
IN PETHREAD Thread,
|
|
IN NTSTATUS ExitStatus
|
|
);
|
|
|
|
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
|
|
);
|
|
|
|
|
|
//
|
|
// 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
|
|
);
|
|
|
|
//
|
|
// VOID
|
|
// PspLockProcessSecurityFields(VOID)
|
|
//
|
|
|
|
#define PspLockProcessSecurityFields( ) ExAcquireFastMutex( &PspProcessSecurityLock )
|
|
|
|
//
|
|
// VOID
|
|
// PspFreeProcessSecurityFields(VOID);
|
|
//
|
|
|
|
#define PspFreeProcessSecurityFields( ) ExReleaseFastMutex( &PspProcessSecurityLock )
|
|
|
|
//
|
|
// Ldt support routines
|
|
//
|
|
|
|
#ifdef i386
|
|
NTSTATUS
|
|
PspLdtInitialize(
|
|
);
|
|
#endif
|
|
|
|
//
|
|
// Vdm support Routines
|
|
|
|
#ifdef 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
|
|
);
|
|
//
|
|
//
|
|
// Global Data
|
|
//
|
|
|
|
extern PHANDLE_TABLE PspCidTable;
|
|
extern HANDLE PspInitialSystemProcessHandle;
|
|
extern PACCESS_TOKEN PspBootAccessToken;
|
|
extern KSPIN_LOCK PspEventPairLock;
|
|
extern SYSTEM_DLL PspSystemDll;
|
|
extern FAST_MUTEX PspProcessSecurityLock;
|
|
extern FAST_MUTEX PspActiveProcessMutex;
|
|
extern FAST_MUTEX PspProcessLockMutex;
|
|
|
|
extern ULONG PspDefaultPagedLimit;
|
|
extern ULONG PspDefaultNonPagedLimit;
|
|
extern ULONG PspDefaultPagefileLimit;
|
|
|
|
extern EPROCESS_QUOTA_BLOCK PspDefaultQuotaBlock;
|
|
extern BOOLEAN PspDoingGiveBacks;
|
|
|
|
extern PKWIN32_PROCESS_CALLOUT PspW32ProcessCallout;
|
|
extern PKWIN32_THREAD_CALLOUT PspW32ThreadCallout;
|
|
extern ULONG PspW32ProcessSize;
|
|
extern ULONG PspW32ThreadSize;
|
|
extern SCHAR PspForegroundQuantum[3];
|
|
|
|
#if DBG
|
|
|
|
extern PRTL_EVENT_ID_INFO PspExitProcessEventId;
|
|
extern PRTL_EVENT_ID_INFO PspPageFaultEventId;
|
|
|
|
#endif // DBG
|
|
|
|
#endif // _PSP_
|