MiReadyLargePageToFree

INT64 __fastcall MiReadyLargePageToFree(UINT64 a1, INT64 a2, CHAR a3){
  UINT64 v4; 
  __int64 v5; 
  __int64 v6; 
  _MMPFN *v7; 
  UINT64 v8; 
  UINT8 v9; 
  UINT64 v10; 
  UINT8 v11; 
  UINT64 v12; 
  unsigned __int64 v13; 
  UINT8 v14; 
  UINT8 v15; 
  UINT8 v16; 
  __int64 v17; 
  v4 = a1;
  v5 = 0i64;
  v6 = MiLargePageSizes[(unsigned int)a2];
  v7 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * a1);
  v8 = (UINT64)v7;
  v9 = MiLockPage((INT64)v7);
  *(_QWORD *)v7 ^= (v6 ^ *(_QWORD *)v7) & 0xFFFFFFFFFi64;
  MiUnlockPage(v7, v9);
  v10 = v4 + v6;
  if( v4 >= v4 + v6 )
    return 0i64;
  do
  {
    if( *(_WORD *)(v8 + 32) != 2 )
    {
      v11 = MiLockPage(v8);
      if( *(_WORD *)(v8 + 32) != 2 )
      {
        *(_QWORD *)(v8 + 24) |= 0x4000000000000000ui64;
        MiUnlockPage((_MMPFN *)v8, v11);
        if( (a3 & 4) != 0 )
          MiBadRefCount((_MMPFN *)v8, v12);
        goto LABEL_12;
      }
      MiUnlockPage((_MMPFN *)v8, v11);
    }
    v13 = *(_QWORD *)(v8 + 40);
    if( ((v13 >> 60) & 7) == 3 )
    {
      v14 = MiLockPage(v8);
      MiClearPfnImageVerified(v8, 12);
      MiUnlockPage((_MMPFN *)v8, v14);
      v13 = *(_QWORD *)(v8 + 40);
    }
    if( ((v13 >> 60) & 7) == 1 )
    {
      v15 = MiLockPage(v8);
      *(_QWORD *)(v8 + 40) &= 0x8FFFFFFFFFFFFFFFui64;
      MiUnlockPage((_MMPFN *)v8, v15);
    }
    ++v5;
LABEL_12:
    v8 += 48i64;
    ++v4;
  }
  while( v4 < v10 );
  if( v5 )
  {
    if( v5 == v6 )
      return 1i64;
    v16 = MiLockPage((INT64)v7);
    v17 = (*(_QWORD *)v7 & 0xFFFFFFFFFi64) - v5;
    *(_QWORD *)v7 ^= (v17 ^ *(_QWORD *)v7) & 0xFFFFFFFFFi64;
    MiUnlockPage(v7, v16);
    if( !v17 )
      return 1i64;
  }
  return 0i64;
}

Referenced by:

MiFreeLargePageMemory