MiReadyLargePageToFree

NTSTATUS __stdcall MiReadyLargePageToFree(UINT64 a1, INT64 a2, CHAR a3){
  UINT64 v4; 
  __int64 v5; 
  __int64 v6; 
  _MMPFN *v7; 
  _MMPFN *v8; 
  UINT8 v9; 
  UINT64 v10; 
  UINT8 v11; 
  unsigned __int64 EntireField; 
  UINT8 v13; 
  UINT8 v14; 
  UINT8 v15; 
  __int64 v16; 

  v4 = a1;
  v5 = 0i64;
  v6 = MiLargePageSizes[(unsigned int)a2];
  v7 = &MmGetPfnDb()[a1];
  v8 = v7;
  v9 = MiLockPage(v7);
  v7->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 ^= (v6 ^ v7->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0) & 0xFFFFFFFFFi64;
  MiUnlockPage(v7, v9);
  v10 = v4 + v6;
  if( v4 >= v4 + v6 )
    return 0;
  do
  {
    if( v8->u3.ReferenceCount != 2 )
    {
      v11 = MiLockPage(v8);
      if( v8->u3.ReferenceCount != 2 )
      {
        v8->u2._bf_0 |= 0x4000000000000000ui64;
        MiUnlockPage(v8, v11);
        if( (a3 & 4) != 0 )
          MiBadRefCount(v8);
        goto LABEL_12;
      }
      MiUnlockPage(v8, v11);
    }
    EntireField = v8->u4.EntireField;
    if( ((EntireField >> 60) & 7) == 3 )
    {
      v13 = MiLockPage(v8);
      MiClearPfnImageVerified(v8, 0xCui64);
      MiUnlockPage(v8, v13);
      EntireField = v8->u4.EntireField;
    }
    if( ((EntireField >> 60) & 7) == 1 )
    {
      v14 = MiLockPage(v8);
      v8->u4._bf_0 &= 0x8FFFFFFFFFFFFFFFui64;
      MiUnlockPage(v8, v14);
    }
    ++v5;
LABEL_12:
    ++v8;
    ++v4;
  }
  while( v4 < v10 );
  if( v5 )
  {
    if( v5 == v6 )
      return 1;
    v15 = MiLockPage(v7);
    v16 = (v7->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 & 0xFFFFFFFFFi64) - v5;
    v7->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 ^= (v16 ^ v7->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0) & 0xFFFFFFFFFi64;
    MiUnlockPage(v7, v15);
    if( !v16 )
      return 1;
  }
  return 0;
}

Referenced by:

MiFreeLargePageMemory