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) {
30 thread_entry(parameter);
83 Thread->
PID = ParentProcess->
PID;
91 void* BaseAddress = NULL;
106 ContextFrame.
rip = (uint64_t)EntryPoint;
107 ContextFrame.
rdi = (uint64_t)ThreadParameter;
153 Trap->
rdi = (uint64_t)ParentProcess->
Peb;
154 Trap->
rsi = (uint64_t)Teb;
155 Trap->
rdx = (uint64_t)EntryPoint;
156 Trap->
rcx = (uint64_t)ThreadParameter;
157 Trap->
rip = (uint64_t)MtdllEntrypoint;
212 bool LargeStack =
false;
221 uintptr_t StackTop = (uintptr_t)stackStart;
238 cfm->
rsp = (uint64_t)StackTop;
239 cfm->
rip = (uint64_t)ThreadWrapperEx;
240 cfm->
rdi = (uint64_t)entry;
241 cfm->
rsi = (uint64_t)parameter;
247 cfm->
rflags |= (1 << 9ULL);
274 if (OutThread) *OutThread = thread;
298 assert(
false,
"Termination called upon remote thread, unimplemented. Need APCs");
321 if (IsKernelThread) {
348 (
void*)(uintptr_t)CurrentProcess,
350 (
void*)(uintptr_t)Thread,
362 (
void*)(uintptr_t)Thread,
379 bool LastThread =
false;
388 while (entry != listHead) {
390 if (iter == Thread) {
399 entry = entry->
Flink;
409 (
void*)(uintptr_t)CurrentProcess,
void MeDetachProcess(IN PAPC_STATE ApcState)
void MeAttachProcess(IN PIPROCESS Process, OUT PAPC_STATE ApcState)
NORETURN void MeBugCheckEx(IN enum _BUGCHECK_CODES BugCheckCode, IN void *BugCheckParameter1, IN void *BugCheckParameter2, IN void *BugCheckParameter3, IN void *BugCheckParameter4)
HANDLE PsAllocateThreadId(IN PETHREAD Thread)
void PsFreeCid(IN HANDLE Cid)
struct _EPROCESS EPROCESS
struct _TRAP_FRAME TRAP_FRAME
struct _DOUBLY_LINKED_LIST * PDOUBLY_LINKED_LIST
void gop_printf(uint32_t color, const char *fmt,...)
void HtDeleteHandleTable(IN PHANDLE_TABLE Table)
bool MeDisableInterrupts(void)
void MeLowerIrql(IN IRQL NewIrql)
#define CONTAINING_RECORD(ptr, type, member)
struct _APC_STATE APC_STATE
@ WORKER_THREAD_ATTEMPTED_TERMINATION
@ INVALID_PROCESS_ATTACH_ATTEMPT
FORCEINLINE PITHREAD MeGetCurrentThread(void)
FORCEINLINE bool MeIsAttachedProcess(void)
FORCEINLINE PPROCESSOR MeGetCurrentProcessor(void)
enum _TimeSliceTicks TimeSliceTicks
enum _BUGCHECK_CODES BUGCHECK_CODES
#define COLOR_RED
Colors definitions for easier access.
FORCEINLINE void * kmemset(void *dest, int64_t val, uint64_t len)
#define MI_DEFAULT_USER_STACK_SIZE
void * MiCreateKernelStack(IN bool LargeStack)
MTSTATUS MmCreateUserStack(IN PEPROCESS Process, OUT void **OutStackTop, _In_Opt size_t StackReserveSize)
MTSTATUS MmCreateTeb(IN PETHREAD Thread, OUT void **OutTeb)
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_NOT_IMPLEMENTED
#define MT_FAILURE(Status)
#define MT_INVALID_HANDLE
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)
FORCEINLINE MTSTATUS GetExceptionCode(void)
void(* ThreadEntry)(THREAD_PARAMETER)
#define MT_THREAD_ALL_ACCESS
#define MT_PROCESS_CREATE_THREAD
FORCEINLINE bool PsIsKernelThread(IN PETHREAD Thread)
@ ProcessBreakOnTermination
POBJECT_TYPE PsThreadType
POBJECT_TYPE PsProcessType
void PsDeferKernelStackDeletion(void *StackBase, bool IsLarge)
void MsAcquirePushLockExclusive(IN PUSH_LOCK *Lock)
void MsReleasePushLockExclusive(IN PUSH_LOCK *Lock)
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 _DOUBLY_LINKED_LIST * Blink
struct _DOUBLY_LINKED_LIST * Flink
struct _RUNDOWN_REF ProcessRundown
PHANDLE_TABLE ObjectTable
enum _PROCESS_FLAGS Flags
struct _ETHREAD * MainThread
struct _IPROCESS InternalProcess
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
NORETURN void PspExitThread(IN MTSTATUS ExitStatus)
MTSTATUS PsTerminateThread(IN PETHREAD Thread, IN MTSTATUS ExitStatus)
MTSTATUS PsCreateThread(HANDLE ProcessHandle, PHANDLE ThreadHandle, ThreadEntry EntryPoint, THREAD_PARAMETER ThreadParameter, TimeSliceTicks TimeSlice, ThreadEntry MtdllEntrypoint)
PETHREAD PsGetCurrentThread(void)
MTSTATUS PsCreateSystemThread(ThreadEntry entry, THREAD_PARAMETER parameter, TimeSliceTicks TIMESLICE, _Out_Opt PETHREAD *OutThread)
void PsDeleteThread(IN void *Object)