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