MiGetPageFromSlabEntry

NTSTATUS __stdcall MiGetPageFromSlabEntry(INT64 a1, INT64 a2){
  unsigned __int64 v4; 
  __int64 v5; 
  unsigned int v6; 
  unsigned int v7; 
  unsigned int v8; 
  unsigned int v9; 
  int v10; 
  __int64 v11; 
  unsigned int v12; 
  unsigned int v13; 
  __int64 *v14; 
  __int64 i; 
  unsigned __int64 v16; 
  unsigned int v17; 
  unsigned int v18; 
  unsigned int v19; 

  if( !*(_DWORD *)(a1 + 132) )
  {
LABEL_18:
    LODWORD(v5) = -1;
    return v5;
  }
  v4 = *(_DWORD *)(a1 + 128) & (unsigned int)-(*(_DWORD *)(a1 + 128) < 0x200u);
  if( _bittest64(*(const signed __int64 **)(a1 + 56), v4)
    || !RtlInterlockedSetClearRun(a1 + 48, (unsigned int)v4, 1ui64) )
  {
    do
    {
      v6 = *(_DWORD *)(a1 + 48);
      v7 = v4 + 1;
      v8 = v7 < v6 ? v7 : 0;
      v9 = v6 - 1;
      v10 = (*(_DWORD *)(a1 + 56) & 4) != 0i64 ? 0x20 : 0;
      v11 = *(_QWORD *)(a1 + 56) - ((*(_QWORD *)(a1 + 56) & 4i64) != 0 ? 4 : 0);
      while( 1 )
      {
        v12 = v10 + v9;
        v13 = v10 + v8;
        if( v9 - v8 == -1 )
          goto LABEL_19;
        v14 = (__int64 *)(v11 + 8 * ((unsigned __int64)v13 >> 6));
        for( i = *v14 | ((1i64 << (v13 & 0x3F)) - 1); i == -1; i = *v14 )
        {
          if( (unsigned __int64)++v14 > v11 + 8 * ((unsigned __int64)v12 >> 6) )
            goto LABEL_19;
        }
        _BitScanForward64(&v16, ~i);
        v17 = v16 + ((unsigned int)(((__int64)v14 - v11) >> 3) << 6);
        if( v17 > v12 )
        {
LABEL_19:
          v17 = -1;
        }
        else if( v17 != -1 )
        {
          break;
        }
        if( !v8 )
          break;
        v19 = v7 + 1;
        if( v7 + 1 > v6 )
          v19 = *(_DWORD *)(a1 + 48);
        v9 = v19 - 1;
        v8 = 0;
      }
      v18 = v17 - v10;
      if( v17 == -1 )
        v18 = -1;
      LODWORD(v4) = v18;
      if( v18 == -1 )
        goto LABEL_18;
    }
    while( !RtlInterlockedSetClearRun(a1 + 48, v18, 1ui64) );
  }
  _InterlockedDecrement((volatile signed __int32 *)(a1 + 132));
  _InterlockedDecrement((volatile signed __int32 *)(a2 + 32));
  *(_DWORD *)(a1 + 128) = v4 + 1;
  return *(_QWORD *)(a1 + 24) + v4;
}

Referenced by:

MiGetPageFromSlabAllocator