58 size_t TotalSize = StackSize + GuardSize;
63 if (!BaseVa)
return NULL;
66 uintptr_t MapStartVa = BaseVa + GuardSize;
68 size_t Iterations = 0;
71 for (
size_t i = 0; i < PagesToMap; i++) {
111 if (failure)
goto failure_cleanup;
124 return (
void*)(BaseVa + TotalSize);
128 for (
size_t j = 0; j < Iterations; j++) {
132 if (pte && pte->Hard.Present) {
144 assert(
false,
"This function is currently a Must-Succeed.");
150 IN void* AllocatedStackTop,
172 gop_printf(
COLOR_PINK,
"**Reached MiFreeKernelStack | LargeStack: %s | AllocatedStackTop: %p**\n", (LargeStack ?
"True" :
"False"), AllocatedStackTop);
176 size_t TotalSize = StackSize + GuardSize;
184 for (
size_t i = 0; i < PagesToUnMap; i++) {
204 uintptr_t BaseVa = (uintptr_t)AllocatedStackTop - TotalSize;
222 OUT void** DirectoryTable
246 uint64_t physicalAddress;
274 pml4Base[i] = currentPml4[i];
298 *DirectoryTable = (
void*)physicalAddress;
305MiFreePageTableHierarchy(
341 for (
int i = start; i < limit; i++) {
344 bool isPresent =
false;
345 bool isLargePage =
false;
350 pte.
Value = mapping[i];
367 if (isPresent && childPfn !=
PFN_ERROR) {
376 MiFreePageTableHierarchy(childPfn, Level - 1);
393 IN uintptr_t PageDirectoryPhysical
415 if (!Process || !PageDirectoryPhysical) {
427 MiFreePageTableHierarchy(pml4Pfn, 4);
438 OUT void** OutStackTop,
439 _In_Opt size_t StackReserveSize
473 uintptr_t CurrentStackHint = Process->NextStackHint;
476 uintptr_t EndOfStack = CurrentStackHint - StackReserveSize;
488 Process->NextStackHint = (uintptr_t)GuardPageEnd;
490 if (OutStackTop) *OutStackTop = (
void*)CurrentStackHint;
505 OUT void** OutBasicMtdllTypes
510 void* BaseAddress = NULL;
529 *PBasictypes = BaseAddress;
543 void* BaseAddress = NULL;
NORETURN void MeBugCheckEx(IN enum _BUGCHECK_CODES BugCheckCode, IN void *BugCheckParameter1, IN void *BugCheckParameter2, IN void *BugCheckParameter3, IN void *BugCheckParameter4)
void gop_printf(uint32_t color, const char *fmt,...)
void * MiMapPageInHyperspace(IN uint64_t PfnIndex, OUT PIRQL OldIrql)
void MiUnmapHyperSpaceMap(IN IRQL OldIrql)
uint64_t * pml4_from_recursive(void)
PAGE_INDEX MiTranslatePteToPfn(IN PMMPTE pte)
PMMPTE MiGetPtePointer(IN uintptr_t va)
void MiInvalidateTlbForVa(IN void *VirtualAddress)
void MiUnmapPte(IN PMMPTE pte)
@ MANUALLY_INITIATED_CRASH
FORCEINLINE bool MiIsValidPfn(IN PAGE_INDEX Pfn)
#define MI_LARGE_STACK_SIZE
#define PPFN_TO_PHYSICAL_ADDRESS(PPFN)
FORCEINLINE void * kmemset(void *dest, int64_t val, uint64_t len)
#define MI_DEFAULT_USER_STACK_SIZE
#define PhysicalMemoryOffset
#define PHYS_TO_INDEX(PhysicalAddress)
#define BYTES_TO_PAGES(Bytes)
#define INDEX_TO_PPFN(Index)
#define MI_WRITE_PTE(_PtePointer, _Va, _Pa, _Flags)
#define MI_GUARD_PAGE_PROTECTION
void * MiCreateKernelStack(IN bool LargeStack)
MTSTATUS MmCreateProcessAddressSpace(OUT void **DirectoryTable)
MTSTATUS MmCreateUserStack(IN PEPROCESS Process, OUT void **OutStackTop, _In_Opt size_t StackReserveSize)
MTSTATUS MmDeleteProcessAddressSpace(IN PEPROCESS Process, IN uintptr_t PageDirectoryPhysical)
MTSTATUS MmCreateTeb(IN PETHREAD Thread, OUT void **OutTeb)
void MiFreeKernelStack(IN void *AllocatedStackTop, IN bool LargeStack)
MTSTATUS MmCreatePeb(IN PEPROCESS Process, OUT void **OutPeb, OUT void **OutBasicMtdllTypes)
#define MT_GENERAL_FAILURE
#define MT_FAILURE(Status)
#define MT_SUCCEEDED(Status)
Macros to test status.
PAGE_INDEX MiRequestPhysicalPage(IN PFN_STATE ListType)
NOINLINE void MiReleasePhysicalPage(IN PAGE_INDEX PfnIndex)
struct _MTDLL_BASIC_TYPES * PMTDLL_BASIC_TYPES
struct _MTDLL_BASIC_TYPES MTDLL_BASIC_TYPES
void MsAcquirePushLockExclusive(IN PUSH_LOCK *Lock)
void MsReleasePushLockExclusive(IN PUSH_LOCK *Lock)
struct _MMPTE::@172372265215056352375070220246156106027174106113::@200357034104227323320222006243127050212100105247 Hard
struct _MMPTE::@172372265215056352375070220246156106027174106113::@277354034164206104264133322054061025100052052376 Soft
uintptr_t MiAllocatePoolVa(IN POOL_TYPE PoolType, IN size_t NumberOfBytes)
void MiFreePoolVaContiguous(IN uintptr_t va, IN size_t NumberOfBytes, IN POOL_TYPE PoolType)
MTSTATUS MmFreeVirtualMemory(IN PEPROCESS Process, IN void *BaseAddress)
MTSTATUS MmAllocateVirtualMemory(IN PEPROCESS Process, _In_Opt _Out_Opt void **BaseAddress, IN size_t NumberOfBytes, IN VAD_FLAGS VadFlags)