WbGetWarbirdThread
NTSTATUS __fastcall WbGetWarbirdThread(INT64 a1, INT64 a2, INT64 **a3){
_ETHREAD *CurrentThread;
__int64 v4;
_EX_PUSH_LOCK *v7;
_BYTE *v8;
NTSTATUS v9;
INT64 v10;
_ETHREAD *v12;
_BYTE *v13;
INT64 v14;
_BYTE *v15;
INT64 v16;
char v17;
UINT64 v18;
INT64 v19;
INT64 v20;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = 0i64;
v20 = 0i64;
--CurrentThread->Tcb.SpecialApcDisable;
v7 = (_EX_PUSH_LOCK *)(a1 + 128);
v8 = KeAbPreAcquire((VOID *)(a1 + 128), 0i64, 0i64);
if( _InterlockedCompareExchange64(&v7->_bf_0, 17i64, 0i64) )
ExfAcquirePushLockSharedEx(v7, v8, v7);
if( v8 )
v8[26] |= 1u;
v19 = 0i64;
v9 = sub_14065EB58(a1 + 88, (__int64)CurrentThread, 8u, &v19, 0i64);
if( v9 >= 0 )
{
v10 = v19;
if( v19 )
{
_InterlockedIncrement64((volatile signed __int64 *)(v19 + 8));
v10 = v19;
}
v20 = v10;
}
if( _InterlockedCompareExchange64(&v7->_bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v7);
KeAbPostRelease(v7);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
if( v9 == -1073741198 )
{
v9 = sub_14064F8DC((_EX_PUSH_LOCK *)a1, (__int64)CurrentThread, &v20);
if( v9 < 0 )
{
LABEL_25:
v4 = v20;
goto LABEL_15;
}
v12 = (_ETHREAD *)KeGetCurrentThread();
--v12->Tcb.SpecialApcDisable;
v13 = KeAbPreAcquire(v7, 0i64, 0i64);
v15 = v13;
if( _interlockedbittestandset64((volatile signed __int32 *)v7, 0i64) )
ExfAcquirePushLockExclusiveEx(v7, v13, v7);
if( v15 )
v15[26] |= 1u;
v16 = v20;
LODWORD(v18) = -1;
v9 = sub_14065FDF0((INT64 *)(a1 + 88), v20, v14, *(_QWORD *)v20, 8, v18);
if( v9 >= 0 )
_InterlockedIncrement64((volatile signed __int64 *)(v16 + 8));
v17 = _InterlockedExchangeAdd64(&v7->_bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v17 & 2) != 0 && (v17 & 4) == 0 )
ExfTryToWakePushLock(v7);
KeAbPostRelease(v7);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
if( v9 < 0 || !a3 )
goto LABEL_25;
*a3 = (INT64 *)v20;
LABEL_15:
sub_14065E6C8((_EX_PUSH_LOCK *)a1, v4);
return v9;
}Referenced by:
WbHeapExecuteCall
sub_14065EC80