|
|
- using System;
- using System.Diagnostics;
- using System.IO;
- using System.Security.Principal;
- using System.Threading;
- using amecs.Misc;
- using Ameliorated.ConsoleUtils;
- using Microsoft.Win32;
-
- namespace amecs.Actions
- {
- public class Deameliorate
- {
- private static string _mountedPath;
- private static string _winVer;
- private static string _win11Setup = "";
- private static bool _win11 = Environment.OSVersion.Version.Build >= 22000;
- private const string ExplorerPatcherId = "D17F1E1A-5919-4427-8F89-A1A8503CA3EB";
-
- public static bool DeAme()
- {
- if (new ChoicePrompt()
- {
- Text = @"
- This will de-ameliorate by reinstalling Windows.
-
- Although user data should be kept, we strongly recommend
- making backups of any important user data.
-
- Continue? (Y/N): "
- }.Start().Value == 1) return true;
-
- Program.Frame.Clear();
- (_mountedPath, _, _winVer, _, _) = SelectWindowsImage.GetMediaPath();
- if (_mountedPath == null) return false;
-
- if (new ChoicePrompt {Text = $"\r\nYour Windows image is {_winVer}. Continue? (Y/N): "}.Start().Value == 1)
- return true;
-
- var fc = Console.ForegroundColor;
- Console.ForegroundColor = ConsoleColor.Yellow;
-
- string userSid = null;
- try
- {
- NSudo.GetSystemPrivilege();
- NSudo.RunAsUser(() =>
- {
- userSid = WindowsIdentity.GetCurrent().User.ToString();
- });
- }
- catch
- {
- // do nothing
- }
-
- try
- {
- ConsoleTUI.OpenFrame.WriteCentered("\r\nUninstalling AME-installed UI software...");
-
- string openShellId = null;
-
- var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
- foreach (var item in key.GetSubKeyNames())
- {
- try
- {
- if (((string)key.OpenSubKey(item).GetValue("DisplayName")).Equals("Open-Shell"))
- openShellId = item;
- }
- catch
- {
- // do nothing
- }
- }
-
- if (openShellId != null)
- {
- ConsoleTUI.OpenFrame.WriteCentered("\r\nUninstalling Open-Shell...");
-
- Process.Start("MsiExec.exe", $"/X{openShellId} /quiet")?.WaitForExit();
-
- if (userSid != null)
- {
- var appData = (string)Registry.Users.OpenSubKey(userSid + @"\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders").GetValue("AppData");
-
- if (Directory.Exists(Path.Combine(appData, "OpenShell")))
- Directory.Delete(Path.Combine(appData, "OpenShell"), true);
- }
- }
-
- var epSetupPath = $@"{Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)}\ExplorerPatcher\ep_setup.exe";
- if (File.Exists(epSetupPath))
- {
- ConsoleTUI.OpenFrame.WriteCentered("\r\nUninstalling ExplorerPatcher...");
-
- var winlogon = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true);
- winlogon?.SetValue("AutoRestartShell", 0);
-
- // kill processes that the files use
- foreach (var processName in new[] {"explorer.exe", "rundll32.exe", "dllhost.exe", "ShellExperienceHost.exe", "StartMenuExperienceHost.exe"})
- {
- foreach (var process in Process.GetProcessesByName(Path.GetFileNameWithoutExtension(processName)))
- {
- process.Kill();
- process.WaitForExit();
- }
- }
-
- // delete DWM service that removes rounded corners
- Process.Start("sc", $"stop \"ep_dwm_{ExplorerPatcherId}\"")?.WaitForExit();
- Process.Start("sc", $"delete \"ep_dwm_{ExplorerPatcherId}\"")?.WaitForExit();
-
- // remove registered DLL
- var explorerPatcherDllPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "ExplorerPatcher", "ExplorerPatcher.amd64.dll");
- Process.Start("regsvr32.exe", $"/s /u \"{explorerPatcherDllPath}\"")?.WaitForExit();
-
- // delete files
- foreach (var file in new[]
- {
- Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows),
- @"SystemApps\ShellExperienceHost_cw5n1h2txyewy\dxgi.dll"),
- Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows),
- @"SystemApps\ShellExperienceHost_cw5n1h2txyewy\wincorlib.dll"),
- Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows),
- @"SystemApps\ShellExperienceHost_cw5n1h2txyewy\wincorlib_orig.dll"),
- Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows),
- @"SystemApps\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\dxgi.dll"),
- Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows),
- @"SystemApps\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\wincorlib.dll"),
- Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows),
- @"SystemApps\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\wincorlib_orig.dll"),
- Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows),
- "dxgi.dll")
- })
- {
- if (File.Exists(file)) File.Delete(file);
- }
- foreach (var folder in new[]
- {
- Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),
- "ExplorerPatcher"),
- Path.Combine(
- Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData),
- @"Microsoft\Windows\Start Menu\Programs\ExplorerPatcher")
- })
- {
- if (Directory.Exists(folder)) Directory.Delete(folder, true);
- }
-
- winlogon?.SetValue("AutoRestartShell", 1);
- }
-
- Program.Frame.Clear();
- } catch (Exception e)
- {
- ConsoleTUI.OpenFrame.Close(
- "Error when uninstalling software: " + e.Message,
- ConsoleColor.Red, Console.BackgroundColor,
- new ChoicePrompt { AnyKey = true, Text = "Press any key to continue anyways: " });
-
- Program.Frame.Clear();
- ConsoleTUI.OpenFrame.WriteCentered("\r\nContinuing without uninstalling software...\r\n");
- }
-
- // restart Explorer
- if (Process.GetProcessesByName("explorer").Length == 0)
- NSudo.RunProcessAsUser(NSudo.GetUserToken(), "explorer.exe", "", 0);
-
- // all policies are cleared as a user that's de-ameliorating is unlikely to have their own policies in the first place
- // also clear ExplorerPatcher Registry entries
- ConsoleTUI.OpenFrame.WriteCentered("\r\nClearing policies...");
- foreach (var keyPath in new[] {
- $@"HKU\{userSid}\Software\Microsoft\Windows\CurrentVersion\Policies",
- $@"HKU\{userSid}\Software\Policies",
- $@"HKU\{userSid}\Software\ExplorerPatcher",
- $@"HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{{ExplorerPatcherId}}}_ExplorerPatcher",
- @"HKLM\Software\Microsoft\Windows\CurrentVersion\Policies",
- @"HKLM\Software\Policies",
- @"HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Policies"
- })
- {
- var hive = RegistryHive.LocalMachine;
- if (keyPath.StartsWith("HKU"))
- hive = RegistryHive.Users;
-
- var baseKey = RegistryKey.OpenBaseKey(hive, RegistryView.Default);
- var subKeyPath = keyPath.Substring(keyPath.IndexOf('\\') + 1);
- var key = baseKey.OpenSubKey(subKeyPath, true);
- if (key == null) continue;
-
- try
- {
- baseKey.DeleteSubKeyTree(subKeyPath);
- }
- catch
- {
- // do nothing - some values might fail, but almost all are deleted
- }
-
- key.Close();
- }
-
- Thread.Sleep(3000);
- Program.Frame.Clear();
- ConsoleTUI.OpenFrame.WriteCentered("\r\nCompleted initial setup!", ConsoleColor.Green);
- if (_win11)
- {
- ConsoleTUI.OpenFrame.WriteCentered("\r\nWindows Setup will display as 'Windows Server,' but it's not actually installing Windows Server and is only set as such to bypass hardware requirements.");
- Console.WriteLine();
- }
- ConsoleTUI.OpenFrame.WriteCentered("\r\nWaiting 10 seconds and starting Windows Setup...");
-
- Console.ForegroundColor = fc;
- Thread.Sleep(10000);
- Console.WriteLine();
- try
- {
- if (_win11) _win11Setup = "/Product Server";
- Process.Start(Path.Combine(_mountedPath, "setup.exe"), $"/Auto Upgrade /DynamicUpdate Disable {_win11Setup}");
- } catch (Exception e)
- {
- ConsoleTUI.OpenFrame.Close(
- $"There was an error when trying to run the Windows Setup: {e}\r\nTry running the Windows Setup manually from File Explorer.",
- ConsoleColor.Red, Console.BackgroundColor,
- new ChoicePrompt { AnyKey = true, Text = $"Press any key to exit: " });
-
- return false;
- }
-
- ConsoleTUI.OpenFrame.Close(
- "Completed, Windows Setup should have started.",
- ConsoleColor.Cyan, Console.BackgroundColor,
- new ChoicePrompt { AnyKey = true, Text = $"Press any key to go back: " });
-
- return true;
- }
- }
- }
|