diff --git a/Rectify11Installer/Core/Backend/Common.cs b/Rectify11Installer/Core/Backend/Common.cs index 437d37ad6..d649ae89b 100644 --- a/Rectify11Installer/Core/Backend/Common.cs +++ b/Rectify11Installer/Core/Backend/Common.cs @@ -18,38 +18,48 @@ internal class Common /// indicates whether theme only files are written public static bool WriteFiles(bool icons, bool themes) { - if (icons) - { - if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "aRun.exe"), Properties.Resources.AdvancedRun, Helper.OperationType.Write)) - return false; - if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "Rectify11.Phase2.exe"), Properties.Resources.Rectify11Phase2, Helper.OperationType.Write)) - return false; - } - if (themes) + try { - if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "themes.7z"), Properties.Resources.themes, Helper.OperationType.Write)) - return false; + if (icons) + { + if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "aRun.exe"), Properties.Resources.AdvancedRun, Helper.OperationType.Write)) + return false; + if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "Rectify11.Phase2.exe"), Properties.Resources.Rectify11Phase2, Helper.OperationType.Write)) + return false; + } + if (themes) + { + if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "themes.7z"), Properties.Resources.themes, Helper.OperationType.Write)) + return false; - var s = NativeMethods.IsArm64() ? Properties.Resources.secureux_arm64 : Properties.Resources.secureux_x64; - var dll = NativeMethods.IsArm64() ? Properties.Resources.ThemeDll_arm64 : Properties.Resources.ThemeDll_x64; + var s = NativeMethods.IsArm64() ? Properties.Resources.secureux_arm64 : Properties.Resources.secureux_x64; + var dll = NativeMethods.IsArm64() ? Properties.Resources.ThemeDll_arm64 : Properties.Resources.ThemeDll_x64; - if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "SecureUXHelper.exe"), s, Helper.OperationType.Write)) - return false; - if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "ThemeDll.dll"), dll, Helper.OperationType.Write)) - return false; + if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "SecureUXHelper.exe"), s, Helper.OperationType.Write)) + return false; + if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "ThemeDll.dll"), dll, Helper.OperationType.Write)) + return false; + } + if (!themes && !icons) + { + if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "7za.exe"), Properties.Resources._7za, Helper.OperationType.Write)) + return false; + if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "files.7z"), Properties.Resources.files7z, Helper.OperationType.Write)) + return false; + if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "extras.7z"), Properties.Resources.extras, Helper.OperationType.Write)) + return false; + if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "ResourceHacker.exe"), Properties.Resources.ResourceHacker, Helper.OperationType.Write)) + return false; + } + + Logger.WriteLine("WriteFiles() succeeded"); + return true; } - if (!themes && !icons) + catch (Exception ex) { - if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "7za.exe"), Properties.Resources._7za, Helper.OperationType.Write)) - return false; - if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "files.7z"), Properties.Resources.files7z, Helper.OperationType.Write)) - return false; - if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "extras.7z"), Properties.Resources.extras, Helper.OperationType.Write)) - return false; - if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "ResourceHacker.exe"), Properties.Resources.ResourceHacker, Helper.OperationType.Write)) - return false; + Logger.WriteLine("WriteFiles() failed", ex); + return false; } - return true; } /// @@ -57,63 +67,22 @@ public static bool WriteFiles(bool icons, bool themes) /// public static bool CreateDirs() { - if (!Directory.Exists(Path.Combine(Variables.r11Folder, "Backup"))) + try { - try - { + if (!Directory.Exists(Path.Combine(Variables.r11Folder, "Backup"))) Directory.CreateDirectory(Path.Combine(Variables.r11Folder, "Backup")); - Logger.WriteLine("Created " + Path.Combine(Variables.r11Folder, "Backup")); - } - catch (Exception ex) - { - Logger.WriteLine("Error creating " + Path.Combine(Variables.r11Folder, "Backup"), ex); - return false; - } - } - else - { - Logger.WriteLine(Path.Combine(Variables.r11Folder, "Backup") + " already exists."); - } + else + Logger.WriteLine(Path.Combine(Variables.r11Folder, "Backup") + " already exists."); - if (Directory.Exists(Path.Combine(Variables.r11Folder, "Tmp"))) - { - Logger.WriteLine(Path.Combine(Variables.r11Folder, "Tmp") + " exists. Deleting it."); - try - { - Directory.Delete(Path.Combine(Variables.r11Folder, "Tmp"), true); - } - catch - { - string name = Path.GetRandomFileName(); - string tmpPath = Path.Combine(Path.GetTempPath(), name); - Directory.Move(Path.Combine(Variables.r11Folder, "Tmp"), tmpPath); - var files = Directory.GetFiles(tmpPath); - for (int i = 0; i < files.Length; i++) - { - try - { - File.Delete(files[i]); - } - catch - { - NativeMethods.MoveFileEx(files[i], null, NativeMethods.MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT); - } - } - NativeMethods.MoveFileEx(tmpPath, null, NativeMethods.MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT); - return false; - } - } - try - { + Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "Tmp"), false); Directory.CreateDirectory(Path.Combine(Variables.r11Folder, "Tmp")); - Logger.WriteLine("Created " + Path.Combine(Variables.r11Folder, "Tmp")); + return true; } catch (Exception ex) { - Logger.WriteLine("Error creating " + Path.Combine(Variables.r11Folder, "Tmp"), ex); + Logger.WriteLine("CreateDirs() failed", ex); return false; } - return true; } /// @@ -121,29 +90,38 @@ public static bool CreateDirs() /// public static bool CreateUninstall() { - // backup - // fails anyways if you use uninstaller.exe - Helper.SafeFileOperation(Assembly.GetExecutingAssembly().Location, Path.Combine(Variables.r11Folder, "Uninstall.exe"), Helper.OperationType.Copy); - Logger.WriteLine("Installer copied to " + Path.Combine(Variables.r11Folder, "Uninstall.exe")); + try + { - var r11key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", true)?.CreateSubKey("Rectify11", true); - if (r11key != null) + // backup + // fails anyways if you use uninstaller.exe + Helper.SafeFileOperation(Assembly.GetExecutingAssembly().Location, Path.Combine(Variables.r11Folder, "Uninstall.exe"), Helper.OperationType.Copy); + Logger.WriteLine("Installer copied to " + Path.Combine(Variables.r11Folder, "Uninstall.exe")); + + var r11key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", true)?.CreateSubKey("Rectify11", true); + if (r11key != null) + { + r11key.SetValue("DisplayName", "Rectify11", RegistryValueKind.String); + r11key.SetValue("DisplayVersion", Assembly.GetEntryAssembly()?.GetName().Version.ToString() ?? string.Empty, RegistryValueKind.String); + r11key.SetValue("DisplayIcon", Path.Combine(Variables.r11Folder, "Uninstall.exe"), RegistryValueKind.String); + r11key.SetValue("InstallLocation", Variables.r11Folder, RegistryValueKind.String); + r11key.SetValue("UninstallString", Path.Combine(Variables.r11Folder, "Uninstall.exe"), RegistryValueKind.String); + r11key.SetValue("ModifyPath", Path.Combine(Variables.r11Folder, "Uninstall.exe"), RegistryValueKind.String); + r11key.SetValue("NoRepair", 1, RegistryValueKind.DWord); + r11key.SetValue("VersionMajor", Assembly.GetEntryAssembly()?.GetName().Version.Major.ToString() ?? string.Empty, RegistryValueKind.String); + r11key.SetValue("VersionMinor", Assembly.GetEntryAssembly()?.GetName().Version.Minor.ToString() ?? string.Empty, RegistryValueKind.String); + r11key.SetValue("Build", Assembly.GetEntryAssembly()?.GetName().Version.Build.ToString() ?? string.Empty, RegistryValueKind.String); + r11key.SetValue("Publisher", "The Rectify11 Team", RegistryValueKind.String); + r11key.SetValue("URLInfoAbout", "https://rectify11.net/", RegistryValueKind.String); + return true; + } + return false; + } + catch (Exception ex) { - r11key.SetValue("DisplayName", "Rectify11", RegistryValueKind.String); - r11key.SetValue("DisplayVersion", Assembly.GetEntryAssembly()?.GetName().Version.ToString() ?? string.Empty, RegistryValueKind.String); - r11key.SetValue("DisplayIcon", Path.Combine(Variables.r11Folder, "Uninstall.exe"), RegistryValueKind.String); - r11key.SetValue("InstallLocation", Variables.r11Folder, RegistryValueKind.String); - r11key.SetValue("UninstallString", Path.Combine(Variables.r11Folder, "Uninstall.exe"), RegistryValueKind.String); - r11key.SetValue("ModifyPath", Path.Combine(Variables.r11Folder, "Uninstall.exe"), RegistryValueKind.String); - r11key.SetValue("NoRepair", 1, RegistryValueKind.DWord); - r11key.SetValue("VersionMajor", Assembly.GetEntryAssembly()?.GetName().Version.Major.ToString() ?? string.Empty, RegistryValueKind.String); - r11key.SetValue("VersionMinor", Assembly.GetEntryAssembly()?.GetName().Version.Minor.ToString() ?? string.Empty, RegistryValueKind.String); - r11key.SetValue("Build", Assembly.GetEntryAssembly()?.GetName().Version.Build.ToString() ?? string.Empty, RegistryValueKind.String); - r11key.SetValue("Publisher", "The Rectify11 Team", RegistryValueKind.String); - r11key.SetValue("URLInfoAbout", "https://rectify11.net/", RegistryValueKind.String); - return true; + Logger.Warn("CreateUninstall() failed", ex); + return false; } - return false; } /// @@ -151,23 +129,24 @@ public static bool CreateUninstall() /// public static bool InstallRuntimes() { - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "vcredist.exe")); - Logger.WriteLine("Extracting vcredist.exe from extras.7z"); - Helper.SvExtract(true, "extras.7z", "vcredist.exe"); - - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "core31.exe")); - Logger.WriteLine("Extracting core31.exe from extras.7z"); - Helper.SvExtract(true, "extras.7z", "core31.exe"); - - Logger.WriteLine("Executing vcredist.exe with arguments /install /quiet /norestart"); - ProcessStartInfo vcinfo = new() - { - FileName = Path.Combine(Variables.r11Folder, "vcredist.exe"), - WindowStyle = ProcessWindowStyle.Hidden, - Arguments = " /install /quiet /norestart" - }; try { + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "vcredist.exe")); + Logger.WriteLine("Extracting vcredist.exe from extras.7z"); + Helper.SvExtract(true, "extras.7z", "vcredist.exe"); + + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "core31.exe")); + Logger.WriteLine("Extracting core31.exe from extras.7z"); + Helper.SvExtract(true, "extras.7z", "core31.exe"); + + // vcredist + Logger.WriteLine("Executing vcredist.exe with arguments /install /quiet /norestart"); + ProcessStartInfo vcinfo = new() + { + FileName = Path.Combine(Variables.r11Folder, "vcredist.exe"), + WindowStyle = ProcessWindowStyle.Hidden, + Arguments = " /install /quiet /norestart" + }; var vcproc = Process.Start(vcinfo); if (vcproc == null) return false; vcproc.WaitForExit(); @@ -179,20 +158,16 @@ public static bool InstallRuntimes() } else Variables.vcRedist = true; if (vcproc.ExitCode == 0) Variables.RestartRequired = true; - } - catch - { - return false; - } - Logger.WriteLine("Executing core31.exe with arguments /install /quiet /norestart"); - ProcessStartInfo core3info = new() - { - FileName = Path.Combine(Variables.r11Folder, "core31.exe"), - WindowStyle = ProcessWindowStyle.Hidden, - Arguments = " /install /quiet /norestart" - }; - try - { + + // .net core + Logger.WriteLine("Executing core31.exe with arguments /install /quiet /norestart"); + ProcessStartInfo core3info = new() + { + FileName = Path.Combine(Variables.r11Folder, "core31.exe"), + WindowStyle = ProcessWindowStyle.Hidden, + Arguments = " /install /quiet /norestart" + }; + var core3proc = Process.Start(core3info); if (core3proc == null) return false; core3proc.WaitForExit(); @@ -204,12 +179,13 @@ public static bool InstallRuntimes() } else Variables.core31 = true; if (core3proc.ExitCode == 0) Variables.RestartRequired = true; + return true; } - catch + catch (Exception ex) { + Logger.WriteLine("InstallRuntimes() failed", ex); return false; } - return true; } /// @@ -242,28 +218,37 @@ public static void RuntimeInstallError(string app, string info, string link) /// public static bool Cleanup() { - // we dont care about returned value - Helper.SafeDirectoryDeletion(Variables.r11Files, false); - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "files.7z")); - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "extras.7z")); - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "vcredist.exe")); - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "extras", "vcredist.exe")); - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "core31.exe")); - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "extras", "core31.exe")); - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "newfiles.txt")); - Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "themes"), false); - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "themes.7z")); - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "7za.exe")); - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "aRun.exe")); - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "ResourceHacker.exe")); - if (Directory.Exists(Path.Combine(Variables.r11Folder, "extras"))) + try { - if (Directory.GetDirectories(Path.Combine(Variables.r11Folder, "extras")).Length == 0) + // we dont care about returned value + Helper.SafeDirectoryDeletion(Variables.r11Files, false); + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "files.7z")); + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "extras.7z")); + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "vcredist.exe")); + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "extras", "vcredist.exe")); + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "core31.exe")); + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "extras", "core31.exe")); + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "newfiles.txt")); + Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "themes"), false); + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "themes.7z")); + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "7za.exe")); + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "aRun.exe")); + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "ResourceHacker.exe")); + if (Directory.Exists(Path.Combine(Variables.r11Folder, "extras"))) { - Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "extras"), false); + if (Directory.GetDirectories(Path.Combine(Variables.r11Folder, "extras")).Length == 0) + { + Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "extras"), false); + } } + Logger.WriteLine("Cleanup() succeeded"); + return true; + } + catch (Exception ex) + { + Logger.WriteLine("Cleanup() failed", ex); + return false; } - return true; } #endregion } diff --git a/Rectify11Installer/Core/Backend/Extras.cs b/Rectify11Installer/Core/Backend/Extras.cs index 54507c702..e8541e8f2 100644 --- a/Rectify11Installer/Core/Backend/Extras.cs +++ b/Rectify11Installer/Core/Backend/Extras.cs @@ -13,98 +13,87 @@ internal class Extras { public static bool Install(FrmWizard frm) { - Logger.WriteLine("Installing Extras"); - Logger.WriteLine("─────────────────"); - - if (InstallOptions.InstallWallpaper) - { - frm.InstallerProgress = "Installing extras: Wallpapers"; - - if (InstallWallpapers()) - Logger.WriteLine("InstallWallpapers() succeeded."); - } - if (InstallOptions.InstallASDF) + try { - frm.InstallerProgress = "Installing extras: AccentColorizer"; - - if (Installasdf()) - Logger.WriteLine("Installasdf() succeeded."); + Logger.WriteLine("Installing Extras"); + Logger.WriteLine("─────────────────"); - if (!Variables.RestartRequired) + if (InstallOptions.InstallWallpaper) { - Interaction.Shell(Path.Combine(Variables.r11Folder, "extras", "AccentColorizer", "AccentColorizer.exe"), AppWinStyle.Hide); - Interaction.Shell(Path.Combine(Variables.r11Folder, "extras", "AccentColorizer", "AccentColorizerEleven.exe"), AppWinStyle.Hide); + frm.InstallerProgress = "Installing extras: Wallpapers"; + + if (InstallWallpapers()) + Logger.WriteLine("InstallWallpapers() succeeded."); } - } - if (InstallOptions.InstallGadgets) - { - frm.InstallerProgress = "Installing extras: Gadgets"; + if (InstallOptions.InstallASDF) + { + frm.InstallerProgress = "Installing extras: AccentColorizer"; - InstallGadgets(); - Logger.WriteLine("InstallGadgets() succeeded."); - Directory.Delete(Path.Combine(Variables.r11Folder, "extras", "GadgetPack"), true); - } - if (InstallOptions.InstallShell) - { - frm.InstallerProgress = "Installing extras: Enhanced context menu"; + Installasdf(); - if (InstallShell()) - Logger.WriteLine("InstallShell() succeeded."); + if (!Variables.RestartRequired) + { + Interaction.Shell(Path.Combine(Variables.r11Folder, "extras", "AccentColorizer", "AccentColorizer.exe"), AppWinStyle.Hide); + Interaction.Shell(Path.Combine(Variables.r11Folder, "extras", "AccentColorizer", "AccentColorizerEleven.exe"), AppWinStyle.Hide); + } + } + if (InstallOptions.InstallGadgets) + { + frm.InstallerProgress = "Installing extras: Gadgets"; - try + InstallGadgets(); + Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "extras", "GadgetPack"), false); + } + if (InstallOptions.InstallShell) { - Directory.Delete(Path.Combine(Variables.r11Folder, "extras", "Nilesoft"), true); + frm.InstallerProgress = "Installing extras: Enhanced context menu"; + + InstallShell(); + + Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "extras", "Nilesoft"), false); + Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "extras", "NilesoftArm64"), false); } - catch { } - try + if (InstallOptions.userAvatars) { - Directory.Delete(Path.Combine(Variables.r11Folder, "extras", "NilesoftArm64"), true); + frm.InstallerProgress = "Installing extras: User avatars"; + + InstallUserAvatars(); + Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "extras", "userAV"), false); } - catch { } + Logger.WriteLine("InstallExtras() succeeded."); + Logger.WriteLine("══════════════════════════════════════════════"); + return true; } - if (InstallOptions.userAvatars) + catch (Exception ex) { - frm.InstallerProgress = "Installing extras: User avatars"; - - if (InstallUserAvatars()) - Logger.WriteLine("InstallUserAvatars() succeeded."); - Directory.Delete(Path.Combine(Variables.r11Folder, "extras", "userAV"), true); + Logger.WriteLine("Extras.Install() failed", ex); + return false; } - Logger.WriteLine("InstallExtras() succeeded."); - Logger.WriteLine("══════════════════════════════════════════════"); - return true; } public static bool Uninstall() { - for (int i = 0; i < UninstallOptions.uninstExtrasList.Count; i++) + try { - if (UninstallOptions.uninstExtrasList[i] == "wallpapersNode") - { - UninstallWallpapers(); - Logger.WriteLine("Uninstalled wallpapers"); - } - if (UninstallOptions.uninstExtrasList[i] == "asdfNode") + for (int i = 0; i < UninstallOptions.uninstExtrasList.Count; i++) { - UninstallAsdf(); - Logger.WriteLine("Uninstalled asdf"); - } - if (UninstallOptions.uninstExtrasList[i] == "useravNode") - { - UninstallUserAv(); - Logger.WriteLine("Uninstalled user avatars"); - } - if (UninstallOptions.uninstExtrasList[i] == "shellNode") - { - UninstallShell(); - Logger.WriteLine("Uninstalled shell"); - } - if (UninstallOptions.uninstExtrasList[i] == "gadgetsNode") - { - UninstallGadgets(); - Logger.WriteLine("Uninstalled gadgets"); + if (UninstallOptions.uninstExtrasList[i] == "wallpapersNode") + UninstallWallpapers(); + if (UninstallOptions.uninstExtrasList[i] == "asdfNode") + UninstallAsdf(); + if (UninstallOptions.uninstExtrasList[i] == "useravNode") + UninstallUserAv(); + if (UninstallOptions.uninstExtrasList[i] == "shellNode") + UninstallShell(); + if (UninstallOptions.uninstExtrasList[i] == "gadgetsNode") + UninstallGadgets(); } + return true; + } + catch (Exception ex) + { + Logger.WriteLine("Extras.Uninstall() failed", ex); + return false; } - return true; } /// @@ -117,8 +106,7 @@ private static bool InstallWallpapers() UninstallWallpapers(); string path = Path.Combine(Variables.r11Folder, "extras", "wallpapers"); - if (Directory.Exists(path)) - Directory.Delete(path, true); + Helper.SafeDirectoryDeletion(path, false); // extract the 7z Helper.SvExtract("extras.7z", "extras", "wallpapers"); @@ -142,7 +130,9 @@ private static bool InstallWallpapers() { File.Copy(files[i].FullName, Path.Combine(Variables.Windir, "web", "wallpaper", "Rectified", files[i].Name), true); } - Directory.Delete(path, true); + Helper.SafeDirectoryDeletion(path, false); + + Logger.WriteLine("InstallWallpapers() succeeded"); return true; } catch (Exception ex) @@ -173,10 +163,12 @@ private static bool Installasdf() asdf11.Target = Path.Combine(Variables.r11Folder, "extras", "AccentColorizer", "AccentColorizerEleven.exe"); asdf11.Save(Path.Combine(GetFolderPath(SpecialFolder.CommonStartMenu), "programs", "startup", "Accentcolorizer11.lnk")); + Logger.WriteLine("Installasdf() succeeded."); return true; } catch (Exception ex) { + UninstallAsdf(); Logger.WriteLine("Installasdf() failed", ex); return false; } @@ -190,10 +182,7 @@ private static void InstallGadgets() try { UninstallGadgets(); - if (Directory.Exists(Path.Combine(Variables.r11Folder, "extras", "GadgetPack"))) - { - Directory.Delete(Path.Combine(Variables.r11Folder, "extras", "GadgetPack"), true); - } + Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "extras", "GadgetPack"), false); // extract the 7z Helper.SvExtract("extras.7z", "extras", "GadgetPack"); @@ -206,9 +195,12 @@ private static void InstallGadgets() }; var vcproc = Process.Start(gad); vcproc.WaitForExit(); + + Logger.WriteLine("InstallGadgets() succeeded."); } catch (Exception ex) { + UninstallGadgets(); Logger.WriteLine("InstallGadgets() failed", ex); } } @@ -261,10 +253,13 @@ private static bool InstallShell() Thread.Sleep(3000); if (num == 4) Process.Start(Path.Combine(GetFolderPath(SpecialFolder.CommonStartMenu), "programs", "startup", "acrylmenu.lnk")); } + + Logger.WriteLine("InstallShell() succeeded."); return true; } catch (Exception ex) { + UninstallShell(); Logger.WriteLine("InstallShell() failed", ex); return false; } @@ -278,11 +273,7 @@ private static bool InstallUserAvatars() try { UninstallUserAv(); - - if (Directory.Exists(Path.Combine(Variables.r11Folder, "extras", "userAV"))) - { - Directory.Delete(Path.Combine(Variables.r11Folder, "extras", "userAV"), true); - } + Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "extras", "userAV"), false); // extract the 7z Helper.SvExtract("extras.7z", "extras", "userAV"); @@ -295,16 +286,18 @@ private static bool InstallUserAvatars() File.Copy(Path.Combine(Variables.r11Folder, "extras", "userAV", info.GetFiles("*.*")[i].Name), Path.Combine(Variables.progdata, "Microsoft", "User Account Pictures", "Default Pictures", info.GetFiles("*.*")[i].Name), true); } + + Logger.WriteLine("InstallUserAvatars() succeeded."); return true; } catch (Exception ex) { + UninstallUserAv(); Logger.WriteLine("InstallUserAvatars() failed", ex); return false; } } - private static bool UninstallWallpapers() { try @@ -331,6 +324,8 @@ private static bool UninstallWallpapers() Helper.SafeDirectoryDeletion(Path.Combine(Variables.Windir, "web", "wallpaper", "Rectified"), false); } } + + Logger.WriteLine("UninstallWallpapers() succeeded"); return true; } catch (Exception ex) @@ -365,6 +360,8 @@ private static bool UninstallAsdf() { Helper.SafeDirectoryDeletion(epath, false); } + + Logger.WriteLine("UninstallAsdf() succeeded"); return true; } return true; @@ -384,6 +381,8 @@ private static bool UninstallGadgets() var gaduns = Process.Start(uns); gaduns.WaitForExit(); } + + Logger.WriteLine("UninstallGadgets() succeeded"); return true; } catch (Exception ex) @@ -432,6 +431,7 @@ private static bool UninstallShell() Thread.Sleep(3000); } } + Logger.WriteLine("UninstallShell() succeeded"); return true; } catch (Exception ex) @@ -445,6 +445,7 @@ private static bool UninstallUserAv() try { Helper.SafeDirectoryDeletion(Path.Combine(Variables.progdata, "Microsoft", "User Account Pictures", "Default Pictures"), false); + Logger.WriteLine("UninstallUserAv() succeeded"); return true; } catch (Exception ex) diff --git a/Rectify11Installer/Core/Backend/Icons.cs b/Rectify11Installer/Core/Backend/Icons.cs index 677053c2f..f8ac29a69 100644 --- a/Rectify11Installer/Core/Backend/Icons.cs +++ b/Rectify11Installer/Core/Backend/Icons.cs @@ -20,124 +20,117 @@ private enum PatchType x86 } #endregion + + /// + /// icon installation logic + /// + /// FrmWizard instance + /// true if succeeds, else returns false public static bool Install(FrmWizard frm) { - Logger.WriteLine("Installing icons"); - Logger.WriteLine("────────────────"); - // extract files, delete if folder exists - frm.InstallerProgress = "Extracting files..."; - Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "files"), false); try { - File.WriteAllBytes(Path.Combine(Variables.r11Folder, "files.7z"), Properties.Resources.files7z); - Logger.LogFile("files.7z"); - } - catch (Exception ex) - { - Logger.LogFile("files.7z", ex); - return false; - } + Logger.WriteLine("Installing icons"); + Logger.WriteLine("────────────────"); + // extract files, delete if folder exists + frm.InstallerProgress = "Extracting files..."; + Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "files"), false); + if (!Helper.SafeFileOperation( + Path.Combine(Variables.r11Folder, "files.7z"), + Properties.Resources.files7z, + Helper.OperationType.Write)) + return false; - // extract the 7z - Helper.SvExtract("files.7z", "files"); - Logger.WriteLine("Extracted files.7z"); - - // Get all patches - var patches = PatchesParser.GetAll(); - var patch = patches.Items; - decimal progress = 0; - List fileList = new(); - List x86List = new(); - for (var i = 0; i < patch.Length; i++) - { - for (var j = 0; j < InstallOptions.iconsList.Count; j++) + // extract the 7z + Helper.SvExtract("files.7z", "files"); + + // Get all patches + var patches = PatchesParser.GetAll(); + var patch = patches.Items; + decimal progress = 0; + List fileList = new(); + List x86List = new(); + for (var i = 0; i < patch.Length; i++) { - if (patch[i].Mui.Contains(InstallOptions.iconsList[j])) + for (var j = 0; j < InstallOptions.iconsList.Count; j++) { - var number = Math.Round((progress / InstallOptions.iconsList.Count) * 100m); - frm.InstallerProgress = "Patching " + patch[i].Mui + " (" + number + "%)"; - if (!MatchAndApplyRule(patch[i])) - { - Logger.Warn("MatchAndApplyRule() on " + patch[i].Mui + " failed"); - } - else + if (patch[i].Mui.Contains(InstallOptions.iconsList[j])) { - fileList.Add(patch[i].HardlinkTarget); - if (!string.IsNullOrWhiteSpace(patch[i].x86)) + var number = Math.Round((progress / InstallOptions.iconsList.Count) * 100m); + frm.InstallerProgress = "Patching " + patch[i].Mui + " (" + number + "%)"; + if (!MatchAndApplyRule(patch[i])) + { + Logger.Warn("MatchAndApplyRule() on " + patch[i].Mui + " failed"); + } + else { - x86List.Add(patch[i].HardlinkTarget); + fileList.Add(patch[i].HardlinkTarget); + if (!string.IsNullOrWhiteSpace(patch[i].x86)) + { + x86List.Add(patch[i].HardlinkTarget); + } } + progress++; } - progress++; } } - } - Logger.WriteLine("MatchAndApplyRule() succeeded"); + Logger.WriteLine("MatchAndApplyRule() succeeded"); - if (!WritePendingFiles(fileList, x86List)) - { - Logger.WriteLine("WritePendingFiles() failed"); - return false; - } - Logger.WriteLine("WritePendingFiles() succeeded"); - - if (!Common.WriteFiles(true, false)) - { - Logger.WriteLine("WriteFiles() failed"); - return false; - } - Logger.WriteLine("WriteFiles() succeeded"); + if (!WritePendingFiles(fileList, x86List)) + return false; - frm.InstallerProgress = "Replacing files"; + if (!Common.WriteFiles(true, false)) + return false; - // runs only if SSText3D.scr is selected - if (InstallOptions.iconsList.Contains("SSText3D.scr")) - { - Interaction.Shell(Path.Combine(Variables.sys32Folder, "reg.exe") + " import " + Path.Combine(Variables.r11Files, "screensaver.reg"), AppWinStyle.Hide); - Logger.WriteLine("screensaver.reg succeeded"); - } + frm.InstallerProgress = "Replacing files"; - // runs only if any one of mmcbase.dll.mun, mmc.exe.mui or mmcndmgr.dll.mun is selected - if (InstallOptions.iconsList.Contains("mmcbase.dll.mun") - || InstallOptions.iconsList.Contains("mmc.exe.mui") - || InstallOptions.iconsList.Contains("mmcndmgr.dll.mun")) - { - if (!MMCHelper.PatchAll()) + // runs only if SSText3D.scr is selected + if (InstallOptions.iconsList.Contains("SSText3D.scr")) { - Logger.WriteLine("MmcHelper.PatchAll() failed"); - return false; + Helper.ImportReg(Path.Combine(Variables.r11Files, "screensaver.reg")); } - Logger.WriteLine("MmcHelper.PatchAll() succeeded"); - } - if (InstallOptions.iconsList.Contains("odbcad32.exe")) - { - if (!FixOdbc()) - { - Logger.Warn("FixOdbc() failed"); - } - else + // runs only if any one of mmcbase.dll.mun, mmc.exe.mui or mmcndmgr.dll.mun is selected + if (InstallOptions.iconsList.Contains("mmcbase.dll.mun") + || InstallOptions.iconsList.Contains("mmc.exe.mui") + || InstallOptions.iconsList.Contains("mmcndmgr.dll.mun")) { - Logger.WriteLine("FixOdbc() succeeded"); + if (!MMCHelper.PatchAll()) + return false; } - } - // phase 2 - Helper.RunAsTI(Path.Combine(Variables.r11Folder, "Rectify11.Phase2.exe"), "/install"); - // reg files for various file extensions - Interaction.Shell(Path.Combine(Variables.sys32Folder, "reg.exe") + " import " + Path.Combine(Variables.r11Files, "icons.reg"), AppWinStyle.Hide); - Logger.WriteLine("icons.reg succeeded"); + if (InstallOptions.iconsList.Contains("odbcad32.exe")) + FixOdbc(); - Variables.RestartRequired = true; - return true; + // phase 2 + Helper.RunAsTI(Path.Combine(Variables.r11Folder, "Rectify11.Phase2.exe"), "/install"); + + // reg files for various file extensions + Helper.ImportReg(Path.Combine(Variables.r11Files, "icons.reg")); + + Variables.RestartRequired = true; + return true; + } + catch (Exception ex) + { + // rollback + // ikr amazing + Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "Tmp"), false); + Logger.WriteLine("Icons.Install() failed", ex); + return false; + } } + /// + /// icon uninstallation logic + /// + /// true if succeeds, else returns false public static bool Uninstall() { - Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "Rectify11.Phase2.exe"), Properties.Resources.Rectify11Phase2, Helper.OperationType.Write); - Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "aRun.exe"), Properties.Resources.AdvancedRun, Helper.OperationType.Write); try { + Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "Rectify11.Phase2.exe"), Properties.Resources.Rectify11Phase2, Helper.OperationType.Write); + Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "aRun.exe"), Properties.Resources.AdvancedRun, Helper.OperationType.Write); Registry.LocalMachine.OpenSubKey(@"SOFTWARE", true) ?.CreateSubKey("Rectify11", true) ?.SetValue("UninstallFiles", UninstallOptions.uninstIconsList.ToArray()); @@ -147,15 +140,16 @@ public static bool Uninstall() Logger.WriteLine("Executed Rectify11.Phase2.exe"); Helper.RunAsTI(Path.Combine(Variables.r11Folder, "Rectify11.Phase2.exe"), "/uninstall"); } + + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "Rectify11.Phase2.exe")); + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "aRun.exe")); + return true; } - catch + catch (Exception ex) { + Logger.WriteLine("Icons.Uninstall() failed", ex); return false; } - - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "Rectify11.Phase2.exe")); - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "aRun.exe")); - return true; } /// @@ -163,18 +157,20 @@ public static bool Uninstall() /// private static bool FixOdbc() { - var filename = string.Empty; - var admintools = Path.Combine(GetFolderPath(SpecialFolder.CommonApplicationData), "Microsoft", "Windows", "Start Menu", "Programs", "Administrative Tools"); - var files = Directory.GetFiles(admintools); - for (var i = 0; i < files.Length; i++) - { - if (!Path.GetFileName(files[i]).Contains("ODBC") || - !Path.GetFileName(files[i])!.Contains("32")) continue; - filename = Path.GetFileName(files[i]); - File.Delete(files[i]); - } try { + var filename = string.Empty; + var admintools = Path.Combine(GetFolderPath(SpecialFolder.CommonApplicationData), "Microsoft", "Windows", "Start Menu", "Programs", "Administrative Tools"); + if (!Directory.Exists(admintools)) return false; + + var files = Directory.GetFiles(admintools); + for (var i = 0; i < files.Length; i++) + { + if (!Path.GetFileName(files[i]).Contains("ODBC") || + !Path.GetFileName(files[i])!.Contains("32")) continue; + filename = Path.GetFileName(files[i]); + File.Delete(files[i]); + } using ShellLink shortcut = new(); shortcut.Target = Path.Combine(Variables.sysWOWFolder, "odbcad32.exe"); shortcut.WorkingDirectory = @"%windir%\system32"; @@ -182,12 +178,15 @@ private static bool FixOdbc() shortcut.IconIndex = 0; shortcut.DisplayMode = ShellLink.LinkDisplayMode.edmNormal; if (filename != null) shortcut.Save(Path.Combine(admintools, filename)); + + Logger.WriteLine("FixOdbc() succeeded"); + return true; } - catch + catch (Exception ex) { + Logger.Warn("FixOdbc() failed", ex); return false; } - return true; } @@ -212,12 +211,15 @@ private static bool WritePendingFiles(List fileList, List x86Lis using var ubrReg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", false); string build = OSVersion.Version.Major + "." + OSVersion.Version.Minor + "." + OSVersion.Version.Build + "." + ubrReg.GetValue("UBR").ToString(); SafeWriteReg(reg, "OSVersion", build, false); + + Logger.WriteLine("WritePendingFiles() succeeded."); + return true; } - catch + catch (Exception ex) { + Logger.WriteLine("WritePendingFiles() failed", ex); return false; } - return true; } /// @@ -273,7 +275,7 @@ private static bool Patch(string file, PatchesPatch patch, PatchType type) if (patch.mask.Contains("|")) { - if (!string.IsNullOrWhiteSpace(patch.Ignore) + if (!string.IsNullOrWhiteSpace(patch.Ignore) && ((!string.IsNullOrWhiteSpace(patch.MinVersion) && OSVersion.Version.Build <= int.Parse(patch.MinVersion)) || (!string.IsNullOrWhiteSpace(patch.MaxVersion) && OSVersion.Version.Build >= int.Parse(patch.MaxVersion)))) { masks = masks.Replace(patch.Ignore, ""); diff --git a/Rectify11Installer/Core/Backend/Installer.cs b/Rectify11Installer/Core/Backend/Installer.cs index 6e1d2ab53..9ffb2ec6b 100644 --- a/Rectify11Installer/Core/Backend/Installer.cs +++ b/Rectify11Installer/Core/Backend/Installer.cs @@ -23,22 +23,13 @@ public bool Install(FrmWizard frm) ?.DeleteValue("x86PendingFiles", false); if (!Common.WriteFiles(false, false)) - { - Logger.WriteLine("WriteFiles() failed."); return false; - } - Logger.WriteLine("WriteFiles() succeeded."); if (!Common.CreateDirs()) - { - Logger.WriteLine("CreateDirs() failed."); return false; - } - Logger.WriteLine("CreateDirs() succeeded."); try { - // create restore point frm.InstallerProgress = "Begin creating a restore point"; CreateSystemRestorePoint(false); } @@ -49,11 +40,7 @@ public bool Install(FrmWizard frm) // runtimes frm.InstallerProgress = "Installing runtimes"; - if (!Common.InstallRuntimes()) - { - Logger.WriteLine("InstallRuntimes() failed."); - return false; - } + Common.InstallRuntimes(); if (Variables.vcRedist && Variables.core31) { Logger.WriteLine("InstallRuntimes() succeeded."); @@ -95,19 +82,13 @@ public bool Install(FrmWizard frm) } frm.InstallerProgress = "Creating uninstaller"; - if (!Common.CreateUninstall()) - { - Logger.WriteLine("CreateUninstall() failed"); - return false; - } - Logger.WriteLine("CreateUninstall() succeeded"); + Common.CreateUninstall(); InstallStatus.IsRectify11Installed = true; Logger.WriteLine("══════════════════════════════════════════════"); try { - // create restore point frm.InstallerProgress = "End creating a restore point"; CreateSystemRestorePoint(true); } diff --git a/Rectify11Installer/Core/Backend/MMCHelper.cs b/Rectify11Installer/Core/Backend/MMCHelper.cs index c9e9f56ae..70f15ab5a 100644 --- a/Rectify11Installer/Core/Backend/MMCHelper.cs +++ b/Rectify11Installer/Core/Backend/MMCHelper.cs @@ -1,6 +1,6 @@ #nullable enable +using System; using System.Collections.Generic; -using System.Diagnostics; using System.Globalization; using System.IO; using System.Xml; @@ -17,39 +17,49 @@ internal class MMCHelper #region Public Methods public static bool PatchAll() { - var langFolder = Path.Combine(Variables.sys32Folder, CultureInfo.CurrentUICulture.Name); - var usaFolder = Path.Combine(Variables.sys32Folder, "en-US"); - List langMsc = new(Directory.GetFiles(langFolder, "*.msc", SearchOption.TopDirectoryOnly)); - List usaMsc = new(Directory.GetFiles(usaFolder, "*.msc", SearchOption.TopDirectoryOnly)); - List r11Msc = new(Directory.GetFiles(Path.Combine(Variables.r11Files, "mmc"), "*.msc", SearchOption.TopDirectoryOnly)); - CopyFiles(langMsc, usaMsc, r11Msc); + try + { + var langFolder = Path.Combine(Variables.sys32Folder, CultureInfo.CurrentUICulture.Name); + var usaFolder = Path.Combine(Variables.sys32Folder, "en-US"); + List langMsc = new(Directory.GetFiles(langFolder, "*.msc", SearchOption.TopDirectoryOnly)); + List usaMsc = new(Directory.GetFiles(usaFolder, "*.msc", SearchOption.TopDirectoryOnly)); + List r11Msc = new(Directory.GetFiles(Path.Combine(Variables.r11Files, "mmc"), "*.msc", SearchOption.TopDirectoryOnly)); + CopyFiles(langMsc, usaMsc, r11Msc); - // exit if current language is en-us - if (CultureInfo.CurrentUICulture.Name == "en-US") return true; + // exit if current language is en-us + if (CultureInfo.CurrentUICulture.Name == "en-US") return true; - List r11LangMsc = new(Directory.GetFiles(Path.Combine(tempDir, "msc", CultureInfo.CurrentUICulture.Name), "*.msc", SearchOption.TopDirectoryOnly)); - List sysMsc = new(Directory.GetFiles(Path.Combine(tempDir, "msc", CultureInfo.CurrentUICulture.Name, "temp"), "*.msc", SearchOption.TopDirectoryOnly)); - for (var i = 0; i < r11LangMsc.Count; i++) - { - for (var j = 0; j < sysMsc.Count; j++) + List r11LangMsc = new(Directory.GetFiles(Path.Combine(tempDir, "msc", CultureInfo.CurrentUICulture.Name), "*.msc", SearchOption.TopDirectoryOnly)); + List sysMsc = new(Directory.GetFiles(Path.Combine(tempDir, "msc", CultureInfo.CurrentUICulture.Name, "temp"), "*.msc", SearchOption.TopDirectoryOnly)); + for (var i = 0; i < r11LangMsc.Count; i++) { - if (Path.GetFileName(r11LangMsc[i]) == Path.GetFileName(sysMsc[j])) + for (var j = 0; j < sysMsc.Count; j++) { - ReplaceString(r11LangMsc[i], sysMsc[j]); + if (Path.GetFileName(r11LangMsc[i]) == Path.GetFileName(sysMsc[j])) + { + ReplaceString(r11LangMsc[i], sysMsc[j]); + } } } - } - Helper.SafeDirectoryDeletion(Path.Combine(tempDir, "msc", CultureInfo.CurrentUICulture.Name, "temp"), false); - var msc = Path.Combine(tempDir, "msc"); - if (CultureInfo.CurrentUICulture.Name != "en-US") - { - File.Copy(Path.Combine(msc, "lusrmgr.msc"), Path.Combine(msc, CultureInfo.CurrentUICulture.Name, "lusrmgr.msc"), true); - File.Copy(Path.Combine(msc, "taskschd.msc"), Path.Combine(msc, CultureInfo.CurrentUICulture.Name, "taskschd.msc"), true); - File.Copy(Path.Combine(msc, "WmiMgmt.msc"), Path.Combine(msc, CultureInfo.CurrentUICulture.Name, "WmiMgmt.msc"), true); + Helper.SafeDirectoryDeletion(Path.Combine(tempDir, "msc", CultureInfo.CurrentUICulture.Name, "temp"), false); + var msc = Path.Combine(tempDir, "msc"); + if (CultureInfo.CurrentUICulture.Name != "en-US") + { + File.Copy(Path.Combine(msc, "lusrmgr.msc"), Path.Combine(msc, CultureInfo.CurrentUICulture.Name, "lusrmgr.msc"), true); + File.Copy(Path.Combine(msc, "taskschd.msc"), Path.Combine(msc, CultureInfo.CurrentUICulture.Name, "taskschd.msc"), true); + File.Copy(Path.Combine(msc, "WmiMgmt.msc"), Path.Combine(msc, CultureInfo.CurrentUICulture.Name, "WmiMgmt.msc"), true); + } + + Logger.WriteLine("MmcHelper.PatchAll() succeeded"); + return true; } - return true; - } + catch (Exception ex) + { + Logger.WriteLine("MmcHelper.PatchAll() failed", ex); + return false; + } + } #endregion #region Private Methods private static void ReplaceString(string file, string r11file) diff --git a/Rectify11Installer/Core/Backend/Themes.cs b/Rectify11Installer/Core/Backend/Themes.cs index ed07adf77..988a1d9fe 100644 --- a/Rectify11Installer/Core/Backend/Themes.cs +++ b/Rectify11Installer/Core/Backend/Themes.cs @@ -5,127 +5,145 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Runtime.InteropServices.WindowsRuntime; using static Rectify11Installer.Win32.NativeMethods; namespace Rectify11Installer.Core { internal class Themes { + /// + /// themes installation logic + /// + /// true if succeeds, else returns false public static bool Install() { - Logger.WriteLine("Installing Themes"); - Logger.WriteLine("─────────────────"); - if (!Common.WriteFiles(false, true)) + try { - Logger.WriteLine("WriteFiles() failed."); - return false; - } - Logger.WriteLine("WriteFiles() succeeded."); + Logger.WriteLine("Installing Themes"); + Logger.WriteLine("─────────────────"); + if (!Common.WriteFiles(false, true)) + return false; - if (Directory.Exists(Path.Combine(Variables.r11Folder, "themes"))) - { - Logger.WriteLine(Path.Combine(Variables.r11Folder, "themes") + " exists. Deleting it."); - if (!Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "themes"), false)) + if (Directory.Exists(Path.Combine(Variables.r11Folder, "themes"))) { - Logger.WriteLine("Deleting " + Path.Combine(Variables.r11Folder, "themes") + " failed. "); - return false; + Logger.WriteLine(Path.Combine(Variables.r11Folder, "themes") + " exists. Deleting it."); + if (!Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "themes"), false)) + { + return false; + } } - } - // extract the 7z - Helper.SvExtract("themes.7z", "themes"); + // extract the 7z + Helper.SvExtract("themes.7z", "themes"); - Logger.WriteLine("Extracted themes.7z"); - if (!InstallThemes()) - { - Logger.WriteLine("InstallThemes() failed."); - return false; - } - try - { - if (!InstallOptions.SkipMFE) + if (!InstallThemes()) + return false; + + try { + if (!InstallOptions.SkipMFE) + { + InstallMfe(); + Logger.WriteLine("InstallMfe() succeeded."); + } + } + catch (Exception ex) + { + Logger.Warn("InstallMfe() failed", ex); + } - InstallMfe(); - Logger.WriteLine("InstallMfe() succeeded."); + try + { + Installr11cpl(); + Logger.WriteLine("Installr11cpl() succeeded."); } + catch (Exception ex) + { + Logger.Warn("Installr11cpl() failed", ex); + } + Variables.RestartRequired = true; + Logger.WriteLine("InstallThemes() succeeded."); + Logger.WriteLine("══════════════════════════════════════════════"); + return true; } - catch - { - Logger.WriteLine("InstallMfe() failed."); - } - try - { - Installr11cpl(); - Logger.WriteLine("Installr11cpl() succeeded."); - } - catch + catch (Exception ex) { - Logger.WriteLine("Installr11cpl() failed."); + Logger.WriteLine("Themes.Install() failed", ex); + return false; } - Variables.RestartRequired = true; - Logger.WriteLine("InstallThemes() succeeded."); - Logger.WriteLine("══════════════════════════════════════════════"); - return true; } + + /// + /// themes uninstallation logic + /// + /// true if succeeds, else returns false public static bool Uninstall() { - var s = IsArm64() ? Properties.Resources.secureux_arm64 : Properties.Resources.secureux_x64; - var dll = IsArm64() ? Properties.Resources.ThemeDll_arm64 : Properties.Resources.ThemeDll_x64; + try + { + var s = IsArm64() ? Properties.Resources.secureux_arm64 : Properties.Resources.secureux_x64; + var dll = IsArm64() ? Properties.Resources.ThemeDll_arm64 : Properties.Resources.ThemeDll_x64; - if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "SecureUXHelper.exe"), s, Helper.OperationType.Write)) - return false; - if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "ThemeDll.dll"), dll, Helper.OperationType.Write)) - return false; + if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "SecureUXHelper.exe"), s, Helper.OperationType.Write)) + return false; + if (!Helper.SafeFileOperation(Path.Combine(Variables.r11Folder, "ThemeDll.dll"), dll, Helper.OperationType.Write)) + return false; - string mode = Theme.IsUsingDarkMode ? "dark.theme" : "aero.theme"; - Process.Start(Path.Combine(Variables.Windir, "Resources", "Themes", mode)); - string theme = Theme.IsUsingDarkMode ? "Windows (dark)" : "Windows (light)"; - Interaction.Shell(Path.Combine(Variables.r11Folder, "SecureUXHelper.exe") + " apply " + '"' + theme + '"', AppWinStyle.Hide, true); + string mode = Theme.IsUsingDarkMode ? "dark.theme" : "aero.theme"; + Process.Start(Path.Combine(Variables.Windir, "Resources", "Themes", mode)); + string theme = Theme.IsUsingDarkMode ? "Windows (dark)" : "Windows (light)"; + Interaction.Shell(Path.Combine(Variables.r11Folder, "SecureUXHelper.exe") + " apply " + '"' + theme + '"', AppWinStyle.Hide, true); - UninstallThemeWallpapers(); + UninstallThemeWallpapers(); - Interaction.Shell(Path.Combine(Variables.r11Folder, "SecureUXHelper.exe") + " uninstall", AppWinStyle.Hide, true); - Helper.SafeFileDeletion(Path.Combine(Variables.Windir, "Themetool.exe")); - Logger.WriteLine("Deleted " + Path.Combine(Variables.Windir, "Themetool.exe")); + Interaction.Shell(Path.Combine(Variables.r11Folder, "SecureUXHelper.exe") + " uninstall", AppWinStyle.Hide, true); + Helper.SafeFileDeletion(Path.Combine(Variables.Windir, "Themetool.exe")); - UninstallCursors(); + UninstallCursors(); - UninstallMsstyles(); + UninstallMsstyles(); - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "SecureUXHelper.exe")); - Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "ThemeDll.dll")); + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "SecureUXHelper.exe")); + Helper.SafeFileDeletion(Path.Combine(Variables.r11Folder, "ThemeDll.dll")); - UninstallMfe(); + UninstallMfe(); - try - { - var key = Registry.ClassesRoot.OpenSubKey(@"CLSID", true); - key.DeleteSubKeyTree("{959E11F4-0A48-49cf-8416-FF9BC49D9656}", false); - key.Dispose(); - key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace", true); - key.DeleteSubKeyTree("{959E11F4-0A48-49cf-8416-FF9BC49D9656}", false); - key.Dispose(); - key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes", true); - key.SetValue("MS Shell Dlg 2", "Tahoma"); - key.SetValue("MS Shell Dlg", "Microsoft Sans Serif"); - key.Dispose(); - key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop\WindowMetrics", true); - key.SetValue("MenuHeight", "-285"); - key.SetValue("MenuWidth", "-285"); - key.Dispose(); - Logger.WriteLine("Remove registry entries"); - } - catch { } + try + { + var key = Registry.ClassesRoot.OpenSubKey(@"CLSID", true); + key.DeleteSubKeyTree("{959E11F4-0A48-49cf-8416-FF9BC49D9656}", false); + key.Dispose(); + key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace", true); + key.DeleteSubKeyTree("{959E11F4-0A48-49cf-8416-FF9BC49D9656}", false); + key.Dispose(); + key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes", true); + key.SetValue("MS Shell Dlg 2", "Tahoma"); + key.SetValue("MS Shell Dlg", "Microsoft Sans Serif"); + key.Dispose(); + key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop\WindowMetrics", true); + key.SetValue("MenuHeight", "-285"); + key.SetValue("MenuWidth", "-285"); + key.Dispose(); + Logger.WriteLine("Remove registry entries"); + } + catch { } - // nuke r11cp - Helper.SafeFileDeletion(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Microsoft", "Windows", "Start Menu", "Programs", "Rectify11 Control Center.lnk")); - Helper.SafeFileDeletion(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Rectify11 Control Center.lnk")); - Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "Rectify11ControlCenter"), false); + // nuke r11cp + Helper.SafeFileDeletion(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Microsoft", "Windows", "Start Menu", "Programs", "Rectify11 Control Center.lnk")); + Helper.SafeFileDeletion(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Rectify11 Control Center.lnk")); + Helper.SafeDirectoryDeletion(Path.Combine(Variables.r11Folder, "Rectify11ControlCenter"), false); + Logger.WriteLine("Deleted Rectify11 Control Center"); - Logger.WriteLine("Deleted Rectify11 Control Center"); - return true; + Logger.WriteLine("Uninstall() succeeded"); + return true; + } + catch (Exception ex) + { + Logger.WriteLine("Themes.Uninstall() failed", ex); + return false; + } } /// @@ -133,17 +151,33 @@ public static bool Uninstall() /// private static bool InstallThemes() { - InstallThemeWallpapers(); + try + { + InstallThemeWallpapers(); - // todo: remove r11cp - File.Copy(Path.Combine(Variables.r11Folder, "themes", "ThemeTool.exe"), Path.Combine(Variables.Windir, "ThemeTool.exe"), true); - Logger.WriteLine("Copied Themetool."); - Interaction.Shell(Path.Combine(Variables.r11Folder, "SecureUXHelper.exe") + " install", AppWinStyle.Hide, true); - Interaction.Shell(Path.Combine(Variables.sys32Folder, "reg.exe") + " import " + Path.Combine(Variables.r11Folder, "themes", "Themes.reg"), AppWinStyle.Hide, true); + Helper.SafeFileOperation( + Path.Combine(Variables.r11Folder, "themes", "ThemeTool.exe"), + Path.Combine(Variables.Windir, "ThemeTool.exe"), + Helper.OperationType.Copy); - InstallCursors(); - InstallMsstyles(); - return true; + Logger.WriteLine("Copied Themetool."); + Interaction.Shell(Path.Combine(Variables.r11Folder, "SecureUXHelper.exe") + " install", AppWinStyle.Hide, true); + Helper.ImportReg(Path.Combine(Variables.r11Folder, "themes", "Themes.reg")); + + InstallCursors(); + InstallMsstyles(); + return true; + } + catch (Exception ex) + { + Logger.WriteLine("InstallThemes() failed", ex); + UninstallThemeWallpapers(); + UninstallCursors(); + UninstallMsstyles(); + Helper.SafeFileDeletion(Path.Combine(Variables.Windir, "ThemeTool.exe")); + Interaction.Shell(Path.Combine(Variables.r11Folder, "SecureUXHelper.exe") + " uninstall", AppWinStyle.Hide, true); + return false; + } } @@ -161,7 +195,10 @@ private static void Installr11cpl() shortcut.IconPath = Path.Combine(Variables.r11Folder, "Rectify11ControlCenter", "Rectify11ControlCenter.exe"); shortcut.IconIndex = 0; shortcut.DisplayMode = ShellLink.LinkDisplayMode.edmNormal; - shortcut.Save(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Microsoft", "Windows", "Start Menu", "Programs", "Rectify11 Control Center.lnk")); + string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Microsoft", "Windows", "Start Menu", "Programs", "Rectify11 Control Center.lnk"); + if (!Directory.Exists(path)) + Directory.CreateDirectory(path); + shortcut.Save(path); shortcut.Save(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Rectify11 Control Center.lnk")); shortcut.Dispose(); } @@ -267,7 +304,7 @@ private static bool InstallCursors() } catch (Exception ex) { - Logger.WriteLine("Error copying " + curdir[i].Name + ". " + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); + Logger.WriteLine("Error copying " + curdir[i].Name, ex); return false; } } @@ -348,7 +385,7 @@ private static bool InstallMsstyles() } catch (Exception ex) { - Logger.WriteLine("Error copying " + msstyleDirList[i].Name + ". " + ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine); + Logger.WriteLine("Error copying " + msstyleDirList[i].Name, ex); return false; } } diff --git a/Rectify11Installer/Core/Backend/Uninstaller.cs b/Rectify11Installer/Core/Backend/Uninstaller.cs index a019321f2..38d81c8de 100644 --- a/Rectify11Installer/Core/Backend/Uninstaller.cs +++ b/Rectify11Installer/Core/Backend/Uninstaller.cs @@ -13,7 +13,7 @@ public bool Uninstall(FrmWizard frm) Logger.WriteLine("Uninstalling icons"); Logger.WriteLine("──────────────────"); frm.InstallerProgress = "Uninstalling icons"; - Icons.Uninstall(); + if (!Icons.Uninstall()) return false; Variables.RestartRequired = true; Console.WriteLine("══════════════════════════════════════════════"); } @@ -22,7 +22,7 @@ public bool Uninstall(FrmWizard frm) Logger.WriteLine("Uninstalling themes"); Logger.WriteLine("───────────────────"); frm.InstallerProgress = "Uninstalling themes"; - Themes.Uninstall(); + if (!Themes.Uninstall()) return false; Variables.RestartRequired = true; Console.WriteLine("══════════════════════════════════════════════"); } @@ -31,7 +31,7 @@ public bool Uninstall(FrmWizard frm) Logger.WriteLine("Uninstalling extras"); Logger.WriteLine("───────────────────"); frm.InstallerProgress = "Uninstalling Extras"; - Extras.Uninstall(); + if (!Extras.Uninstall()) return false; Console.WriteLine("══════════════════════════════════════════════"); } // cleanup diff --git a/Rectify11Installer/Core/Helpers.cs b/Rectify11Installer/Core/Helpers.cs index c3b1a038f..f366cdb3b 100644 --- a/Rectify11Installer/Core/Helpers.cs +++ b/Rectify11Installer/Core/Helpers.cs @@ -30,10 +30,19 @@ public static bool CheckIfUpdatesPending() } public static bool SvExtract(string file, string path) { - Interaction.Shell(Path.Combine(Variables.r11Folder, "7za.exe") + - " x -o" + Path.Combine(Variables.r11Folder, path) + - " " + Path.Combine(Variables.r11Folder, file), AppWinStyle.Hide, true); - return true; + try + { + Interaction.Shell(Path.Combine(Variables.r11Folder, "7za.exe") + + " x -o" + Path.Combine(Variables.r11Folder, path) + + " " + Path.Combine(Variables.r11Folder, file), AppWinStyle.Hide, true); + Logger.WriteLine("Extracted files.7z"); + return true; + } + catch (Exception ex) + { + Logger.WriteLine("Error extracting files.7z", ex); + return false; + } } public static bool SvExtract(string file, string path, string folder) @@ -218,6 +227,18 @@ public static void DeleteTask(string name) Interaction.Shell(Path.Combine(Variables.sys32Folder, "schtasks.exe") + " /end /tn " + name, AppWinStyle.Hide, true); Interaction.Shell(Path.Combine(Variables.sys32Folder, "schtasks.exe") + " /delete /f /tn " + name, AppWinStyle.Hide, true); } + public static void ImportReg(string path) + { + try + { + Interaction.Shell(Path.Combine(Variables.sys32Folder, "reg.exe") + " import " + path, AppWinStyle.Hide); + Logger.WriteLine(Path.GetFileName(path) + " succeeded."); + } + catch (Exception ex) + { + Logger.Warn(Path.GetFileName(path) + " failed.", ex); + } + } public enum OperationType { @@ -328,8 +349,9 @@ public static bool SafeDirectoryDeletion(string path, bool ischild) } return true; } - catch + catch (Exception ex) { + Logger.WriteLine("Deleting " + path + " failed", ex); return false; } } diff --git a/Rectify11Installer/Pages/ProgressPage.cs b/Rectify11Installer/Pages/ProgressPage.cs index aa200a214..fd58a2fd3 100644 --- a/Rectify11Installer/Pages/ProgressPage.cs +++ b/Rectify11Installer/Pages/ProgressPage.cs @@ -96,7 +96,17 @@ private async void NavigationHelper_OnNavigate(object sender, EventArgs e) RectifyPages.ProgressPage.Start(); NativeMethods.SetCloseButton(frmwiz, false); Uninstaller uninstaller = new(); - await Task.Run(() => uninstaller.Uninstall(frmwiz)); + if (!await Task.Run(() => uninstaller.Uninstall(frmwiz))) + { + Common.Cleanup(); + Logger.CommitLog(); + TaskDialog.Show(text: "Rectify11 setup encountered an error, for more information, see the log in " + Path.Combine(Variables.r11Folder, "installer.log") + ", and report it to rectify11 development server", + title: "Error", + buttons: TaskDialogButtons.OK, + icon: TaskDialogStandardIcon.Error); + Application.Exit(); + } + if (Variables.RestartRequired) { NativeMethods.SetCloseButton(frmwiz, false);