diff --git a/service/ptos/head/ps/process.h b/service/ptos/head/ps/process.h index ef179ea..d86dcd9 100644 --- a/service/ptos/head/ps/process.h +++ b/service/ptos/head/ps/process.h @@ -9,6 +9,7 @@ #ifndef _PS_PROCESS_H_ #define _PS_PROCESS_H_ 1 +#include #include #include @@ -27,11 +28,13 @@ * @Name: Name of process * @Pid: Process ID * @Flags: Initialization flags + * @Vas: Virtual address space of process */ typedef struct _PROCESS { CHAR Name[PS_NAME_MAX]; UQUAD Pid; ULONG Flags; + MMU_VAS Vas; } PROCESS; /* diff --git a/service/ptos/ps/process.c b/service/ptos/ps/process.c index 38884e5..9c0f47c 100644 --- a/service/ptos/ps/process.c +++ b/service/ptos/ps/process.c @@ -18,6 +18,8 @@ PsCreateProcess(const CHAR *Name, ULONG Flags, PROCESS **Result) { USIZE NameLen; PROCESS *Process; + MMU_VAS CurrentVas; + PT_STATUS Status; if (Name == NULL || Result == NULL) { return STATUS_INVALID_PARAM; @@ -43,6 +45,14 @@ PsCreateProcess(const CHAR *Name, ULONG Flags, PROCESS **Result) return STATUS_NO_MEMORY; } + /* Fork a new VAS */ + HalMmuReadVas(&CurrentVas); + Status = HalMmuForkVas(&CurrentVas, &Process->Vas); + if (PT_ERROR(Status)) { + ExFreePoolWithTag(Process, PS_POOL_TAG); + return Status; + } + RtlMemCpy(Process->Name, Name, NameLen); Process->Pid = AtomicIncQuad(&ProcessId); Process->Flags = Flags;