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