ArbAllocateEntry

__int64 __fastcall ArbAllocateEntry(__int64 a1, unsigned __int64 a2){
  char v2; 
  unsigned __int64 v5; 
  char v6; 
  unsigned __int64 v7; 
  __int64 result; 
  _QWORD *i; 
  __int64 v10; 
  __int64 v11; 
  unsigned int v12; 
  __int64 v13; 
  __int16 v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  v2 = 0;
  v5 = a2;
  v6 = 0;
  v7 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart + 10000000i64;
  while( 1 )
  {
    while( 1 )
    {
      if( v5 < a2 || !*(_QWORD *)(v5 + 32) )
      {
        for( i = (_QWORD *)(a2 + 32); *i; i += 10 )
        {
          (*(void(__fastcall **)(_QWORD, _QWORD, _QWORD))(a1 + 128))(
            *(_QWORD *)(i[1] + 40i64),
            *(i - 4),
            *(_QWORD *)(*i + 72i64));
          v10 = i[1];
          v11 = *i;
          *(_QWORD *)(v11 + 80) = *(_QWORD *)(v10 + 40);
        }
        v12 = 0;
        goto LABEL_15;
      }
      result = (*(__int64(__fastcall **)(__int64, unsigned __int64))(a1 + 224))(a1, v5);
      if( (int)result < 0 )
        return result;
      if( !v2 )
        break;
      v13 = *(_QWORD *)(v5 + 40);
      v2 = 0;
      *(_QWORD *)(v5 + 120) = 0i64;
      if( !*(_QWORD *)(v13 + 16) )
        goto LABEL_18;
      (*(void(__fastcall **)(__int64, unsigned __int64))(a1 + 264))(a1, v5);
      v14 = *(_WORD *)(v5 + 64);
      if( (v14 & 0x40) != 0 )
      {
        *(_WORD *)(v5 + 64) = v14 & 0xFFBF;
        goto LABEL_18;
      }
      v15 = *(_QWORD *)v5 - 1i64;
      if( v15 > *(_QWORD *)v5
        || v15 < **(_QWORD **)(v5 + 40)
        || *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart > v7 )
      {
        break;
      }
      *(_QWORD *)(v5 + 24) = v15;
LABEL_7:
      if( !(*(unsigned __int8(__fastcall **)(__int64, unsigned __int64))(a1 + 248))(a1, v5) )
        break;
      if( *(_QWORD *)(*(_QWORD *)(v5 + 40) + 16i64) )
        (*(void(__fastcall **)(__int64, unsigned __int64))(a1 + 256))(a1, v5);
      else
        *(_DWORD *)(*(_QWORD *)(v5 + 32) + 88i64) = 2;
      v5 += 80i64;
    }
    if( (*(unsigned __int8(__fastcall **)(__int64, unsigned __int64))(a1 + 240))(a1, v5) )
      goto LABEL_7;
LABEL_18:
    if( (*(_BYTE *)(v5 + 64) & 0x20) != 0 )
      v6 = 1;
    if( v5 == a2 )
      break;
    v2 = 1;
    v5 -= 80i64;
  }
  v12 = v6 != 0 ? -1073739512 : -1073741823;
LABEL_15:
  if( *(_QWORD *)(a2 + 32) )
  {
    v16 = a2 + 64;
    do
    {
      if( (*(_BYTE *)v16 & 0x10) != 0 )
      {
        ExFreePoolWithTag(*(PVOID *)(v16 + 8), 0);
        *(_QWORD *)(v16 + 8) = 0i64;
        *(_WORD *)v16 &= ~0x10u;
      }
      v16 += 80i64;
    }
    while( *(_QWORD *)(v16 - 32) );
  }
  return v12;
}

Referenced by:

No references.