diff --git a/DS4Windows/DS4Control/Util.cs b/DS4Windows/DS4Control/Util.cs index fe3535b..a117023 100644 --- a/DS4Windows/DS4Control/Util.cs +++ b/DS4Windows/DS4Control/Util.cs @@ -190,5 +190,46 @@ namespace DS4Windows } }); } + + public static int ElevatedCopyUpdater(string tmpUpdaterPath, bool deleteUpdatesDir=false) + { + int result = -1; + string tmpPath = Path.Combine(Path.GetTempPath(), "updatercopy.bat"); + // Create temporary bat script that will later be executed + using (StreamWriter w = new StreamWriter(new FileStream(tmpPath, + FileMode.Create, FileAccess.Write))) + { + w.WriteLine("@echo off"); // Turn off echo + w.WriteLine("@echo Attempting to replace updater, please wait..."); + // Copy temp downloaded file to destination + w.WriteLine($"@mov /Y \"{tmpUpdaterPath}\" {Global.exedirpath}\\DS4Updater.exe"); + if (deleteUpdatesDir) + { + w.WriteLine($"@del {Global.exedirpath}\\Update Files\\DS4Windows\\DS4Updater.exe"); + } + w.WriteLine("@DEL \"%~f0\""); // Attempt to delete myself without opening a time paradox. + w.Close(); + } + + // Execute temp batch script with admin privileges + ProcessStartInfo startInfo = new ProcessStartInfo(); + startInfo.FileName = tmpPath; + startInfo.WindowStyle = ProcessWindowStyle.Hidden; + startInfo.Verb = "runas"; + startInfo.UseShellExecute = true; + startInfo.CreateNoWindow = true; + try + { + // Launch process, wait and then save exit code + using (Process temp = Process.Start(startInfo)) + { + temp.WaitForExit(); + result = temp.ExitCode; + } + } + catch { } + + return result; + } } } diff --git a/DS4Windows/DS4Forms/MainWindow.xaml.cs b/DS4Windows/DS4Forms/MainWindow.xaml.cs index dea0793..957f34a 100644 --- a/DS4Windows/DS4Forms/MainWindow.xaml.cs +++ b/DS4Windows/DS4Forms/MainWindow.xaml.cs @@ -55,6 +55,9 @@ namespace DS4WinWPF.DS4Forms public ProfileList ProfileListHolder { get => profileListHolder; } + private const string UPDATER_VERSION = "1.4.1"; + private string updaterExe = Environment.Is64BitProcess ? "DS4Updater.exe" : "DS4Updater_x86.exe"; + public MainWindow(ArgumentParser parser) { InitializeComponent(); @@ -184,23 +187,47 @@ Properties.Resources.DS4Update, MessageBoxButton.YesNo, MessageBoxImage.Question if (result == MessageBoxResult.Yes) { - bool launch = false; - using (Process p = new Process()) + bool launch = true; + if (!File.Exists(Global.exedirpath + "\\DS4Updater.exe") || + (File.Exists(Global.exedirpath + "\\DS4Updater.exe") + && (FileVersionInfo.GetVersionInfo(Global.exedirpath + "\\DS4Updater.exe").FileVersion.CompareTo(UPDATER_VERSION) != 0))) { - p.StartInfo.FileName = System.IO.Path.Combine(Global.exedirpath, "DS4Updater.exe"); - bool isAdmin = Global.IsAdministrator(); - List argList = new List(); - argList.Add("-autolaunch"); - if (!isAdmin) + Uri url2 = new Uri($"https://github.com/Ryochan7/DS4Updater/releases/download/v{UPDATER_VERSION}/{updaterExe}"); + string filename = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "DS4Updater.exe"); + using (var downloadStream = new FileStream(filename, FileMode.Create)) { - argList.Add("-user"); + Task temp = + App.requestClient.GetAsync(url2.ToString(), downloadStream); + temp.Wait(); + if (!temp.Result.IsSuccessStatusCode) launch = false; } - p.StartInfo.Arguments = string.Join(" ", argList); - if (Global.AdminNeeded()) - p.StartInfo.Verb = "runas"; - try { launch = p.Start(); } - catch (InvalidOperationException) { } + if (launch) + { + int copyStatus = Util.ElevatedCopyUpdater(filename); + if (copyStatus != 0) launch = false; + } + } + + if (launch) + { + using (Process p = new Process()) + { + p.StartInfo.FileName = System.IO.Path.Combine(Global.exedirpath, "DS4Updater.exe"); + bool isAdmin = Global.IsAdministrator(); + List argList = new List(); + argList.Add("-autolaunch"); + if (!isAdmin) + { + argList.Add("-user"); + } + p.StartInfo.Arguments = string.Join(" ", argList); + if (Global.AdminNeeded()) + p.StartInfo.Verb = "runas"; + + try { launch = p.Start(); } + catch (InvalidOperationException) { } + } } if (launch) @@ -211,6 +238,14 @@ Properties.Resources.DS4Update, MessageBoxButton.YesNo, MessageBoxImage.Question Close(); })); } + else + { + Dispatcher.Invoke(() => + { + MessageBox.Show(Properties.Resources.PleaseDownloadUpdater); + }); + //Process.Start($"https://github.com/Ryochan7/DS4Updater/releases/download/v{UPDATER_VERSION}/{updaterExe}"); + } } else { @@ -436,10 +471,17 @@ Suspend support not enabled.", true); processes = Process.GetProcessesByName("DS4Updater"); } - File.Delete(Global.exedirpath + "\\DS4Updater.exe"); - File.Move(Global.exedirpath + "\\Update Files\\DS4Windows\\DS4Updater.exe", - Global.exedirpath + "\\DS4Updater.exe"); - Directory.Delete(Global.exedirpath + "\\Update Files", true); + if (!Global.AdminNeeded()) + { + File.Delete(Global.exedirpath + "\\DS4Updater.exe"); + File.Move(Global.exedirpath + "\\Update Files\\DS4Windows\\DS4Updater.exe", + Global.exedirpath + "\\DS4Updater.exe"); + Directory.Delete(Global.exedirpath + "\\Update Files", true); + } + else + { + Util.ElevatedCopyUpdater(Global.exedirpath + "\\Update Files\\DS4Windows\\DS4Updater.exe", true); + } } }