MiFillHyperPtes

VOID __fastcall MiFillHyperPtes(UINT64 a1, UINT64 a2, UINT8 a3, INT64 a4){
  __int64 v4; 
  __int64 v7; 
  _MMPTE *PteBase; 
  char *v9; 
  char *v10; 
  UINT64 v11; 
  UINT64 v12; 
  __int64 v13; 
  _MMPTE *v14; 
  UINT64 v15; 
  INT64 v16; 
  char *v17; 
  __int64 v18; 
  char v19; 
  char v20; 
  v4 = 4i64;
  v18 = 4i64;
  v7 = 4i64;
  PteBase = MmGetPteBase();
  v9 = &v19;
  do
  {
    *((_QWORD *)v9 - 1) = a1;
    *(_QWORD *)v9 = a2;
    a1 = (UINT64)PteBase + ((a1 >> 9) & 0x7FFFFFFFF8i64);
    a2 = (UINT64)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64);
    v9 += 16;
    --v7;
  }
  while( v7 );
  v10 = &v20;
  v17 = &v20;
  do
  {
    v11 = *((_QWORD *)v10 - 1);
    v12 = *(_QWORD *)v10;
    if( *(_DWORD *)a4 )
    {
      v13 = *((_QWORD *)KeGetCurrentThread() + 23);
      if( v11 <= v12 )
      {
        v14 = MmGetPteBase();
        do
        {
          v15 = (UINT64)v14 + ((v11 >> 9) & 0x7FFFFFFFF8i64);
          MiMakeSystemAddressValid(v11, 0i64, 0i64, a3, 0);
          do
          {
            if( !MI_READ_PTE_LOCK_FREE(v11) )
              MiMakeHyperPteDemandZero((UINT64 *)v11, v16, a4);
            v11 += 8i64;
          }
          while( v11 <= v12 && (v11 & 0xFFF) != 0 );
          MiUnlockPageTableInternal(v13 + 1664, v15);
        }
        while( v11 <= v12 );
        v10 = v17;
        v4 = v18;
      }
    }
    else
    {
      *(_QWORD *)(a4 + 8) += ((__int64)(v12 - v11) >> 3) + 1;
    }
    v10 -= 16;
    --v4;
    v17 = v10;
    v18 = v4;
  }
  while( v4 );
}

Referenced by:

MiMakeHyperRangeAccessible