7#define MAX_TID 0xFFFFFFFCu
9#define MAX_FREE_POOL 1024u
11#define THREAD_STACK_SIZE (1024*24)
12#define THREAD_ALIGNMENT 16
15static void ThreadExit(
void) {
26 thread_entry(parameter);
87 ContextFrame.
rip = (uint64_t)EntryPoint;
88 ContextFrame.
rdi = (uint64_t)ThreadParameter;
138 bool LargeStack =
false;
147 uintptr_t StackTop = (uintptr_t)stackStart;
164 cfm->
rsp = (uint64_t)StackTop;
165 cfm->
rip = (uint64_t)ThreadWrapperEx;
166 cfm->
rdi = (uint64_t)entry;
167 cfm->
rsi = (uint64_t)parameter;
173 cfm->
rflags |= (1 << 9ULL);
206 Thread->ExitStatus = ExitStatus;
238 if (IsKernelThread) {
242 assert(
false,
"User mode threads are not supported yet.");
FORCEINLINE uint32_t InterlockedIncrementU32(volatile uint32_t *target)
HANDLE PsAllocateThreadId(IN PETHREAD Thread)
void PsFreeCid(IN HANDLE Cid)
struct _EPROCESS EPROCESS
struct _TRAP_FRAME TRAP_FRAME
void gop_printf(uint32_t color, const char *fmt,...)
#define CONTAINING_RECORD(ptr, type, member)
FORCEINLINE PITHREAD MeGetCurrentThread(void)
FORCEINLINE PPROCESSOR MeGetCurrentProcessor(void)
enum _TimeSliceTicks TimeSliceTicks
#define COLOR_RED
Colors definitions for easier access.
FORCEINLINE void * kmemset(void *dest, int64_t val, uint64_t len)
void * MiCreateKernelStack(IN bool LargeStack)
FORCEINLINE void InitializeListHead(PDOUBLY_LINKED_LIST Head)
FORCEINLINE void InsertTailList(PDOUBLY_LINKED_LIST Head, PDOUBLY_LINKED_LIST Entry)
#define MT_PROCESS_IS_TERMINATING
#define MT_FAILURE(Status)
MTSTATUS ObReferenceObjectByHandle(IN HANDLE Handle, IN uint32_t DesiredAccess, IN POBJECT_TYPE DesiredType, OUT void **Object, _Out_Opt PHANDLE_TABLE_ENTRY HandleInformation)
MTSTATUS ObCreateHandleForObjectEx(IN void *Object, IN ACCESS_MASK DesiredAccess, OUT PHANDLE ReturnedHandle, IN PHANDLE_TABLE ObjectTable)
void ObDereferenceObject(IN void *Object)
MTSTATUS ObCreateObject(IN POBJECT_TYPE ObjectType, IN uint32_t ObjectSize, OUT void **ObjectCreated)
FORCEINLINE void MeEnqueueThreadWithLock(Queue *queue, PETHREAD thread)
void(* ThreadEntry)(THREAD_PARAMETER)
#define MT_THREAD_ALL_ACCESS
#define MT_PROCESS_CREATE_THREAD
FORCEINLINE bool PsIsKernelThread(IN PETHREAD Thread)
POBJECT_TYPE PsThreadType
POBJECT_TYPE PsProcessType
void PsDeferKernelStackDeletion(void *StackBase, bool IsLarge)
bool MsAcquireRundownProtection(IN PRUNDOWN_REF rundown)
void MsReleaseRundownProtection(IN PRUNDOWN_REF rundown)
void MsWaitForRundownProtectionRelease(IN PRUNDOWN_REF rundown)
NORETURN void Schedule(void)
EPROCESS PsInitialSystemProcess
PEPROCESS SavedApcProcess
struct _RUNDOWN_REF ProcessRundown
PHANDLE_TABLE ObjectTable
struct _ETHREAD * MainThread
DOUBLY_LINKED_LIST AllThreads
struct _RUNDOWN_REF ThreadRundown
struct _EPROCESS * ParentProcess
struct _ITHREAD InternalThread
struct _EVENT * CurrentEvent
struct _DOUBLY_LINKED_LIST ThreadListEntry
enum _TimeSliceTicks TimeSlice
struct _TRAP_FRAME TrapRegisters
enum _TimeSliceTicks TimeSliceAllocated
struct _APC_STATE ApcState
MTSTATUS PsCreateSystemThread(ThreadEntry entry, THREAD_PARAMETER parameter, TimeSliceTicks TIMESLICE)
void PsTerminateThread(IN PETHREAD Thread, IN MTSTATUS ExitStatus)
PETHREAD PsGetCurrentThread(void)
MTSTATUS PsCreateThread(HANDLE ProcessHandle, PHANDLE ThreadHandle, ThreadEntry EntryPoint, THREAD_PARAMETER ThreadParameter, TimeSliceTicks TimeSlice)
void PsDeleteThread(IN void *Object)
MTSTATUS MmAllocateVirtualMemory(IN PEPROCESS Process, _In_Opt _Out_Opt void **BaseAddress, IN size_t NumberOfBytes, IN VAD_FLAGS VadFlags)