WbAllocateSlots

INT64 __fastcall WbAllocateSlots(INT64 a1, UINT64 a2, INT64 a3, INT64 a4){
  INT64 v4; 
  unsigned int v5; 
  _ETHREAD *CurrentThread; 
  int v7; 
  unsigned int v8; 
  UINT64 *v10; 
  _BYTE *v11; 
  _BYTE *v12; 
  signed __int64 v13; 
  unsigned int v14; 
  _BYTE *v15; 
  int v16; 
  _ETHREAD *v17; 
  _BYTE *v18; 
  _BYTE *v19; 
  char v20; 
  v4 = 0i64;
  v5 = a4;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v7 = a3;
  v8 = a2;
  --*((_WORD *)CurrentThread + 243);
  v10 = (UINT64 *)(a1 + 1072);
  LODWORD(v11) = KeAbPreAcquire((PVOID)(a1 + 1072), 0i64, 0i64);
  v12 = v11;
  if( _InterlockedCompareExchange64((volatile signed __int64 *)v10, 17i64, 0i64) )
    ExfAcquirePushLockSharedEx(v10, v11, v10);
  v13 = 0i64;
  if( v12 )
    v12[26] |= 1u;
  v14 = v7 + 1;
  while( 1 )
  {
    if( v8 >= v14 )
    {
LABEL_10:
      v8 = -1;
    }
    else
    {
      v15 = (_BYTE *)(v8 + a1 + 44);
      while( *v15 != (_BYTE)v13 )
      {
        ++v8;
        ++v15;
        if( v8 >= v14 )
          goto LABEL_10;
      }
    }
    if( v8 == -1 )
      break;
    v16 = sub_14065FD40(a1, v8 + 1, v5 - 1);
    if( v16 == -1 )
      break;
    v8 = v16 + 1;
  }
  if( _InterlockedCompareExchange64((volatile signed __int64 *)v10, v13, 17i64) != 17 )
    ExfReleasePushLockShared((INT64 *)v10);
  KeAbPostRelease(v10);
  KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
  if( v8 != -1 )
  {
    v17 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v17 + 243);
    LODWORD(v18) = KeAbPreAcquire(v10, 0i64, 0i64);
    v19 = v18;
    if( _interlockedbittestandset64((volatile signed __int32 *)v10, 0i64) )
      ExfAcquirePushLockExclusiveEx(v10, v18, v10);
    if( v19 )
      v19[26] |= 1u;
    if( (unsigned int)sub_14065FD40(a1, v8, v5) == -1 )
    {
      v4 = *(_QWORD *)(a1 + 32) + (v8 << 6);
      if( v5 )
        memset(a1 + v8 + 44i64, 2i64);
      *(_BYTE *)(v8 + v5 - 1 + a1 + 44) = 1;
    }
    v20 = _InterlockedExchangeAdd64((volatile signed __int64 *)v10, 0xFFFFFFFFFFFFFFFFui64);
    if( (v20 & 2) != 0 && (v20 & 4) == 0 )
      ExfTryToWakePushLock((volatile INT64 *)v10);
    KeAbPostRelease(v10);
    KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
  }
  return v4;
}

Referenced by:

sub_14065FACC