fixed a few race conditions during thread/process termination leading to dead-locks
[reactos.git] / reactos / ntoskrnl / include / internal / ps.h
index f7244cd..75e851a 100644 (file)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: ps.h,v 1.64 2004/08/10 06:26:42 ion Exp $
+/* $Id$
  *
  * FILE:            ntoskrnl/ke/kthread.c
  * PURPOSE:         Process manager definitions
@@ -33,6 +33,7 @@
 /* Forward declarations. */
 struct _KTHREAD;
 struct _KTRAPFRAME;
+struct _EJOB;
 
 #endif /* __ASM__ */
 
@@ -47,28 +48,9 @@ struct _KTRAPFRAME;
 #define KeGetCurrentProcessorNumber() (KeGetCurrentKPCR()->ProcessorNumber)
 #endif
 
-extern HANDLE SystemProcessHandle;
-
 extern LCID PsDefaultThreadLocaleId;
 extern LCID PsDefaultSystemLocaleId;
 
-#ifndef __USE_W32API
-
-#include <pshpack1.h>
-
-typedef struct _KAPC_STATE
-{
-   LIST_ENTRY ApcListHead[2];
-   struct _KPROCESS* Process;
-   UCHAR KernelApcInProgress;
-   UCHAR KernelApcPending;
-   USHORT UserApcPending;
-} KAPC_STATE, *PKAPC_STATE, *__restrict PRKAPC_STATE;
-
-#include <poppack.h>
-
-#endif /* __USE_W32API */
-
 #include <pshpack1.h>
 
 typedef struct _KTHREAD
@@ -79,7 +61,7 @@ typedef struct _KTHREAD
    /* List of mutants owned by the thread */
    LIST_ENTRY        MutantListHead;      /* 10 */
    PVOID             InitialStack;        /* 18 */
-   ULONG             StackLimit;          /* 1C */
+   ULONG_PTR         StackLimit;          /* 1C */
    
    /* Pointer to the thread's environment block in user memory */
    PTEB              Teb;                 /* 20 */
@@ -91,16 +73,16 @@ typedef struct _KTHREAD
    
    /* Thread state (one of THREAD_STATE_xxx constants below) */
    UCHAR             State;               /* 2D */
-   UCHAR             Alerted[2];          /* 2E */
+   BOOLEAN           Alerted[2];          /* 2E */
    UCHAR             Iopl;                /* 30 */
    UCHAR             NpxState;            /* 31 */
-   UCHAR             Saturation;          /* 32 */
+   CHAR              Saturation;          /* 32 */
    CHAR              Priority;            /* 33 */
    KAPC_STATE        ApcState;            /* 34 */
    ULONG             ContextSwitches;     /* 4C */
-   ULONG             WaitStatus;          /* 50 */
+   LONG              WaitStatus;          /* 50 */
    KIRQL             WaitIrql;            /* 54 */
-   UCHAR             WaitMode;            /* 55 */
+   CHAR              WaitMode;            /* 55 */
    UCHAR             WaitNext;            /* 56 */
    UCHAR             WaitReason;          /* 57 */
    PKWAIT_BLOCK      WaitBlockList;       /* 58 */
@@ -109,15 +91,15 @@ typedef struct _KTHREAD
    CHAR              BasePriority;        /* 68 */
    UCHAR             DecrementCount;      /* 69 */
    UCHAR             PriorityDecrement;   /* 6A */
-   UCHAR             Quantum;             /* 6B */
+   CHAR              Quantum;             /* 6B */
    KWAIT_BLOCK       WaitBlock[4];        /* 6C */
    PVOID             LegoData;            /* CC */
-   LONG              KernelApcDisable;    /* D0 */
+   ULONG             KernelApcDisable;    /* D0 */
    KAFFINITY         UserAffinity;        /* D4 */
    UCHAR             SystemAffinityActive;/* D8 */
    UCHAR             PowerState;          /* D9 */
    UCHAR             NpxIrql;             /* DA */
-   UCHAR             Pad;                 /* DB */
+   UCHAR             Pad[1];              /* DB */
    SSDT_ENTRY        *ServiceTable;       /* DC */
    PKQUEUE           Queue;               /* E0 */
    KSPIN_LOCK        ApcQueueLock;        /* E4 */
@@ -129,8 +111,8 @@ typedef struct _KTHREAD
    UCHAR             KernelStackResident; /* 11E */
    UCHAR             NextProcessor;       /* 11F */
    PVOID             CallbackStack;       /* 120 */
-   BOOL              Win32Thread;         /* 124 */
-   struct _KTRAP_FRAME*      TrapFrame;   /* 128 */
+   struct _W32THREAD *Win32Thread;        /* 124 */
+   struct _KTRAP_FRAME *TrapFrame;        /* 128 */
    PKAPC_STATE       ApcStatePointer[2];  /* 12C */
    UCHAR             EnableStackSwap;     /* 134 */
    UCHAR             LargeStack;          /* 135 */
@@ -151,13 +133,6 @@ typedef struct _KTHREAD
    UCHAR             SuspendCount;        /* 1AD */
    UCHAR             IdealProcessor;      /* 1AE */
    UCHAR             DisableBoost;        /* 1AF */
-   
-   /*
-    * Below here are thread structure members that are specific to ReactOS
-    */
-   
-   /* Added by Phillip Susi for list of threads in a process */
-   LIST_ENTRY        ProcessThreadListEntry;         /* 1B0 */
 } KTHREAD;
 
 #include <poppack.h>
@@ -169,67 +144,68 @@ typedef struct _KTHREAD
 #define        FSRTL_FAST_IO_TOP_LEVEL_IRP             (0x04)
 #define        FSRTL_MAX_TOP_LEVEL_IRP_FLAG            (0x04)
 
+#ifndef __USE_W32API
 typedef struct
 {
-  PACCESS_TOKEN Token;                              // 0x0
-  BOOLEAN CopyOnOpen;                               // 0x4
-  BOOLEAN EffectiveOnly;                            // 0x5
-  UCHAR Pad[2];                                     // 0x6
-  SECURITY_IMPERSONATION_LEVEL Level;               // 0x8
-} PS_IMPERSONATION_INFO, *PPS_IMPERSONATION_INFO;
+    PACCESS_TOKEN                   Token;
+    BOOLEAN                         CopyOnOpen;
+    BOOLEAN                         EffectiveOnly;
+    SECURITY_IMPERSONATION_LEVEL    ImpersonationLevel;
+} PS_IMPERSONATION_INFORMATION, *PPS_IMPERSONATION_INFORMATION;
+#endif
 
 #include <pshpack1.h>
 
+/* This needs to be fixed ASAP! */
 typedef struct _ETHREAD
 {
-  KTHREAD Tcb;                                      /* 000 */
-  TIME CreateTime;                                  /* 1B0/1B8 */
-  union
-  {
-    TIME ExitTime;                                  /* 1B8/1E4 */
-    LIST_ENTRY LpcReplyChain;                       /* 1B8/1E4 */
-  } u1;
-  NTSTATUS ExitStatus;                              /* 1C0/1EC */
-  LIST_ENTRY PostBlockList;                         /* 1C4/1F0 */
-  LIST_ENTRY TerminationPortList;                   /* 1CC/1F8 */
-  KSPIN_LOCK ActiveTimerListLock;                   /* 1D4/200 */
-  LIST_ENTRY ActiveTimerListHead;                   /* 1D8/204 */
-  CLIENT_ID Cid;                                    /* 1E0/20C */
-  KSEMAPHORE LpcReplySemaphore;                     /* 1E8/214 */
-  PVOID LpcReplyMessage;                            /* 1FC/228 */
-  PLARGE_INTEGER LpcReplyMessageId;                 /* 200/22C */
-  ULONG PerformanceCounterLow;                      /* 204/230 */
-  PPS_IMPERSONATION_INFO ImpersonationInfo;         /* 208/234 */
-  LIST_ENTRY IrpList;                               /* 20C/238 */
-  PIRP TopLevelIrp;                                 /* 214/240 */
-  PDEVICE_OBJECT DeviceToVerify;                    /* 218/244 */
-  ULONG ReadClusterSize;                            /* 21C/248 */
-  UCHAR ForwardClusterOnly;                         /* 220/24C */
-  UCHAR DisablePageFaultClustering;                 /* 221/24D */
-  UCHAR DeadThread;                                 /* 222/24E */
-  UCHAR HasTerminated;                              /* 223/24F */
-  PVOID EventPair;                                  /* 224/250 */
-  ACCESS_MASK GrantedAccess;                        /* 228/254 */
-  struct _EPROCESS* ThreadsProcess;                 /* 22C/258 */
-  PKSTART_ROUTINE StartAddress;                     /* 230/25C */
-  union
-  {
-    LPTHREAD_START_ROUTINE Win32StartAddress;       /* 234/260 */
-    ULONG LpcReceiveMessageId;                      /* 234/260 */
-  } u2;
-  UCHAR LpcExitThreadCalled;                        /* 238/264 */
-  UCHAR HardErrorsAreDisabled;                      /* 239/265 */
-  UCHAR LpcReceivedMsgIdValid;                      /* 23A/266 */
-  BOOLEAN ActiveImpersonationInfo;                  /* 23B/267 */
-  ULONG PerformanceCountHigh;                       /* 23C/268 */
-
-  /*
-   * Added by David Welch (welch@cwcom.net)
-   */
-  struct _EPROCESS* OldProcess;                     /* 240/26C */
-
-  struct _W32THREAD* Win32Thread;
-  
+  KTHREAD Tcb;
+  union {
+       LARGE_INTEGER CreateTime;
+       UCHAR NestedFaultCount:2;
+       UCHAR ApcNeeded:1;
+  };
+  LARGE_INTEGER ExitTime;
+  LIST_ENTRY LpcReplyChain;
+  NTSTATUS ExitStatus;
+  PVOID OfsChain;
+  LIST_ENTRY PostBlockList;
+  union {
+    struct _TERMINATION_PORT *TerminationPort;
+    struct _ETHREAD* ReaperLink;  
+  };
+  KSPIN_LOCK ActiveTimerListLock;
+  LIST_ENTRY ActiveTimerListHead;
+  CLIENT_ID Cid;
+  KSEMAPHORE LpcReplySemaphore;
+  PVOID LpcReplyMessage;
+  ULONG LpcReplyMessageId;
+  ULONG PerformanceCountLow;
+  PPS_IMPERSONATION_INFORMATION ImpersonationInfo;
+  LIST_ENTRY IrpList;
+  PIRP TopLevelIrp;
+  PDEVICE_OBJECT DeviceToVerify;
+  ULONG ReadClusterSize;
+  UCHAR ForwardClusterOnly;
+  UCHAR DisablePageFaultClustering;
+  UCHAR DeadThread;
+  UCHAR HideFromDebugger;
+  ULONG HasTerminated;
+#ifdef _ENABLE_THRDEVTPAIR
+  PVOID EventPair;
+#endif /* _ENABLE_THRDEVTPAIR */
+  ACCESS_MASK GrantedAccess;
+  struct _EPROCESS *ThreadsProcess;
+  PKSTART_ROUTINE StartAddress;
+  LPTHREAD_START_ROUTINE Win32StartAddress;
+  ULONG LpcReceivedMessageId;
+  UCHAR LpcExitThreadCalled;
+  UCHAR HardErrorsAreDisabled;
+  UCHAR LpcReceivedMsgIdValid;
+  UCHAR ActiveImpersonationInfo;
+  ULONG PerformanceCountHigh;
+  LIST_ENTRY ThreadListEntry;
+  BOOLEAN SystemThread;
 } ETHREAD;
 
 #include <poppack.h>
@@ -310,6 +286,27 @@ typedef struct _KPROCESS
 
 typedef struct _KPROCESS *PKPROCESS;
 
+typedef struct _HARDWARE_PTE_X86 {
+    ULONG Valid             : 1;
+    ULONG Write             : 1;
+    ULONG Owner             : 1;
+    ULONG WriteThrough      : 1;
+    ULONG CacheDisable      : 1;
+    ULONG Accessed          : 1;
+    ULONG Dirty             : 1;
+    ULONG LargePage         : 1;
+    ULONG Global            : 1;
+    ULONG CopyOnWrite       : 1;
+    ULONG Prototype         : 1;
+    ULONG reserved          : 1;
+    ULONG PageFrameNumber   : 20;
+} HARDWARE_PTE_X86, *PHARDWARE_PTE_X86;
+
+typedef struct _WOW64_PROCESS
+{
+  PVOID Wow64;
+} WOW64_PROCESS, *PWOW64_PROCESS;
+
 #endif /* __USE_W32API */
 
 struct _EPROCESS
@@ -324,18 +321,14 @@ struct _EPROCESS
   ULONG                 LockCount;                    /* 07C */
 
   /* Time of process creation. */
-#ifdef __USE_W32API
-  LARGE_INTEGER                  CreateTime;                   /* 080 */
-#else
-  TIME                  CreateTime;                   /* 080 */
-#endif
+  LARGE_INTEGER         CreateTime;                   /* 080 */
 
   /* Time of process exit. */
-  TIME                  ExitTime;                     /* 088 */
+  LARGE_INTEGER         ExitTime;                     /* 088 */
   /* Unknown. */
-  PVOID                 LockOwner;                    /* 090 */
+  PKTHREAD              LockOwner;                    /* 090 */
   /* Process id. */
-  ULONG                 UniqueProcessId;              /* 094 */
+  HANDLE                UniqueProcessId;              /* 094 */
   /* Unknown. */
   LIST_ENTRY            ActiveProcessLinks;           /* 098 */
   /* Unknown. */
@@ -352,30 +345,15 @@ struct _EPROCESS
   ULONG                 PeakVirtualSize;              /* 0BC */
   /* Unknown. */
   LARGE_INTEGER         VirtualSize;                  /* 0C0 */
-  struct
-  {
-    ULONG               LastTrimTime;
-    ULONG               LastTrimFaultCount;
-    ULONG               PageFaultCount;
-    ULONG               PeakWorkingSetSize;
-    ULONG               WorkingSetSize;
-    ULONG               MinimumWorkingSetSize;
-    ULONG               MaximumWorkingSetSize;
-    ULONG               VmWorkingSetList;
-    LIST_ENTRY          WorkingSetExpansionList;
-    UCHAR               AllowWorkingSetAdjustment;
-    UCHAR               AddressSpaceBeingDeleted;
-    UCHAR               ForegroundPrioritySwitch;
-    UCHAR               MemoryPriority;
-  } Vm;
-  PVOID                 LastProtoPteFault;
-  struct _EPORT*        DebugPort;
-  struct _EPORT*        ExceptionPort;
-  PVOID                 ObjectTable;
+
+  MMSUPPORT             Vm;
+  LIST_ENTRY            SessionProcessLinks;
+  struct _EPORT         *DebugPort;
+  struct _EPORT         *ExceptionPort;
+  PHANDLE_TABLE         ObjectTable;
   PVOID                 Token;
-  /*  FAST_MUTEX            WorkingSetLock; */
-  KMUTEX                WorkingSetLock;
-  PVOID                 WorkingSetPage;
+  FAST_MUTEX            WorkingSetLock;
+  ULONG                 WorkingSetPage;
   UCHAR                 ProcessOutswapEnabled;
   UCHAR                 ProcessOutswapped;
   UCHAR                 AddressSpaceInitialized;
@@ -387,14 +365,15 @@ struct _EPROCESS
   UCHAR                 ForkWasSuccessful;
   UCHAR                 MmAgressiveWsTrimMask;
   PKEVENT               VmOperationEvent;
-  PVOID                 PageDirectoryPte;
+  PVOID                 PaeTop;
   ULONG                 LastFaultCount;
+  ULONG                 ModifiedPageCount;
   PVOID                 VadRoot;
   PVOID                 VadHint;
   PVOID                 CloneRoot;
   ULONG                 NumberOfPrivatePages;
   ULONG                 NumberOfLockedPages;
-  USHORT                NextProcessColour;
+  USHORT                NextPageColor;
   UCHAR                 ExitProcessCalled;
   UCHAR                 CreateProcessReported;
   HANDLE                SectionHandle;
@@ -402,14 +381,20 @@ struct _EPROCESS
   PVOID                 SectionBaseAddress;
   PEPROCESS_QUOTA_BLOCK QuotaBlock;
   NTSTATUS              LastThreadExitStatus;
-  PVOID                 WorkingSetWatch;
+  PPAGEFAULT_HISTORY    WorkingSetWatch;
+  HANDLE                Win32WindowStation;
   HANDLE                InheritedFromUniqueProcessId;
-  ACCESS_MASK           GrantedAccess;
+  ULONG                 GrantedAccess;
   ULONG                 DefaultHardErrorProcessing;
   PVOID                 LdtInformation;
-  ULONG                 VadFreeHint;
+  PVOID                 VadFreeHint;
   PVOID                 VdmObjects;
-  KMUTANT               ProcessMutant;
+  PVOID                 DeviceObjects;
+  ULONG                 SessionId;
+  LIST_ENTRY            PhysicalVadList;
+  HARDWARE_PTE_X86      PageDirectoryPte;
+  ULONGLONG             Filler;
+  ULONG                 PaePageDirectoryPage;
   CHAR                  ImageFileName[16];
   ULONG                 VmTrimFaultValue;
   UCHAR                 SetTimerResolution;
@@ -417,25 +402,34 @@ struct _EPROCESS
   UCHAR                 SubSystemMinorVersion;
   UCHAR                 SubSystemMajorVersion;
   USHORT                SubSystemVersion;
-  struct _W32PROCESS*   Win32Process;
-  HANDLE                Win32WindowStation;
-   
-   /*
-    * Added by David Welch (welch@mcmail.com)
-    */
-  HANDLE                Win32Desktop;
+  struct _W32PROCESS    *Win32Process;
+  struct _EJOB          *Job;
+  ULONG                 JobStatus;
+  LIST_ENTRY            JobLinks;
+  PVOID                 LockedPagesList;
+  struct _EPORT         *SecurityPort;
+  PWOW64_PROCESS        Wow64;
+  LARGE_INTEGER         ReadOperationCount;
+  LARGE_INTEGER         WriteOperationCount;
+  LARGE_INTEGER         OtherOperationCount;
+  LARGE_INTEGER         ReadTransferCount;
+  LARGE_INTEGER         WriteTransferCount;
+  LARGE_INTEGER         OtherTransferCount;
+  ULONG                 CommitChargeLimit;
+  ULONG                 CommitChargePeak;
+  LIST_ENTRY            ThreadListHead;
+  PRTL_BITMAP           VadPhysicalPagesBitMap;
+  ULONG                 VadPhysicalPages;
+  KSPIN_LOCK            AweLock;
+  ULONG                 Cookie;
+
+  /*
+   * FIXME - ReactOS specified - remove the following fields ASAP!!!
+   */
   MADDRESS_SPACE        AddressSpace;
-  HANDLE_TABLE          HandleTable;
   LIST_ENTRY            ProcessListEntry;
-   
-   /*
-    * Added by Philip Susi for list of threads in process
-    */
-  LIST_ENTRY           ThreadListHead;
-
-  /* Added by Alex Ionescu (alex@relsoft.net)*/
-  ULONG                                        SessionId;
-  struct _EPORT*               SecurityPort;
+  PVOID                 TebBlock;
+  PVOID                 TebLastAllocated;
 };
 
 #define PROCESS_STATE_TERMINATED (1)
@@ -447,8 +441,8 @@ VOID PiShutdownProcessManager(VOID);
 VOID PsInitThreadManagment(VOID);
 VOID PsInitProcessManagment(VOID);
 VOID PsInitIdleThread(VOID);
-VOID PsDispatchThreadNoLock(ULONG NewThreadStatus);
 VOID PiTerminateProcessThreads(PEPROCESS Process, NTSTATUS ExitStatus);
+VOID PsTerminateCurrentThread(NTSTATUS ExitStatus);
 VOID PsTerminateOtherThread(PETHREAD Thread, NTSTATUS ExitStatus);
 VOID PsReleaseThread(PETHREAD Thread);
 VOID PsBeginThread(PKSTART_ROUTINE StartRoutine, PVOID StartContext);
@@ -458,25 +452,37 @@ NTSTATUS STDCALL PiTerminateProcess(PEPROCESS Process, NTSTATUS ExitStatus);
 VOID PiInitApcManagement(VOID);
 VOID STDCALL PiDeleteThread(PVOID ObjectBody);
 VOID PsReapThreads(VOID);
+VOID PsInitializeThreadReaper(VOID);
+VOID PsQueueThreadReap(PETHREAD Thread);
 NTSTATUS 
-PsInitializeThread(HANDLE ProcessHandle,
+PsInitializeThread(PEPROCESS Process,
                   PETHREAD* ThreadPtr,
-                  PHANDLE ThreadHandle,
-                  ACCESS_MASK DesiredAccess,
                   POBJECT_ATTRIBUTES ObjectAttributes,
+                  KPROCESSOR_MODE AccessMode,
                   BOOLEAN First);
 
-PACCESS_TOKEN PsReferenceEffectiveToken(PETHREAD Thread,
+PACCESS_TOKEN STDCALL PsReferenceEffectiveToken(PETHREAD Thread,
                                        PTOKEN_TYPE TokenType,
                                        PUCHAR b,
                                        PSECURITY_IMPERSONATION_LEVEL Level);
 
-NTSTATUS PsOpenTokenOfProcess(HANDLE ProcessHandle,
+NTSTATUS STDCALL PsOpenTokenOfProcess(HANDLE ProcessHandle,
                              PACCESS_TOKEN* Token);
-
+VOID
+STDCALL
+PspTerminateProcessThreads(PEPROCESS Process,
+                           NTSTATUS ExitStatus);
 NTSTATUS PsSuspendThread(PETHREAD Thread, PULONG PreviousCount);
 NTSTATUS PsResumeThread(PETHREAD Thread, PULONG PreviousCount);
-
+NTSTATUS
+STDCALL
+PspAssignPrimaryToken(PEPROCESS Process,
+                      HANDLE TokenHandle);
+VOID STDCALL PsExitSpecialApc(PKAPC Apc, 
+                     PKNORMAL_ROUTINE *NormalRoutine,
+                     PVOID *NormalContext,
+                     PVOID *SystemArgument1,
+                     PVOID *SystemArgument2);
 
 #define THREAD_STATE_INITIALIZED  (0)
 #define THREAD_STATE_READY        (1)
@@ -500,25 +506,25 @@ NTSTATUS PsResumeThread(PETHREAD Thread, PULONG PreviousCount);
 #define PROCESS_PRIO_RT                                18
 
 
+VOID STDCALL PiDeleteProcess(PVOID ObjectBody);
+
 VOID 
-KeInitializeThread(PKPROCESS Process, PKTHREAD Thread, BOOLEAN First);
-NTSTATUS KeReleaseThread(PETHREAD Thread);
+STDCALL 
+PspReapRoutine(PVOID Context);
 
-STDCALL
 VOID
-KeStackAttachProcess (
-    IN PKPROCESS Process,
-    OUT PKAPC_STATE ApcState
-    );
-
 STDCALL
+PspExitThread(NTSTATUS ExitStatus);
+
+extern LIST_ENTRY PspReaperListHead;
+extern WORK_QUEUE_ITEM PspReaperWorkItem;
+extern BOOLEAN PspReaping;
+
 VOID
-KeUnstackDetachProcess (
-    IN PKAPC_STATE ApcState
-    );
+STDCALL
+PspTerminateThreadByPointer(PETHREAD Thread,
+                            NTSTATUS ExitStatus);
 
-VOID STDCALL PiDeleteProcess(PVOID ObjectBody);
-VOID PsReapThreads(VOID);
 VOID PsUnfreezeOtherThread(PETHREAD Thread);
 VOID PsFreezeOtherThread(PETHREAD Thread);
 VOID PsFreezeProcessThreads(PEPROCESS Process);
@@ -526,11 +532,6 @@ VOID PsUnfreezeProcessThreads(PEPROCESS Process);
 ULONG PsEnumThreadsByProcess(PEPROCESS Process);
 PEPROCESS PsGetNextProcess(PEPROCESS OldProcess);
 VOID
-PsBlockThread(PNTSTATUS Status, UCHAR Alertable, ULONG WaitMode, 
-             BOOLEAN DispatcherLock, KIRQL WaitIrql, UCHAR WaitReason);
-VOID
-PsUnblockThread(PETHREAD Thread, PNTSTATUS WaitStatus);
-VOID
 PsApplicationProcessorInit(VOID);
 VOID
 PsPrepareForApplicationProcessorInit(ULONG Id);
@@ -549,13 +550,21 @@ VOID STDCALL
 PiSuspendThreadNormalRoutine(PVOID NormalContext,
                             PVOID SystemArgument1,
                             PVOID SystemArgument2);
-VOID STDCALL
-PsDispatchThread(ULONG NewThreadStatus);
 VOID
 PsInitialiseSuspendImplementation(VOID);
+NTSTATUS 
+STDCALL
+PspExitProcess(PEPROCESS Process);
 
-extern ULONG PiNrThreadsAwaitingReaping;
+VOID 
+STDCALL 
+PspDeleteProcess(PVOID ObjectBody);
+
+VOID 
+STDCALL
+PspDeleteThread(PVOID ObjectBody);
 
+extern LONG PiNrThreadsAwaitingReaping;
 
 NTSTATUS
 PsInitWin32Thread (PETHREAD Thread);
@@ -577,6 +586,85 @@ VOID
 STDCALL
 PspRunCreateProcessNotifyRoutines(PEPROCESS, BOOLEAN);
 
+#include <pshpack1.h>
+typedef struct _PS_JOB_TOKEN_FILTER
+{
+  UINT CapturedSidCount;
+  PSID_AND_ATTRIBUTES CapturedSids;
+  UINT CapturedSidsLength;
+  UINT CapturedGroupCount;
+  PSID_AND_ATTRIBUTES CapturedGroups;
+  UINT CapturedGroupsLength;
+  UINT CapturedPrivilegeCount;
+  PLUID_AND_ATTRIBUTES CapturedPrivileges;
+  UINT CapturedPrivilegesLength;
+} PS_JOB_TOKEN_FILTER, *PPS_JOB_TOKEN_FILTER;
+#include <poppack.h>
+
+#include <pshpack1.h>
+typedef struct _EJOB
+{
+  KEVENT Event;
+  LIST_ENTRY JobLinks;
+  LIST_ENTRY ProcessListHead;
+  ERESOURCE JobLock;
+  LARGE_INTEGER TotalUserTime;
+  LARGE_INTEGER TotalKernelTime;
+  LARGE_INTEGER ThisPeriodTotalUserTime;
+  LARGE_INTEGER ThisPeriodTotalKernelTime;
+  UINT TotalPageFaultCount;
+  UINT TotalProcesses;
+  UINT ActiveProcesses;
+  UINT TotalTerminatedProcesses;
+  LARGE_INTEGER PerProcessUserTimeLimit;
+  LARGE_INTEGER PerJobUserTimeLimit;
+  UINT LimitFlags;
+  UINT MinimumWorkingSetSize;
+  UINT MaximumWorkingSetSize;
+  UINT ActiveProcessLimit;
+  UINT Affinity;
+  BYTE PriorityClass;
+  UINT UIRestrictionsClass;
+  UINT SecurityLimitFlags;
+  PVOID Token;
+  PPS_JOB_TOKEN_FILTER Filter;
+  UINT EndOfJobTimeAction;
+  PVOID CompletionPort;
+  PVOID CompletionKey;
+  UINT SessionId;
+  UINT SchedulingClass;
+  ULONGLONG ReadOperationCount;
+  ULONGLONG WriteOperationCount;
+  ULONGLONG OtherOperationCount;
+  ULONGLONG ReadTransferCount;
+  ULONGLONG WriteTransferCount;
+  ULONGLONG OtherTransferCount;
+  IO_COUNTERS IoInfo;
+  UINT ProcessMemoryLimit;
+  UINT JobMemoryLimit;
+  UINT PeakProcessMemoryUsed;
+  UINT PeakJobMemoryUsed;
+  UINT CurrentJobMemoryUsed;
+  FAST_MUTEX MemoryLimitsLock;
+} EJOB;
+#include <poppack.h>
+
+VOID INIT_FUNCTION PsInitJobManagment(VOID);
+
+/* CLIENT ID */
+
+NTSTATUS PsCreateCidHandle(PVOID Object, POBJECT_TYPE ObjectType, PHANDLE Handle);
+NTSTATUS PsDeleteCidHandle(HANDLE CidHandle, POBJECT_TYPE ObjectType);
+PHANDLE_TABLE_ENTRY PsLookupCidHandle(HANDLE CidHandle, POBJECT_TYPE ObjectType, PVOID *Object);
+VOID PsUnlockCidHandle(PHANDLE_TABLE_ENTRY CidEntry);
+NTSTATUS PsLockProcess(PEPROCESS Process, BOOLEAN Timeout);
+VOID PsUnlockProcess(PEPROCESS Process);
+
+#define ETHREAD_TO_KTHREAD(pEThread) (&(pEThread)->Tcb)
+#define KTHREAD_TO_ETHREAD(pKThread) (CONTAINING_RECORD((pKThread), ETHREAD, Tcb))
+#define EPROCESS_TO_KPROCESS(pEProcess) (&(pEProcess)->Pcb)
+#define KPROCESS_TO_EPROCESS(pKProcess) (CONTAINING_RECORD((pKProcess), EPROCESS, Pcb))
+
 #endif /* ASSEMBLER */
 
 #endif /* __INCLUDE_INTERNAL_PS_H */