/// <summary> /// Get directories which are already used and should be skipped /// </summary> private static IEnumerable <string> GetDirectoriesToSkip(IEnumerable <ApplicationUninstallerEntry> existingUninstallers, IEnumerable <KVP> pfDirectories) { var dirs = new List <string>(); foreach (var x in existingUninstallers) { dirs.Add(x.InstallLocation); dirs.Add(x.UninstallerLocation); if (string.IsNullOrEmpty(x.DisplayIcon)) { continue; } try { var iconFilename = x.DisplayIcon.Contains('.') ? ProcessTools.SeparateArgsFromCommand(x.DisplayIcon).FileName : x.DisplayIcon; dirs.Add(PathTools.GetDirectory(iconFilename)); } catch { // Ignore invalid DisplayIcon paths } } return(dirs.Where(x => !string.IsNullOrEmpty(x)).Distinct() .Where(x => !pfDirectories.Any(pfd => pfd.Key.FullName.Contains(x, StringComparison.InvariantCultureIgnoreCase)))); }
public override IEnumerable <JunkNode> FindJunk() { var returnList = new List <JunkNode>(); returnList.AddRange(ScanForJunk()); returnList.AddRange(ScanFirewallRules()); returnList.AddRange(ScanTracing()); returnList.AddRange(ScanClsid()); returnList.AddRange(ScanAudioPolicyConfig()); returnList.AddRange(ScanUserAssist()); returnList.AddRange(ScanAppCompatFlags()); returnList.AddRange(ScanEventLogs()); returnList.AddRange(ScanInstallerFolders()); if (Uninstaller.RegKeyStillExists()) { var regKeyNode = new RegistryKeyJunkNode(PathTools.GetDirectory(Uninstaller.RegistryPath), Uninstaller.RegistryKeyName, Uninstaller.DisplayName); regKeyNode.Confidence.Add(ConfidencePart.IsUninstallerRegistryKey); returnList.Add(regKeyNode); } return(returnList); }
static UninstallToolsGlobalConfig() { AssemblyLocation = Assembly.GetExecutingAssembly().Location; if (AssemblyLocation.ContainsAny(new[] { ".dll", ".exe" }, StringComparison.OrdinalIgnoreCase)) { AssemblyLocation = PathTools.GetDirectory(AssemblyLocation); } QuestionableDirectoryNames = new[] { "install", "settings", "config", "configuration", "users", "data" }.AsEnumerable(); DirectoryBlacklist = new[] { "Microsoft", "Microsoft Games", "Temp", "Programs", "Common", "Common Files", "Clients", "Desktop", "Internet Explorer", "Windows NT", "Windows Photo Viewer", "Windows Mail", "Windows Defender", "Windows Media Player", "Uninstall Information", "Reference Assemblies", "InstallShield Installation Information" }.AsEnumerable(); StockProgramFiles = new[] { WindowsTools.GetEnvironmentPath(CSIDL.CSIDL_PROGRAM_FILES), WindowsTools.GetProgramFilesX86Path() }.Distinct().ToList().AsEnumerable(); // JunkSearchDirs -------------- var localData = WindowsTools.GetEnvironmentPath(CSIDL.CSIDL_LOCAL_APPDATA); var paths = new List <string> { WindowsTools.GetEnvironmentPath(CSIDL.CSIDL_PROGRAMS), WindowsTools.GetEnvironmentPath(CSIDL.CSIDL_COMMON_PROGRAMS), WindowsTools.GetEnvironmentPath(CSIDL.CSIDL_APPDATA), WindowsTools.GetEnvironmentPath(CSIDL.CSIDL_COMMON_APPDATA), localData //Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) danger? }; var appDataParentDir = Path.GetDirectoryName(localData.TrimEnd('\\', '/', ' ')); if (!string.IsNullOrEmpty(appDataParentDir)) { var lowDir = Path.Combine(appDataParentDir, "LocalLow"); if (Directory.Exists(lowDir)) { paths.Add(lowDir); } } var vsPath = Path.Combine(localData, "VirtualStore"); if (Directory.Exists(vsPath)) { paths.AddRange(Directory.GetDirectories(vsPath)); } JunkSearchDirs = paths.Distinct().ToList().AsEnumerable(); }
public override IEnumerable <JunkNode> FindJunk() { var softwareKeys = GetSoftwareRegKeys(Uninstaller.Is64Bit); var returnList = new List <RegistryJunkNode>(); foreach (var softwareKey in softwareKeys) { FindJunkRecursively(returnList, softwareKey, 0); } if (Uninstaller.RegKeyStillExists()) { var regKeyNode = new RegistryJunkNode(PathTools.GetDirectory(Uninstaller.RegistryPath), Uninstaller.RegistryKeyName, Uninstaller.DisplayName); regKeyNode.Confidence.Add(ConfidencePart.IsUninstallerRegistryKey); returnList.Add(regKeyNode); } return(returnList.Cast <JunkNode>()); }
public static IEnumerable <ApplicationUninstallerEntry> GetApplicationsFromDrive( IEnumerable <ApplicationUninstallerEntry> existingUninstallerEntries, GetUninstallerListCallback callback) { var existingUninstallers = existingUninstallerEntries as IList <ApplicationUninstallerEntry> ?? existingUninstallerEntries.ToList(); var pfDirectories = UninstallToolsGlobalConfig.GetProgramFilesDirectories(true).ToList(); // Get directories which are already used and should be skipped var directoriesToSkip = existingUninstallers.SelectMany(x => { if (!string.IsNullOrEmpty(x.DisplayIcon)) { try { var iconFilename = x.DisplayIcon.Contains('.') ? ProcessTools.SeparateArgsFromCommand(x.DisplayIcon).FileName : x.DisplayIcon; return(new[] { x.InstallLocation, x.UninstallerLocation, PathTools.GetDirectory(iconFilename) }); } catch { // Ignore invalid DisplayIcon paths } } return(new[] { x.InstallLocation, x.UninstallerLocation }); }).Where(x => x.IsNotEmpty()).Select(PathTools.PathToNormalCase) .Where(x => !pfDirectories.Any(pfd => pfd.Key.FullName.Contains(x, StringComparison.InvariantCultureIgnoreCase))) .Distinct().ToList(); // Get sub directories which could contain user programs var directoriesToCheck = pfDirectories.Aggregate(Enumerable.Empty <KeyValuePair <DirectoryInfo, bool?> >(), (a, b) => a.Concat(b.Key.GetDirectories().Select(x => new KeyValuePair <DirectoryInfo, bool?>(x, b.Value)))); // Get directories that can be relatively safely checked var inputs = directoriesToCheck.Where(x => !directoriesToSkip.Any(y => x.Key.FullName.Contains(y, StringComparison.InvariantCultureIgnoreCase) || y.Contains(x.Key.FullName, StringComparison.InvariantCultureIgnoreCase))).ToList(); var results = new List <ApplicationUninstallerEntry>(); var itemId = 0; foreach (var directory in inputs) { itemId++; var progress = new GetUninstallerListProgress(inputs.Count) { CurrentCount = itemId }; callback(progress); if (UninstallToolsGlobalConfig.IsSystemDirectory(directory.Key) || directory.Key.Name.StartsWith("Windows", StringComparison.InvariantCultureIgnoreCase)) { continue; } //Try to get the main executable from the filtered folders. If no executables are present check subfolders. var detectedEntries = ApplicationUninstallerFactory.TryCreateFromDirectory(directory.Key, directory.Value); results.AddRange(detectedEntries.Where(detected => !existingUninstallers.Any(existing => { if (!string.IsNullOrEmpty(existing.DisplayName) && !string.IsNullOrEmpty(detected.DisplayNameTrimmed) && existing.DisplayName.Contains(detected.DisplayNameTrimmed)) { return(!existing.IsInstallLocationValid() || detected.InstallLocation.Contains(existing.InstallLocation, StringComparison.CurrentCultureIgnoreCase)); } return(false); }))); //if (result != null && !existingUninstallers.Any(x => x.DisplayName.Contains(result.DisplayNameTrimmed))) // results.Add(result); } return(results); }