AlpcpReferenceMessageByWaitingThreadPort
_QWORD *__fastcall AlpcpReferenceMessageByWaitingThreadPort(__int64 a1, __int64 a2){
INT64 *v2;
volatile signed __int64 *v5;
_QWORD *v6;
v2 = (INT64 *)(a2 + 352);
ExAcquirePushLockSharedEx(a2 + 352, 0i64);
if( (*(_DWORD *)(a2 + 416) & 0x41) != 1 )
{
v6 = 0i64;
goto LABEL_14;
}
v5 = (volatile signed __int64 *)(a2 + 136);
ExAcquirePushLockExclusiveEx(a2 + 136, 0i64);
v6 = AlpcpReferenceMessageByWaitingThreadPortQueue(a1, (_QWORD **)(a2 + 144));
if( v6 )
goto LABEL_3;
v6 = AlpcpReferenceMessageByWaitingThreadPortQueue(a1, (_QWORD **)(a2 + 160));
if( (_InterlockedExchangeAdd64(v5, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(a2 + 136));
KeAbPostRelease((PVOID)(a2 + 136));
if( !v6 )
{
ExAcquirePushLockExclusiveEx(a2 + 176, 0i64);
v6 = AlpcpReferenceMessageByWaitingThreadPortQueue(a1, (_QWORD **)(a2 + 184));
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(a2 + 176), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(a2 + 176));
KeAbPostRelease((PVOID)(a2 + 176));
if( !v6 )
{
v5 = (volatile signed __int64 *)(a2 + 200);
ExAcquirePushLockExclusiveEx(a2 + 200, 0i64);
v6 = AlpcpReferenceMessageByWaitingThreadPortQueue(a1, (_QWORD **)(a2 + 208));
LABEL_3:
if( (_InterlockedExchangeAdd64(v5, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v5);
KeAbPostRelease((PVOID)v5);
}
}
LABEL_14:
if( _InterlockedCompareExchange64(v2, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v2);
KeAbPostRelease(v2);
return v6;
}Referenced by:
AlpcpReferenceMessageByWaitingThread