public IEnumerable <ApplicationUninstallerEntry> GetUninstallerEntries(ListGenerationProgress.ListGenerationCallback progressCallback) { progressCallback(new ListGenerationProgress(0, -1, Localisation.Progress_DriveScan_Gathering)); var existingUninstallers = _existingUninstallerEntries.ToList(); var pfDirs = UninstallToolsGlobalConfig.GetProgramFilesDirectories(true).ToList(); var dirsToSkip = GetDirectoriesToSkip(existingUninstallers, pfDirs).ToList(); var itemsToScan = GetDirectoriesToScan(existingUninstallers, pfDirs, dirsToSkip).ToList(); var progress = 0; var results = new List <ApplicationUninstallerEntry>(); foreach (var directory in itemsToScan) { progressCallback(new ListGenerationProgress(progress++, itemsToScan.Count, directory.Key.FullName)); if (UninstallToolsGlobalConfig.IsSystemDirectory(directory.Key) || directory.Key.Name.StartsWith("Windows", StringComparison.InvariantCultureIgnoreCase)) { continue; } var detectedEntries = TryCreateFromDirectory(directory.Key, directory.Value, dirsToSkip).ToList(); results = ApplicationUninstallerFactory.MergeResults(results, detectedEntries, null); } return(results); }
public static IEnumerable <ApplicationUninstallerEntry> DriveApplicationScan( ListGenerationProgress.ListGenerationCallback progressCallback, List <string> dirsToSkip, List <KeyValuePair <DirectoryInfo, bool?> > itemsToScan) { var dividedItems = SplitByPhysicalDrives(itemsToScan, pair => pair.Key); void GetUninstallerEntriesThread(KeyValuePair <DirectoryInfo, bool?> data, List <ApplicationUninstallerEntry> state) { if (UninstallToolsGlobalConfig.IsSystemDirectory(data.Key) || data.Key.Name.StartsWith("Windows", StringComparison.InvariantCultureIgnoreCase)) { return; } var detectedEntries = DirectoryFactory.TryCreateFromDirectory(data.Key, data.Value, dirsToSkip).ToList(); ApplicationUninstallerFactory.MergeResults(state, detectedEntries, null); } var workSpreader = new ThreadedWorkSpreader <KeyValuePair <DirectoryInfo, bool?>, List <ApplicationUninstallerEntry> > (MaxThreadsPerDrive, GetUninstallerEntriesThread, list => new List <ApplicationUninstallerEntry>(list.Count), data => data.Key.FullName); workSpreader.Start(dividedItems, progressCallback); var results = new List <ApplicationUninstallerEntry>(); foreach (var workerResults in workSpreader.Join()) { ApplicationUninstallerFactory.MergeResults(results, workerResults, null); } return(results); }
private static ApplicationUninstallerEntry GetBasicInformation(RegistryKey uninstallerKey) { return(new ApplicationUninstallerEntry { RegistryPath = uninstallerKey.Name, RegistryKeyName = uninstallerKey.GetKeyName(), Comment = uninstallerKey.GetValue(ApplicationUninstallerEntry.RegistryNameComment) as string, RawDisplayName = uninstallerKey.GetValue(ApplicationUninstallerEntry.RegistryNameDisplayName) as string, DisplayVersion = ApplicationUninstallerFactory.CleanupDisplayVersion(uninstallerKey.GetValue(ApplicationUninstallerEntry.RegistryNameDisplayVersion) as string), ParentKeyName = uninstallerKey.GetValue(ApplicationUninstallerEntry.RegistryNameParentKeyName) as string, Publisher = uninstallerKey.GetValue(ApplicationUninstallerEntry.RegistryNamePublisher) as string, UninstallString = uninstallerKey.GetValue(ApplicationUninstallerEntry.RegistryNameUninstallString) as string, QuietUninstallString = uninstallerKey.GetValue(ApplicationUninstallerEntry.RegistryNameQuietUninstallString) as string, ModifyPath = uninstallerKey.GetValue(ApplicationUninstallerEntry.RegistryNameModifyPath) as string, InstallLocation = uninstallerKey.GetValue(ApplicationUninstallerEntry.RegistryNameInstallLocation) as string, InstallSource = uninstallerKey.GetValue(ApplicationUninstallerEntry.RegistryNameInstallSource) as string, SystemComponent = (int)uninstallerKey.GetValue(ApplicationUninstallerEntry.RegistryNameSystemComponent, 0) != 0, DisplayIcon = uninstallerKey.GetValue(ApplicationUninstallerEntry.RegistryNameDisplayIcon) as string }); }
private static ApplicationUninstallerEntry GetOneDrive() { var result = new ApplicationUninstallerEntry(); // Check if installed try { using (var key = RegistryTools.OpenRegistryKey(@"HKEY_CURRENT_USER\SOFTWARE\Microsoft\OneDrive", false)) { result.RegistryPath = key.Name; result.RegistryKeyName = key.GetKeyName(); result.InstallLocation = key.GetValue("CurrentVersionPath") as string; if (result.InstallLocation == null || !Directory.Exists(result.InstallLocation)) { return(null); } result.DisplayIcon = key.GetValue("OneDriveTrigger") as string; result.DisplayVersion = ApplicationUninstallerFactory.CleanupDisplayVersion(key.GetValue("Version") as string); } } catch { return(null); } // Check if the uninstaller is available var systemRoot = WindowsTools.GetEnvironmentPath(CSIDL.CSIDL_WINDOWS); var uninstallPath = Path.Combine(systemRoot, @"System32\OneDriveSetup.exe"); if (!File.Exists(uninstallPath)) { uninstallPath = Path.Combine(systemRoot, @"SysWOW64\OneDriveSetup.exe"); if (!File.Exists(uninstallPath)) { uninstallPath = null; } } if (uninstallPath != null) { result.IsValid = true; result.UninstallString = $"\"{uninstallPath}\" /uninstall"; result.QuietUninstallString = result.UninstallString; if (!File.Exists(result.DisplayIcon)) { result.DisplayIcon = uninstallPath; } } result.AboutUrl = @"https://onedrive.live.com/"; result.RawDisplayName = "OneDrive"; result.Publisher = "Microsoft Corporation"; result.EstimatedSize = FileSize.FromKilobytes(1024 * 90); result.Is64Bit = MachineType.X86; result.IsRegistered = true; result.UninstallerKind = UninstallerType.Unknown; result.InstallDate = Directory.GetCreationTime(result.InstallLocation); if (!string.IsNullOrEmpty(result.DisplayIcon)) { result.IconBitmap = UninstallToolsGlobalConfig.TryExtractAssociatedIcon(result.DisplayIcon); } return(result); }
private static IEnumerable <ApplicationUninstallerEntry> GetUpdates() { if (!HelperIsAvailable) { yield break; } var output = SteamFactory.StartProcessAndReadOutput(HelperPath, "list"); if (string.IsNullOrEmpty(output) || output.Contains("error", StringComparison.OrdinalIgnoreCase)) { yield break; } foreach (var group in ProcessInput(output)) { var entry = new ApplicationUninstallerEntry { UninstallerKind = UninstallerType.WindowsUpdate, IsUpdate = true, Publisher = "Microsoft Corporation" }; foreach (var valuePair in group) { switch (valuePair.Key) { case "UpdateID": entry.RatingId = valuePair.Value; Guid result; if (GuidTools.TryExtractGuid(valuePair.Value, out result)) { entry.BundleProviderKey = result; } break; case "RevisionNumber": entry.DisplayVersion = ApplicationUninstallerFactory.CleanupDisplayVersion(valuePair.Value); break; case "Title": entry.RawDisplayName = valuePair.Value; break; case "IsUninstallable": bool isUnins; if (bool.TryParse(valuePair.Value, out isUnins)) { entry.IsValid = isUnins; } break; case "SupportUrl": entry.AboutUrl = valuePair.Value; break; case "MinDownloadSize": long size; if (long.TryParse(valuePair.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out size)) { entry.EstimatedSize = FileSize.FromBytes(size); } break; case "LastDeploymentChangeTime": DateTime date; if (DateTime.TryParse(valuePair.Value, CultureInfo.InvariantCulture, DateTimeStyles.None, out date) && !DateTime.MinValue.Equals(date)) { entry.InstallDate = date; } break; } } if (entry.IsValid) { entry.UninstallString = $"\"{HelperPath}\" uninstall {entry.RatingId}"; entry.QuietUninstallString = entry.UninstallString; } yield return(entry); } }