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