/* * Copyright (c) 2026, Chloe M. * Provided under the BSD-3 clause. * * Description: Thread management * Author: Chloe M. */ #include #include #include #include #include #include #include /* Globals */ static UQUAD NextThreadTid = 0; static SCHED_QUEUE ReaperQueue; PT_STATUS PsCreateThread(struct _PROCESS *Parent, ULONG Flags, UPTR Ip, THREAD **Result) { THREAD *Thread; PT_STATUS Status; if (Parent == NULL || Result == NULL) { return STATUS_INVALID_PARAM; } Thread = ExAllocatePoolWithTag( POOL_NON_PAGED, sizeof(*Thread), THREAD_POOL_TAG ); if (Thread == NULL) { return STATUS_NO_MEMORY; } Thread->Tid = AtomicIncQuad(&NextThreadTid); Thread->Parent = Parent; Status = HalThreadInit(Thread, Flags, Ip); if (PT_ERROR(Status)) { ExFreePoolWithTag(Thread, THREAD_POOL_TAG); return Status; } *Result = Thread; return STATUS_SUCCESS; } NO_RETURN VOID PsExitThread(ULONG ExitCode) { KPCR *Kpcr; Kpcr = HalKpcrCurrent(); KeSchedEnqueue(&ReaperQueue, Kpcr->CurrentThread); Kpcr->CurrentThread = NULL; HalThreadYield(); for (;;) { HalCpuSuspend(); } }