MiFillHyperPtes

void __fastcall MiFillHyperPtes(unsigned __int64 a1, unsigned __int64 a2, UINT8 a3, INT64 a4){
  __int64 v4; 
  __int64 v7; 
  _MMPTE *PteBase; 
  char *v9; 
  char *v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  _EPROCESS *Process; 
  _MMPTE *v14; 
  UINT64 v15; 
  __int64 v16; 
  INT64 v17; 
  UINT64 v18; 
  char *v19; 
  __int64 v20; 
  char v21; 
  char v22; 

  v4 = 4i64;
  v20 = 4i64;
  v7 = 4i64;
  PteBase = MmGetPteBase();
  v9 = &v21;
  do
  {
    *((_QWORD *)v9 - 1) = a1;
    *(_QWORD *)v9 = a2;
    a1 = (unsigned __int64)PteBase + ((a1 >> 9) & 0x7FFFFFFFF8i64);
    a2 = (unsigned __int64)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64);
    v9 += 16;
    --v7;
  }
  while( v7 );
  v10 = &v22;
  v19 = &v22;
  do
  {
    v11 = *((_QWORD *)v10 - 1);
    v12 = *(_QWORD *)v10;
    if( *(_DWORD *)a4 )
    {
      Process = KeGetCurrentThread()->ApcState.Process;
      if( v11 <= v12 )
      {
        v14 = MmGetPteBase();
        do
        {
          LODWORD(v18) = 0;
          v15 = (UINT64)v14 + ((v11 >> 9) & 0x7FFFFFFFF8i64);
          MiMakeSystemAddressValid((VOID *)v11, 0i64, 0i64, a3, v18);
          do
          {
            LODWORD(v16) = MI_READ_PTE_LOCK_FREE(v11);
            if( !v16 )
              MiMakeHyperPteDemandZero((UINT64 *)v11, v17, a4);
            v11 += 8i64;
          }
          while( v11 <= v12 && (v11 & 0xFFF) != 0 );
          MiUnlockPageTableInternal((INT64)&Process->Vm, v15);
        }
        while( v11 <= v12 );
        v10 = v19;
        v4 = v20;
      }
    }
    else
    {
      *(_QWORD *)(a4 + 8) += ((__int64)(v12 - v11) >> 3) + 1;
    }
    v10 -= 16;
    --v4;
    v19 = v10;
    v20 = v4;
  }
  while( v4 );
}

Referenced by:

MiMakeHyperRangeAccessible