MiChangeAwePageAttributes

NTSTATUS __stdcall MiChangeAwePageAttributes(INT64 a1, INT64 a2, INT64 a3){
  unsigned __int64 v3; 
  _MI_PFN_CACHE_ATTRIBUTE v4; 
  INT64 v6; 
  unsigned __int64 v7; 
  _MMPTE v9; 
  _MMPFN *Long; 
  unsigned __int64 v11; 
  _MMPTE *p_OriginalPte; 

  v3 = *(_QWORD *)(a1 + 8);
  v4 = (int)a3;
  v6 = a2 + 24;
  v7 = MiLockPageInline((_MMPFN *)a2);
  if( *(_WORD *)(a2 + 32) > 2u
    || (*(_QWORD *)v6 & 0x3FFFFFFFFFFFFFFFi64) != 1
    || (*(_QWORD *)(a2 + 24) & 0x4000000000000000i64) != 0 )
  {
    _InterlockedAnd64((volatile signed __int64 *)v6, 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(v7);
    return -1073741800;
  }
  v9.u.Long = *(_QWORD *)(a2 + 16);
  _InterlockedAnd64((volatile signed __int64 *)v6, 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v7);
  Long = 0i64;
  v11 = 0i64;
  if( v3 )
  {
    while( *(_WORD *)(v6 + 8) <= 2u && (*(_QWORD *)v6 & 0x4000000000000000i64) == 0 )
    {
      *(_QWORD *)(v6 - 8) = Long;
      ++v11;
      Long = (_MMPFN *)(v6 - 24);
      v6 += 48i64;
      if( v11 >= v3 )
        goto LABEL_10;
    }
    while( Long )
    {
      p_OriginalPte = &Long->OriginalPte;
      Long = (_MMPFN *)Long->OriginalPte.u.Long;
      p_OriginalPte->u.Long = v9.u.Long;
    }
    return -1073741800;
  }
LABEL_10:
  MiChangePageAttributeBatch(Long, v4, v9);
  return 0;
}

Referenced by:

MiIncrementAweMapCount