Reverted latest changes.
[reactos.git] / reactos / ntoskrnl / include / internal / ps.h
index 6c5d7a8..27eb97f 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.42 2002/09/07 15:12:51 chorns Exp $
+/* $Id: ps.h,v 1.43 2002/09/08 10:23:23 chorns Exp $
  *
  * FILE:            ntoskrnl/ke/kthread.c
  * PURPOSE:         Process manager definitions
 #ifndef __INCLUDE_INTERNAL_PS_H
 #define __INCLUDE_INTERNAL_PS_H
 
-#if __GNUC__ >=3
-#pragma GCC system_header
-#endif
-
-#ifndef AS_INVOKED
-
-#include <internal/mm.h>
+#ifndef __ASM__
 
 /* Forward declarations. */
-
 struct _KTHREAD;
 struct _KTRAPFRAME;
 
-#endif /* !AS_INVOKED */
+#endif /* __ASM__ */
 
 #include <internal/arch/ps.h>
 
-#ifndef AS_INVOKED
+#ifndef __ASM__
 
 #include <internal/mm.h>
+#include <napi/teb.h>
+
+#define KeGetCurrentProcessorNumber() (KeGetCurrentKPCR()->ProcessorNumber)
 
 extern HANDLE SystemProcessHandle;
+
 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;
+
+typedef struct _KTHREAD
+{
+   /* For waiting on thread exit */
+   DISPATCHER_HEADER DispatcherHeader;    /* 00 */
+   
+   /* List of mutants owned by the thread */
+   LIST_ENTRY        MutantListHead;      /* 10 */
+   PVOID             InitialStack;        /* 18 */
+   ULONG             StackLimit;          /* 1C */
+   
+   /* Pointer to the thread's environment block in user memory */
+   PTEB              Teb;                 /* 20 */
+   
+   /* Pointer to the thread's TLS array */
+   PVOID             TlsArray;            /* 24 */
+   PVOID             KernelStack;         /* 28 */
+   UCHAR             DebugActive;         /* 2C */
+   
+   /* Thread state (one of THREAD_STATE_xxx constants below) */
+   UCHAR             State;               /* 2D */
+   UCHAR             Alerted[2];          /* 2E */
+   UCHAR             Iopl;                /* 30 */
+   UCHAR             NpxState;            /* 31 */
+   UCHAR             Saturation;          /* 32 */
+   CHAR              Priority;            /* 33 */
+   KAPC_STATE        ApcState;            /* 34 */
+   ULONG             ContextSwitches;     /* 4C */
+   ULONG             WaitStatus;          /* 50 */
+   KIRQL             WaitIrql;            /* 54 */
+   UCHAR             WaitMode;            /* 55 */
+   UCHAR             WaitNext;            /* 56 */
+   UCHAR             WaitReason;          /* 57 */
+   PKWAIT_BLOCK      WaitBlockList;       /* 58 */
+   LIST_ENTRY        WaitListEntry;       /* 5C */
+   ULONG             WaitTime;            /* 64 */
+   CHAR              BasePriority;        /* 68 */
+   UCHAR             DecrementCount;      /* 69 */
+   UCHAR             PriorityDecrement;   /* 6A */
+   UCHAR             Quantum;             /* 6B */
+   KWAIT_BLOCK       WaitBlock[4];        /* 6C */
+   PVOID             LegoData;            /* CC */
+   LONG              KernelApcDisable;    /* D0 */
+   KAFFINITY         UserAffinity;        /* D4 */
+   UCHAR             SystemAffinityActive;/* D8 */
+   UCHAR             Pad[7];              /* D9 */
+   PKQUEUE           Queue;               /* E0 */
+   KSPIN_LOCK        ApcQueueLock;        /* E4 */
+   KTIMER            Timer;               /* E8 */
+   LIST_ENTRY        QueueListEntry;      /* 110 */
+   KAFFINITY         Affinity;            /* 118 */
+   UCHAR             Preempted;           /* 11C */
+   UCHAR             ProcessReadyQueue;   /* 11D */
+   UCHAR             KernelStackResident; /* 11E */
+   UCHAR             NextProcessor;       /* 11F */
+   PVOID             CallbackStack;       /* 120 */
+   BOOL              Win32Thread;         /* 124 */
+   struct _KTRAP_FRAME*      TrapFrame;   /* 128 */
+   PVOID             ApcStatePointer[2];  /* 12C */
+   UCHAR             EnableStackSwap;     /* 134 */
+   UCHAR             LargeStack;          /* 135 */
+   UCHAR             ResourceIndex;       /* 136 */
+   UCHAR             PreviousMode;        /* 137 */
+   ULONG             KernelTime;          /* 138 */
+   ULONG             UserTime;            /* 13C */
+   KAPC_STATE        SavedApcState;       /* 140 */
+   UCHAR             Alertable;           /* 158 */
+   UCHAR             ApcStateIndex;       /* 159 */
+   UCHAR             ApcQueueable;        /* 15A */
+   UCHAR             AutoAlignment;       /* 15B */
+   PVOID             StackBase;           /* 15C */
+   KAPC              SuspendApc;          /* 160 */
+   KSEMAPHORE        SuspendSemaphore;    /* 190 */
+   LIST_ENTRY        ThreadListEntry;     /* 1A4 */
+   CHAR              FreezeCount;         /* 1AC */
+   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 */
+} __attribute__((packed)) KTHREAD, *PKTHREAD;
+
+/* 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)
+
+typedef struct _TOP_LEVEL_IRP
+{
+       PIRP TopLevelIrp;
+       ULONG TopLevelIrpConst;
+} TOP_LEVEL_IRP;
+
+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;
+
+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 */
+  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;
+
+
+typedef struct _KPROCESS 
+{
+  /* So it's possible to wait for the process to terminate */
+  DISPATCHER_HEADER    DispatcherHeader;             /* 000 */
+  /* 
+   * Presumably a list of profile objects associated with this process,
+   * currently unused.
+   */
+  LIST_ENTRY            ProfileListHead;              /* 010 */
+  /*
+   * We use the first member of this array to hold the physical address of
+   * the page directory for this process.
+   */
+  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.
+   */
+  ULONG                 Int21Descriptor[2];           /* 028 */
+  /* Don't know. */
+  USHORT                IopmOffset;                   /* 030 */
+  /* 
+   * Presumably I/O privilege level to be used for this process, currently
+   * unused.
+   */
+  UCHAR                 Iopl;                         /* 032 */
+  /* Set if this process is a virtual dos machine? */
+  UCHAR                 VdmFlag;                      /* 033 */
+  /* Bitmask of the processors being used by this process's threads? */
+  ULONG                 ActiveProcessors;             /* 034 */
+  /* Aggregate of the time this process's threads have spent in kernel mode? */
+  ULONG                 KernelTime;                   /* 038 */
+  /* Aggregate of the time this process's threads have spent in user mode? */
+  ULONG                 UserTime;                     /* 03C */
+  /* List of this process's threads that are ready for execution? */
+  LIST_ENTRY            ReadyListHead;                /* 040 */
+  /* List of this process's threads that have their stacks swapped out? */
+  LIST_ENTRY            SwapListEntry;                /* 048 */
+  /* List of this process's threads? */
+  LIST_ENTRY            ThreadListHead;               /* 050 */
+  /* Maybe a lock for this data structure, the type is assumed. */
+  KSPIN_LOCK            ProcessLock;                  /* 058 */
+  /* Default affinity mask for this process's threads? */
+  ULONG                 Affinity;                     /* 05C */
+  /* Count of the stacks allocated for this process's threads? */
+  USHORT                StackCount;                   /* 060 */
+  /* Base priority for this process's threads? */
+  KPRIORITY             BasePriority;                 /* 062 */
+  /* Default quantum for this process's threads */
+  UCHAR                        ThreadQuantum;                /* 063 */
+  /* Unknown. */
+  UCHAR                 AutoAlignment;                /* 064 */
+  /* Process execution state, currently either active or terminated. */
+  UCHAR                        State;                        /* 065 */
+  /* Seed for generating thread ids for this process's threads? */
+  UCHAR                        ThreadSeed;                   /* 066 */
+  /* Disable priority boosts? */
+  UCHAR                        DisableBoost;                 /* 067 */
+} KPROCESS, *PKPROCESS;
+
+struct _EPROCESS
+{
+  /* Microkernel specific process state. */
+  KPROCESS              Pcb;                          /* 000 */
+  /* Exit status of the process. */
+  NTSTATUS              ExitStatus;                   /* 068 */
+  /* Unknown. */
+  KEVENT                LockEvent;                    /* 06C */
+  /* Unknown. */
+  ULONG                 LockCount;                    /* 07C */
+  /* Time of process creation. */
+  TIME                  CreateTime;                   /* 080 */
+  /* Time of process exit. */
+  TIME                  ExitTime;                     /* 088 */
+  /* Unknown. */
+  PVOID                 LockOwner;                    /* 090 */
+  /* Process id. */
+  ULONG                 UniqueProcessId;              /* 094 */
+  /* Unknown. */
+  LIST_ENTRY            ActiveProcessLinks;           /* 098 */
+  /* Unknown. */
+  ULONG                 QuotaPeakPoolUsage[2];        /* 0A0 */
+  /* Unknown. */
+  ULONG                 QuotaPoolUsage[2];            /* 0A8 */
+  /* Unknown. */
+  ULONG                 PagefileUsage;                /* 0B0 */
+  /* Unknown. */
+  ULONG                 CommitCharge;                 /* 0B4 */
+  /* Unknown. */
+  ULONG                 PeakPagefileUsage;            /* 0B8 */
+  /* Unknown. */
+  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;
+  PVOID                 Token;
+  /*  FAST_MUTEX            WorkingSetLock; */
+  KMUTEX                WorkingSetLock;
+  PVOID                 WorkingSetPage;
+  UCHAR                 ProcessOutswapEnabled;
+  UCHAR                 ProcessOutswapped;
+  UCHAR                 AddressSpaceInitialized;
+  UCHAR                 AddressSpaceDeleted;
+  FAST_MUTEX            AddressCreationLock;
+  KSPIN_LOCK            HyperSpaceLock;
+  PETHREAD              ForkInProgress;
+  USHORT                VmOperation;
+  UCHAR                 ForkWasSuccessful;
+  UCHAR                 MmAgressiveWsTrimMask;
+  PKEVENT               VmOperationEvent;
+  PVOID                 PageDirectoryPte;
+  ULONG                 LastFaultCount;
+  PVOID                 VadRoot;
+  PVOID                 VadHint;
+  PVOID                 CloneRoot;
+  ULONG                 NumberOfPrivatePages;
+  ULONG                 NumberOfLockedPages;
+  USHORT                NextProcessColour;
+  UCHAR                 ExitProcessCalled;
+  UCHAR                 CreateProcessReported;
+  HANDLE                SectionHandle;
+  PPEB                  Peb;
+  PVOID                 SectionBaseAddress;
+  PVOID                 QuotaBlock;
+  NTSTATUS              LastThreadExitStatus;
+  PVOID                 WorkingSetWatch;
+  HANDLE                InheritedFromUniqueProcessId;
+  ACCESS_MASK           GrantedAccess;
+  ULONG                 DefaultHardErrorProcessing;
+  PVOID                 LdtInformation;
+  ULONG                 VadFreeHint;
+  PVOID                 VdmObjects;
+  KMUTANT               ProcessMutant;
+  CHAR                  ImageFileName[16];
+  ULONG                 VmTrimFaultValue;
+  UCHAR                 SetTimerResolution;
+  UCHAR                 PriorityClass;
+  UCHAR                 SubSystemMinorVersion;
+  UCHAR                 SubSystemMajorVersion;
+  USHORT                SubSystemVersion;
+  struct _W32PROCESS*   Win32Process;
+  HANDLE                Win32WindowStation;
+   
+   /*
+    * Added by David Welch (welch@mcmail.com)
+    */
+  HANDLE                Win32Desktop;
+  MADDRESS_SPACE        AddressSpace;
+  HANDLE_TABLE          HandleTable;
+  LIST_ENTRY            ProcessListEntry;
+   
+   /*
+    * Added by Philip Susi for list of threads in process
+    */
+  LIST_ENTRY           ThreadListHead;
+};
+
+#define PROCESS_STATE_TERMINATED (1)
+#define PROCESS_STATE_ACTIVE     (2)
+
 VOID PiInitDefaultLocale(VOID);
 VOID PiInitProcessManager(VOID);
 VOID PiShutdownProcessManager(VOID);
@@ -78,13 +428,13 @@ PsInitializeThread(HANDLE ProcessHandle,
                   POBJECT_ATTRIBUTES ObjectAttributes,
                   BOOLEAN First);
 
-PIACCESS_TOKEN PsReferenceEffectiveToken(PETHREAD Thread,
+PACCESS_TOKEN PsReferenceEffectiveToken(PETHREAD Thread,
                                        PTOKEN_TYPE TokenType,
                                        PUCHAR b,
                                        PSECURITY_IMPERSONATION_LEVEL Level);
 
 NTSTATUS PsOpenTokenOfProcess(HANDLE ProcessHandle,
-                             PIACCESS_TOKEN* Token);
+                             PACCESS_TOKEN* Token);
 
 NTSTATUS PsSuspendThread(PETHREAD Thread, PULONG PreviousCount);
 NTSTATUS PsResumeThread(PETHREAD Thread, PULONG PreviousCount);
@@ -131,7 +481,7 @@ VOID
 PsApplicationProcessorInit(VOID);
 VOID
 PsPrepareForApplicationProcessorInit(ULONG Id);
-VOID STDCALL
+NTSTATUS STDCALL
 PsIdleThreadMain(PVOID Context);
 
 VOID STDCALL
@@ -153,6 +503,6 @@ PsInitialiseSuspendImplementation(VOID);
 
 extern ULONG PiNrThreadsAwaitingReaping;
 
-#endif /* !AS_INVOKED */
+#endif /* ASSEMBLER */
 
 #endif /* __INCLUDE_INTERNAL_PS_H */