AlpcpReferenceConnectedPort

_ALPC_PORT *__fastcall AlpcpReferenceConnectedPort(_ALPC_PORT *PortObject){
  _ALPC_PORT *v2; 
  __int64 v3; 
  int v4; 
  v2 = 0i64;
  if( (*((_DWORD *)PortObject + 104) & 6) != 2 )
  {
    v3 = *((_QWORD *)PortObject + 2);
    if( !v3 )
      return v2;
    ExAcquirePushLockSharedEx(v3 - 16, 0i64);
    v4 = *((_DWORD *)PortObject + 104) & 6;
    if( v4 == 4 )
    {
      v2 = *(_ALPC_PORT **)(v3 + 8);
    }
    else
    {
      if( v4 != 6 )
      {
LABEL_9:
        if( _InterlockedCompareExchange64((volatile signed __int64 *)(v3 - 16), 0i64, 17i64) != 17 )
          ExfReleasePushLockShared((INT64 *)(v3 - 16));
        KeAbPostRelease((PVOID)(v3 - 16));
        return v2;
      }
      v2 = *(_ALPC_PORT **)(v3 + 16);
    }
    if( v2 && !ObReferenceObjectSafe(v2) )
      v2 = 0i64;
    goto LABEL_9;
  }
  ObfReferenceObject(PortObject);
  return PortObject;
}

Referenced by:

AlpcpExposeHandleAttribute
AlpcpImpersonateMessage
AlpcpPortQueryConnectedSidInfo
AlpcpPortQueryServerSessionInfo
NtAlpcImpersonateClientOfPort