AlpcpCaptureSecurityAttributeInternal
INT64 __fastcall AlpcpCaptureSecurityAttributeInternal(
_ALPC_PORT *PortObject,
UINT64 Flags,
_SECURITY_QUALITY_OF_SERVICE *QualityOfService,
VOID **Handle,
_KALPC_MESSAGE_ATTRIBUTES *MessageAttributes){
int v6;
__int64 v8;
_ALPC_PORT **v9;
_KALPC_SECURITY_DATA *v10;
INT64 result;
char v12;
_KALPC_SECURITY_DATA **v13;
v6 = Flags;
if( (Flags & 0xFFFCFFFF) != 0 || (Flags & 0x30000) == 196608 )
return 3221225485i64;
if( *Handle != (VOID *)-2i64 )
{
v8 = *((_QWORD *)PortObject + 2);
if( v8 )
{
v9 = (_ALPC_PORT **)AlpcReferenceBlobByHandle((_ALPC_HANDLE_TABLE *)(v8 + 40), *Handle, &AlpcSecurityType);
v10 = (_KALPC_SECURITY_DATA *)v9;
if( v9 )
{
if( PortObject == v9[3] )
{
if( (v6 & 0x10000) != 0 )
{
if( AlpcpDeleteBlob(v9) )
AlpcpDereferenceBlobEx(v10, 1i64);
AlpcpDereferenceBlobEx(v10, 1i64);
v10 = 0i64;
}
MessageAttributes->SecurityData = v10;
return 0i64;
}
else
{
AlpcpDereferenceBlobEx(v9, 1i64);
return 3221225506i64;
}
}
}
return 3221225480i64;
}
if( (Flags & 0x20000) != 0 )
{
v12 = 1;
}
else
{
if( (Flags & 0x10000) != 0 )
return 3221225480i64;
v12 = 0;
}
v13 = (_KALPC_SECURITY_DATA **)QualityOfService;
LOBYTE(QualityOfService) = v12;
result = AlpcpCreateSecurityContext(PortObject, (INT64)KeGetCurrentThread(), QualityOfService, v13);
if( (int)result >= 0 )
{
MessageAttributes->SecurityData = 0i64;
if( v12 )
*Handle = (VOID *)MEMORY[8];
}
return result;
}Referenced by:
AlpcpCaptureSecurityAttribute
AlpcpCaptureSecurityAttribute32