Beispiel #1
0
        /// <summary>
        ///     Ask the user to begin system restore and do so if he accepts. Returns false if user decides to cancel the
        ///     operation.
        /// </summary>
        /// <param name="count">How many items are being uninstalled</param>
        /// <param name="displayMessage">If user should be asked to create the restore point. If false, always create</param>
        public static bool BeginSysRestore(int count, bool displayMessage = true)
        {
            if (SysRestore.SysRestoreAvailable())
            {
                switch (displayMessage ? MessageBoxes.SysRestoreBeginQuestion() : MessageBoxes.PressedButton.Yes)
                {
                case MessageBoxes.PressedButton.Yes:
                    var error = LoadingDialog.ShowDialog(null, Localisable.LoadingDialogTitleCreatingRestorePoint, x =>
                    {
                        //if (_currentRestoreId > 0)
                        EndSysRestore();

                        var result = SysRestore.StartRestore(MessageBoxes.GetSystemRestoreDescription(count),
                                                             SysRestore.RestoreType.ApplicationUninstall, out _currentRestoreId, 3);
                        if (result < 0)
                        {
                            throw new IOException(Localisable.SysRestoreGenericError);
                        }
                    });

                    return(error == null ||
                           MessageBoxes.SysRestoreContinueAfterError(error.Message) ==
                           MessageBoxes.PressedButton.Yes);

                case MessageBoxes.PressedButton.Cancel:
                    return(false);
                }
            }
            return(true);
        }
Beispiel #2
0
 /// <summary>
 ///     Cancel running restore if any
 /// </summary>
 public static void CancelSysRestore()
 {
     if (_currentRestoreId > 0)
     {
         SysRestore.CancelRestore(_currentRestoreId);
         _currentRestoreId = 0;
     }
 }
Beispiel #3
0
 public static void EndSysRestore()
 {
     if (_currentRestoreId > 0)
     {
         SysRestore.EndRestore(_currentRestoreId);
         _currentRestoreId = 0;
     }
 }
Beispiel #4
0
        public BeginUninstallTaskWizard()
        {
            InitializeComponent();

            Icon         = MessageBoxes.DefaultOwner.Icon;
            DialogResult = DialogResult.Cancel;

            tabControl1.TabIndex = 0;

            buttonCreateRestore.Enabled = SysRestore.SysRestoreAvailable();
        }
Beispiel #5
0
        private async void buttonFix_Click(object sender, RoutedEventArgs e)
        {
            //List<FileEntry> files = (from resParent in (this._tree.Model as ResultModel).Root.Children where resParent.Children.Count > 0 from resChild in resParent.Children where resChild.IsChecked.GetValueOrDefault() select resChild.FileEntry).ToList();

            var resultModel = Tree.Model as ResultModel;

            if (resultModel == null)
            {
                return;
            }

            var files = resultModel.Root.Children.Where(resParent => resParent.Children.Count > 0)
                        .SelectMany(resParent => resParent.Children)
                        .Where(resChild => resChild.IsChecked.GetValueOrDefault())
                        .Select(resChild => resChild.FileEntry)
                        .ToList();

            if (files.Count == 0)
            {
                MessageBox.Show(Application.Current.MainWindow,
                                "No files were selected to be removed. If you would like to not remove any files, please click cancel.",
                                Utils.ProductName, MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            if (
                MessageBox.Show(Application.Current.MainWindow,
                                "Are you sure you want to remove the selected files?\nYou may not be able to get them back once they're deleted.",
                                Utils.ProductName, MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
            {
                return;
            }

            Main.Watcher.Event("Duplicate Finder", "Remove Duplicates");

            Main.TaskbarProgressState = TaskbarItemProgressState.Normal;
            Main.TaskbarProgressValue = 0;

            ProgressBar.Value   = 0;
            ProgressBar.Minimum = 0;
            ProgressBar.Maximum = SysRestore.SysRestoreAvailable() ? files.Count + 2 : files.Count;

            _taskScan = new Task(() => FixDuplicates(files));
            _taskScan.Start();
            await _taskScan;

            MessageBox.Show(Application.Current.MainWindow, "Removed duplicate files from computer", Utils.ProductName,
                            MessageBoxButton.OK, MessageBoxImage.Information);

            Main.TaskbarProgressState = TaskbarItemProgressState.None;
            Main.TaskbarProgressValue = 0;

            _scanBase.MoveFirst();
        }
Beispiel #6
0
        private void Clean()
        {
            long lSeqNum = 0;
            var  report  = Report.CreateReport(Settings.Default.privacyCleanerLog);

            // Create system restore point
            try
            {
                SysRestore.StartRestore("Before Little System Cleaner (Privacy Cleaner) Cleaning", out lSeqNum);
            }
            catch (Win32Exception ex)
            {
                string message = $"Unable to create system restore point.\nThe following error occurred: {ex.Message}";
                Utils.MessageBoxThreadSafe(Application.Current.MainWindow, message, Utils.ProductName,
                                           MessageBoxButton.OK, MessageBoxImage.Error);
            }

            var observationModel = (Tree.Model as ResultModel)?.Root.Children;

            if (observationModel != null)
            {
                foreach (var parent in observationModel)
                {
                    foreach (var n in parent.Children.Where(n => n.IsChecked.GetValueOrDefault()))
                    {
                        report.WriteLine("Section: {0}", parent.Section);

                        n.Clean(report);
                    }
                }
            }

            Settings.Default.totalErrorsFixed += Settings.Default.lastScanErrorsFixed;

            report.WriteLine("Successfully Cleaned Disk @ " + DateTime.Now.ToLongTimeString());
            report.DisplayLogFile(Settings.Default.privacyCleanerDisplayLog);

            if (lSeqNum == 0)
            {
                return;
            }

            try
            {
                SysRestore.EndRestore(lSeqNum);
            }
            catch (Win32Exception ex)
            {
                string message = $"Unable to create system restore point.\nThe following error occurred: {ex.Message}";
                Utils.MessageBoxThreadSafe(Application.Current.MainWindow, message, Utils.ProductName,
                                           MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        protected override void OnLoad(System.EventArgs e)
        {
            base.OnLoad(e);

            if (DesignMode)
            {
                return;
            }

            var settings = Properties.Settings.Default.SettingBinder;

            // Shutdown blocking not available below Windows Vista
            if (Environment.OSVersion.Version < new Version(6, 0))
            {
                checkBoxShutdown.Enabled = false;
            }
            else
            {
                settings.BindControl(checkBoxShutdown, settings => settings.UninstallPreventShutdown, this);
            }

            checkBoxRestorePoint.Enabled = SysRestore.SysRestoreAvailable();
            settings.BindControl(checkBoxRestorePoint, settings => settings.CreateRestorePoint, this);

            settings.BindControl(checkBoxConcurrent, settings => settings.UninstallConcurrency, this);

            settings.BindControl(checkBoxConcurrentOneLoud, settings => settings.UninstallConcurrentOneLoud, this);
            settings.BindControl(checkBoxManualNoCollisionProtection, settings => settings.UninstallConcurrentDisableManualCollisionProtection, this);

            settings.Subscribe(OnMaxCountChanged, settings => settings.UninstallConcurrentMaxCount, this);
            numericUpDownMaxConcurrent.ValueChanged += NumericUpDownMaxConcurrentOnValueChanged;

            settings.BindControl(checkBoxBatchSortQuiet, x => x.AdvancedIntelligentUninstallerSorting, this);
            settings.BindControl(checkBoxDiisableProtection, x => x.AdvancedDisableProtection, this);
            settings.BindControl(checkBoxSimulate, x => x.AdvancedSimulate, this);

            settings.BindControl(checkBoxAutoKillQuiet, x => x.QuietAutoKillStuck, this);
            settings.BindControl(checkBoxRetryQuiet, x => x.QuietRetryFailedOnce, this);
            settings.BindControl(checkBoxGenerate, x => x.QuietAutomatization, this);
            settings.BindControl(checkBoxGenerateStuck, x => x.QuietAutomatizationKillStuck, this);
            settings.BindControl(checkBoxAutoDaemon, x => x.QuietUseDaemon, this);

            settings.Subscribe((sender, args) => checkBoxGenerateStuck.Enabled = args.NewValue, settings => settings.QuietAutomatization, this);

            settings.Subscribe(
                (x, y) => checkBoxSimulate.ForeColor = y.NewValue ? Color.OrangeRed : SystemColors.ControlText,
                x => x.AdvancedSimulate, this);

            settings.SendUpdates(this);
            Disposed += (x, y) => settings.RemoveHandlers(this);
        }
        private void UpdateState()
        {
            UseWaitCursor = true;
            Application.DoEvents();

            switch (PageNumber)
            {
            case 0:
                break;

            case 1:
            {
                processWaiterControl1.StopUpdating();

                var additionals = relatedUninstallerAdder1.GetResults();
                var taskEntries = ConvertToTaskEntries(_selectedUninstallers.Concat(additionals));
                taskEntries = SortTaskEntryList(taskEntries);
                uninstallConfirmation1.SetRelatedApps(taskEntries);
            }
            break;

            case 2:
            {
                /*if (taskEntries == null || taskEntries.Count == 0) return;*/

                var selectedTaskEntries = uninstallConfirmation1.GetResults().ToList();

                if (!selectedTaskEntries.Any())
                {
                    MessageBoxes.NoUninstallersSelectedInfo();

                    PageNumber = 1;
                    return;
                }

                var relatedPids = AppUninstaller.GetRelatedProcessIds(
                    selectedTaskEntries.Select(x => x.UninstallerEntry), !_quiet);

                if (relatedPids.Length == 0)
                {
                    PageNumber = _previousPageNumber < 2 ? 3 : 1;
                    return;
                }

                processWaiterControl1.Initialize(relatedPids, !_quiet);
                processWaiterControl1.StartUpdating();
            }
            break;

            case 3:     // Settings
                processWaiterControl1.StopUpdating();
                break;

            case 4:     // Final
            {
                var taskEntries = uninstallConfirmation1.GetResults().ToList();

                labelApps.Text = string.Join(", ",
                                             taskEntries.Select(x => x.UninstallerEntry.DisplayName).OrderBy(x => x).ToArray());
                labelTotalSize.Text = FileSize.SumFileSizes(taskEntries.Select(x => x.UninstallerEntry.EstimatedSize)).ToString();

                labelConcurrentEnabled.Text   = Settings.Default.UninstallConcurrency.ToYesNo();
                labelFilesStillUsed.Text      = processWaiterControl1.ProcessesStillRunning.ToYesNo();
                labelRestorePointCreated.Text = (Settings.Default.CreateRestorePoint && SysRestore.SysRestoreAvailable()).ToYesNo();
                labelWillBeSilent.Text        = _quiet.ToYesNo();

                labelOther.Text = Settings.Default.AdvancedSimulate ? "Simulating" : "-";
            }
            break;
            }

            labelProgress.Text = PageNumber + 1 + " / " + tabControl1.TabCount;
            buttonPrev.Enabled = PageNumber > 0 && (PageNumber != 1 || _anyRelatedUninstallers);
            buttonNext.Enabled = PageNumber + 1 < tabControl1.TabCount;

            UseWaitCursor = false;

            _previousPageNumber = PageNumber;
        }
        private async void CompactRegistry()
        {
            long lSeqNum = 0;

            Little_System_Cleaner.Main.Watcher.Event("Registry Optimizer", "Compact Registry");

            Thread.BeginCriticalRegion();

            SetShutdownBlockReason(true);

            try
            {
                SysRestore.StartRestore("Before Little System Cleaner Registry Optimization", out lSeqNum);
            }
            catch (Win32Exception ex)
            {
                string message = $"Unable to create system restore point.\nThe following error occurred: {ex.Message}";
                MessageBox.Show(Application.Current.MainWindow, message, Utils.ProductName, MessageBoxButton.OK,
                                MessageBoxImage.Error);
            }

            foreach (var h in Wizard.RegistryHives)
            {
                if (h.SkipCompact)
                {
                    TextBlockStatus.Text = $"Skipping: {h.RegistryHive}";
                }
                else
                {
                    TextBlockStatus.Text = $"Compacting: {h.RegistryHive}";

                    await Task.Run(() => h.CompactHive(this));
                }

                ProgressBar.Value++;
            }

            if (lSeqNum != 0)
            {
                try
                {
                    SysRestore.EndRestore(lSeqNum);
                }
                catch (Win32Exception ex)
                {
                    string message =
                        $"Unable to create system restore point.\nThe following error occurred: {ex.Message}";
                    MessageBox.Show(Application.Current.MainWindow, message, Utils.ProductName, MessageBoxButton.OK,
                                    MessageBoxImage.Error);
                }
            }

            SetShutdownBlockReason(false);

            Thread.EndCriticalRegion();

            // Set IsCompacted
            Main.IsCompacted = true;

            DialogResult = true;

            Little_System_Cleaner.Main.TaskbarProgressState = TaskbarItemProgressState.None;
            Close();
        }
Beispiel #10
0
 public static void EndSysRestore()
 {
     SysRestore.EndRestore(_currentRestoreId);
 }
Beispiel #11
0
 /// <summary>
 ///     Cancel running restore if any
 /// </summary>
 public static void CancelSysRestore()
 {
     SysRestore.CancelRestore(_currentRestoreId);
 }
Beispiel #12
0
        private void buttonRestore_Click(object sender, RoutedEventArgs e)
        {
            long lSeqNum = 0;

            if (ListViewFiles.SelectedItem == null)
            {
                MessageBox.Show(Application.Current.MainWindow, "No restore file selected", Utils.ProductName,
                                MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            if (
                MessageBox.Show(Application.Current.MainWindow, "Are you sure?", Utils.ProductName,
                                MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
            {
                return;
            }

            var filePath = (ListViewFiles.SelectedItem as RestoreFile)?.FileInfo.FullName;

            using (var backupReg = new BackupRegistry(filePath))
            {
                string message;
                if (!backupReg.Open(true))
                {
                    message = $"Failed to open backup file ({filePath}).\nUnable to restore registry.";
                    MessageBox.Show(Application.Current.MainWindow, message, Utils.ProductName, MessageBoxButton.OK,
                                    MessageBoxImage.Error);
                    return;
                }

                try
                {
                    SysRestore.StartRestore("Before Little System Cleaner (Registry Cleaner) Restore", out lSeqNum);
                }
                catch (Win32Exception ex)
                {
                    message = $"Unable to create system restore point.\nThe following error occurred: {ex.Message}";
                    MessageBox.Show(Application.Current.MainWindow, message, Utils.ProductName, MessageBoxButton.OK,
                                    MessageBoxImage.Error);
                }

                if (!backupReg.Deserialize(out message))
                {
                    MessageBox.Show(Application.Current.MainWindow, message, Utils.ProductName, MessageBoxButton.OK,
                                    MessageBoxImage.Error);
                    return;
                }

                if (backupReg.RegistryEntries.Count == 0)
                {
                    MessageBox.Show(Application.Current.MainWindow,
                                    "No registry entries found in backup file.\nUnable to restore registry.", Utils.ProductName,
                                    MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

                if (backupReg.Restore())
                {
                    MessageBox.Show(Application.Current.MainWindow, "Successfully restored registry", Utils.ProductName,
                                    MessageBoxButton.OK, MessageBoxImage.Information);
                    if (Settings.Default.registryCleanerOptionsDelBackup)
                    {
                        // Delete file
                        (ListViewFiles.SelectedItem as RestoreFile)?.FileInfo.Delete();

                        // Remove from listview and refresh
                        RestoreFiles.Remove(ListViewFiles.SelectedItem as RestoreFile);
                        PopulateListView();
                    }
                }
                else
                {
                    MessageBox.Show(Application.Current.MainWindow, "Error restoring the registry", Utils.ProductName,
                                    MessageBoxButton.OK, MessageBoxImage.Error);
                }

                if (lSeqNum == 0)
                {
                    return;
                }

                try
                {
                    SysRestore.EndRestore(lSeqNum);
                }
                catch (Win32Exception ex)
                {
                    message = $"Unable to create system restore point.\nThe following error occurred: {ex.Message}";
                    MessageBox.Show(Application.Current.MainWindow, message, Utils.ProductName, MessageBoxButton.OK,
                                    MessageBoxImage.Error);
                }
            }
        }
 public static void EndSysRestore()
 {
     try { SysRestore.EndRestore(_currentRestoreId); }
     catch (Exception ex) { Console.WriteLine(ex); }
 }
        /// <summary>
        ///     Fixes registry problems
        /// </summary>
        /// <returns>Returns true if fix was successful</returns>
        private bool FixProblems()
        {
            var cancelled = false;

            try
            {
                var badRegKeys = GetSelectedRegKeys();

                long           lSeqNum = 0;
                BackupRegistry backupReg;

                if (SysRestore.SysRestoreAvailable())
                {
                    // Create Restore Point
                    ProgressBarText = "Creating system restore point";

                    try
                    {
                        SysRestore.StartRestore("Before Little System Cleaner (Registry Cleaner) Fix", out lSeqNum);
                    }
                    catch (Win32Exception ex)
                    {
                        string message =
                            $"Unable to create system restore point.\nThe following error occurred: {ex.Message}";
                        Utils.MessageBoxThreadSafe(message, Utils.ProductName, MessageBoxButton.OK,
                                                   MessageBoxImage.Error);
                    }
                }

                // Generate filename to backup registry
                ProgressBarText = "Creating backup file";
                var backupFile = string.Format("{0}\\{1:yyyy}_{1:MM}_{1:dd}_{1:HH}{1:mm}{1:ss}.bakx",
                                               Settings.Default.OptionsBackupDir, DateTime.Now);

                try
                {
                    backupReg = new BackupRegistry(backupFile);
                    backupReg.Open(false);
                }
                catch (Exception ex)
                {
                    string message = $"Unable to create backup file ({backupFile}).\nError: {ex.Message}";
                    Utils.MessageBoxThreadSafe(message, Utils.ProductName, MessageBoxButton.OK, MessageBoxImage.Error);
                    return(false);
                }

                Settings.Default.lastScanErrorsFixed = 0;

                foreach (var brk in badRegKeys)
                {
                    var skip = false;

                    if (_cancellationTokenSource.IsCancellationRequested)
                    {
                        break;
                    }

                    // Backup key
                    if (!backupReg.Store(brk))
                    {
                        if (Settings.Default.registryCleanerOptionsShowErrors)
                        {
                            string message =
                                $"An error occurred trying to backup registry key ({brk.RegKeyPath}).\nWould you like to remove it (not recommended)?";

                            if (
                                Utils.MessageBoxThreadSafe(message, Utils.ProductName, MessageBoxButton.YesNo,
                                                           MessageBoxImage.Exclamation) != MessageBoxResult.Yes)
                            {
                                skip = true;
                            }
                        }
                        else
                        {
                            skip = !Settings.Default.registryCleanerOptionsDeleteOnBackupError;
                        }
                    }

                    if (!skip)
                    {
                        // Delete key/value
                        if (!brk.Delete())
                        {
                            if (Settings.Default.registryCleanerOptionsShowErrors)
                            {
                                string message = $"An error occurred trying to remove registry key {brk.RegKeyPath}";
                                Utils.MessageBoxThreadSafe(message, Utils.ProductName, MessageBoxButton.OK,
                                                           MessageBoxImage.Error);
                            }
                        }
                        else
                        {
                            // Set last scan erors fixed
                            Settings.Default.lastScanErrorsFixed++;
                        }
                    }

                    Dispatcher.Invoke(() =>
                    {
                        // Set icon to check mark
                        brk.BitmapImg = new Image {
                            Source = BitmapSrcFinishedScanning
                        };

                        Tree.Items.Refresh();

                        // Increase & Update progress bar
                        ProgressBarValue++;
                        ProgressBarText = $"Items Repaired: {ProgressBarValue}/{ProgressBar.Maximum}";
                    });
                }

                if (!_cancellationTokenSource.IsCancellationRequested)
                {
                    // Store data as file
                    backupReg.Serialize();
                }

                // Set total errors fixed
                Settings.Default.totalErrorsFixed += Settings.Default.lastScanErrorsFixed;

                if (SysRestore.SysRestoreAvailable())
                {
                    // Finish creating restore point
                    if (lSeqNum != 0)
                    {
                        try
                        {
                            if (!_cancellationTokenSource.IsCancellationRequested)
                            {
                                SysRestore.EndRestore(lSeqNum);
                            }
                            else
                            {
                                SysRestore.CancelRestore(lSeqNum);
                            }
                        }
                        catch (Win32Exception ex)
                        {
                            string message =
                                $"Unable to create system restore point.\nThe following error occurred: {ex.Message}";
                            Utils.MessageBoxThreadSafe(message, Utils.ProductName, MessageBoxButton.OK,
                                                       MessageBoxImage.Error);
                        }
                    }
                }

                _cancellationTokenSource.Token.ThrowIfCancellationRequested();
            }
            catch (OperationCanceledException)
            {
                cancelled = true;
            }
            finally
            {
                _cancellationTokenSource.Dispose();
                _cancellationTokenSource = null;
            }

            return(!cancelled);
        }
        private void FixProblems()
        {
            long lSeqNum = 0;

            try
            {
                SysRestore.StartRestore("Before Little System Cleaner (Disk Cleaner) Cleaning", out lSeqNum);
            }
            catch (Win32Exception ex)
            {
                string message = $"Unable to create system restore point.\nThe following error occurred: {ex.Message}";
                Utils.MessageBoxThreadSafe(Application.Current.MainWindow, message, Utils.ProductName,
                                           MessageBoxButton.OK, MessageBoxImage.Error);
            }

            foreach (var lvi in ProblemsCollection.Where(lvi => lvi.Checked.GetValueOrDefault()))
            {
                try
                {
                    var fileInfo = lvi.FileInfo;

                    // Make sure file exists
                    if (!fileInfo.Exists)
                    {
                        continue;
                    }

                    switch (Settings.Default.diskCleanerRemoveMode)
                    {
                    case 0:
                        // Remove permanately
                        fileInfo.Delete();
                        break;

                    case 1:
                        // Recycle file
                        SendFileToRecycleBin(fileInfo.FullName);
                        break;

                    default:
                        // Move file to specified directory
                        if (!Directory.Exists(Settings.Default.diskCleanerMoveFolder))
                        {
                            Directory.CreateDirectory(Settings.Default.diskCleanerMoveFolder);
                        }

                        File.Move(fileInfo.FullName, $@"{Settings.Default.diskCleanerMoveFolder}\{fileInfo.Name}");
                        break;
                    }
                }
                catch (Exception)
                {
                    //this.m_watcher.Exception(ex);
                }
            }

            if (lSeqNum != 0)
            {
                try
                {
                    SysRestore.EndRestore(lSeqNum);
                }
                catch (Win32Exception ex)
                {
                    string message =
                        $"Unable to create system restore point.\nThe following error occurred: {ex.Message}";
                    Utils.MessageBoxThreadSafe(Application.Current.MainWindow, message, Utils.ProductName,
                                               MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
        }
Beispiel #16
0
        private void FixDuplicates(IEnumerable <FileEntry> files)
        {
            long seqNum = 0;
            var  sysRestoreAvailable = SysRestore.SysRestoreAvailable();

            if (sysRestoreAvailable)
            {
                ProgressBarText = "Creating System Restore Point";

                try
                {
                    SysRestore.StartRestore("Before Little System Cleaner (Duplicate Finder) Clean", out seqNum);
                }
                catch (Win32Exception ex)
                {
                    Utils.MessageBoxThreadSafe(Application.Current.MainWindow,
                                               "The following error occurred trying to create a system restore point: " + ex.Message,
                                               Utils.ProductName, MessageBoxButton.OK, MessageBoxImage.Error);
                }

                Dispatcher.Invoke(() => ProgressBar.Value++);
            }

            foreach (var fileEntry in files)
            {
                var filePath = fileEntry.FilePath;

                var percent = Dispatcher.Invoke(() => ProgressBar.Value / ProgressBar.Maximum * 100);
                ProgressBarText = Dispatcher.Invoke(() => $"{ProgressBar.Value}/{ProgressBar.Maximum} ({percent:0.##}%)");

                try
                {
                    System.IO.File.Delete(filePath);
                }
                catch (Exception ex)
                {
                    string message = $"Unable to remove file ({filePath}).\nThe following error occurred: {ex.Message}";
                    Utils.MessageBoxThreadSafe(Application.Current.MainWindow, message, Utils.ProductName,
                                               MessageBoxButton.OK, MessageBoxImage.Error);
                }

                Dispatcher.Invoke(() => ProgressBar.Value++);
            }

            if (!sysRestoreAvailable)
            {
                return;
            }

            ProgressBarText = "Finalizing system restore point";

            if (seqNum != 0)
            {
                try
                {
                    SysRestore.EndRestore(seqNum);
                }
                catch (Win32Exception ex)
                {
                    Utils.MessageBoxThreadSafe(Application.Current.MainWindow,
                                               "Unable to create system restore point.\nThe following error occurred: " + ex.Message,
                                               Utils.ProductName, MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }

            Dispatcher.Invoke(() => ProgressBar.Value++);
        }