MiFreePageToSlabEntry

NTSTATUS __stdcall MiFreePageToSlabEntry(UINT64 a1, INT64 a2, INT64 a3){
  unsigned int v4; 
  __int64 v5; 
  volatile signed __int32 *v6; 
  int v7; 
  NTSTATUS result; 
  int v9; 
  unsigned __int64 v10; 

  v4 = (int)(a1 - (unsigned int)MmGetPfnDb()) / 48 - *(_DWORD *)(a2 + 24);
  _InterlockedIncrement((volatile signed __int32 *)(a2 + 132));
  _InterlockedIncrement((volatile signed __int32 *)(a3 + 32));
  LOBYTE(a1) = 1;
  v5 = v4 & 0x1F;
  v6 = (volatile signed __int32 *)(*(_QWORD *)(a2 + 56) + 4 * ((unsigned __int64)v4 >> 5));
  if( (unsigned __int64)(v5 + 1) <= 0x20 )
  {
    v7 = ~(1 << v5);
LABEL_3:
    _InterlockedAnd(v6, v7);
    goto LABEL_4;
  }
  v9 = v4 & 0x1F;
  if( !v9 )
    goto LABEL_12;
  _InterlockedAnd(v6++, ~(((1 << (32 - v9)) - 1) << v5));
  LODWORD(a1) = 1 - (32 - v9);
  if( (unsigned int)a1 >= 0x20 )
  {
    v10 = (unsigned __int64)(unsigned int)a1 >> 5;
    do
    {
      *v6 = 0;
      LODWORD(a1) = a1 - 32;
      ++v6;
      --v10;
    }
    while( v10 );
  }
  if( (_DWORD)a1 )
  {
LABEL_12:
    v7 = -1 << a1;
    goto LABEL_3;
  }
LABEL_4:
  result = *(_DWORD *)(a2 + 132) + *(_DWORD *)(a2 + 136);
  if( (unsigned int)result >= 0x200 )
    _InterlockedOr((volatile signed __int32 *)(a3 + 56), 1u);
  return result;
}

Referenced by:

MiFreePageToSlabAllocator