MiAllocateTopLevelPage
INT64 __stdcall MiAllocateTopLevelPage(INT64 rcx0, UINT64 *a2){
unsigned int v4;
__int64 v5;
_MI_PARTITION *v6;
_MI_PARTITION *v7;
unsigned int NextPageColor;
UINT64 i;
UINT64 Page;
UINT64 v11;
UINT64 v12;
_QWORD *v13;
UINT64 ValidPte;
unsigned __int64 v15;
_OWORD v17[2];
v17[0] = 0i64;
MiGetProcessPartition((_EPROCESS *)rcx0);
v7 = v6;
MiInitializePageColorBase(v5 + 1664, v4, (INT64)v17);
NextPageColor = MiGetNextPageColor((INT64)v17);
for( i = NextPageColor; ; i = NextPageColor )
{
Page = MiGetPage(v7, i, 0x302ui64);
v12 = Page;
if( Page != -1i64 )
break;
MiWaitForFreePage(v7, v11);
}
v13 = (_QWORD *)((char *)MmGetPfnDb() + 48 * Page);
MiSetPfnLink(v13, 0i64);
ValidPte = MiMakeValidPte(0i64, v12, 2415919110i64);
*v13 = 0i64;
v13[5] ^= (v12 ^ v13[5]) & 0xFFFFFFFFFi64;
v15 = ValidPte & 0xFFFFFFFFFFFFFEFFui64;
MiSetPageTablePfnBuddy((INT64)v13, rcx0, 0i64);
MiInitializePfnForOtherProcess(v12, MmGetPxeSelfRef(), v12, 0x200ui64);
*a2 = MiMakeValidPte(0i64, v12, 2684354564i64);
*(_QWORD *)(((__int64)(((_QWORD)a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16)
+ 8 * (((unsigned __int64)MmGetPxeSelfRef() >> 3) & 0x1FF)) = v15;
return v12;
}Referenced by:
MmCreateProcessAddressSpace