WbGetWarbirdProcess

INT64 __fastcall WbGetWarbirdProcess(INT64 a1, INT64 rdx0, INT64 **a3){
  volatile signed __int64 *v3; 
  _ETHREAD *CurrentThread; 
  int v6; 
  _BYTE *v8; 
  _BYTE *v9; 
  int v10; 
  _ETHREAD *v12; 
  _BYTE *v13; 
  INT64 v14; 
  _BYTE *v15; 
  INT64 v16; 
  char v17; 
  INT64 a5; 
  UINT64 a6; 
  INT64 a2; 
  v3 = 0i64;
  a2 = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v6 = rdx0;
  --*((_WORD *)CurrentThread + 243);
  LODWORD(v8) = KeAbPreAcquire(&qword_140C53AF8, 0i64, 0i64);
  v9 = v8;
  if( _InterlockedCompareExchange64((volatile signed __int64 *)&qword_140C53AF8, 17i64, 0i64) )
    ExfAcquirePushLockSharedEx(&qword_140C53AF8, v8, &qword_140C53AF8);
  if( v9 )
    v9[26] |= 1u;
  v10 = sub_14065EAF4(a1, &a2);
  if( _InterlockedCompareExchange64((volatile signed __int64 *)&qword_140C53AF8, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared((INT64 *)&qword_140C53AF8);
  KeAbPostRelease(&qword_140C53AF8);
  KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
  if( v10 == -1073741198 )
  {
    if( !v6 )
      goto LABEL_24;
    v10 = WbCreateWarbirdProcess(a1, &a2);
    if( v10 < 0 )
      goto LABEL_24;
    v12 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v12 + 243);
    LODWORD(v13) = KeAbPreAcquire(&qword_140C53AF8, 0i64, 0i64);
    v15 = v13;
    if( _interlockedbittestandset64((volatile signed __int32 *)&qword_140C53AF8, 0i64) )
      ExfAcquirePushLockExclusiveEx(&qword_140C53AF8, v13, &qword_140C53AF8);
    if( v15 )
      v15[26] |= 1u;
    v16 = a2;
    LODWORD(a6) = -1;
    LODWORD(a5) = 8;
    v10 = sub_14065FDF0(&qword_140C53AD0, a2, v14, *(_QWORD *)a2, a5, a6);
    if( v10 >= 0 )
      _InterlockedIncrement64((volatile signed __int64 *)(v16 + 232));
    v17 = _InterlockedExchangeAdd64((volatile signed __int64 *)&qword_140C53AF8, 0xFFFFFFFFFFFFFFFFui64);
    if( (v17 & 2) != 0 && (v17 & 4) == 0 )
      ExfTryToWakePushLock((volatile INT64 *)&qword_140C53AF8);
    KeAbPostRelease(&qword_140C53AF8);
    KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
  }
  if( v10 < 0 || !a3 )
  {
LABEL_24:
    v3 = (volatile signed __int64 *)a2;
    goto LABEL_11;
  }
  *a3 = (INT64 *)a2;
LABEL_11:
  sub_14065E8E4(v3);
  return(unsigned int)v10;
}

Referenced by:

WbDispatchOperation