public IEnumerable <IJunkResult> FindJunk(ApplicationUninstallerEntry target) { var results = new List <RegistryKeyJunk>(); using (var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(TracingKey)) { if (key != null) { foreach (var subKeyName in key.GetSubKeyNames()) { var i = subKeyName.LastIndexOf('_'); if (i <= 0) { continue; } var str = subKeyName.Substring(0, i); var conf = ConfidenceGenerators.GenerateConfidence(str, Path.Combine(FullTracingKey, subKeyName), 0, target).ToList(); if (conf.Any()) { var node = new RegistryKeyJunk(Path.Combine(FullTracingKey, subKeyName), target, this); node.Confidence.AddRange(conf); results.Add(node); } } } } ConfidenceGenerators.TestForSimilarNames(target, _allEntries, results.Select(x => new KeyValuePair <JunkResultBase, string>(x, x.RegKeyName)).ToList()); return(results.Cast <IJunkResult>()); }
private IEnumerable <RegistryKeyJunk> FindJunkRecursively(RegistryKey softwareKey, int level = -1) { var added = new List <RegistryKeyJunk>(); IEnumerable <RegistryKeyJunk> returnList = added; try { // Don't try to scan root keys if (level > -1) { var keyName = Path.GetFileName(softwareKey.Name); var keyDir = Path.GetDirectoryName(softwareKey.Name); var confidence = ConfidenceGenerators.GenerateConfidence(keyName, keyDir, level, _uninstaller).ToList(); // Check if application's location is explicitly mentioned in any of the values if (softwareKey.TryGetValueNames().Any(valueName => TestValueForMatches(softwareKey, valueName))) { confidence.Add(ConfidenceRecords.ExplicitConnection); } if (confidence.Any()) { // TODO Add extra confidence if the key is, or will be empty after junk removal var newNode = new RegistryKeyJunk(softwareKey.Name, _uninstaller, this); newNode.Confidence.AddRange(confidence); added.Add(newNode); } } // Limit recursion depth if (level <= 1) { foreach (var subKeyName in softwareKey.GetSubKeyNames()) { if (KeyBlacklist.Contains(subKeyName, StringComparison.InvariantCultureIgnoreCase)) { continue; } using (var subKey = softwareKey.OpenSubKey(subKeyName, false)) { if (subKey != null) { returnList = returnList.Concat(FindJunkRecursively(subKey, level + 1)); } } } } ConfidenceGenerators.TestForSimilarNames(_uninstaller, AllUninstallers, added.Select(x => new KeyValuePair <JunkResultBase, string>(x, x.RegKeyName)).ToList()); } // Reg key invalid catch (ArgumentException) { } catch (SecurityException) { } catch (ObjectDisposedException) { } return(returnList); }
private IEnumerable <FileSystemJunk> FindJunkRecursively(DirectoryInfo directory, ApplicationUninstallerEntry uninstaller, int level = 0) { var added = new List <FileSystemJunk>(); IEnumerable <FileSystemJunk> results = added; try { var dirs = directory.GetDirectories(); foreach (var dir in dirs) { if (UninstallToolsGlobalConfig.IsSystemDirectory(dir)) { continue; } var generatedConfidence = GenerateConfidence(dir.GetNameWithoutExtension(), directory.FullName, uninstaller, level).ToList(); FileSystemJunk newNode = null; if (generatedConfidence.Any()) { newNode = new FileSystemJunk(dir, uninstaller, this); newNode.Confidence.AddRange(generatedConfidence); if (CheckIfDirIsStillUsed(dir.FullName, GetOtherInstallLocations(uninstaller))) { newNode.Confidence.Add(ConfidenceRecords.DirectoryStillUsed); } added.Add(newNode); } if (level > 1) { continue; } var junkNodes = FindJunkRecursively(dir, uninstaller, level + 1).ToList(); results = results.Concat(junkNodes); if (newNode != null) { // Check if the directory will have nothing left after junk removal. if (!dir.GetFiles().Any()) { var subDirs = dir.GetDirectories(); if (!subDirs.Any() || subDirs.All(d => junkNodes.Any(y => PathTools.PathsEqual(d.FullName, y.Path.FullName)))) { newNode.Confidence.Add(ConfidenceRecords.AllSubdirsMatched); } } } } ConfidenceGenerators.TestForSimilarNames(uninstaller, AllUninstallers, added.Select(x => new KeyValuePair <JunkResultBase, string>(x, x.Path.GetNameWithoutExtension())).ToList()); } catch (Exception ex) { if (Debugger.IsAttached) { throw; } Console.WriteLine(ex); } return(results); }