fixed a few race conditions during thread/process termination leading to dead-locks
[reactos.git] / reactos / ntoskrnl / include / internal / ps.h
index d3cb47f..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.33 2002/05/14 21:19:17 dwelch Exp $
+/* $Id$
  *
  * FILE:            ntoskrnl/ke/kthread.c
  * PURPOSE:         Process manager definitions
 #ifndef __INCLUDE_INTERNAL_PS_H
 #define __INCLUDE_INTERNAL_PS_H
 
-/*
- * Defines for accessing KPCR and KTHREAD structure members
- */
-#define KTHREAD_INITIAL_STACK     0x18
-#define KTHREAD_TEB               0x20
-#define KTHREAD_KERNEL_STACK      0x28
-#define KTHREAD_PREVIOUS_MODE     0x137
-#define KTHREAD_TRAP_FRAME        0x128
-#define KTHREAD_CALLBACK_STACK    0x120
-
-#define ETHREAD_THREADS_PROCESS   0x258
+#ifndef __ASM__
 
-#define KPROCESS_DIRECTORY_TABLE_BASE 0x18
+/* Forward declarations. */
+struct _KTHREAD;
+struct _KTRAPFRAME;
+struct _EJOB;
 
-#define KPCR_BASE                 0xFF000000
+#endif /* __ASM__ */
 
-#define KPCR_EXCEPTION_LIST       0x0
-#define KPCR_SELF                 0x18
-#define KPCR_TSS                  0x28
-#define KPCR_CURRENT_THREAD       0x124        
+#include <internal/arch/ps.h>
 
 #ifndef __ASM__
 
 #include <internal/mm.h>
 #include <napi/teb.h>
 
-struct _KTHREAD;
-struct _KTRAPFRAME;
-
-/* FIXME: This does not work if we have more than 24 IRQs (ie. more than one I/O APIC) */
-#define VECTOR2IRQ(vector) (((vector) - 0x31) / 8)
-#define VECTOR2IRQL(vector) (4 + VECTOR2IRQ(vector))
-
-/*
- * Processor Control Region
- */
-typedef struct _KPCR
-{
-  PVOID ExceptionList;               /* 00 */
-  PVOID StackBase;                   /* 04 */
-  PVOID StackLimit;                  /* 08 */
-  PVOID SubSystemTib;                /* 0C */
-  PVOID Reserved1;                   /* 10 */
-  PVOID ArbitraryUserPointer;        /* 14 */
-  struct _KPCR* Self;                /* 18 */
-  UCHAR ProcessorNumber;             /* 1C */
-  KIRQL Irql;                        /* 1D */
-  UCHAR Reserved2[0x2];              /* 1E */
-  PUSHORT IDT;                       /* 20 */
-  PUSHORT GDT;                       /* 24 */
-  KTSS* TSS;                         /* 28 */
-  UCHAR Reserved3[0xF8];             /* 2C */
-  struct _KTHREAD* CurrentThread;    /* 124 */
-} __attribute__((packed)) KPCR, *PKPCR;
-
-static inline PKPCR KeGetCurrentKPCR(VOID)
-{
-  ULONG value;
-
-  __asm__ __volatile__ ("movl %%fs:0x18, %0\n\t"
-         : "=r" (value)
-    : /* no inputs */
-    );
-  return((PKPCR)value);
-}
-
+#ifndef KeGetCurrentProcessorNumber
 #define KeGetCurrentProcessorNumber() (KeGetCurrentKPCR()->ProcessorNumber)
-
-extern HANDLE SystemProcessHandle;
+#endif
 
 extern LCID PsDefaultThreadLocaleId;
 extern LCID PsDefaultSystemLocaleId;
 
-
-typedef struct _KAPC_STATE
-{
-   LIST_ENTRY ApcListHead[2];
-   struct _KPROCESS* Process;
-   UCHAR KernelApcInProgress;
-   UCHAR KernelApcPending;
-   USHORT UserApcPending;
-} __attribute__((packed)) KAPC_STATE, *PKAPC_STATE;
+#include <pshpack1.h>
 
 typedef struct _KTHREAD
 {
@@ -119,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 */
@@ -131,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 */
@@ -149,13 +91,16 @@ 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             Pad[7];              /* D9 */
+   UCHAR             PowerState;          /* D9 */
+   UCHAR             NpxIrql;             /* DA */
+   UCHAR             Pad[1];              /* DB */
+   SSDT_ENTRY        *ServiceTable;       /* DC */
    PKQUEUE           Queue;               /* E0 */
    KSPIN_LOCK        ApcQueueLock;        /* E4 */
    KTIMER            Timer;               /* E8 */
@@ -166,9 +111,9 @@ typedef struct _KTHREAD
    UCHAR             KernelStackResident; /* 11E */
    UCHAR             NextProcessor;       /* 11F */
    PVOID             CallbackStack;       /* 120 */
-   BOOL              Win32Thread;         /* 124 */
-   struct _KTRAP_FRAME*      TrapFrame;   /* 128 */
-   PVOID             ApcStatePointer[2];  /* 12C */
+   struct _W32THREAD *Win32Thread;        /* 124 */
+   struct _KTRAP_FRAME *TrapFrame;        /* 128 */
+   PKAPC_STATE       ApcStatePointer[2];  /* 12C */
    UCHAR             EnableStackSwap;     /* 134 */
    UCHAR             LargeStack;          /* 135 */
    UCHAR             ResourceIndex;       /* 136 */
@@ -188,106 +133,89 @@ 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 */
-
-   /* Added by Phillip Susi for internal KeAddThreadTimeout() implementation */
-   KDPC              TimerDpc;                      /* 1B8 */
-
-   /* Record the last EIP value when the thread is suspended */
-   ULONG             LastEip;                        /* 1D8 */
-} __attribute__((packed)) KTHREAD, *PKTHREAD;
+} KTHREAD;
 
-// According to documentation the stack should have a commited [ 1 page ] and
-// a reserved part [ 1 M ] but can be specified otherwise in the image file.
+#include <poppack.h>
 
+/* Top level irp definitions. */
+#define        FSRTL_FSP_TOP_LEVEL_IRP                 (0x01)
+#define        FSRTL_CACHE_TOP_LEVEL_IRP               (0x02)
+#define        FSRTL_MOD_WRITE_TOP_LEVEL_IRP           (0x03)
+#define        FSRTL_FAST_IO_TOP_LEVEL_IRP             (0x04)
+#define        FSRTL_MAX_TOP_LEVEL_IRP_FLAG            (0x04)
 
-
-
-
-
-
-// TopLevelIrp can be one of the following values:
-// FIXME I belong somewhere else
-
-#define        FSRTL_FSP_TOP_LEVEL_IRP                 (0x01)
-#define        FSRTL_CACHE_TOP_LEVEL_IRP               (0x02)
-#define        FSRTL_MOD_WRITE_TOP_LEVEL_IRP           (0x03)
-#define                FSRTL_FAST_IO_TOP_LEVEL_IRP             (0x04)
-#define                FSRTL_MAX_TOP_LEVEL_IRP_FLAG            (0x04)
-
-typedef struct _TOP_LEVEL_IRP
-{
-       PIRP TopLevelIrp;
-       ULONG TopLevelIrpConst;
-} TOP_LEVEL_IRP;
-
+#ifndef __USE_W32API
 typedef struct
 {
-   PACCESS_TOKEN Token;                              // 0x0
-   UCHAR Unknown1;                                   // 0x4
-   UCHAR Unknown2;                                   // 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/1DC */
-  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 */
-  TOP_LEVEL_IRP* 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 */
-  UCHAR ActiveImpersonationInfo;                    /* 23B/267 */
-  ULONG PerformanceCountHigh;                       /* 23C/268 */
-
-  /*
-   * Added by David Welch (welch@cwcom.net)
-   */
-  struct _EPROCESS* OldProcess;                     /* 240/26C */
-
-  struct _W32THREAD* Win32Thread;
-  
-} __attribute__((packed)) ETHREAD, *PETHREAD;
+  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>
+
+
+#ifndef __USE_W32API
+
+typedef struct _ETHREAD *PETHREAD;
+
+#endif /* __USE_W32API */
 
 
 typedef struct _KPROCESS 
@@ -303,17 +231,17 @@ typedef struct _KPROCESS
    * We use the first member of this array to hold the physical address of
    * the page directory for this process.
    */
-  PVOID                 DirectoryTableBase[2];        /* 018 */
+  PHYSICAL_ADDRESS      DirectoryTableBase;           /* 018 */
   /*
    * Presumably a descriptor for the process's LDT, currently unused.
    */
   ULONG                 LdtDescriptor[2];             /* 020 */
   /*
-   * Presumably for processing int 0x21 from V86 mode DOS, currently
-   * unused.
+   * Virtual Dos Machine flag.
    */
-  ULONG                 Int21Descriptor[2];           /* 028 */
-  /* Don't know. */
+  ULONG                 NtVdmFlag;                    /* 028 */
+  ULONG                 VdmUnused;                    /* 02C */
+  /* Is the i/o permission map enabled for the process. */
   USHORT                IopmOffset;                   /* 030 */
   /* 
    * Presumably I/O privilege level to be used for this process, currently
@@ -352,7 +280,34 @@ typedef struct _KPROCESS
   UCHAR                        ThreadSeed;                   /* 066 */
   /* Disable priority boosts? */
   UCHAR                        DisableBoost;                 /* 067 */
-} KPROCESS, *PKPROCESS;
+} KPROCESS;
+
+#ifndef __USE_W32API
+
+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
 {
@@ -364,14 +319,16 @@ struct _EPROCESS
   KEVENT                LockEvent;                    /* 06C */
   /* Unknown. */
   ULONG                 LockCount;                    /* 07C */
+
   /* Time of process creation. */
-  TIME                  CreateTime;                   /* 080 */
+  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. */
@@ -388,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;
@@ -423,29 +365,36 @@ 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;
   PPEB                  Peb;
   PVOID                 SectionBaseAddress;
-  PVOID                 QuotaBlock;
+  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;
@@ -453,20 +402,34 @@ struct _EPROCESS
   UCHAR                 SubSystemMinorVersion;
   UCHAR                 SubSystemMajorVersion;
   USHORT                SubSystemVersion;
-  struct _W32PROCESS*   Win32Process;
-  HANDLE                Win32WindowStation;
-   
-   /*
-    * Added by David Welch (welch@mcmail.com)
-    */
-   MADDRESS_SPACE       AddressSpace;
-   HANDLE_TABLE         HandleTable;
-   LIST_ENTRY           ProcessListEntry;
-   
-   /*
-    * Added by Philip Susi for list of threads in process
-    */
-   LIST_ENTRY           ThreadListHead;
+  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;
+  LIST_ENTRY            ProcessListEntry;
+  PVOID                 TebBlock;
+  PVOID                 TebLastAllocated;
 };
 
 #define PROCESS_STATE_TERMINATED (1)
@@ -478,43 +441,51 @@ 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);
 VOID PsBeginThreadWithContextInternal(VOID);
 VOID PiKillMostProcesses(VOID);
 NTSTATUS STDCALL PiTerminateProcess(PEPROCESS Process, NTSTATUS ExitStatus);
-ULONG PsUnfreezeThread(PETHREAD Thread, PNTSTATUS WaitStatus);
-ULONG PsFreezeThread(PETHREAD Thread, PNTSTATUS WaitStatus,
-                    UCHAR Alertable, ULONG WaitMode);
 VOID PiInitApcManagement(VOID);
 VOID STDCALL PiDeleteThread(PVOID ObjectBody);
-VOID STDCALL PiCloseThread(PVOID ObjectBody, ULONG HandleCount);
 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);
-
-
-#define THREAD_STATE_INVALID      (0)
-#define THREAD_STATE_RUNNABLE     (1)
+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)
 #define THREAD_STATE_RUNNING      (2)
 #define THREAD_STATE_SUSPENDED    (3)
 #define THREAD_STATE_FROZEN       (4)
@@ -526,41 +497,45 @@ NTSTATUS PsResumeThread(PETHREAD Thread, PULONG PreviousCount);
 
 /*
  * Internal thread priorities, added by Phillip Susi
- * TODO: rebalence these to make use of all priorities... the ones above 16 can not all be used right now
+ * TODO: rebalence these to make use of all priorities... the ones above 16 
+ * can not all be used right now
  */
-
 #define PROCESS_PRIO_IDLE                      3
 #define PROCESS_PRIO_NORMAL                    8
 #define PROCESS_PRIO_HIGH                      13
 #define PROCESS_PRIO_RT                                18
 
 
-VOID 
-KeInitializeThread(PKPROCESS Process, PKTHREAD Thread, BOOLEAN First);
-NTSTATUS KeReleaseThread(PETHREAD Thread);
-NTSTATUS 
-Ke386InitThread(PKTHREAD Thread, PKSTART_ROUTINE fn, PVOID StartContext);
-NTSTATUS 
-Ke386InitThreadWithContext(PKTHREAD Thread, PCONTEXT Context);
 VOID STDCALL PiDeleteProcess(PVOID ObjectBody);
-VOID PsReapThreads(VOID);
+
+VOID 
+STDCALL 
+PspReapRoutine(PVOID Context);
+
+VOID
+STDCALL
+PspExitThread(NTSTATUS ExitStatus);
+
+extern LIST_ENTRY PspReaperListHead;
+extern WORK_QUEUE_ITEM PspReaperWorkItem;
+extern BOOLEAN PspReaping;
+
+VOID
+STDCALL
+PspTerminateThreadByPointer(PETHREAD Thread,
+                            NTSTATUS ExitStatus);
+
 VOID PsUnfreezeOtherThread(PETHREAD Thread);
 VOID PsFreezeOtherThread(PETHREAD Thread);
 VOID PsFreezeProcessThreads(PEPROCESS Process);
 VOID PsUnfreezeProcessThreads(PEPROCESS Process);
+ULONG PsEnumThreadsByProcess(PEPROCESS Process);
 PEPROCESS PsGetNextProcess(PEPROCESS OldProcess);
 VOID
-Ki386ContextSwitch(PKTHREAD NewThread, PKTHREAD OldThread);
-VOID
-PsBlockThread(PNTSTATUS Status, UCHAR Alertable, ULONG WaitMode, 
-             BOOLEAN DispatcherLock, KIRQL WaitIrql);
-VOID
-PsUnblockThread(PETHREAD Thread, PNTSTATUS WaitStatus);
-VOID
 PsApplicationProcessorInit(VOID);
 VOID
 PsPrepareForApplicationProcessorInit(ULONG Id);
-NTSTATUS STDCALL
+VOID STDCALL
 PsIdleThreadMain(PVOID Context);
 
 VOID STDCALL
@@ -575,15 +550,120 @@ VOID STDCALL
 PiSuspendThreadNormalRoutine(PVOID NormalContext,
                             PVOID SystemArgument1,
                             PVOID SystemArgument2);
+VOID
+PsInitialiseSuspendImplementation(VOID);
+NTSTATUS 
+STDCALL
+PspExitProcess(PEPROCESS Process);
 
-VOID STDCALL
-PiTimeoutThread(struct _KDPC *dpc,
-               PVOID Context,
-               PVOID arg1,
-               PVOID arg2);
+VOID 
+STDCALL 
+PspDeleteProcess(PVOID ObjectBody);
 
-VOID STDCALL
-PsDispatchThread(ULONG NewThreadStatus);
+VOID 
+STDCALL
+PspDeleteThread(PVOID ObjectBody);
+
+extern LONG PiNrThreadsAwaitingReaping;
+
+NTSTATUS
+PsInitWin32Thread (PETHREAD Thread);
+
+VOID
+PsTerminateWin32Process (PEPROCESS Process);
+
+VOID
+PsTerminateWin32Thread (PETHREAD Thread);
+
+VOID
+PsInitialiseW32Call(VOID);
+
+VOID
+STDCALL
+PspRunCreateThreadNotifyRoutines(PETHREAD, BOOLEAN);
+
+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 */