WbGetWarbirdThread
INT64 __fastcall WbGetWarbirdThread(INT64 a1, INT64 a2, INT64 **r8_0){
_ETHREAD *CurrentThread;
INT64 v4;
UINT64 *v7;
_BYTE *v8;
_BYTE *v9;
int v10;
INT64 *v11;
_ETHREAD *v13;
_BYTE *v14;
INT64 v15;
_BYTE *v16;
INT64 *v17;
char v18;
INT64 *a5;
UINT64 a6;
INT64 *a4;
INT64 *a3;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = 0i64;
a3 = 0i64;
--*((_WORD *)CurrentThread + 243);
v7 = (UINT64 *)(a1 + 128);
LODWORD(v8) = KeAbPreAcquire((PVOID)(a1 + 128), 0i64, 0i64);
v9 = v8;
if( _InterlockedCompareExchange64((volatile signed __int64 *)v7, 17i64, 0i64) )
ExfAcquirePushLockSharedEx(v7, v8, v7);
if( v9 )
v9[26] |= 1u;
a4 = 0i64;
v10 = sub_14065EB58(a1 + 88, (INT64)CurrentThread, 8ui64, &a4, 0i64);
if( v10 >= 0 )
{
v11 = a4;
if( a4 )
{
_InterlockedIncrement64(a4 + 1);
v11 = a4;
}
a3 = v11;
}
if( _InterlockedCompareExchange64((volatile signed __int64 *)v7, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)v7);
KeAbPostRelease(v7);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
if( v10 == -1073741198 )
{
v10 = sub_14064F8DC(a1, (INT64)CurrentThread, &a3);
if( v10 < 0 )
{
LABEL_25:
v4 = (INT64)a3;
goto LABEL_15;
}
v13 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v13 + 243);
LODWORD(v14) = KeAbPreAcquire(v7, 0i64, 0i64);
v16 = v14;
if( _interlockedbittestandset64((volatile signed __int32 *)v7, 0i64) )
ExfAcquirePushLockExclusiveEx(v7, v14, v7);
if( v16 )
v16[26] |= 1u;
v17 = a3;
LODWORD(a6) = -1;
LODWORD(a5) = 8;
v10 = sub_14065FDF0((INT64 *)(a1 + 88), (INT64)a3, v15, *a3, (INT64)a5, a6);
if( v10 >= 0 )
_InterlockedIncrement64(v17 + 1);
v18 = _InterlockedExchangeAdd64((volatile signed __int64 *)v7, 0xFFFFFFFFFFFFFFFFui64);
if( (v18 & 2) != 0 && (v18 & 4) == 0 )
ExfTryToWakePushLock((volatile INT64 *)v7);
KeAbPostRelease(v7);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
if( v10 < 0 || !r8_0 )
goto LABEL_25;
*r8_0 = a3;
LABEL_15:
sub_14065E6C8(a1, v4);
return(unsigned int)v10;
}Referenced by:
WbHeapExecuteCall
sub_14065EC80