* 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
#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
/* 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 */
/* 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 */
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 */
#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;
UCHAR ActiveImpersonationInfo;
ULONG PerformanceCountHigh;
LIST_ENTRY ThreadListEntry;
+ BOOLEAN SystemThread;
} ETHREAD;
#include <poppack.h>
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
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. */
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;
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;
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;
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;
};
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);
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)
#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);
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);
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;
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))