fixed a few race conditions during thread/process termination leading to dead-locks
[reactos.git] / reactos / ntoskrnl / include / internal / ps.h
index 62e0c88..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.71 2004/10/13 01:42:14 ion Exp $
+/* $Id$
  *
  * FILE:            ntoskrnl/ke/kthread.c
  * PURPOSE:         Process manager definitions
@@ -48,29 +48,9 @@ struct _EJOB;
 #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;
-   UCHAR UserApcPending;
-   UCHAR Reserved;
-} KAPC_STATE, *PKAPC_STATE, *__restrict PRKAPC_STATE;
-
-#include <poppack.h>
-
-#endif /* __USE_W32API */
-
 #include <pshpack1.h>
 
 typedef struct _KTHREAD
@@ -81,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 */
@@ -93,7 +73,7 @@ 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 */
    CHAR              Saturation;          /* 32 */
@@ -111,7 +91,7 @@ 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 */
    ULONG             KernelApcDisable;    /* D0 */
@@ -167,27 +147,33 @@ typedef struct _KTHREAD
 #ifndef __USE_W32API
 typedef struct
 {
-  PACCESS_TOKEN Token;
-  BOOLEAN CopyOnOpen;
-  BOOLEAN EffectiveOnly;
-  SECURITY_IMPERSONATION_LEVEL Level;
+    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;
-  TIME CreateTime;
-  USHORT NestedFaultCount;
-  UCHAR ApcNeeded;
-  TIME ExitTime;
+  union {
+       LARGE_INTEGER CreateTime;
+       UCHAR NestedFaultCount:2;
+       UCHAR ApcNeeded:1;
+  };
+  LARGE_INTEGER ExitTime;
   LIST_ENTRY LpcReplyChain;
   NTSTATUS ExitStatus;
   PVOID OfsChain;
   LIST_ENTRY PostBlockList;
-  LIST_ENTRY TerminationPortList;
+  union {
+    struct _TERMINATION_PORT *TerminationPort;
+    struct _ETHREAD* ReaperLink;  
+  };
   KSPIN_LOCK ActiveTimerListLock;
   LIST_ENTRY ActiveTimerListHead;
   CLIENT_ID Cid;
@@ -219,6 +205,7 @@ typedef struct _ETHREAD
   UCHAR ActiveImpersonationInfo;
   ULONG PerformanceCountHigh;
   LIST_ENTRY ThreadListEntry;
+  BOOLEAN SystemThread;
 } ETHREAD;
 
 #include <poppack.h>
@@ -299,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
@@ -313,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. */
@@ -341,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;
@@ -376,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;
@@ -391,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;
@@ -406,30 +402,32 @@ 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;
-  
-  struct _EJOB*         Job;
-  UINT                  JobStatus;
-
-  FAST_MUTEX            TebLock;
   PVOID                 TebBlock;
   PVOID                 TebLastAllocated;
 };
@@ -443,7 +441,6 @@ 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);
@@ -460,22 +457,32 @@ VOID PsQueueThreadReap(PETHREAD Thread);
 NTSTATUS 
 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)
@@ -499,27 +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(PKTHREAD Thread);
+STDCALL 
+PspReapRoutine(PVOID Context);
 
 VOID
 STDCALL
-KeStackAttachProcess (
-    IN PKPROCESS Process,
-    OUT PKAPC_STATE ApcState
-    );
+PspExitThread(NTSTATUS ExitStatus);
+
+extern LIST_ENTRY PspReaperListHead;
+extern WORK_QUEUE_ITEM PspReaperWorkItem;
+extern BOOLEAN PspReaping;
 
 VOID
 STDCALL
-KeUnstackDetachProcess (
-    IN PKAPC_STATE ApcState
-    );
+PspTerminateThreadByPointer(PETHREAD Thread,
+                            NTSTATUS ExitStatus);
 
-VOID STDCALL PiDeleteProcess(PVOID ObjectBody);
-VOID PsReapThreads(VOID);
-VOID PsInitializeThreadReaper(VOID);
-VOID PsQueueThreadReap(PETHREAD Thread);
 VOID PsUnfreezeOtherThread(PETHREAD Thread);
 VOID PsFreezeOtherThread(PETHREAD Thread);
 VOID PsFreezeProcessThreads(PEPROCESS Process);
@@ -527,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);
@@ -550,10 +550,19 @@ VOID STDCALL
 PiSuspendThreadNormalRoutine(PVOID NormalContext,
                             PVOID SystemArgument1,
                             PVOID SystemArgument2);
-VOID STDCALL
-PsDispatchThread(ULONG NewThreadStatus);
 VOID
 PsInitialiseSuspendImplementation(VOID);
+NTSTATUS 
+STDCALL
+PspExitProcess(PEPROCESS Process);
+
+VOID 
+STDCALL 
+PspDeleteProcess(PVOID ObjectBody);
+
+VOID 
+STDCALL
+PspDeleteThread(PVOID ObjectBody);
 
 extern LONG PiNrThreadsAwaitingReaping;
 
@@ -642,26 +651,14 @@ typedef struct _EJOB
 
 VOID INIT_FUNCTION PsInitJobManagment(VOID);
 
-/* CID */
-
-typedef struct _CID_OBJECT
-{
-  LONG ref;
-  HANDLE Handle;
-  LIST_ENTRY Entry;
-  LONG Lock;
-  union
-  {
-    struct _EPROCESS *Process;
-    struct _ETHREAD *Thread;
-    PVOID Object;
-  } Obj;
-} CID_OBJECT, *PCID_OBJECT;
+/* CLIENT ID */
 
 NTSTATUS PsCreateCidHandle(PVOID Object, POBJECT_TYPE ObjectType, PHANDLE Handle);
 NTSTATUS PsDeleteCidHandle(HANDLE CidHandle, POBJECT_TYPE ObjectType);
-PCID_OBJECT PsLockCidHandle(HANDLE CidHandle, POBJECT_TYPE ObjectType);
-VOID PsUnlockCidObject(PCID_OBJECT CidObject);
+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))