MiConvertContiguousPages

INT64 __fastcall MiConvertContiguousPages(UINT64 *a1, INT64 a2, INT64 a3){
  unsigned int v4; 
  unsigned int v5; 
  UINT64 *v6; 
  __int64 v7; 
  UINT64 *v8; 
  BOOL IsFreeZeroPfnCold; 
  INT64 v10; 
  BOOL v11; 
  unsigned int v12; 
  UINT64 v13; 
  INT64 v14; 
  UINT64 v15; 
  UINT64 *v16; 
  INT64 v17; 
  UINT64 v19; 
  v19 = 0i64;
  v4 = a3;
  v5 = 1;
  MiSetOriginalPtePfnFromFreeList(&v19);
  v6 = 0i64;
  v8 = &a1[6 * v7];
  if( a1 != v8 )
  {
    do
    {
      IsFreeZeroPfnCold = MiIsFreeZeroPfnCold((INT64)a1);
      v11 = MiPfnZeroingNeeded((INT64)a1, v4);
      v12 = 0;
      if( !v11 )
        v12 = v5;
      v5 = v12;
      if( (unsigned int)MiPageAttributeBatchChangeNeeded((INT64)a1, v10) )
      {
        v13 = *a1 & 0xFFFFFFF000000000ui64;
        *a1 = v13;
        if( IsFreeZeroPfnCold )
        {
          v13 |= 2ui64;
          *a1 = v13;
        }
        a1[2] = (UINT64)v6;
        v6 = a1;
        if( v11 )
          *a1 = v13 | 1;
      }
      else
      {
        v14 = v19 & -(__int64)v11;
        a1[2] = v14;
        if( IsFreeZeroPfnCold )
          a1[2] = MiUpdatePageFileHighInPte(v14, 4294967293i64);
      }
      a1 += 6;
    }
    while( a1 != v8 );
    if( v6 )
    {
      MiChangePageAttributeBatch((INT64)v6, (_BYTE *)v4, -1i64);
      do
      {
        v15 = *v6;
        v16 = (UINT64 *)v6[2];
        v17 = v19 & -(__int64)((*v6 & 1) != 0);
        v6[2] = v17;
        if( (v15 & 2) != 0 )
          v6[2] = MiUpdatePageFileHighInPte(v17, 4294967293i64);
        *v6 = v15 & 0xFFFFFFF000000000ui64;
        v6 = v16;
      }
      while( v16 );
    }
  }
  return v5;
}

Referenced by:

MiFindContiguousPages