MiUpdateForkMaps

_MMPTE *__stdcall MiUpdateForkMaps(
        _MI_FORK_MAPS *ForkMapInfo,
        _MMPTE *PointerPte,
        _MMPTE *LastPte,
        UINT64 *PrivatePageCount,
        _EPROCESS *CurrentProcess,
        UINT8 WsIrql){
  _MMPTE *NextPageTable; 
  unsigned __int64 v9; 
  _MMPTE *PteBase; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  unsigned __int64 v15; 
  UINT64 v16; 
  _MMPTE **v17; 
  int v18; 
  UINT64 v19; 
  UINT64 v20; 
  _MMPFN *v21; 
  char *v22; 
  UINT64 v23; 
  unsigned __int64 v24; 
  _MI_FORK_MAPS *v25; 
  UINT8 v26; 
  UINT64 MakeValid; 
  UINT64 MakeValida; 
  UINT64 v29; 
  __int64 v30; 
  _MMPTE *v31; 
  UINT64 v32[2]; 
  __int128 v33; 
  UINT64 v34; 
  UINT64 *v35; 

  v35 = PrivatePageCount;
  LODWORD(v34) = 0;
  LODWORD(MakeValid) = 4;
  *(_OWORD *)v32 = 0i64;
  v33 = 0i64;
  NextPageTable = MiGetNextPageTable(PointerPte, LastPte, 0i64, WsIrql, MakeValid, &v34, v29);
  v31 = NextPageTable;
  v9 = (unsigned __int64)NextPageTable;
  if( !NextPageTable )
    return LastPte + 1;
  PteBase = MmGetPteBase();
  v12 = (__int64)(((_QWORD)NextPageTable << 25) - ((_QWORD)PteBase << 25)) >> 16;
  LODWORD(v13) = MI_IS_PHYSICAL_ADDRESS((VOID *)v12);
  if( (_DWORD)v13 )
  {
    v14 = (unsigned int)v13;
    do
    {
      v9 = (unsigned __int64)PteBase + ((v9 >> 9) & 0x7FFFFFFFF8i64);
      --v14;
    }
    while( v14 );
    v9 += 8i64;
    v13 = (unsigned int)v13;
    do
    {
      v9 = (__int64)((v9 << 25) - ((_QWORD)PteBase << 25)) >> 16;
      --v13;
    }
    while( v13 );
  }
  else
  {
    if( ((v9 ^ *((_QWORD *)ForkMapInfo + 6)) & 0xFFFFFFFFFFFFF000ui64) != 0 )
    {
      MiFillPteHierarchy(v12, v32);
      v16 = *(_QWORD *)ForkMapInfo;
      v17 = (_MMPTE **)&v33 + 1;
      *((_QWORD *)ForkMapInfo + 6) = v9;
      v18 = 4;
      v30 = 3i64;
      v19 = *(_QWORD *)(v16 + 40) >> 12;
      v20 = v19;
      v21 = 0i64;
      do
      {
        v22 = (char *)MiMapSinglePage(*((VOID **)ForkMapInfo + 7), v19, 0x40000020ui64)
            + 8 * ((*(_DWORD *)v17 >> 3) & 0x1FF);
        LODWORD(v23) = MI_READ_PTE_LOCK_FREE((INT64)v22);
        v29 = v23;
        v24 = v23;
        if( v23 )
        {
          if( (v23 & 1) != 0 )
          {
            MiPteInShadowRange((UINT64)&v29);
          }
          else if( *(&stru_140C4DB30 + 42) )
          {
            if( (v23 & 0x10) != 0 )
              v24 = v23 & 0xFFFFFFFFFFFFFFEFui64;
            else
              v24 = ~*(&stru_140C4DB30 + 42) & v23;
          }
          v19 = (v24 >> 12) & 0xFFFFFFFFFi64;
        }
        else
        {
          v25 = &ForkMapInfo[2 * (4 - v18)];
          MiDoneWithThisPageGetAnother((UINT64 *)v25 + 1, CurrentProcess, *(_QWORD *)ForkMapInfo);
          v19 = *((_QWORD *)v25 + 1);
          MiBuildForkPageTable(*(_QWORD *)ForkMapInfo, (_MMPTE *)v19, *v17, (UINT64)v22, v20);
          ++*v35;
          if( v21 )
            MiIncreaseUsedPtesCount(v21, (VOID *)1);
        }
        v21 = &MmGetPfnDb()[v19];
        --v18;
        --v17;
        v20 = v19;
        --v30;
      }
      while( v30 );
      v15 = (unsigned __int64)MiMapSinglePage(*((VOID **)ForkMapInfo + 7), v19, 0x40000020ui64);
      v9 = (unsigned __int64)v31;
      *((_QWORD *)ForkMapInfo + 4) = v15;
      *((_QWORD *)ForkMapInfo + 8) = v21;
    }
    else
    {
      v15 = *((_QWORD *)ForkMapInfo + 4);
    }
    v26 = WsIrql;
    LODWORD(MakeValida) = 1;
    *((_QWORD *)ForkMapInfo + 5) = v15 | v9 & 0xFFF;
    MiMakeSystemAddressValid((VOID *)v9, 0i64, 0i64, v26, MakeValida);
  }
  return(_MMPTE *)v9;
}

Referenced by:

MiCloneVads