WbGetWarbirdProcess
NTSTATUS __stdcall WbGetWarbirdProcess(INT64 a1, INT64 a2, INT64 **a3){
__int64 v3;
_ETHREAD *CurrentThread;
int v6;
_BYTE *v8;
NTSTATUS v9;
UINT64 v10;
_LARGE_INTEGER v11;
VOID *v12;
_ETHREAD *v14;
_BYTE *v15;
INT64 v16;
_BYTE *v17;
INT64 v18;
char v19;
UINT64 v20;
INT64 v21;
v3 = 0i64;
v21 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = a2;
--CurrentThread->Tcb.SpecialApcDisable;
v8 = KeAbPreAcquire(&LockPointer, 0i64, 0i64);
if( _InterlockedCompareExchange64(&LockPointer._bf_0, 17i64, 0i64) )
ExfAcquirePushLockSharedEx(&LockPointer, v8, &LockPointer);
if( v8 )
v8[26] |= 1u;
v9 = sub_14065EAF4(a1, &v21);
if( _InterlockedCompareExchange64(&LockPointer._bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(&LockPointer);
KeAbPostRelease(&LockPointer);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
if( v9 == -1073741198 )
{
if( !v6 )
goto LABEL_24;
v9 = WbCreateWarbirdProcess(a1, &v21);
if( v9 < 0 )
goto LABEL_24;
v14 = (_ETHREAD *)KeGetCurrentThread();
--v14->Tcb.SpecialApcDisable;
v15 = KeAbPreAcquire(&LockPointer, 0i64, 0i64);
v17 = v15;
if( _interlockedbittestandset64((volatile signed __int32 *)&LockPointer, 0i64) )
ExfAcquirePushLockExclusiveEx(&LockPointer, v15, &LockPointer);
if( v17 )
v17[26] |= 1u;
v18 = v21;
LODWORD(v20) = -1;
v9 = sub_14065FDF0(&qword_140C53AD0, v21, v16, *(_QWORD *)v21, 8, v20);
if( v9 >= 0 )
_InterlockedIncrement64((volatile signed __int64 *)(v18 + 232));
v19 = _InterlockedExchangeAdd64(&LockPointer._bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v19 & 2) != 0 && (v19 & 4) == 0 )
ExfTryToWakePushLock(&LockPointer);
KeAbPostRelease(&LockPointer);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
if( v9 < 0 || !a3 )
{
LABEL_24:
v3 = v21;
goto LABEL_11;
}
*a3 = (INT64 *)v21;
LABEL_11:
sub_14065E8E4(v3, v10, v11, v12);
return v9;
}Referenced by:
WbDispatchOperation