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