17#define MAX_PID 0xFFFFFFFCUL
19#define MAX_FREE_POOL 1024u
21#define PML4_INDEX(addr) (((addr) >> 39) & 0x1FFULL)
22#define KERNEL_PML4_START ((size_t)PML4_INDEX(KernelVaStart))
23#define USER_INITIAL_STACK_TOP 0x00007FFFFFFFFFFF
32GetBaseName(
const char* fullpath,
char* out,
size_t outsz) {
33 const char* ext =
".mtexe";
35 if (!fullpath || !out || outsz == 0)
return false;
38 const char* p = fullpath + len;
39 while (p > fullpath && *(p - 1) !=
'/') --p;
42 if (name_len < ext_len ||
kstrcmp(p + name_len - ext_len, ext) != 0)
return false;
44 if (name_len + 1 > outsz)
return false;
51 IN const char* ExecutablePath,
113 GetBaseName(ExecutablePath, filename,
sizeof(filename));
114 if (filename[0] ==
'\0')
goto CleanupWithRef;
122 if (!HandleTable)
goto CleanupWithRef;
126 void* DirectoryTablePhysical = NULL;
142 void* file_buffer = NULL;
143 uint32_t FileSize = 0;
144 Status =
vfs_read(ExecutablePath, &FileSize, &file_buffer);
155 uintptr_t CurrentVA = Process->
ImageBase;
156 uint8_t* SourcePtr = (uint8_t*)file_buffer;
157 size_t BytesRemaining = FileSize;
163 for (
size_t i = 0; i < num_pages; i++) {
177 kmemcpy((
void*)PhysicalAddressOfVa, SourcePtr, BytesToCopy);
190 SourcePtr += BytesToCopy;
191 BytesRemaining -= BytesToCopy;
212 *ProcessHandle = hProcess;
218 assert(
false,
"Something went wrong.");
237 assert(
false,
"Unimplemented routine");
void MeDetachProcess(IN PAPC_STATE ApcState)
void MeAttachProcess(IN PIPROCESS Process, OUT PAPC_STATE ApcState)
NORETURN void MeBugCheck(IN enum _BUGCHECK_CODES BugCheckCode)
HANDLE PsAllocateProcessId(IN PEPROCESS Process)
struct _EPROCESS EPROCESS
size_t kstrlen(const char *str)
void gop_printf(uint32_t color, const char *fmt,...)
char * kstrncpy(char *dst, const char *src, size_t n)
int kstrcmp(const char *s1, const char *s2)
PHANDLE_TABLE HtCreateHandleTable(IN PEPROCESS Process)
struct _HANDLE_TABLE * PHANDLE_TABLE
void * MiMapPageInHyperspace(IN uint64_t PfnIndex, OUT PIRQL OldIrql)
void MiUnmapHyperSpaceMap(IN IRQL OldIrql)
#define UNREFERENCED_PARAMETER(x)
PMMPTE MiGetPtePointer(IN uintptr_t va)
struct _APC_STATE APC_STATE
@ MANUALLY_INITIATED_CRASH2
FORCEINLINE PPROCESSOR MeGetCurrentProcessor(void)
@ DEFAULT_TIMESLICE_TICKS
#define COLOR_RED
Colors definitions for easier access.
FORCEINLINE void * kmemcpy(void *dest, const void *src, size_t len)
#define PhysicalMemoryOffset
#define MI_WRITE_PTE(_PtePointer, _Va, _Pa, _Flags)
MTSTATUS MmCreateProcessAddressSpace(OUT void **DirectoryTable)
FORCEINLINE void InitializeListHead(PDOUBLY_LINKED_LIST Head)
#define MT_GENERAL_FAILURE
#define MT_FAILURE(Status)
MTSTATUS ObCreateHandleForObject(IN void *Object, IN ACCESS_MASK DesiredAccess, OUT PHANDLE ReturnedHandle)
MTSTATUS ObReferenceObjectByHandle(IN HANDLE Handle, IN uint32_t DesiredAccess, IN POBJECT_TYPE DesiredType, OUT void **Object, _Out_Opt PHANDLE_TABLE_ENTRY HandleInformation)
void ObDereferenceObject(IN void *Object)
MTSTATUS ObCreateObject(IN POBJECT_TYPE ObjectType, IN uint32_t ObjectSize, OUT void **ObjectCreated)
PAGE_INDEX MiRequestPhysicalPage(IN PFN_STATE ListType)
uintptr_t MmSystemRangeStart
uintptr_t MmUserProbeAddress
void PsTerminateProcess(IN PEPROCESS Process)
#define USER_INITIAL_STACK_TOP
MTSTATUS PsCreateProcess(IN const char *ExecutablePath, OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, _In_Opt HANDLE ParentProcess)
uintptr_t MmHighestUserAddress
FORCEINLINE void MeEnqueueThreadWithLock(Queue *queue, PETHREAD thread)
void(* ThreadEntry)(THREAD_PARAMETER)
#define MT_PROCESS_CREATE_PROCESS
POBJECT_TYPE PsProcessType
PHANDLE_TABLE ObjectTable
struct _ETHREAD * MainThread
struct _IPROCESS InternalProcess
DOUBLY_LINKED_LIST AllThreads
uintptr_t PageDirectoryPhysical
MTSTATUS PsCreateThread(HANDLE ProcessHandle, PHANDLE ThreadHandle, ThreadEntry EntryPoint, THREAD_PARAMETER ThreadParameter, TimeSliceTicks TimeSlice)
MTSTATUS vfs_read(const char *filename, uint32_t *file_size_out, void **buffer_out)
Reads the file into a buffer.