private static Win32Program InternetShortcutProgram(string path) { try { // We don't want to read the whole file if we don't need to var lines = FileWrapper.ReadLines(path); string iconPath = string.Empty; string urlPath = string.Empty; bool validApp = false; const string urlPrefix = "URL="; const string iconFilePrefix = "IconFile="; foreach (string line in lines) { // Using OrdinalIgnoreCase since this is used internally if (line.StartsWith(urlPrefix, StringComparison.OrdinalIgnoreCase)) { urlPath = line.Substring(urlPrefix.Length); if (!Uri.TryCreate(urlPath, UriKind.RelativeOrAbsolute, out Uri _)) { ProgramLogger.Warn("url could not be parsed", null, MethodBase.GetCurrentMethod().DeclaringType, urlPath); return(InvalidProgram); } // To filter out only those steam shortcuts which have 'run' or 'rungameid' as the hostname if (InternetShortcutURLPrefixes.Match(urlPath).Success) { validApp = true; } } else if (line.StartsWith(iconFilePrefix, StringComparison.OrdinalIgnoreCase)) { iconPath = line.Substring(iconFilePrefix.Length); } // If we resolved an urlPath & and an iconPath quit reading the file if (!string.IsNullOrEmpty(urlPath) && !string.IsNullOrEmpty(iconPath)) { break; } } if (!validApp) { return(InvalidProgram); } try { return(new Win32Program { Name = Path.GetFileNameWithoutExtension(path), ExecutableName = Path.GetFileName(path), IcoPath = iconPath, FullPath = urlPath.ToLowerInvariant(), UniqueIdentifier = path, ParentDirectory = Directory.GetParent(path).FullName, Valid = true, Enabled = true, AppType = ApplicationType.InternetShortcutApplication, }); } catch (Exception e) when(e is SecurityException || e is UnauthorizedAccessException) { ProgramLogger.Warn($"|Permission denied when trying to load the program from {path}", e, MethodBase.GetCurrentMethod().DeclaringType, path); return(InvalidProgram); } } catch (Exception e) { ProgramLogger.Exception($"|An unexpected error occurred in the calling method InternetShortcutProgram at {path}", e, MethodBase.GetCurrentMethod().DeclaringType, path); return(InvalidProgram); } }