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