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