ptos: ps: Add process init logic
Signed-off-by: Chloe M <chloe@mensia.org>
This commit is contained in:
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: Process management
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _PS_PROCESS_H_
|
||||||
|
#define _PS_PROCESS_H_ 1
|
||||||
|
|
||||||
|
#include <ptapi/status.h>
|
||||||
|
#include <ptdef.h>
|
||||||
|
|
||||||
|
/* Maximum length of process name */
|
||||||
|
#define PS_NAME_MAX 64
|
||||||
|
|
||||||
|
/* Pool tag for process allocations */
|
||||||
|
#define PS_POOL_TAG 'PS'
|
||||||
|
|
||||||
|
/* Process flags */
|
||||||
|
#define PS_USER BIT(0) /* Set if user-level */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Represents a running process on the machine
|
||||||
|
*
|
||||||
|
* @Name: Name of process
|
||||||
|
* @Pid: Process ID
|
||||||
|
* @Flags: Initialization flags
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
CHAR Name[PS_NAME_MAX];
|
||||||
|
UQUAD Pid;
|
||||||
|
ULONG Flags;
|
||||||
|
} PROCESS;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate and create a new process descriptor
|
||||||
|
*
|
||||||
|
* @Name: Name of process
|
||||||
|
* @Flags: Initialization flags of process
|
||||||
|
* @Result: Result is written here
|
||||||
|
*/
|
||||||
|
PT_STATUS PsCreateProcess(const CHAR *Name, ULONG Flags, PROCESS **Result);
|
||||||
|
|
||||||
|
#endif /* !_PS_PROCESS_H_ */
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: Process management
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ps/process.h>
|
||||||
|
#include <ex/pool.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <atomic.h>
|
||||||
|
|
||||||
|
static UQUAD ProcessId = 0;
|
||||||
|
|
||||||
|
PT_STATUS
|
||||||
|
PsCreateProcess(const CHAR *Name, ULONG Flags, PROCESS **Result)
|
||||||
|
{
|
||||||
|
USIZE NameLen;
|
||||||
|
PROCESS *Process;
|
||||||
|
|
||||||
|
if (Name == NULL || Result == NULL) {
|
||||||
|
return STATUS_INVALID_PARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: Support user-level processes */
|
||||||
|
if (ISSET(Flags, PS_USER)) {
|
||||||
|
return STATUS_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
NameLen = RtlStrLen(Name);
|
||||||
|
if (NameLen >= PS_NAME_MAX - 1) {
|
||||||
|
return STATUS_NAME_TOO_LONG;
|
||||||
|
}
|
||||||
|
|
||||||
|
Process = ExAllocatePoolWithTag(
|
||||||
|
POOL_NON_PAGED,
|
||||||
|
sizeof(*Process),
|
||||||
|
PS_POOL_TAG
|
||||||
|
);
|
||||||
|
|
||||||
|
if (Process == NULL) {
|
||||||
|
return STATUS_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
RtlMemCpy(Process->Name, Name, NameLen);
|
||||||
|
Process->Pid = AtomicIncQuad(&ProcessId);
|
||||||
|
Process->Flags = Flags;
|
||||||
|
*Result = Process;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user