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