AlpcpValidateAndSetPortAttributes

INT64 __fastcall AlpcpValidateAndSetPortAttributes(
        _ALPC_PORT *PortObject,
        _ALPC_PORT_ATTRIBUTES *CapturedPortAttributes,
        _ALPC_PORT *ConnectionPort,
        _SECURITY_QUALITY_OF_SERVICE *CapturedQos,
        UINT64 MaxMessageLength,
        INT64 Waitable,
        INT64 LegacyPort){
  unsigned int Flags; 
  unsigned __int64 v12; 
  INT64 v13; 
  int v14; 
  unsigned int v15; 
  unsigned __int64 v16; 
  _DWORD result[4]; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  int v24; 
  memset((INT64)result, 0i64);
  if( CapturedPortAttributes )
  {
    if( CapturedPortAttributes->MaxMessageLength - 40 > 0xFFD7 )
      return 3221225485i64;
    Flags = CapturedPortAttributes->Flags;
    if( (CapturedPortAttributes->Flags & 0x100000) != 0 )
    {
      if( *((_BYTE *)KeGetCurrentThread() + 562) )
        return 3221225485i64;
    }
    CapturedPortAttributes->DupObjectTypes &= 0xFFDu;
    CapturedPortAttributes->Flags = Flags & 0x3FF0000;
  }
  else
  {
    v20 = 0x4000i64;
    CapturedPortAttributes = (_ALPC_PORT_ATTRIBUTES *)result;
    v21 = 0x4000i64;
    result[3] = 257;
    v14 = result[0];
    if( (_BYTE)LegacyPort )
      v14 = 4096;
    result[0] = v14;
    v18 = 512i64;
    v23 = 0x20000i64;
    v22 = 0i64;
    v19 = 0i64;
    *(_QWORD *)&result[1] = 12i64;
    v24 = 0;
  }
  if( ((*((_DWORD *)PortObject + 104) >> 1) & 3) == 1 )
  {
    v15 = CapturedPortAttributes->Flags | 0x20000;
    CapturedPortAttributes->Flags = v15;
    if( !(_BYTE)LegacyPort )
      goto LABEL_13;
    v16 = (unsigned int)MaxMessageLength;
    if( (unsigned int)MaxMessageLength <= LpcLegacyMaxMessageLength )
    {
      if( (_BYTE)Waitable )
        CapturedPortAttributes->Flags = v15 | 0x40000;
LABEL_28:
      CapturedPortAttributes->MaxMessageLength = v16;
      goto LABEL_13;
    }
    return 3221225485i64;
  }
  if( ((*((_DWORD *)PortObject + 104) >> 1) & 3) != 2 )
  {
    CapturedPortAttributes->Flags &= ~0x20000u;
    if( !(_BYTE)LegacyPort )
      goto LABEL_13;
    v16 = *((_QWORD *)ConnectionPort + 34);
    if( v16 <= (unsigned int)LpcLegacyMaxMessageLength )
      goto LABEL_28;
    return 3221225485i64;
  }
  if( CapturedPortAttributes == (_ALPC_PORT_ATTRIBUTES *)result )
    CapturedPortAttributes->Flags |= 0x10000u;
  if( (_BYTE)LegacyPort )
  {
    CapturedPortAttributes->Flags |= 0x20000u;
    if( CapturedQos )
    {
      *(_QWORD *)&CapturedPortAttributes->SecurityQos.Length = *(_QWORD *)&CapturedQos->Length;
      *(_DWORD *)&CapturedPortAttributes->SecurityQos.ContextTrackingMode = *(_DWORD *)&CapturedQos->ContextTrackingMode;
    }
    v12 = *((_QWORD *)ConnectionPort + 34);
    goto LABEL_22;
  }
  v12 = *((_QWORD *)ConnectionPort + 34);
  if( CapturedPortAttributes->MaxMessageLength > v12 )
LABEL_22:
    CapturedPortAttributes->MaxMessageLength = v12;
LABEL_13:
  v13 = SeValidateSecurityQos(&CapturedPortAttributes->SecurityQos);
  if( (int)v13 >= 0 )
  {
    v13 = 0i64;
    *((_OWORD *)PortObject + 16) = *(_OWORD *)&CapturedPortAttributes->Flags;
    *((_OWORD *)PortObject + 17) = *(_OWORD *)&CapturedPortAttributes->MaxMessageLength;
    *((_OWORD *)PortObject + 18) = *(_OWORD *)&CapturedPortAttributes->MaxPoolUsage;
    *((_OWORD *)PortObject + 19) = *(_OWORD *)&CapturedPortAttributes->MaxViewSize;
    *((_QWORD *)PortObject + 40) = *(_QWORD *)&CapturedPortAttributes->DupObjectTypes;
  }
  return v13;
}

Referenced by:

AlpcpAcceptConnectPort
AlpcpCreateClientPort
AlpcpCreateConnectionPort