diff --git a/.gitignore b/.gitignore
index b248083..87d5d82 100644
--- a/.gitignore
+++ b/.gitignore
@@ -347,3 +347,6 @@ healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
+
+# Markdown backups
+*.md.backup
\ No newline at end of file
diff --git a/EnvyUpdate.sln b/EnvyUpdate.sln
index 5225e06..d029e8c 100644
--- a/EnvyUpdate.sln
+++ b/EnvyUpdate.sln
@@ -1,23 +1,41 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29411.108
+# Visual Studio Version 17
+VisualStudioVersion = 17.6.33829.357
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnvyUpdate", "EnvyUpdate\EnvyUpdate.csproj", "{1BF2468D-9579-462D-9153-4836E9C8721F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug - ignoregpu|Any CPU = Debug - ignoregpu|Any CPU
+ Debug - ignoregpu|x64 = Debug - ignoregpu|x64
+ Debug - ignoregpu|x86 = Debug - ignoregpu|x86
Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1BF2468D-9579-462D-9153-4836E9C8721F}.Debug - ignoregpu|Any CPU.ActiveCfg = Debug - ignoregpu|Any CPU
{1BF2468D-9579-462D-9153-4836E9C8721F}.Debug - ignoregpu|Any CPU.Build.0 = Debug - ignoregpu|Any CPU
+ {1BF2468D-9579-462D-9153-4836E9C8721F}.Debug - ignoregpu|x64.ActiveCfg = Debug - ignoregpu|x64
+ {1BF2468D-9579-462D-9153-4836E9C8721F}.Debug - ignoregpu|x64.Build.0 = Debug - ignoregpu|x64
+ {1BF2468D-9579-462D-9153-4836E9C8721F}.Debug - ignoregpu|x86.ActiveCfg = Debug - ignoregpu|x86
+ {1BF2468D-9579-462D-9153-4836E9C8721F}.Debug - ignoregpu|x86.Build.0 = Debug - ignoregpu|x86
{1BF2468D-9579-462D-9153-4836E9C8721F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1BF2468D-9579-462D-9153-4836E9C8721F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1BF2468D-9579-462D-9153-4836E9C8721F}.Debug|x64.ActiveCfg = Debug|x64
+ {1BF2468D-9579-462D-9153-4836E9C8721F}.Debug|x64.Build.0 = Debug|x64
+ {1BF2468D-9579-462D-9153-4836E9C8721F}.Debug|x86.ActiveCfg = Debug|x86
+ {1BF2468D-9579-462D-9153-4836E9C8721F}.Debug|x86.Build.0 = Debug|x86
{1BF2468D-9579-462D-9153-4836E9C8721F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1BF2468D-9579-462D-9153-4836E9C8721F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1BF2468D-9579-462D-9153-4836E9C8721F}.Release|x64.ActiveCfg = Release|x64
+ {1BF2468D-9579-462D-9153-4836E9C8721F}.Release|x64.Build.0 = Release|x64
+ {1BF2468D-9579-462D-9153-4836E9C8721F}.Release|x86.ActiveCfg = Release|x86
+ {1BF2468D-9579-462D-9153-4836E9C8721F}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/EnvyUpdate/App.config b/EnvyUpdate/App.config
index 56efbc7..1027a8f 100644
--- a/EnvyUpdate/App.config
+++ b/EnvyUpdate/App.config
@@ -1,6 +1,34 @@
-
+
-
+
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/EnvyUpdate/App.xaml b/EnvyUpdate/App.xaml
index 414c0d4..de53160 100644
--- a/EnvyUpdate/App.xaml
+++ b/EnvyUpdate/App.xaml
@@ -2,8 +2,14 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:EnvyUpdate"
+ xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
StartupUri="MainWindow.xaml">
-
+
+
+
+
+
+
diff --git a/EnvyUpdate/App.xaml.cs b/EnvyUpdate/App.xaml.cs
index 3e57067..185bc1d 100644
--- a/EnvyUpdate/App.xaml.cs
+++ b/EnvyUpdate/App.xaml.cs
@@ -1,10 +1,14 @@
-using System;
+using Microsoft.Toolkit.Uwp.Notifications;
+using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
+using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
+using Windows.Foundation.Collections;
+using Wpf.Ui.Markup;
namespace EnvyUpdate
{
@@ -13,5 +17,19 @@ namespace EnvyUpdate
///
public partial class App : Application
{
+ protected override void OnStartup(StartupEventArgs e)
+ {
+ // Listen to notification activation
+ ToastNotificationManagerCompat.OnActivated += ToastNotificationManagerCompat_OnActivated;
+ }
+
+ private void ToastNotificationManagerCompat_OnActivated(ToastNotificationActivatedEventArgsCompat e)
+ {
+ // Need to dispatch to UI thread if performing UI operations
+ Application.Current.Dispatcher.Invoke(delegate
+ {
+ Util.ShowMain();
+ });
+ }
}
}
diff --git a/EnvyUpdate/DashboardPage.xaml b/EnvyUpdate/DashboardPage.xaml
new file mode 100644
index 0000000..546b018
--- /dev/null
+++ b/EnvyUpdate/DashboardPage.xaml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/EnvyUpdate/DashboardPage.xaml.cs b/EnvyUpdate/DashboardPage.xaml.cs
new file mode 100644
index 0000000..f53ef42
--- /dev/null
+++ b/EnvyUpdate/DashboardPage.xaml.cs
@@ -0,0 +1,509 @@
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Text.RegularExpressions;
+using System.Threading;
+using System.Windows;
+using System.Windows.Threading;
+using MessageBox = System.Windows.MessageBox;
+
+namespace EnvyUpdate
+{
+ ///
+ /// Interaction logic for Dashboard.xaml
+ ///
+ public partial class DashboardPage
+ {
+ private string localDriv = null;
+ private string onlineDriv = null;
+ private string gpuURL = null;
+ private string skippedVer = null;
+ private DateTime lastFileChanged = DateTime.MinValue;
+
+ public DashboardPage()
+ {
+ InitializeComponent();
+
+ if (GlobalVars.startMinimized)
+ Application.Current.MainWindow.Hide(); // Hide only AFTER initializing dashboard page, otherwise tray icon doesn't work
+
+ if (Debug.isFake)
+ localDriv = Debug.LocalDriv();
+ else
+ localDriv = Util.GetLocDriv();
+
+ Debug.LogToFile("INFO Local driver version: " + localDriv);
+
+ if (localDriv != null)
+ {
+ Debug.LogToFile("INFO Local driver version already known, updating info without reloading.");
+ UpdateLocalVer(false);
+ }
+
+ Debug.LogToFile("INFO Detecting driver type.");
+
+ if (Debug.isFake)
+ textblockLocalType.Text = "DCH (Debug)";
+ else if (Util.IsDCH())
+ textblockLocalType.Text = "DCH";
+ else
+ textblockLocalType.Text = "Standard";
+
+ Debug.LogToFile("INFO Done detecting driver type: " + textblockLocalType.Text);
+
+ // Check for startup shortcut
+ if (File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), "EnvyUpdate.lnk")))
+ {
+ Debug.LogToFile("INFO Autostart is enabled.");
+ switchAutostart.IsChecked = true;
+ switchAutostart_Click(null, null); //Automatically recreate shortcut to account for moved EXE.
+ }
+
+ DispatcherTimer Dt = new DispatcherTimer();
+ Dt.Tick += new EventHandler(Dt_Tick);
+ // Check for new updates every 5 hours.
+ Dt.Interval = new TimeSpan(5, 0, 0);
+ Dt.Start();
+ Debug.LogToFile("INFO Started check timer.");
+
+ string watchDirPath = Path.Combine(Environment.ExpandEnvironmentVariables("%ProgramW6432%"), "NVIDIA Corporation\\Installer2\\InstallerCore");
+ if (Directory.Exists(watchDirPath))
+ {
+ GlobalVars.monitoringInstall = true;
+
+ var driverFileChangedWatcher = new FileSystemWatcher(watchDirPath);
+ driverFileChangedWatcher.NotifyFilter = NotifyFilters.Attributes
+ | NotifyFilters.CreationTime
+ | NotifyFilters.FileName
+ | NotifyFilters.LastAccess
+ | NotifyFilters.LastWrite
+ | NotifyFilters.Size;
+ driverFileChangedWatcher.Changed += DriverFileChanged;
+
+ driverFileChangedWatcher.Filter = "*.dll";
+ driverFileChangedWatcher.IncludeSubdirectories = false;
+ driverFileChangedWatcher.EnableRaisingEvents = true;
+ Debug.LogToFile("INFO Started update file system watcher.");
+ }
+ else
+ Debug.LogToFile("WARN Could not start update file system watcher. Path not found: " + watchDirPath);
+
+ Load();
+ }
+
+ private void Dt_Tick(object sender, EventArgs e)
+ {
+ Load();
+ }
+
+ private void Load()
+ {
+ if (Util.GetDTID() == 18)
+ {
+ Debug.LogToFile("INFO Found studio driver.");
+ switchStudioDriver.IsChecked = true;
+ }
+ else
+ {
+ Debug.LogToFile("INFO Found standard driver.");
+ switchStudioDriver.IsChecked = false;
+ }
+
+ if (File.Exists(Path.Combine(GlobalVars.saveDirectory,"skip.envy")))
+ {
+ Debug.LogToFile("INFO Found version skip config.");
+ skippedVer = File.ReadLines(Path.Combine(GlobalVars.saveDirectory, "skip.envy")).First();
+ }
+
+ // This little bool check is necessary for debug fake mode.
+ if (Debug.isFake)
+ {
+ localDriv = Debug.LocalDriv();
+ cardLocal.Header = localDriv;
+ textblockGPUName.Text = Debug.GPUname();
+ }
+
+ try
+ {
+ Debug.LogToFile("INFO Trying to get GPU update URL.");
+ gpuURL = Util.GetGpuUrl();
+ }
+ catch (ArgumentException)
+ {
+ Debug.LogToFile("WARN Could not get GPU update URL, trying again with non-studio driver.");
+ try
+ {
+ // disable SD and try with GRD
+ if (File.Exists(Path.Combine(GlobalVars.saveDirectory, "sd.envy")))
+ {
+ File.Delete(Path.Combine(GlobalVars.saveDirectory, "sd.envy"));
+ }
+
+ gpuURL = Util.GetGpuUrl(); //try again with GRD
+ MessageBox.Show(Properties.Resources.ui_studionotsupported);
+ switchStudioDriver.IsChecked = false;
+ }
+ catch (ArgumentNullException)
+ {
+ MessageBox.Show("ERROR: Could not get list of GPU models from Nvidia, please check your network connection.\nOtherwise, please report this issue on GitHub.");
+ Environment.Exit(11);
+ }
+ catch (ArgumentException e)
+ {
+ // Now we have a problem.
+ Debug.LogToFile("FATAL Invalid API response from Nvidia. Attempted API call: " + e.Message);
+ MessageBox.Show("ERROR: Invalid API response from Nvidia. Please file an issue on GitHub.\nAttempted API call:\n" + e.Message);
+ Environment.Exit(10);
+ }
+ }
+
+ using (var c = new WebClient())
+ {
+ Debug.LogToFile("INFO Trying to get newest driver version.");
+ string pContent = c.DownloadString(gpuURL);
+ var pattern = @"Windows\/\d{3}\.\d{2}";
+ Regex rgx = new Regex(pattern);
+ var matches = rgx.Matches(pContent);
+ onlineDriv = Regex.Replace(Convert.ToString(matches[0]), "Windows/", "");
+ cardOnline.Header = onlineDriv;
+ Debug.LogToFile("INFO Got online driver version: " + onlineDriv);
+ }
+
+ string correctLocalDriv;
+ string correctOnlineDriv;
+
+ try
+ {
+ float.Parse(onlineDriv);
+ correctLocalDriv = localDriv;
+ correctOnlineDriv = onlineDriv;
+ }
+ catch (FormatException)
+ {
+ Debug.LogToFile("INFO Caught FormatException, assuming locale workaround is necessary.");
+ //Thank you locales. Some languages need , instead of . for proper parsing
+ correctLocalDriv = localDriv.Replace('.', ',');
+ correctOnlineDriv = onlineDriv.Replace('.', ',');
+ }
+
+ if (float.Parse(correctLocalDriv) < float.Parse(correctOnlineDriv))
+ {
+ Debug.LogToFile("INFO Local version is older than online. Setting UI...");
+ SetInfoBar(false);
+ buttonDownload.Visibility = Visibility.Visible;
+ buttonSkipVersion.Visibility = Visibility.Visible;
+ if (skippedVer == null)
+ {
+ buttonSkipVersion.ToolTip = Properties.Resources.ui_skipversion;
+ buttonSkipVersion.IsEnabled = true;
+ }
+ else
+ {
+ buttonSkipVersion.IsEnabled = false;
+ buttonSkipVersion.ToolTip = Properties.Resources.ui_skipped;
+ }
+
+ Debug.LogToFile("INFO UI set.");
+
+ if (skippedVer != onlineDriv)
+ {
+ if (GlobalVars.autoDownload)
+ {
+ if (buttonDownload.IsVisible)
+ {
+ Debug.LogToFile("INFO Auto-Downloading driver.");
+ buttonDownload_Click(null, null);
+ }
+ }
+
+ Debug.LogToFile("INFO Showing update popup notification.");
+ Notify.ShowDrivUpdatePopup();
+ }
+ }
+ else
+ {
+ Debug.LogToFile("INFO Local version is up to date.");
+ buttonSkipVersion.Visibility = Visibility.Collapsed;
+ SetInfoBar(true);
+ }
+
+ //Check for different version than skipped version
+ if (skippedVer != null && skippedVer != onlineDriv)
+ {
+ Debug.LogToFile("INFO Skipped version is surpassed, deleting setting.");
+ skippedVer = null;
+ if (File.Exists(Path.Combine(GlobalVars.saveDirectory, "skip.envy")))
+ File.Delete(Path.Combine(GlobalVars.saveDirectory, "skip.envy"));
+ buttonSkipVersion.ToolTip = Properties.Resources.ui_skipversion;
+ buttonSkipVersion.IsEnabled = true;
+ buttonSkipVersion.Visibility = Visibility.Visible;
+ }
+
+ // Check if update file already exists and display install button instead
+ if (File.Exists(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe")))
+ {
+ Debug.LogToFile("INFO Found downloaded driver installer, no need to redownload.");
+ buttonDownload.Visibility = Visibility.Collapsed;
+ buttonInstall.Visibility = Visibility.Visible;
+ }
+ }
+
+ private void switchStudioDriver_Unchecked(object sender, RoutedEventArgs e)
+ {
+ if (File.Exists(Path.Combine(GlobalVars.saveDirectory, "sd.envy")))
+ {
+ Debug.LogToFile("INFO Switching to game ready driver.");
+ File.Delete(Path.Combine(GlobalVars.saveDirectory, "sd.envy"));
+ Load();
+ }
+ }
+
+ private void switchStudioDriver_Checked(object sender, RoutedEventArgs e)
+ {
+ if (!File.Exists(Path.Combine(GlobalVars.saveDirectory, "sd.envy")))
+ {
+ Debug.LogToFile("INFO Switching to studio driver.");
+ File.Create(Path.Combine(GlobalVars.saveDirectory, "sd.envy")).Close();
+ Load();
+ }
+ }
+
+ private void switchAutostart_Click(object sender, RoutedEventArgs e)
+ {
+ if (File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), "EnvyUpdate.lnk")))
+ {
+ Debug.LogToFile("INFO Removing autostart entry.");
+ File.Delete(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), "EnvyUpdate.lnk"));
+ }
+ if (switchAutostart.IsChecked == true)
+ {
+ Debug.LogToFile("INFO Creating autostart entry.");
+ Util.CreateShortcut("EnvyUpdate", Environment.GetFolderPath(Environment.SpecialFolder.Startup), GlobalVars.pathToAppExe, "NVidia Update Checker", "/minimize");
+ }
+ }
+
+ private void buttonSkipVersion_Click(object sender, RoutedEventArgs e)
+ {
+ Debug.LogToFile("INFO Skipping version.");
+ skippedVer = onlineDriv;
+ File.WriteAllText(Path.Combine(GlobalVars.saveDirectory, "skip.envy"), onlineDriv);
+ buttonSkipVersion.IsEnabled = false;
+ buttonSkipVersion.ToolTip = Properties.Resources.ui_skipped;
+ MessageBox.Show(Properties.Resources.skip_confirm);
+ }
+
+ private void UpdateLocalVer(bool reloadLocalDriv = true)
+ {
+ Debug.LogToFile("INFO Updating local driver version in UI.");
+ if (reloadLocalDriv)
+ {
+ Debug.LogToFile("INFO Reloading local driver version.");
+ localDriv = Util.GetLocDriv();
+ }
+ cardLocal.Header = localDriv;
+ if (GlobalVars.isMobile)
+ textblockGPUName.Text = Util.GetGPUName(false) + " (mobile)";
+ else
+ textblockGPUName.Text = Util.GetGPUName(false);
+ }
+
+ void DriverFileChanged(object sender, FileSystemEventArgs e)
+ {
+ if (!GlobalVars.isInstalling && (DateTime.UtcNow.Subtract(lastFileChanged).TotalMinutes > 1))
+ {
+ Debug.LogToFile("INFO Watched driver file changed! Reloading data.");
+ System.Threading.Thread.Sleep(10000);
+ lastFileChanged = DateTime.UtcNow;
+ Application.Current.Dispatcher.Invoke(delegate
+ {
+ UpdateLocalVer();
+ Load();
+ });
+ }
+ }
+
+ private void CardOnline_Click(object sender, RoutedEventArgs e)
+ {
+ Debug.LogToFile("INFO Opening download page.");
+ Process.Start(gpuURL);
+ }
+
+ private void SetInfoBar (bool good)
+ {
+ if (good)
+ {
+ infoBarStatus.Severity = Wpf.Ui.Controls.InfoBarSeverity.Success;
+ infoBarStatus.Title = Properties.Resources.ui_info_uptodate;
+ infoBarStatus.Message = Properties.Resources.ui_message_good;
+ }
+ else
+ {
+ infoBarStatus.Severity = Wpf.Ui.Controls.InfoBarSeverity.Warning;
+ infoBarStatus.Title = Properties.Resources.ui_info_outdated;
+ infoBarStatus.Message = Properties.Resources.ui_message_update;
+ }
+ }
+
+ private void buttonDownload_Click(object sender, RoutedEventArgs e)
+ {
+ if (GlobalVars.isDownloading)
+ {
+ Debug.LogToFile("WARN A download is already running.");
+ ShowSnackbar(Wpf.Ui.Common.ControlAppearance.Danger, Wpf.Ui.Common.SymbolRegular.ErrorCircle24, Properties.Resources.info_download_running, Properties.Resources.info_download_running_title);
+ }
+ else
+ {
+ progressbarDownload.Visibility = Visibility.Visible;
+ buttonDownload.IsEnabled = false;
+ GlobalVars.isDownloading = true;
+
+ if (File.Exists(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe.downloading")))
+ {
+ Debug.LogToFile("WARN Found previous unfinished download, retrying.");
+ File.Delete(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe.downloading"));
+ }
+ Thread thread = new Thread(() => {
+ using (WebClient client = new WebClient())
+ {
+ client.Headers["User-Agent"] = GlobalVars.useragent;
+ client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
+ client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
+ client.DownloadFileAsync(new Uri(Util.GetDirectDownload(gpuURL)), Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe.downloading"));
+ }
+ });
+ thread.Start();
+ Debug.LogToFile("INFO Started installer download.");
+ }
+ }
+
+ void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
+ {
+ double bytesIn = double.Parse(e.BytesReceived.ToString());
+ double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
+ double percentage = bytesIn / totalBytes * 100;
+ Application.Current.Dispatcher.Invoke(new Action(() => {
+ progressbarDownload.Value = int.Parse(Math.Truncate(percentage).ToString());
+ }));
+ }
+
+ void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
+ {
+ Application.Current.Dispatcher.Invoke(new Action(() => {
+ buttonDownload.IsEnabled = true;
+ progressbarDownload.Visibility = Visibility.Collapsed;
+ GlobalVars.isDownloading = false;
+ }));
+ if (e.Error == null)
+ {
+ Application.Current.Dispatcher.Invoke(new Action(() => {
+ ShowSnackbar(Wpf.Ui.Common.ControlAppearance.Success, Wpf.Ui.Common.SymbolRegular.CheckmarkCircle24, Properties.Resources.info_download_success, Properties.Resources.info_download_success_title);
+ buttonDownload.Visibility = Visibility.Collapsed;
+ buttonInstall.Visibility = Visibility.Visible;
+ Debug.LogToFile("INFO Download successful.");
+ }));
+ if (File.Exists(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe")))
+ File.Delete(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe"));
+ File.Move(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe.downloading"), Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe"));
+ }
+ else
+ {
+ File.Delete(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe.downloading"));
+ Application.Current.Dispatcher.Invoke(new Action(() => {
+ ShowSnackbar(Wpf.Ui.Common.ControlAppearance.Danger, Wpf.Ui.Common.SymbolRegular.ErrorCircle24, Properties.Resources.info_download_error, Properties.Resources.info_download_error_title);
+ Debug.LogToFile("INFO Download NOT successful. Error: " + e.Error.ToString());
+ }));
+ }
+ }
+ private void buttonInstall_Click(object sender, RoutedEventArgs e)
+ {
+ buttonInstall.IsEnabled = false;
+ GlobalVars.isInstalling = true;
+ string sevenZipPath = Util.GetSevenZip();
+
+ ShowSnackbar(Wpf.Ui.Common.ControlAppearance.Info, Wpf.Ui.Common.SymbolRegular.FolderZip24, Properties.Resources.info_extracting, Properties.Resources.info_extracting_title);
+
+ string filePath = Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe");
+ string destinationDir = Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-extracted");
+
+ if (!Directory.Exists(destinationDir))
+ Directory.CreateDirectory(destinationDir);
+
+ Debug.LogToFile("INFO Starting extraction of driver files.");
+
+ Process process = new Process();
+ ProcessStartInfo startInfo = new ProcessStartInfo
+ {
+ WindowStyle = ProcessWindowStyle.Minimized,
+ WorkingDirectory = destinationDir,
+ FileName = sevenZipPath,
+ Arguments = "x -aoa -y \"" + filePath + "\" Display.Driver Display.Nview Display.Optimus HDAudio MSVCR NVI2 NVPCF PhysX PPC ShieldWirelessController EULA.txt ListDevices.txt setup.cfg setup.exe"
+ };
+ process.EnableRaisingEvents = true;
+ process.StartInfo = startInfo;
+ process.Exited += new EventHandler(ExtractionFinished);
+ process.Start();
+ }
+
+ private void ExtractionFinished(object sender, EventArgs e)
+ {
+ string extractedPath = Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-extracted");
+ Application.Current.Dispatcher.Invoke(new Action(() => {
+ ShowSnackbar(Wpf.Ui.Common.ControlAppearance.Success, Wpf.Ui.Common.SymbolRegular.FolderZip24, Properties.Resources.info_extract_complete, Properties.Resources.info_extract_complete_title);
+ }));
+ Debug.LogToFile("INFO Extraction exited, deleting 7-zip executable.");
+
+ File.Delete(Path.Combine(GlobalVars.saveDirectory, "7zr.exe"));
+
+ Util.CleanInstallConfig(Path.Combine(extractedPath, "setup.cfg"));
+
+ Debug.LogToFile("Starting driver setup.");
+
+ Process process = new Process();
+ ProcessStartInfo startInfo = new ProcessStartInfo
+ {
+ WindowStyle = ProcessWindowStyle.Normal,
+ WorkingDirectory = extractedPath,
+ FileName = "setup.exe",
+ Arguments = "-passive -noreboot -noeula"
+ };
+ process.EnableRaisingEvents = true;
+ process.StartInfo = startInfo;
+ process.Exited += new EventHandler(InstallFinished);
+ process.Start();
+ }
+
+ private void InstallFinished(object sender, EventArgs e)
+ {
+ Application.Current.Dispatcher.Invoke(new Action(() => {
+ ShowSnackbar(Wpf.Ui.Common.ControlAppearance.Success, Wpf.Ui.Common.SymbolRegular.CheckmarkCircle24, Properties.Resources.info_install_complete, Properties.Resources.info_install_complete_title);
+ buttonInstall.IsEnabled = true;
+ buttonInstall.Visibility = Visibility.Collapsed;
+ buttonDownload.IsEnabled = true;
+ buttonDownload.Visibility = Visibility.Collapsed;
+ }));
+
+ Debug.LogToFile("INFO Driver setup complete. Cleaning up setup files.");
+
+ File.Delete(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe"));
+ Directory.Delete(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-extracted"), true);
+ GlobalVars.isInstalling = false;
+ Application.Current.Dispatcher.Invoke(delegate
+ {
+ UpdateLocalVer();
+ Load();
+ });
+ }
+
+ private void ShowSnackbar(Wpf.Ui.Common.ControlAppearance appearance, Wpf.Ui.Common.SymbolRegular icon, string message = "", string title = "")
+ {
+ snackbarInfo.Appearance = appearance;
+ snackbarInfo.Icon = icon;
+ snackbarInfo.Title = title;
+ snackbarInfo.Message = message;
+ snackbarInfo.Show();
+ }
+ }
+}
diff --git a/EnvyUpdate/Debug.cs b/EnvyUpdate/Debug.cs
new file mode 100644
index 0000000..35e6e04
--- /dev/null
+++ b/EnvyUpdate/Debug.cs
@@ -0,0 +1,60 @@
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Security.Policy;
+
+namespace EnvyUpdate
+{
+ class Debug
+ {
+ public static bool isFake = false;
+#if DEBUG
+ public static bool isVerbose = true;
+#else
+ public static bool isVerbose = false;
+#endif
+
+ public static int LoadFakeIDs(string idType)
+ {
+ /*
+ * Usage: Supply /debug flag to exe. Imitates a GTX 1080ti on Win10 x64 DCH Game Ready Driver.
+ */
+ switch (idType)
+ {
+ case "psid":
+ return 127;
+ case "pfid":
+ return 999;
+ case "osid":
+ return 57;
+ case "dtcid":
+ return 1;
+ case "dtid":
+ return 1;
+ default:
+ return -1;
+ }
+ }
+ public static string LocalDriv()
+ {
+ return "466.11";
+ }
+
+ public static string GPUname()
+ {
+ return "Nvidia GeForce RTX 4080 (debug)";
+ }
+
+ public static void LogToFile(string content)
+ {
+ if (isVerbose)
+ {
+ if (GlobalVars.useAppdata)
+ File.AppendAllText(Path.Combine(GlobalVars.appdata, "envyupdate.log"), content + "\n");
+ else
+ File.AppendAllText(Path.Combine(GlobalVars.directoryOfExe, "envyupdate.log"), content + "\n");
+ }
+ }
+ }
+}
diff --git a/EnvyUpdate/EnvyUpdate.csproj b/EnvyUpdate/EnvyUpdate.csproj
index edc0a08..cc7331b 100644
--- a/EnvyUpdate/EnvyUpdate.csproj
+++ b/EnvyUpdate/EnvyUpdate.csproj
@@ -1,7 +1,5 @@
-
-
Debug
@@ -10,7 +8,7 @@
WinExe
EnvyUpdate
EnvyUpdate
- v4.7.2
+ v4.8
512
{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
4
@@ -18,6 +16,22 @@
true
+ false
+
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ true
AnyCPU
@@ -58,24 +72,75 @@
app.manifest
+
+ true
+ bin\x86\Debug\
+ DEBUG;TRACE
+ full
+ x86
+ 7.3
+ prompt
+ true
+
+
+ bin\x86\Release\
+ TRACE
+ true
+ pdbonly
+ x86
+ 7.3
+ prompt
+ true
+
+
+ true
+ bin\x86\Debug - ignoregpu\
+ DEBUG;TRACE
+ full
+ x86
+ 7.3
+ prompt
+ MinimumRecommendedRules.ruleset
+ true
+
+
+ true
+ bin\x64\Debug\
+ DEBUG;TRACE
+ full
+ x64
+ 7.3
+ prompt
+ true
+
+
+ bin\x64\Release\
+ TRACE
+ true
+ pdbonly
+ x64
+ 7.3
+ prompt
+ true
+
+
+ true
+ bin\x64\Debug - ignoregpu\
+ DEBUG;TRACE
+ full
+ x64
+ 7.3
+ prompt
+ MinimumRecommendedRules.ruleset
+ true
+
-
- ..\packages\Costura.Fody.4.1.0\lib\net40\Costura.dll
-
-
- ..\packages\Hardcodet.NotifyIcon.Wpf.1.0.8\lib\net451\Hardcodet.Wpf.TaskbarNotification.dll
-
-
- ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll
-
-
- ..\packages\Notifications.Wpf.0.1.1\lib\net461\Notifications.Wpf.dll
-
+
@@ -95,22 +160,27 @@
MSBuild:Compile
Designer
+
-
- InfoWindow.xaml
-
+
+ DashboardPage.xaml
+
+
+ True
+ True
+ Licenses.resx
+
Resources.de.resx
True
True
+
+ SettingsPage.xaml
+
-
- Designer
- MSBuild:Compile
-
MSBuild:Compile
Designer
@@ -123,6 +193,14 @@
MainWindow.xaml
Code
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
@@ -138,6 +216,10 @@
Settings.settings
True
+
+ ResXFileCodeGenerator
+ Licenses.Designer.cs
+
PublicResXFileCodeGenerator
Resources.de.Designer.cs
@@ -147,7 +229,6 @@
Resources.Designer.cs
-
SettingsSingleFileGenerator
Settings.Designer.cs
@@ -173,15 +254,39 @@
True
-
+
+
+ False
+ Microsoft .NET Framework 4.7.2 %28x86 and x64%29
+ true
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+
+
+ 5.7.0
+
+
+ 6.8.1
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ 7.1.3
+
+
+ 2.2.0
+
+
+ 8.0.4
+
+
+ 2.1.0
+
+
-
-
- This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/EnvyUpdate/FodyWeavers.xsd b/EnvyUpdate/FodyWeavers.xsd
index 44a5374..05e92c1 100644
--- a/EnvyUpdate/FodyWeavers.xsd
+++ b/EnvyUpdate/FodyWeavers.xsd
@@ -17,6 +17,16 @@
A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.
+
+
+ A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks
+
+
+
+
+ A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.
+
+
A list of unmanaged 32 bit assembly names to include, delimited with line breaks.
@@ -43,6 +53,16 @@
Controls if .pdbs for reference assemblies are also embedded.
+
+
+ Controls if runtime assemblies are also embedded.
+
+
+
+
+ Controls whether the runtime assemblies are embedded with their full path or only with their assembly name.
+
+
Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option.
@@ -73,6 +93,16 @@
A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |.
+
+
+ A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with |
+
+
+
+
+ A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with |.
+
+
A list of unmanaged 32 bit assembly names to include, delimited with |.
diff --git a/EnvyUpdate/GlobalVars.cs b/EnvyUpdate/GlobalVars.cs
index 402384c..f52b4af 100644
--- a/EnvyUpdate/GlobalVars.cs
+++ b/EnvyUpdate/GlobalVars.cs
@@ -6,13 +6,20 @@ namespace EnvyUpdate
class GlobalVars
{
public static bool isMobile = false;
- public static readonly string exeloc = System.Reflection.Assembly.GetEntryAssembly().Location;
- public static readonly string exepath = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + "\\";
+ public static readonly string pathToAppExe = System.Reflection.Assembly.GetEntryAssembly().Location;
+ public static readonly string directoryOfExe = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
+ public static string saveDirectory = directoryOfExe;
public static readonly string startmenu = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu);
- public static readonly float version = 2.3F;
- public static readonly string appdata = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\envyupdate\\";
+ public static readonly string legacyAppdata = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\envyupdate\\";
+ public static readonly string appdata = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "EnvyUpdate_Data");
public static readonly string startup = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
- public static readonly string desktopOverride = exepath + "desktop.envy";
- public static readonly string mobileOverride = exepath + "mobile.envy";
+ public static bool monitoringInstall = false;
+ public static bool startMinimized = false;
+ public static bool isInstalling = false;
+ public static readonly string useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:115.0) Gecko/20100101 Firefox/115.0";
+ public static bool useAppdata = false;
+ public static bool hasWrite = true;
+ public static bool autoDownload = false;
+ public static bool isDownloading = false;
}
}
diff --git a/EnvyUpdate/InfoWindow.xaml b/EnvyUpdate/InfoWindow.xaml
deleted file mode 100644
index 9987dc9..0000000
--- a/EnvyUpdate/InfoWindow.xaml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/EnvyUpdate/InfoWindow.xaml.cs b/EnvyUpdate/InfoWindow.xaml.cs
deleted file mode 100644
index 058b014..0000000
--- a/EnvyUpdate/InfoWindow.xaml.cs
+++ /dev/null
@@ -1,134 +0,0 @@
-using System;
-using System.Windows;
-using System.Windows.Input;
-using System.IO;
-
-namespace EnvyUpdate
-{
- ///
- /// Interaction logic for InfoWindow.xaml
- ///
- public partial class InfoWindow : Window
- {
- bool defaultIsMobile = false;
- bool isOverride = false;
- public InfoWindow()
- {
- InitializeComponent();
-
- if (GlobalVars.isMobile)
- chkMobile.IsChecked = true;
-
- if (Util.IsMobile())
- defaultIsMobile = true;
-
- if (defaultIsMobile != GlobalVars.isMobile)
- isOverride = true;
- }
-
- private void ButtonWeb_Click(object sender, RoutedEventArgs e)
- {
- System.Diagnostics.Process.Start("https://github.com/fyr77/EnvyUpdate/");
- }
-
- private void text_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
- {
- this.Cursor = Cursors.Hand;
- }
-
- private void text_MouseLeave(object sender, MouseEventArgs e)
- {
- this.Cursor = Cursors.Arrow;
- }
-
- private void textEnvyUpdate_MouseDown(object sender, MouseButtonEventArgs e)
- {
- System.Diagnostics.Process.Start("https://github.com/fyr77/EnvyUpdate/blob/master/LICENSE");
- }
-
- private void textFody_MouseDown(object sender, MouseButtonEventArgs e)
- {
- System.Diagnostics.Process.Start("https://github.com/Fody/Fody/blob/master/License.txt");
- }
-
- private void textCostura_MouseDown(object sender, MouseButtonEventArgs e)
- {
- System.Diagnostics.Process.Start("https://github.com/Fody/Costura/blob/master/license.txt");
- }
-
- private void textNotifyIcon_MouseDown(object sender, MouseButtonEventArgs e)
- {
- System.Diagnostics.Process.Start("https://github.com/hardcodet/wpf-notifyicon/blob/master/LICENSE");
- }
-
- private void textNotifications_MouseDown(object sender, MouseButtonEventArgs e)
- {
- System.Diagnostics.Process.Start("https://github.com/Federerer/Notifications.Wpf/blob/master/LICENSE");
- }
- private void textNewtonsoft_MouseDown(object sender, MouseButtonEventArgs e)
- {
- System.Diagnostics.Process.Start("https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md");
- }
- private void textResourceEmbedder_MouseDown(object sender, MouseButtonEventArgs e)
- {
- System.Diagnostics.Process.Start("https://github.com/MarcStan/resource-embedder/blob/master/LICENSE");
- }
-
- private void chkMobile_Checked(object sender, RoutedEventArgs e)
- {
- if (isOverride)
- {
- // If an override was present, delete it.
- bool deleteSuccess = false;
- while (!deleteSuccess)
- {
- try
- {
- File.Delete(GlobalVars.desktopOverride);
- deleteSuccess = true;
- }
- catch (IOException)
- {
- // This is necessary in case someone ticks and unticks the option quickly, as the File.Create Method has sometimes yet to close the file.
- }
- }
- isOverride = false;
- }
- else
- {
- File.Create(GlobalVars.mobileOverride).Close();
- GlobalVars.isMobile = true;
- isOverride = true;
- }
- }
-
- private void chkMobile_Unchecked(object sender, RoutedEventArgs e)
- {
- if (isOverride)
- {
- // If an override was present, delete it.
- bool deleteSuccess = false;
- while (!deleteSuccess)
- {
- try
- {
- File.Delete(GlobalVars.mobileOverride);
- deleteSuccess = true;
- }
- catch (IOException)
- {
- // This is necessary in case someone ticks and unticks the option quickly, as the File.Create Method has sometimes yet to close the file.
- }
- }
-
- isOverride = false;
- }
- else
- {
- File.Create(GlobalVars.desktopOverride).Close();
- GlobalVars.isMobile = false;
- isOverride = true;
- }
- }
- }
-}
diff --git a/EnvyUpdate/MainWindow.xaml b/EnvyUpdate/MainWindow.xaml
index d7300b3..5015f14 100644
--- a/EnvyUpdate/MainWindow.xaml
+++ b/EnvyUpdate/MainWindow.xaml
@@ -1,27 +1,64 @@
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/EnvyUpdate/MainWindow.xaml.cs b/EnvyUpdate/MainWindow.xaml.cs
index fc7fb9c..6522ee3 100644
--- a/EnvyUpdate/MainWindow.xaml.cs
+++ b/EnvyUpdate/MainWindow.xaml.cs
@@ -1,247 +1,154 @@
-using System;
+using Microsoft.Toolkit.Uwp.Notifications;
+using Microsoft.Win32;
+using System;
using System.IO;
-using System.Net;
-using System.Text.RegularExpressions;
+using System.Linq;
using System.Windows;
-using System.Windows.Media;
-using System.Windows.Threading;
namespace EnvyUpdate
{
///
/// Interaction logic for MainWindow.xaml
///
- public partial class MainWindow : Window
+ public partial class MainWindow
{
- private string localDriv = null;
- private string onlineDriv = null;
- private string gpuURL = null;
- private string argument = null;
- private bool isDebug = false;
+ private string[] arguments = null;
public MainWindow()
{
InitializeComponent();
- Title += " " + GlobalVars.version;
// Try to get command line arguments
try
{
- argument = Environment.GetCommandLineArgs()[1];
+ arguments = Environment.GetCommandLineArgs();
}
catch (IndexOutOfRangeException)
{
// This is necessary, since .NET throws an exception if you check for a non-existant arg.
}
+ if (!Util.HasWritePermissions())
+ {
+ if (!Directory.Exists(GlobalVars.appdata))
+ Directory.CreateDirectory(GlobalVars.appdata);
+
+ GlobalVars.hasWrite = false;
+ }
+
+ if (Directory.Exists(GlobalVars.appdata))
+ {
+ GlobalVars.useAppdata = true;
+ GlobalVars.saveDirectory = GlobalVars.appdata;
+ }
+
+ // Check if Debug file exists
+ if (File.Exists(Path.Combine(GlobalVars.saveDirectory, "envyupdate.log")))
+ {
+ Debug.isVerbose = true;
+ Debug.LogToFile("------");
+ Debug.LogToFile("INFO Found log file, will start logging to this.");
+ }
+
+ Debug.LogToFile("INFO Starting EnvyUpdate, version " + System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).FileVersion);
+ Debug.LogToFile("INFO Save directory: " + GlobalVars.saveDirectory);
+
+ // Check if running on supported Windows version.
+ if (Environment.OSVersion.Version.Major < 10)
+ {
+ Debug.LogToFile("FATAL Unsupported OS version, terminating.");
+ MessageBox.Show(Properties.Resources.unsupported_os);
+ Environment.Exit(1);
+ }
+
// Check if EnvyUpdate is already running
if (Util.IsInstanceOpen("EnvyUpdate"))
{
+ Debug.LogToFile("FATAL Found another instance, terminating.");
+
MessageBox.Show(Properties.Resources.instance_already_running);
Environment.Exit(1);
}
- // Set correct ticks
- if (File.Exists(GlobalVars.startup + "\\EnvyUpdate.lnk"))
- chkAutostart.IsChecked = true;
- if (File.Exists(GlobalVars.appdata + "EnvyUpdate.exe"))
- chkInstall.IsChecked = true;
- // Check if application is installed and update
- if (GlobalVars.exepath == GlobalVars.appdata)
+ // Check dark theme
+ AdjustTheme();
+ SystemEvents.UserPreferenceChanged += AdjustTheme;
+
+ // Delete installed legacy versions, required for people upgrading from very old versions.
+ if (Directory.Exists(GlobalVars.legacyAppdata))
{
- try
- {
- if (Util.GetNewVer() > GlobalVars.version)
- {
- Util.UpdateApp();
- }
- }
- catch (WebException)
- {
- // Silently fail.
- }
- // Also set correct ticks.
- chkInstall.IsChecked = true;
+ Debug.LogToFile("INFO Found legacy appdata installation, uninstalling.");
+ Util.UninstallAll();
}
- // Check for overrides
- if (File.Exists(GlobalVars.desktopOverride))
- GlobalVars.isMobile = false;
- else if (File.Exists(GlobalVars.mobileOverride))
- GlobalVars.isMobile = true;
- // Check if mobile, if no override is present
- else
- GlobalVars.isMobile = Util.IsMobile();
-
- string locDriv = Util.GetLocDriv();
- if (locDriv != null)
+ // Allow for running using a fake graphics card if no nvidia card is present.
+ if (arguments.Contains("/fake"))
{
- localDriv = locDriv;
- textblockGPU.Text = locDriv;
- if (GlobalVars.isMobile)
- textblockGPUName.Text = Util.GetGPUName(false) + " (mobile)";
- else
- textblockGPUName.Text = Util.GetGPUName(false);
+ Debug.isFake = true;
+ Debug.LogToFile("WARN Faking GPU with debug info.");
}
- else
+ else if (!Util.IsNvidia())
{
- switch (argument)
- {
- case "/ignoregpu":
- MessageBox.Show("Debug: GPU ignored.");
- isDebug = true;
- break;
- default:
- MessageBox.Show(Properties.Resources.no_compatible_gpu);
- Environment.Exit(255);
- break;
- }
+ Debug.LogToFile("FATAL No supported GPU found, terminating.");
+ MessageBox.Show(Properties.Resources.no_compatible_gpu);
+ Environment.Exit(255);
}
- DispatcherTimer Dt = new DispatcherTimer();
- Dt.Tick += new EventHandler(Dt_Tick);
- // Check for new updates every 5 hours.
- Dt.Interval = new TimeSpan(5, 0, 0);
- Dt.Start();
- Load();
- }
-
- private void Dt_Tick(object sender, EventArgs e)
- {
- Load();
- }
-
- private void buttonHelp_Click(object sender, RoutedEventArgs e)
- {
- InfoWindow infoWin = new InfoWindow();
- infoWin.ShowDialog();
- }
-
- private void Load()
- {
- int psid;
- int pfid;
- int osid;
- //int langid;
-
- // This little bool check is necessary for debug mode on systems without an Nvidia GPU.
- if (!isDebug)
- {
- psid = Util.GetIDs("pfid");
- pfid = Util.GetIDs("psid");
- osid = Util.GetIDs("osid");
- gpuURL = "http://www.nvidia.com/Download/processDriver.aspx?psid=" + psid.ToString() + "&pfid=" + pfid.ToString() + "&osid=" + osid.ToString(); // + "&lid=" + langid.ToString();
- WebClient c = new WebClient();
- gpuURL = c.DownloadString(gpuURL);
- string pContent = c.DownloadString(gpuURL);
- var pattern = @"\d{3}\.\d{2} ";
- Regex rgx = new Regex(pattern);
- var matches = rgx.Matches(pContent);
- onlineDriv = Convert.ToString(matches[0]);
- onlineDriv = onlineDriv.Remove(onlineDriv.Length - 5);
- textblockOnline.Text = onlineDriv;
- c.Dispose();
-
- if (float.Parse(localDriv) < float.Parse(onlineDriv))
- {
- textblockOnline.Foreground = Brushes.Red;
- buttonDL.Visibility = Visibility.Visible;
- Notify.ShowDrivUpdatePopup();
- }
- else
- textblockOnline.Foreground = Brushes.Green;
- }
-
- if (GlobalVars.exepath == GlobalVars.appdata)
+ //Check if launched as miminized with arg
+ if (arguments.Contains("/minimize"))
{
+ Debug.LogToFile("INFO Launching minimized.");
WindowState = WindowState.Minimized;
- Hide();
+ GlobalVars.startMinimized = true;
+ }
+
+ //Check for old unfinished downloads
+ string[] leftovers = Directory.GetFiles(GlobalVars.directoryOfExe, "*-nvidia-installer.exe.downloading");
+ if (leftovers.Length > 0)
+ {
+ foreach (string leftover in leftovers)
+ {
+ Debug.LogToFile("INFO Deleting leftover download " + leftover);
+ File.Delete(leftover);
+ }
+ }
+
+ GlobalVars.isMobile = Util.IsMobile();
+ Debug.LogToFile("INFO Mobile: " + GlobalVars.isMobile);
+
+ if (File.Exists(Path.Combine(GlobalVars.saveDirectory, "autodl.envy")))
+ {
+ Debug.LogToFile("INFO Auto-download is enabled.");
+ GlobalVars.autoDownload = true;
}
}
-
- private void buttonDL_Click(object sender, RoutedEventArgs e)
- {
- System.Diagnostics.Process.Start(gpuURL);
- }
-
- private void TaskbarIcon_TrayLeftMouseDown(object sender, RoutedEventArgs e)
- {
- Util.ShowMain();
- }
-
private void Window_StateChanged(object sender, EventArgs e)
{
if (WindowState == WindowState.Minimized)
{
+ Debug.LogToFile("INFO Window was minimized, closing to tray.");
Hide();
}
}
- private void chkInstall_Checked(object sender, RoutedEventArgs e)
- {
- if (chkAutostart != null)
- {
- chkAutostart.IsEnabled = true;
- }
- if (GlobalVars.exepath != GlobalVars.appdata)
- {
- if (!Directory.Exists(GlobalVars.appdata))
- {
- Directory.CreateDirectory(GlobalVars.appdata);
- }
- File.Copy(GlobalVars.exeloc, GlobalVars.appdata + "EnvyUpdate.exe", true);
-
- if (File.Exists(GlobalVars.mobileOverride))
- File.Copy(GlobalVars.mobileOverride, GlobalVars.appdata + "mobile.envy", true);
- if (File.Exists(GlobalVars.desktopOverride))
- File.Copy(GlobalVars.desktopOverride, GlobalVars.appdata + "desktop.envy", true);
-
- Util.CreateShortcut("EnvyUpdate", GlobalVars.startmenu, GlobalVars.appdata + "EnvyUpdate.exe", Properties.Resources.app_description);
- }
- }
-
- private void chkInstall_Unchecked(object sender, RoutedEventArgs e)
- {
- // Only uninstall if user confirms. Prevents accidental uninstalls.
- if (MessageBox.Show(Properties.Resources.uninstall_confirm, Properties.Resources.uninstall_heading, MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
- {
- if (chkAutostart != null)
- {
- chkAutostart.IsEnabled = false;
- chkAutostart.IsChecked = false;
- }
-
- File.Delete(GlobalVars.appdata + "desktop.envy");
- File.Delete(GlobalVars.appdata + "mobile.envy");
-
- File.Delete(GlobalVars.startup + "\\EnvyUpdate.lnk");
- File.Delete(GlobalVars.startmenu + "\\EnvyUpdate.lnk");
-
- if ((GlobalVars.exepath == GlobalVars.appdata) && File.Exists(GlobalVars.appdata + "EnvyUpdate.exe"))
- Util.SelfDelete();
- else if (File.Exists(GlobalVars.appdata + "EnvyUpdate.exe"))
- File.Delete(GlobalVars.appdata + "EnvyUpdate.exe");
- }
- else
- chkInstall.IsChecked = true;
- }
-
- private void chkAutostart_Checked(object sender, RoutedEventArgs e)
- {
- Util.CreateShortcut("EnvyUpdate", GlobalVars.startup, GlobalVars.appdata + "EnvyUpdate.exe", Properties.Resources.app_description);
- }
-
- private void chkAutostart_Unchecked(object sender, RoutedEventArgs e)
- {
- File.Delete(GlobalVars.startup + "\\EnvyUpdate.lnk");
- }
-
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
- if (MessageBox.Show(Properties.Resources.exit_confirm, "", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
- Application.Current.Shutdown();
+ Debug.LogToFile("INFO Uninstalling notifications and shutting down.");
+ ToastNotificationManagerCompat.Uninstall(); // Uninstall notifications to prevent issues with the app being portable.
+ Application.Current.Shutdown();
+ }
+
+ private void AdjustTheme(object sender = null, UserPreferenceChangedEventArgs e = null)
+ {
+ if (Util.IsDarkTheme())
+ Wpf.Ui.Appearance.Theme.Apply(Wpf.Ui.Appearance.ThemeType.Dark, Wpf.Ui.Appearance.BackgroundType.Mica);
else
- e.Cancel = true;
+ Wpf.Ui.Appearance.Theme.Apply(Wpf.Ui.Appearance.ThemeType.Light, Wpf.Ui.Appearance.BackgroundType.Mica);
+ }
+
+ private void NotifyIcon_LeftClick(Wpf.Ui.Controls.NotifyIcon sender, RoutedEventArgs e)
+ {
+ Util.ShowMain();
}
}
}
\ No newline at end of file
diff --git a/EnvyUpdate/Notify.cs b/EnvyUpdate/Notify.cs
index 7afaecf..d889163 100644
--- a/EnvyUpdate/Notify.cs
+++ b/EnvyUpdate/Notify.cs
@@ -1,4 +1,4 @@
-using Notifications.Wpf;
+using Microsoft.Toolkit.Uwp.Notifications;
namespace EnvyUpdate
{
@@ -6,14 +6,16 @@ namespace EnvyUpdate
{
public static void ShowDrivUpdatePopup()
{
- var notificationManager = new NotificationManager();
-
- notificationManager.Show(new NotificationContent
+ try
{
- Title = "EnvyUpdate",
- Message = Properties.Resources.update_popup_message,
- Type = NotificationType.Information
- }, onClick: Util.ShowMain);
+ var toast = new ToastContentBuilder();
+ toast.AddText(Properties.Resources.update_popup_message);
+ toast.Show();
+ }
+ catch (System.Exception ex)
+ {
+ Debug.LogToFile("WARN Could not show notification. Error: " + ex.Message);
+ }
}
}
}
\ No newline at end of file
diff --git a/EnvyUpdate/Properties/AssemblyInfo.cs b/EnvyUpdate/Properties/AssemblyInfo.cs
index ce694c2..b9441b1 100644
--- a/EnvyUpdate/Properties/AssemblyInfo.cs
+++ b/EnvyUpdate/Properties/AssemblyInfo.cs
@@ -1,6 +1,4 @@
using System.Reflection;
-using System.Resources;
-using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
@@ -8,11 +6,11 @@ using System.Windows;
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("EnvyUpdate")]
-[assembly: AssemblyDescription("")]
+[assembly: AssemblyDescription("Small update checker application for Nvidia GPUs")]
[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
+[assembly: AssemblyCompany("fyr77")]
[assembly: AssemblyProduct("EnvyUpdate")]
-[assembly: AssemblyCopyright("Copyright © 2020")]
+[assembly: AssemblyCopyright("Copyright © 2023")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -51,5 +49,5 @@ using System.Windows;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("2.3")]
-[assembly: AssemblyFileVersion("2.3")]
+[assembly: AssemblyVersion("3.6")]
+[assembly: AssemblyFileVersion("3.6")]
diff --git a/EnvyUpdate/Properties/Licenses.Designer.cs b/EnvyUpdate/Properties/Licenses.Designer.cs
new file mode 100644
index 0000000..ef7ff51
--- /dev/null
+++ b/EnvyUpdate/Properties/Licenses.Designer.cs
@@ -0,0 +1,166 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace EnvyUpdate.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Licenses {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Licenses() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EnvyUpdate.Properties.Licenses", typeof(Licenses).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to GNU LGPL information
+ /// --------------------
+ ///This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
+ ///
+ ///This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public [rest of string was truncated]";.
+ ///
+ internal static string _7zip {
+ get {
+ return ResourceManager.GetString("7zip", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to The MIT License
+ ///
+ ///Copyright (c) 2012 Simon Cropp and contributors
+ ///
+ ///Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+ ///
+ ///The ab [rest of string was truncated]";.
+ ///
+ internal static string CosturaFody {
+ get {
+ return ResourceManager.GetString("CosturaFody", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to MIT License
+ ///
+ ///Copyright (c) 2019-2023 Jakob Senkl
+ ///
+ ///Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+ ///
+ ///The above copyright no [rest of string was truncated]";.
+ ///
+ internal static string EnvyUpdate {
+ get {
+ return ResourceManager.GetString("EnvyUpdate", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to MIT License
+ ///
+ ///Copyright (c) Simon Cropp
+ ///
+ ///Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+ ///
+ ///The above copyright notice and t [rest of string was truncated]";.
+ ///
+ internal static string Fody {
+ get {
+ return ResourceManager.GetString("Fody", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to The MIT License (MIT)
+ ///
+ ///Copyright (c) MarcStan
+ ///
+ ///Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+ ///
+ ///The above copyright notic [rest of string was truncated]";.
+ ///
+ internal static string ResourceEmbedder {
+ get {
+ return ResourceManager.GetString("ResourceEmbedder", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to # Windows Community Toolkit
+ ///
+ ///Copyright © .NET Foundation and Contributors
+ ///
+ ///All rights reserved.
+ ///
+ ///## MIT License (MIT)
+ ///
+ ///Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished [rest of string was truncated]";.
+ ///
+ internal static string WindowsCommunityToolkit {
+ get {
+ return ResourceManager.GetString("WindowsCommunityToolkit", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to MIT License
+ ///
+ ///Copyright (c) 2021-2023 Leszek Pomianowski and WPF UI Contributors. https://dev.lepo.co/
+ ///
+ ///Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject t [rest of string was truncated]";.
+ ///
+ internal static string wpfui {
+ get {
+ return ResourceManager.GetString("wpfui", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/EnvyUpdate/Properties/Licenses.resx b/EnvyUpdate/Properties/Licenses.resx
new file mode 100644
index 0000000..6fe2a2b
--- /dev/null
+++ b/EnvyUpdate/Properties/Licenses.resx
@@ -0,0 +1,199 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ GNU LGPL information
+ --------------------
+This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+
+You can receive a copy of the GNU Lesser General Public License from http://www.gnu.org/
+
+
+ The MIT License
+
+Copyright (c) 2012 Simon Cropp and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+ MIT License
+
+Copyright (c) 2019-2023 Jakob Senkl
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+ MIT License
+
+Copyright (c) Simon Cropp
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+ The MIT License (MIT)
+
+Copyright (c) MarcStan
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+ # Windows Community Toolkit
+
+Copyright © .NET Foundation and Contributors
+
+All rights reserved.
+
+## MIT License (MIT)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+ MIT License
+
+Copyright (c) 2021-2023 Leszek Pomianowski and WPF UI Contributors. https://dev.lepo.co/
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
\ No newline at end of file
diff --git a/EnvyUpdate/Properties/Resources.Designer.cs b/EnvyUpdate/Properties/Resources.Designer.cs
index 33ad0e8..466a9c0 100644
--- a/EnvyUpdate/Properties/Resources.Designer.cs
+++ b/EnvyUpdate/Properties/Resources.Designer.cs
@@ -19,7 +19,7 @@ namespace EnvyUpdate.Properties {
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
public class Resources {
@@ -69,6 +69,15 @@ namespace EnvyUpdate.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to An error occurred attempting to install the new version. Please enable logging in the settings and report the issue on GitHub!.
+ ///
+ public static string error_installing {
+ get {
+ return ResourceManager.GetString("error_installing", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Exit EnvyUpdate?.
///
@@ -78,6 +87,114 @@ namespace EnvyUpdate.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to There was a problem downloading the driver installer. Please try again..
+ ///
+ public static string info_download_error {
+ get {
+ return ResourceManager.GetString("info_download_error", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Error while downloading.
+ ///
+ public static string info_download_error_title {
+ get {
+ return ResourceManager.GetString("info_download_error_title", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to A download process is already running!.
+ ///
+ public static string info_download_running {
+ get {
+ return ResourceManager.GetString("info_download_running", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Download running.
+ ///
+ public static string info_download_running_title {
+ get {
+ return ResourceManager.GetString("info_download_running_title", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Driver installer successfully downloaded..
+ ///
+ public static string info_download_success {
+ get {
+ return ResourceManager.GetString("info_download_success", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Download successful.
+ ///
+ public static string info_download_success_title {
+ get {
+ return ResourceManager.GetString("info_download_success_title", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to The driver files have finished extracting..
+ ///
+ public static string info_extract_complete {
+ get {
+ return ResourceManager.GetString("info_extract_complete", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Extraction complete.
+ ///
+ public static string info_extract_complete_title {
+ get {
+ return ResourceManager.GetString("info_extract_complete_title", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to The driver files are being extracted. This could take a few minutes..
+ ///
+ public static string info_extracting {
+ get {
+ return ResourceManager.GetString("info_extracting", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Extracting driver files.
+ ///
+ public static string info_extracting_title {
+ get {
+ return ResourceManager.GetString("info_extracting_title", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to The installation of the new driver version was completed..
+ ///
+ public static string info_install_complete {
+ get {
+ return ResourceManager.GetString("info_install_complete", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Update finished.
+ ///
+ public static string info_install_complete_title {
+ get {
+ return ResourceManager.GetString("info_install_complete_title", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Preference reset..
///
@@ -114,6 +231,15 @@ namespace EnvyUpdate.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to No.
+ ///
+ public static string no {
+ get {
+ return ResourceManager.GetString("no", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to No NVIDIA GPU found. Application will exit..
///
@@ -124,7 +250,16 @@ namespace EnvyUpdate.Properties {
}
///
- /// Looks up a localized string similar to Autostart.
+ /// Looks up a localized string similar to Version was skipped. Update popups will be disabled until a new version releases..
+ ///
+ public static string skip_confirm {
+ get {
+ return ResourceManager.GetString("skip_confirm", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Run at Windows startup.
///
public static string ui_autostart {
get {
@@ -132,6 +267,60 @@ namespace EnvyUpdate.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to Download.
+ ///
+ public static string ui_download {
+ get {
+ return ResourceManager.GetString("ui_download", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Save files to AppData.
+ ///
+ public static string ui_enable_appdata {
+ get {
+ return ResourceManager.GetString("ui_enable_appdata", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Download updates automatically.
+ ///
+ public static string ui_enable_autodownload {
+ get {
+ return ResourceManager.GetString("ui_enable_autodownload", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Enable logging to file.
+ ///
+ public static string ui_enable_logging {
+ get {
+ return ResourceManager.GetString("ui_enable_logging", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Home.
+ ///
+ public static string ui_home {
+ get {
+ return ResourceManager.GetString("ui_home", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to DCH driver.
+ ///
+ public static string ui_info_dch {
+ get {
+ return ResourceManager.GetString("ui_info_dch", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Mobile GPU (Laptop, etc)?.
///
@@ -141,6 +330,24 @@ namespace EnvyUpdate.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to Update available..
+ ///
+ public static string ui_info_outdated {
+ get {
+ return ResourceManager.GetString("ui_info_outdated", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Up to date..
+ ///
+ public static string ui_info_uptodate {
+ get {
+ return ResourceManager.GetString("ui_info_uptodate", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to EnvyUpdate website.
///
@@ -159,6 +366,15 @@ namespace EnvyUpdate.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to Licenses.
+ ///
+ public static string ui_licenses {
+ get {
+ return ResourceManager.GetString("ui_licenses", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Local driver version:.
///
@@ -168,6 +384,33 @@ namespace EnvyUpdate.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to Local driver type:.
+ ///
+ public static string ui_localdriver_type {
+ get {
+ return ResourceManager.GetString("ui_localdriver_type", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to All good..
+ ///
+ public static string ui_message_good {
+ get {
+ return ResourceManager.GetString("ui_message_good", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to New driver found..
+ ///
+ public static string ui_message_update {
+ get {
+ return ResourceManager.GetString("ui_message_update", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Online driver version:.
///
@@ -177,6 +420,51 @@ namespace EnvyUpdate.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to Open website.
+ ///
+ public static string ui_openwebsite {
+ get {
+ return ResourceManager.GetString("ui_openwebsite", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Settings.
+ ///
+ public static string ui_settings {
+ get {
+ return ResourceManager.GetString("ui_settings", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Version skipped.
+ ///
+ public static string ui_skipped {
+ get {
+ return ResourceManager.GetString("ui_skipped", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Skip this version.
+ ///
+ public static string ui_skipversion {
+ get {
+ return ResourceManager.GetString("ui_skipversion", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Studio Driver is not supported by this graphics card..
+ ///
+ public static string ui_studionotsupported {
+ get {
+ return ResourceManager.GetString("ui_studionotsupported", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Are you sure you want to uninstall EnvyUpdate?.
///
@@ -196,12 +484,39 @@ namespace EnvyUpdate.Properties {
}
///
- /// Looks up a localized string similar to A new driver update is available for your graphics card. Click for more info..
+ /// Looks up a localized string similar to EnvyUpdate must be uninstalled because of an application bug. Please download the most recent version again..
+ ///
+ public static string uninstall_legacy_message {
+ get {
+ return ResourceManager.GetString("uninstall_legacy_message", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Your operating system is not supported by EnvyUpdate. Windows 10 or later is required..
+ ///
+ public static string unsupported_os {
+ get {
+ return ResourceManager.GetString("unsupported_os", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to A new driver update is available for your graphics card..
///
public static string update_popup_message {
get {
return ResourceManager.GetString("update_popup_message", resourceCulture);
}
}
+
+ ///
+ /// Looks up a localized string similar to Yes.
+ ///
+ public static string yes {
+ get {
+ return ResourceManager.GetString("yes", resourceCulture);
+ }
+ }
}
}
diff --git a/EnvyUpdate/Properties/Resources.de.resx b/EnvyUpdate/Properties/Resources.de.resx
index 36a36bf..b5a18f5 100644
--- a/EnvyUpdate/Properties/Resources.de.resx
+++ b/EnvyUpdate/Properties/Resources.de.resx
@@ -120,9 +120,48 @@
NVIDIA Aktualisierungsanwendung.
+
+ Ein Fehler ist bei der Installation aufgetreten. Bitte aktivieren Sie den Log und melden Sie den Fehler auf GitHub!
+
EnvyUpdate schließen?
+
+ Fehler beim Herunterladen der Treiber-Installationsdatei. Bitte versuchen Sie es erneut.
+
+
+ Fehler beim Herunterladen
+
+
+ Ein Downloadvorgang läuft bereits!
+
+
+ Download läuft
+
+
+ Treiber-Installationsdatei erfolgreich heruntergeladen.
+
+
+ Herunterladen erfolgreich abgeschlossen
+
+
+ Die Treiberdateien werden nun extrahiert. Dies könnte einige Minuten dauern.
+
+
+ Dateien werden extrahiert
+
+
+ Die Treiberdateien wurden vollständig extrahiert.
+
+
+ Extrahierung abgeschlossen
+
+
+ Die Installation der neuen Treiberversion wurde abgeschlossen.
+
+
+ Update abgeschlossen
+
Einstellung zurückgesetzt.
@@ -135,34 +174,100 @@
Neue Version von EnvyUpdate gefunden. Die Anwendung wird neu starten.\nDies wird wahrscheinlich einige Sekunden dauern.
+
+ Nein
+
Keine NVIDIA GPU gefunden. EnvyUpdate wird sich nun schließen.
+
+ Version übersprungen. Aktualisierungsbenachrichtigungen werden bis zur nächsten Version deaktiviert.
+
- Autostart
+ Beim Start von Windows ausführen
+
+
+ Herunterladen
+
+
+ Programmdaten in AppData speichern
+
+
+ Updates automatisch herunterladen
+
+
+ Programm-Log in Datei schreiben
+
+
+ Start
+
+
+ DCH Treiber
Mobile Grafikkarte (Laptop, etc)?
+
+ Aktualisierung verfügbar.
+
+
+ Aktuell.
+
EnvyUpdate Webseite
Installieren
+
+ Lizenzen
+
Lokale Treiberversion:
+
+ Lokaler Treibertyp:
+
+
+ Alles in Ordnung.
+
+
+ Neue Treiberversion gefunden.
+
Online Treiberversion:
+
+ Webseite öffnen
+
+
+ Einstellungen
+
+
+ Version übersprungen
+
+
+ Diese Version überspringen
+
+
+ Studio Treiber wird von dieser Grafikkarte nicht unterstützt.
+
Sind Sie sich sicher, dass Sie EnvyUpdate deinstallieren wollen?
Deinstallieren?
+
+ Aufgrund eines Programmfehlers musste EnvyUpdate deinstalliert werden. Bitte laden Sie die neuste Version erneut manuell herunter.
+
+
+ Diese Betriebssystemversion wird von EnvyUpdate nicht unterstützt. Windows 10 oder neuer wird vorausgesetzt.
+
- Eine neue Treiberversion ist verfügbar. Hier klicken für mehr Info.
+ Eine neue Treiberversion ist verfügbar.
+
+
+ Ja
\ No newline at end of file
diff --git a/EnvyUpdate/Properties/Resources.resx b/EnvyUpdate/Properties/Resources.resx
index 67f12e1..2623dae 100644
--- a/EnvyUpdate/Properties/Resources.resx
+++ b/EnvyUpdate/Properties/Resources.resx
@@ -120,9 +120,48 @@
NVIDIA Updater Application.
+
+ An error occurred attempting to install the new version. Please enable logging in the settings and report the issue on GitHub!
+
Exit EnvyUpdate?
+
+ There was a problem downloading the driver installer. Please try again.
+
+
+ Error while downloading
+
+
+ A download process is already running!
+
+
+ Download running
+
+
+ Driver installer successfully downloaded.
+
+
+ Download successful
+
+
+ The driver files are being extracted. This could take a few minutes.
+
+
+ Extracting driver files
+
+
+ The driver files have finished extracting.
+
+
+ Extraction complete
+
+
+ The installation of the new driver version was completed.
+
+
+ Update finished
+
Preference reset.
@@ -135,34 +174,100 @@
New version of EnvyUpdate found. Application will restart.\nThis will probably take a few seconds.
+
+ No
+
No NVIDIA GPU found. Application will exit.
+
+ Version was skipped. Update popups will be disabled until a new version releases.
+
- Autostart
+ Run at Windows startup
+
+
+ Download
+
+
+ Save files to AppData
+
+
+ Download updates automatically
+
+
+ Enable logging to file
+
+
+ Home
+
+
+ DCH driver
Mobile GPU (Laptop, etc)?
+
+ Update available.
+
+
+ Up to date.
+
EnvyUpdate website
Install
+
+ Licenses
+
Local driver version:
+
+ Local driver type:
+
+
+ All good.
+
+
+ New driver found.
+
Online driver version:
+
+ Open website
+
+
+ Settings
+
+
+ Version skipped
+
+
+ Skip this version
+
+
+ Studio Driver is not supported by this graphics card.
+
Are you sure you want to uninstall EnvyUpdate?
Uninstall?
+
+ EnvyUpdate must be uninstalled because of an application bug. Please download the most recent version again.
+
+
+ Your operating system is not supported by EnvyUpdate. Windows 10 or later is required.
+
- A new driver update is available for your graphics card. Click for more info.
+ A new driver update is available for your graphics card.
+
+
+ Yes
\ No newline at end of file
diff --git a/EnvyUpdate/Properties/Settings.Designer.cs b/EnvyUpdate/Properties/Settings.Designer.cs
index 0585bd8..dbccb96 100644
--- a/EnvyUpdate/Properties/Settings.Designer.cs
+++ b/EnvyUpdate/Properties/Settings.Designer.cs
@@ -8,21 +8,17 @@
//
//------------------------------------------------------------------------------
-namespace EnvyUpdate.Properties
-{
-
-
+namespace EnvyUpdate.Properties {
+
+
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
- internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
- {
-
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
-
- public static Settings Default
- {
- get
- {
+
+ public static Settings Default {
+ get {
return defaultInstance;
}
}
diff --git a/EnvyUpdate/SettingsPage.xaml b/EnvyUpdate/SettingsPage.xaml
new file mode 100644
index 0000000..ab6f973
--- /dev/null
+++ b/EnvyUpdate/SettingsPage.xaml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/EnvyUpdate/SettingsPage.xaml.cs b/EnvyUpdate/SettingsPage.xaml.cs
new file mode 100644
index 0000000..e65aa94
--- /dev/null
+++ b/EnvyUpdate/SettingsPage.xaml.cs
@@ -0,0 +1,123 @@
+using System;
+using System.IO;
+using System.Windows;
+
+namespace EnvyUpdate
+{
+ ///
+ /// Interaction logic for SettingsPage.xaml
+ ///
+ public partial class SettingsPage
+ {
+ public SettingsPage()
+ {
+ InitializeComponent();
+
+ System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
+ System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
+ string version = fvi.FileVersion;
+
+ textBlockVer.Text = version;
+ if (GlobalVars.monitoringInstall)
+ textBlockVer.FontStyle = FontStyles.Italic;
+
+ if (File.Exists(Path.Combine(GlobalVars.saveDirectory, "envyupdate.log")) || File.Exists(Path.Combine(GlobalVars.appdata, "envyupdate.log")))
+ chkLog.IsChecked = true;
+
+ if (GlobalVars.useAppdata)
+ chkAppdata.IsChecked = true;
+
+ if (!GlobalVars.hasWrite)
+ chkAppdata.IsEnabled = false;
+
+ if (GlobalVars.autoDownload)
+ chkAutodl.IsChecked = true;
+
+ if (GlobalVars.isDownloading)
+ {
+ chkAppdata.IsEnabled = false;
+ }
+ else
+ chkAppdata.IsEnabled = true;
+
+ textBoxLicEnvyupdate.Text = Properties.Licenses.EnvyUpdate;
+ textBoxLicFody.Text = Properties.Licenses.Fody;
+ textBoxLicCostura.Text = Properties.Licenses.CosturaFody;
+ textBoxLicResourceembedder.Text = Properties.Licenses.ResourceEmbedder;
+ textBoxLicWindowscommunitytoolkit.Text = Properties.Licenses.WindowsCommunityToolkit;
+ textBoxLicWpfui.Text = Properties.Licenses.wpfui;
+ textBoxLic7zip.Text = Properties.Licenses._7zip;
+ }
+
+ private void CardWeb_Click(object sender, RoutedEventArgs e)
+ {
+ Debug.LogToFile("INFO Launching website.");
+ System.Diagnostics.Process.Start("https://github.com/fyr77/EnvyUpdate/");
+ }
+
+ private void chkLog_Checked(object sender, RoutedEventArgs e)
+ {
+ if (!Debug.isVerbose)
+ {
+ Debug.isVerbose = true;
+ Debug.LogToFile("------");
+ Debug.LogToFile("INFO Enabled logging to file. Restart Application to see full startup log.");
+ }
+ }
+
+ private void chkLog_Unchecked(object sender, RoutedEventArgs e)
+ {
+ if (Debug.isVerbose)
+ {
+ Debug.LogToFile("INFO Disabled logging to file.");
+ if (File.Exists(Path.Combine(GlobalVars.saveDirectory, "envyupdate.log")))
+ File.Move(Path.Combine(GlobalVars.saveDirectory, "envyupdate.log"), Path.Combine(GlobalVars.saveDirectory, "envyupdate." + DateTime.Now.ToString("yyyyMMdd-HHmmss") + ".log"));
+ Debug.isVerbose = false;
+ }
+ }
+
+ private void chkAppdata_Checked(object sender, RoutedEventArgs e)
+ {
+ if (!Directory.Exists(GlobalVars.appdata))
+ Directory.CreateDirectory(GlobalVars.appdata);
+
+ GlobalVars.useAppdata = true;
+ GlobalVars.saveDirectory = GlobalVars.appdata;
+ Util.MoveFilesToAppdata();
+
+ Debug.LogToFile("INFO Switched to AppData directory.");
+ }
+
+ private void chkAppdata_Unchecked(object sender, RoutedEventArgs e)
+ {
+ GlobalVars.useAppdata = false;
+ GlobalVars.saveDirectory = GlobalVars.directoryOfExe;
+
+ if (Directory.Exists(GlobalVars.appdata))
+ {
+ Util.MoveFilesToExe();
+ Directory.Delete(GlobalVars.appdata, true);
+ }
+
+ Debug.LogToFile("INFO Switched to EXE directory.");
+ }
+
+ private void chkAutodl_Checked(object sender, RoutedEventArgs e)
+ {
+ GlobalVars.autoDownload = true;
+ if (!File.Exists(Path.Combine(GlobalVars.saveDirectory, "autodl.envy")))
+ {
+ File.Create(Path.Combine(GlobalVars.saveDirectory, "autodl.envy"));
+ }
+ }
+
+ private void chkAutodl_Unchecked(object sender, RoutedEventArgs e)
+ {
+ GlobalVars.autoDownload = false;
+ if (File.Exists(Path.Combine(GlobalVars.saveDirectory, "autodl.envy")))
+ {
+ File.Delete(Path.Combine(GlobalVars.saveDirectory, "autodl.envy"));
+ }
+ }
+ }
+}
diff --git a/EnvyUpdate/Util.cs b/EnvyUpdate/Util.cs
index 6f2be10..8a504cd 100644
--- a/EnvyUpdate/Util.cs
+++ b/EnvyUpdate/Util.cs
@@ -1,16 +1,15 @@
using IWshRuntimeLibrary;
+using Microsoft.Build.Framework.XamlTypes;
+using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Management;
using System.Net;
-using System.Windows;
-using Newtonsoft.Json;
-using System.Xml;
-using System.Xml.Linq;
using System.Text.RegularExpressions;
-using System.Runtime.InteropServices;
+using System.Windows;
+using System.Xml.Linq;
namespace EnvyUpdate
{
@@ -28,19 +27,26 @@ namespace EnvyUpdate
// query local driver version
try
{
+ Debug.LogToFile("INFO Looking for driver version in ManagementObjects");
+
foreach (ManagementObject obj in new ManagementObjectSearcher("SELECT * FROM Win32_VideoController").Get())
{
if (obj["Description"].ToString().ToLower().Contains("nvidia"))
{
- OfflineGPUVersion = obj["DriverVersion"].ToString().Replace(".", string.Empty).Substring(5);
+ OfflineGPUVersion = obj["DriverVersion"].ToString().Replace(".", string.Empty);
+ OfflineGPUVersion = OfflineGPUVersion.Substring(Math.Max(0, OfflineGPUVersion.Length - 5));
OfflineGPUVersion = OfflineGPUVersion.Substring(0, 3) + "." + OfflineGPUVersion.Substring(3); // add dot
foundGpu = true;
+ Debug.LogToFile("INFO Found driver in ManagementObjects.");
break;
}
}
if (!foundGpu)
+ {
+ Debug.LogToFile("WARN Did NOT find driver in ManagementObjects.");
throw new InvalidDataException();
+ }
return OfflineGPUVersion;
}
@@ -50,6 +56,22 @@ namespace EnvyUpdate
}
}
+ ///
+ /// Check for existence of Nvidia GPU
+ ///
+ ///
+ public static bool IsNvidia()
+ {
+ Debug.LogToFile("INFO Checking for existence of Nvidia GPU.");
+
+ foreach (ManagementObject obj in new ManagementObjectSearcher("SELECT * FROM Win32_VideoController").Get())
+ {
+ if (obj["Description"].ToString().ToLower().Contains("nvidia"))
+ return true;
+ }
+ return false;
+ }
+
///
/// Creates a standard Windows shortcut.
///
@@ -57,15 +79,18 @@ namespace EnvyUpdate
///
///
///
- public static void CreateShortcut(string shortcutName, string shortcutPath, string targetFileLocation, string description)
+ ///
+ public static void CreateShortcut(string shortcutName, string shortcutPath, string targetFileLocation, string description, string arguments = "")
{
// It seems unnecessarily complex to create a simple shortcut using C#. Oh well.
string shortcutLocation = Path.Combine(shortcutPath, shortcutName + ".lnk");
WshShell shell = new WshShell();
IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutLocation);
+ shortcut.Arguments = arguments;
shortcut.Description = description;
shortcut.TargetPath = targetFileLocation;
+ Debug.LogToFile("INFO Saving shortcut link.");
shortcut.Save();
}
///
@@ -98,68 +123,19 @@ namespace EnvyUpdate
{
Application.Current.MainWindow.Show();
Application.Current.MainWindow.WindowState = WindowState.Normal;
- }
- ///
- /// Checks for newest EnvyUpdate version.
- ///
- ///
- public static float GetNewVer()
- {
- // This will fetch the most recent version's tag on GitHub.
- string updPath = "https://api.github.com/repos/fyr77/envyupdate/releases/latest";
-
- WebClient wc = new WebClient();
- // Use some user agent to not get 403'd by GitHub.
- wc.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko");
- string webData = wc.DownloadString(updPath);
- dynamic data = JsonConvert.DeserializeObject(webData);
-
- // I am not catching a possible parsing exception, because I cannot think of any way it could happen.
- // If there is no internet connection, it should already throw when using the web client.
- float version = float.Parse(data.tag_name);
-
- return version;
+ Application.Current.MainWindow.Activate();
}
///
- /// Updates the application by downloading the new version from Github and replacing the old file using a seperate CMD instance.
+ /// Deletes EnvyUpdate.exe by calling cmd
///
- public static void UpdateApp()
- {
- string appdata = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\envyupdate\\";
-
- using (var client = new WebClient())
- {
- client.DownloadFile("https://github.com/fyr77/EnvyUpdate/releases/latest/download/EnvyUpdate.exe", appdata + "EnvyUpdated.exe");
- }
-
- MessageBox.Show(Properties.Resources.message_new_version);
-
- // Replace exe with new one.
- // This starts a seperate cmd process which will wait a bit, then delete EnvyUpdate and rename the previously downloaded EnvyUpdated.exe to EnvyUpdate.exe
- // I know this is a bit dumb, but I honestly couldn't think of a different way to solve this properly, since the Application has to delete itself.
- Process process = new Process();
- ProcessStartInfo startInfo = new ProcessStartInfo
- {
- WindowStyle = ProcessWindowStyle.Hidden,
- WorkingDirectory = appdata,
- FileName = "cmd.exe",
- Arguments = "/C timeout 5 && del EnvyUpdate.exe && ren EnvyUpdated.exe EnvyUpdate.exe && EnvyUpdate.exe"
- };
- process.StartInfo = startInfo;
- process.Start();
-
- Environment.Exit(2);
- }
public static void SelfDelete()
{
- string appdata = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\envyupdate\\";
-
Process process = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo
{
WindowStyle = ProcessWindowStyle.Hidden,
- WorkingDirectory = appdata,
+ WorkingDirectory = GlobalVars.legacyAppdata,
FileName = "cmd.exe",
Arguments = "/C timeout 5 && del EnvyUpdate.exe"
};
@@ -168,12 +144,12 @@ namespace EnvyUpdate
Environment.Exit(2);
}
- public static int GetIDs(string IDtype)
+ public static int GetIDs(string IDtype, bool retry = true)
{
- // TODO: check for 2 occurences of GPU - if yes ask if mobile!!!
string xmlcontent = null;
int id = -1;
+ Debug.LogToFile("INFO Getting Nvidia GPU list...");
using (var wc = new WebClient())
{
switch (IDtype)
@@ -182,36 +158,57 @@ namespace EnvyUpdate
case "pfid":
xmlcontent = wc.DownloadString("https://www.nvidia.com/Download/API/lookupValueSearch.aspx?TypeID=3");
break;
- case "osid":
- xmlcontent = wc.DownloadString("https://www.nvidia.com/Download/API/lookupValueSearch.aspx?TypeID=4");
- break;
- case "langid":
- xmlcontent = wc.DownloadString("https://www.nvidia.com/Download/API/lookupValueSearch.aspx?TypeID=5");
- break;
default:
break;
}
}
- XDocument xDoc = XDocument.Parse(xmlcontent);
- string gpuName = GetGPUName(true);
- switch (IDtype)
+ Debug.LogToFile("INFO Got Nvidia GPU list.");
+ if (xmlcontent == null)
{
- case "psid":
- id = GetValueFromName(xDoc, gpuName, false);
- break;
- case "pfid":
- id = GetValueFromName(xDoc, gpuName, true);
- break;
- case "osid":
- id = GetOSID();
- break;
- case "langid":
- // Currently unsupported, because Nvidia has a weird way of naming languages in their native OR english version.
- // https://www.nvidia.com/Download/API/lookupValueSearch.aspx?TypeID=5
- break;
- default:
- break;
+ switch (IDtype)
+ {
+ case "osid":
+ id = GetOSID();
+ Debug.LogToFile("INFO Got osid: " + id);
+ break;
+ case "psid":
+ case "pfid":
+ Debug.LogToFile("WARN GPU list is NULL! This is a possible error source.");
+ if (retry)
+ {
+ Debug.LogToFile("WARN Trying to get ID again.");
+ id = GetIDs(IDtype, false);
+ }
+ else
+ {
+ Debug.LogToFile("FATAL Could not get GPU list to find IDs.");
+ throw new ArgumentNullException();
+ }
+ break;
+ default:
+ Debug.LogToFile("WARN GetIDs was called, but nothing was specified. THIS SHOULD NOT HAPPEN!");
+ break;
+ }
+ }
+ else
+ {
+ XDocument xDoc = XDocument.Parse(xmlcontent);
+ string gpuName = GetGPUName(true);
+ switch (IDtype)
+ {
+ case "psid":
+ id = GetValueFromName(xDoc, gpuName, true);
+ Debug.LogToFile("INFO Got psid: " + id);
+ break;
+ case "pfid":
+ id = GetValueFromName(xDoc, gpuName, false);
+ Debug.LogToFile("INFO Got pfid: " + id);
+ break;
+ default:
+ Debug.LogToFile("WARN GetIDs was called, but nothing was specified.");
+ break;
+ }
}
return id;
@@ -224,23 +221,26 @@ namespace EnvyUpdate
///
///
///
- private static int GetValueFromName (XDocument xDoc, string query, bool psid)
+ private static int GetValueFromName(XDocument xDoc, string query, bool psid)
{
int value = 0;
int i = 0;
int value1 = 0;
- int value2 = 0;
+ int value2 = 0; //Two values are used to cover the eventuality of there being two Nvidia cards (unlikely) in a mobile device
var names = xDoc.Descendants("Name");
- foreach (var name in names)
+ foreach (var name in names) // Looping through the XML Doc because the name is not the primary key
{
string sName = name.Value.ToString().ToLower();
- if (sName == query)
+ if (sName.Contains(query))
{
+ Debug.LogToFile("INFO Matched GetValueFromName query: " + sName);
string cleanResult = null;
if (psid)
{
+ Debug.LogToFile("INFO Getting psid.");
+
if (i == 0)
value1 = int.Parse(name.Parent.FirstAttribute.Value);
else
@@ -248,6 +248,8 @@ namespace EnvyUpdate
}
else
{
+ Debug.LogToFile("INFO Getting something other than psid.");
+
string result = name.Parent.Value.ToLower();
int index = result.IndexOf(sName);
cleanResult = (index < 0)
@@ -280,6 +282,7 @@ namespace EnvyUpdate
}
}
+
return value;
}
///
@@ -290,31 +293,21 @@ namespace EnvyUpdate
private static int GetOSID()
{
// This is faster than making a whole web request and searching through XML. This application only supports 8 possible IDs, so they are hardcoded.
- int value = 0;
- string OS = Environment.OSVersion.Version.Major.ToString() + "." + Environment.OSVersion.Version.Minor.ToString();
+ int value;
- // Here the 32bit values are used. Later, if the OS is 64bit, we'll add 1, since that is how Nvidia does their IDs.
- switch (OS)
+ if (Environment.OSVersion.Version.Build < 22000)
{
- case "10.0":
+ // This means we are running Windows 10.
+ if (Environment.Is64BitOperatingSystem)
+ value = 57;
+ else
value = 56;
- break;
- case "6.1":
- value = 18;
- break;
- case "6.2":
- value = 27;
- break;
- case "6.3":
- value = 40;
- break;
- default:
- break;
}
-
- //Simply increment the ID by 1 if OS is 64bit.
- if (Environment.Is64BitOperatingSystem)
- value++;
+ else
+ {
+ // This must be Windows 11 (for now, until Windows 12 comes along)
+ value = 135; // No need to check for 64bit, Win11 can not be 32bit.
+ }
return value;
}
@@ -325,15 +318,17 @@ namespace EnvyUpdate
public static string GetGPUName(bool lower)
{
string GPUName = null;
+
+ Debug.LogToFile("INFO Trying to get GPU name from ManagementObjects...");
foreach (ManagementObject obj in new ManagementObjectSearcher("SELECT * FROM Win32_VideoController").Get())
{
//if (obj["Description"].ToString().ToLower().Contains("radeon"))
//{
- // If it's an AMD card, use the "Name" field, because they use chip code numbers in "VideoProcessor", which we do not need.
- // Todo for 3.0: Find a way to ignore mobile Radeon GPUs in Laptops.
- // For now: Since we only care about Nvidia GPUs, this is commented out.
- //GPUName = obj["Name"].ToString().ToLower();
- //break;
+ // If it's an AMD card, use the "Name" field, because they use chip code numbers in "VideoProcessor", which we do not need.
+ // Todo for 3.0: Find a way to ignore mobile Radeon GPUs in Laptops.
+ // For now: Since we only care about Nvidia GPUs, this is commented out.
+ //GPUName = obj["Name"].ToString().ToLower();
+ //break;
//}
if (obj["Description"].ToString().ToLower().Contains("nvidia"))
{
@@ -342,7 +337,7 @@ namespace EnvyUpdate
{
GPUName = obj["VideoProcessor"].ToString().ToLower();
// Remove any 3GB, 6GB or similar from name. We don't need to know the VRAM to get results.
- GPUName = Regex.Replace(GPUName, "\\d+GB", "");
+ GPUName = Regex.Match(GPUName, "(geforce )((.t.? )|(mx ))?\\w*\\d*( ti)?").Value;
}
else
GPUName = obj["VideoProcessor"].ToString();
@@ -350,23 +345,355 @@ namespace EnvyUpdate
break;
}
}
+ Debug.LogToFile("INFO Found GPU name: " + GPUName);
// This should NEVER return null outside of debugging mode, since EnvyUpdate should refuse to start without and Nvidia GPU.
return GPUName;
}
+ ///
+ /// Checks for Battery and assumes a mobile GPU if present.
+ ///
+ ///
public static bool IsMobile()
{
bool result = false;
foreach (ManagementObject obj in new ManagementObjectSearcher("SELECT * FROM Win32_Battery").Get())
{
+ Debug.LogToFile("INFO Found Win32_Battery, assuming mobile device.");
result = true;
}
foreach (ManagementObject obj in new ManagementObjectSearcher("SELECT * FROM Win32_PortableBattery").Get())
{
+ Debug.LogToFile("INFO Found Win32_PortableBattery, assuming mobile device.");
result = true;
}
return result;
}
+ ///
+ /// Checks Windows registry for Nvidia DCH Key. If it is present, returns true.
+ /// Can also check file system for existence of DLL if registry access fails
+ ///
+ ///
+ public static bool IsDCH()
+ {
+ try
+ {
+ Debug.LogToFile("INFO Trying to find DCH key in registry...");
+ RegistryKey nvlddmkm = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\services\nvlddmkm", false);
+ return nvlddmkm.GetValueNames().Contains("DCHUVen");
+ }
+ catch (Exception ex)
+ {
+ if (ex.Message == "Object reference not set to an instance of an object." || ex.InnerException is NullReferenceException)
+ {
+ Debug.LogToFile("INFO could not find key. Assuming non-DCH driver.");
+ // Assume no DCH driver is installed if key is not found.
+ return false;
+ }
+ else
+ {
+ try
+ {
+ Debug.LogToFile("WARN Could not read registry, probing file system instead...");
+ //Registry reading error. Check for existance of file nvsvs.dll instead.
+ if (System.IO.File.Exists(Path.Combine(Environment.SystemDirectory, "nvsvs.dll")))
+ {
+ Debug.LogToFile("INFO Found DCH driver file.");
+ return true;
+ }
+ else
+ {
+ Debug.LogToFile("INFO Did not find DCH driver file. Assuming non-DCH driver.");
+ return false;
+ }
+
+ }
+ catch (Exception)
+ {
+ Debug.LogToFile("FATAL Could not probe file system. Error: " + ex.Message);
+ MessageBox.Show("An error has occured. Please report this on GitHub.\nError:" + ex.Message);
+ Environment.Exit(20);
+ return false;
+ }
+ }
+ }
+ }
+ public static int GetDTCID()
+ {
+ return 1; // Force update to DCH drivers
+ }
+
+ public static int GetDTID()
+ {
+ /*
+ * 1 = Game Ready Driver (GRD)
+ * 18 = Studio Driver (SD)
+ */
+ //TODO: find way to differentiate between driver types
+
+ if (System.IO.File.Exists(Path.Combine(GlobalVars.saveDirectory, "sd.envy")))
+ return 18;
+ else
+ return 1;
+ }
+
+ public static string GetGpuUrl()
+ {
+ int psid;
+ int pfid;
+ int osid;
+ int dtcid;
+ int dtid;
+
+ if (Debug.isFake)
+ {
+ Debug.LogToFile("INFO Loading fake IDs.");
+ psid = Debug.LoadFakeIDs("psid");
+ pfid = Debug.LoadFakeIDs("pfid");
+ osid = Debug.LoadFakeIDs("osid");
+ dtcid = Debug.LoadFakeIDs("dtcid");
+ dtid = Debug.LoadFakeIDs("dtid");
+ }
+ else
+ {
+ psid = GetIDs("psid");
+ pfid = GetIDs("pfid");
+ osid = GetIDs("osid");
+ dtcid = GetDTCID();
+ dtid = GetDTID();
+ Debug.LogToFile("INFO Getting GPU URLs. IDs in order psid, pfid, osid, dtcid, dtid: " + psid + ", " + pfid + ", " + osid + ", " + dtcid + ", " + dtid);
+ }
+ string gpuUrlBuild = "http://www.nvidia.com/Download/processDriver.aspx?psid=" + psid.ToString() + "&pfid=" + pfid.ToString() + "&osid=" + osid.ToString() + "&dtcid=" + dtcid.ToString() + "&dtid=" + dtid.ToString();
+
+ Debug.LogToFile("INFO Built GPU URL: " + gpuUrlBuild);
+
+ string gpuUrl;
+
+ using (var c = new WebClient())
+ {
+ gpuUrl = c.DownloadString(gpuUrlBuild);
+
+ Debug.LogToFile("INFO Downloaded driver page URL: " + gpuUrl);
+
+ if (gpuUrl.Contains("https://") || gpuUrl.Contains("http://"))
+ {
+ //absolute url
+ }
+ else if (gpuUrl.Contains("//"))
+ {
+ //protocol agnostic url
+ gpuUrl = "https:" + gpuUrl;
+ }
+ else if (gpuUrl.StartsWith("driverResults.aspx"))
+ {
+ //relative url
+ gpuUrl = "https://www.nvidia.com/Download/" + gpuUrl;
+ }
+ else if (gpuUrl.Contains("No certified downloads were found"))
+ {
+ //configuration not supported
+ throw new ArgumentException(gpuUrlBuild);
+ }
+ else
+ {
+ //panic.
+ Debug.LogToFile("FATAL Unexpected web response: " + gpuUrl);
+ MessageBox.Show("ERROR: Invalid API response from Nvidia - unexpected web response. Please file an issue on GitHub.");
+ Environment.Exit(10);
+ }
+ }
+
+ return gpuUrl;
+ }
+
+ public static void UninstallAll()
+ {
+ if (System.IO.File.Exists(Path.Combine(GlobalVars.startup, "\\EnvyUpdate.lnk")))
+ {
+ Debug.LogToFile("INFO Deleted startup entry.");
+ System.IO.File.Delete(Path.Combine(GlobalVars.startup, "\\EnvyUpdate.lnk"));
+ }
+
+ if (System.IO.File.Exists(Path.Combine(GlobalVars.startmenu, "\\EnvyUpdate.lnk")))
+ {
+ Debug.LogToFile("INFO Deleted start menu entry.");
+ System.IO.File.Delete(Path.Combine(GlobalVars.startmenu, "\\EnvyUpdate.lnk"));
+ }
+ if ((GlobalVars.saveDirectory == GlobalVars.legacyAppdata) && System.IO.File.Exists(Path.Combine(GlobalVars.legacyAppdata, "EnvyUpdate.exe")))
+ {
+ Debug.LogToFile("INFO Deleting EnvyUpdate appdata and self.");
+ MessageBox.Show(Properties.Resources.uninstall_legacy_message);
+ Util.SelfDelete();
+ }
+ else if (Directory.Exists(GlobalVars.legacyAppdata))
+ {
+ Debug.LogToFile("INFO Deleting EnvyUpdate appdata folder");
+ Directory.Delete(GlobalVars.legacyAppdata, true);
+ }
+ }
+
+ public static bool IsDarkTheme()
+ {
+ try
+ {
+ Debug.LogToFile("INFO Trying to get app theme...");
+ int res = (int)Registry.GetValue("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", "AppsUseLightTheme", -1);
+ switch (res)
+ {
+ case 0:
+ Debug.LogToFile("INFO Using dark theme.");
+ return true;
+ case 1:
+ Debug.LogToFile("INFO Using light theme.");
+ return false;
+ default:
+ throw new IndexOutOfRangeException();
+ }
+ }
+ catch (Exception)
+ {
+ Debug.LogToFile("WARN Could not determine theme. Setting light theme.");
+ return false;
+ }
+ }
+
+ public static string GetDirectDownload(string gpuUrl)
+ {
+ string webcontent;
+ using (var wc = new WebClient())
+ webcontent = wc.DownloadString(gpuUrl);
+
+ string directUrl = Regex.Match(webcontent, "\\/Windows\\/\\d+\\.\\d+\\/[\\w\\d\\/\\-\\.]*exe").Value;
+ directUrl = "https://us.download.nvidia.com" + directUrl;
+ return directUrl;
+ }
+
+ public static string GetSevenZip()
+ {
+ string path;
+ if (ExistsOnPath("7zg.exe"))
+ {
+ path = "7zg.exe";
+ }
+ else
+ {
+ path = Path.Combine(GlobalVars.saveDirectory, "7zr.exe");
+ using (WebClient client = new WebClient())
+ {
+ client.Headers["User-Agent"] = GlobalVars.useragent;
+ client.DownloadFile(new Uri("https://www.7-zip.org/a/7zr.exe"), path);
+ }
+ Debug.LogToFile("INFO Downloaded 7-zip.");
+ }
+
+ return path;
+ }
+
+ public static Process ExtractWithSevenZip(string sevenZipPath, string filePath, string destinationDir)
+ {
+ if (!Directory.Exists(destinationDir))
+ Directory.CreateDirectory(destinationDir);
+
+ Process process = new Process();
+ ProcessStartInfo startInfo = new ProcessStartInfo
+ {
+ WindowStyle = ProcessWindowStyle.Minimized,
+ WorkingDirectory = destinationDir,
+ FileName = sevenZipPath,
+ Arguments = "x -aoa -y " + filePath + " Display.Driver Display.Nview Display.Optimus HDAudio MSVCR NVI2 NVPCF PhysX PPC ShieldWirelessController EULA.txt ListDevices.txt setup.cfg setup.exe"
+ };
+ process.EnableRaisingEvents = true;
+ process.StartInfo = startInfo;
+ return process;
+ }
+
+ public static void CleanInstallConfig(string filePath)
+ {
+ if (!System.IO.File.Exists(filePath))
+ {
+ Debug.LogToFile("FATAL Driver installer config not found, terminating.");
+ MessageBox.Show(Properties.Resources.error_installing);
+ Environment.Exit(17);
+ }
+
+ Debug.LogToFile("INFO Removing GFE content from installer config.");
+
+ string outfile = filePath + ".out";
+
+ StreamReader sr = new StreamReader(filePath);
+ StreamWriter sw = new StreamWriter(outfile);
+ string line;
+
+ while ((line = sr.ReadLine()) != null)
+ {
+ if (new[] { "EulaHtmlFile", "FunctionalConsentFile", "PrivacyPolicyFile" }.Any(c => line.Contains(c)))
+ {
+ continue;
+ }
+
+ sw.WriteLine(line);
+ }
+
+ sw.Close();
+ sr.Close();
+
+ System.IO.File.Delete(filePath);
+ System.IO.File.Move(outfile, filePath);
+
+ Debug.LogToFile("INFO Finished removing GFE content from installer config.");
+ }
+
+ private static bool ExistsOnPath(string fileName)
+ {
+ return GetFullPath(fileName) != null;
+ }
+
+ private static string GetFullPath(string fileName)
+ {
+ if (System.IO.File.Exists(fileName))
+ return Path.GetFullPath(fileName);
+
+ var values = Environment.GetEnvironmentVariable("PATH");
+ foreach (var path in values.Split(Path.PathSeparator))
+ {
+ var fullPath = Path.Combine(path, fileName);
+ if (System.IO.File.Exists(fullPath))
+ return fullPath;
+ }
+ return null;
+ }
+
+ public static bool HasWritePermissions()
+ {
+ try
+ {
+ System.IO.File.Create(Path.Combine(GlobalVars.saveDirectory, "writeable.envy")).Close();
+ System.IO.File.Delete(Path.Combine(GlobalVars.saveDirectory, "writeable.envy"));
+ return true;
+ }
+ catch (Exception)
+ {
+ return false;
+ }
+ }
+
+ public static void MoveFilesToAppdata()
+ {
+ string[] envyFiles = Directory.GetFiles(GlobalVars.directoryOfExe, "*.envy");
+ foreach (var item in envyFiles)
+ System.IO.File.Move(item, Path.Combine(GlobalVars.appdata, Path.GetFileName(item)));
+ if (System.IO.File.Exists(Path.Combine(GlobalVars.directoryOfExe, "envyupdate.log")))
+ System.IO.File.Move(Path.Combine(GlobalVars.directoryOfExe, "envyupdate.log"), Path.Combine(GlobalVars.appdata, "envyupdate.log"));
+ }
+
+ public static void MoveFilesToExe()
+ {
+ string[] envyFiles = Directory.GetFiles(GlobalVars.appdata, "*.envy");
+ foreach (var item in envyFiles)
+ System.IO.File.Move(item, Path.Combine(GlobalVars.directoryOfExe, Path.GetFileName(item)));
+ if (System.IO.File.Exists(Path.Combine(GlobalVars.appdata, "envyupdate.log")))
+ System.IO.File.Move(Path.Combine(GlobalVars.appdata, "envyupdate.log"), Path.Combine(GlobalVars.directoryOfExe, "envyupdate.log"));
+ }
}
-}
\ No newline at end of file
+}
diff --git a/EnvyUpdate/packages.config b/EnvyUpdate/packages.config
deleted file mode 100644
index 5bbda94..0000000
--- a/EnvyUpdate/packages.config
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index 9ffca0b..d6dacc4 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2020 Jakob Senkl
+Copyright (c) 2019-2024 fyr77
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index 0c4e180..cd44814 100644
--- a/README.md
+++ b/README.md
@@ -1,47 +1,40 @@
-
+# Important Information
+## I am no longer working on this project and I am looking for a new maintainer. Please see [the corresponding issue](https://vcs.diluvian.cc/fyr77/EnvyUpdate/issues/53) for more details.
+
+
# EnvyUpdate
- A small update checker application for Nvidia GPUs
-
- 
- 
- 
+A small portable update checker application for Nvidia GPUs
## How to use
-### 2.0 and later
+Download the latest release and run it. Windows SmartScreen Messages can be safely ignored. They only happen because this project is not digitally signed.
- 1. Download the [latest release](https://github.com/fyr77/EnvyUpdate/releases/latest/download/EnvyUpdate.exe) (or as a [.zip](https://github.com/fyr77/EnvyUpdate/releases/latest/download/EnvyUpdate.zip)) and run it. Windows SmartScreen Messages can be safely ignored. They only happen because this project is not digitally signed.
- 2. If you want to install the application, tick "Install". Otherwise it will run in portable mode.
-
-### 1.x
+The application itself does not update itself. If you notice any bugs or issues, be sure to check for a new version on GitHub!
- 1. Download the [latest release](https://github.com/fyr77/EnvyUpdate/releases/latest/download/EnvyUpdate.exe) (or as a [.zip](https://github.com/fyr77/EnvyUpdate/releases/latest/download/EnvyUpdate.zip)) and run it. Windows SmartScreen Messages can be safely ignored. They only happen because this project is not digitally signed.
- 2. If you want to use the application without saving any settings to your drive, keep the "Portable mode" checkbox checked. Otherwise uncheck it to automatically save your configuration.
- 3. Install the cookie-txt addon for [Firefox](https://addons.mozilla.org/en-US/firefox/addon/cookies-txt-one-click/) or [Chrome](https://chrome.google.com/webstore/detail/cookiestxt/njabckikapfpffapmjgojcnbfjonfjfg).
- 4. Go to the [Nvidia driver download page](https://www.nvidia.com/Download/index.aspx), enter your graphics card model, operating system, etc. and click "Search".
- 5. On the resulting page, click back in your browser and use the previously installed cookie-txt addon to save your site cookies as a .txt file.
- 6. Drag this .txt file into the corresponding space inside EnvyUpdate.
- 7. If everything works correctly, the online driver version should be displayed in the application window.
- 8. When not in portable mode, you may activate Autostart. This will make the application start everytime Windows boots. This will also install the application itself in your APPDATA folder.
-
-## Uninstalling
+Enabling Autostart will create a shortcut of EnvyUpdate in the Windows startup folder (shell:startup).
-### 2.0 and later
+### Virus warnings
-Untick "Install". This will delete EnvyUpdate from your system.
+Sometimes EnvyUpdate is flagged as a virus by Windows Defender or other antivirus software. This is a **false positive**, caused by EnvyUpdate reading a few values from the Windows registry and looking for files.
-### 1.x
+For extracting the driver installer 7-Zip is downloaded if it cannot be found on the user's system. This may also trigger antivirus warnings, but is necessary for the automatic driver installation to work.
-Simply download the latest release from the [releases page](https://github.com/fyr77/EnvyUpdate/releases), run it and untick "Autostart". This will remove EnvyUpdate from your system.
+### Using AppData for configuration files
+
+Starting with 3.2, EnvyUpdate supports saving its configuration files to AppData/Roaming instead of saving it next to the main exe file. You can enable it in the settings of the application.
+
+If EnvyUpdate fails to write to the folder containing the exe file, this option will be enabled automatically.
## Compatibility
-The application is compatible with all Nvidia GPUs that have their drivers available on the nvidia.com download page and runs on Windows 7 and up.
+The application should be compatible with all Nvidia GeForce GPUs that have their drivers available on the nvidia.com download page and runs on Windows 10 and up.
+
+It is tested with GeForce Series GPUs. Other series (e.g. Quadro) are unlikely to work and are not supported - if you have a Quadro card and are willing to implement support for them, feel free to reach out or create a PR.
## Development
-This application is currently maintained and developed by me (fyr77) alone in my free time.
+This application is currently unmaintained and developed by me (fyr77) alone in my free time.
I always try to implement critical fixes as fast as I can, but other features and minor bug fixes may take a few days or weeks to implement.
@@ -50,18 +43,19 @@ If you want to help me develop EnvyUpdate, you can start by creating issues with
## Other interesting tools
* [TinyNvidiaUpdateChecker](https://github.com/ElPumpo/TinyNvidiaUpdateChecker) - a command line update checker and installer. Inspired EnvyUpdate to begin with.
-* [Disable-Nvidia-Telemtry](https://github.com/NateShoffner/Disable-Nvidia-Telemetry) - does pretty much what the name says. It disables Nvidia Telemetry.
+* [nvidia-update](https://github.com/ZenitH-AT/nvidia-update) - a Powershell script to check for driver updates
+* [Disable-Nvidia-Telemetry](https://github.com/NateShoffner/Disable-Nvidia-Telemetry) - does pretty much what the name says. It disables Nvidia Telemetry.
* [NVCleanInstall](https://www.techpowerup.com/nvcleanstall/) - a closed-source application by TechPowerUp which does quite a lot of cool things.
EnvyUpdate is not a replacement for any of these tools. I will still try to implement as many features in EnvyUpdate as possible while keeping the simple interface and as little settings as possible.
## Licenses
-* This project: [MIT](https://github.com/fyr77/EnvyUpdate/blob/master/LICENSE)
-* Fody (depency of Costura.Fody): [MIT](https://github.com/Fody/Fody/blob/master/License.txt)
+* This project: [MIT](https://https://vcs.diluvian.cc/fyr77/EnvyUpdate/blob/master/LICENSE)
+* Fody (dependency of Costura.Fody): [MIT](https://github.com/Fody/Fody/blob/master/License.txt)
* Costura.Fody (for embedding DLLs into the main executable): [MIT](https://github.com/Fody/Costura/blob/develop/LICENSE)
-* wpf-notifyicon (for showing an icon in the system tray): [CPOL](https://github.com/hardcodet/wpf-notifyicon/blob/master/LICENSE)
-* Notifications.Wpf: [MIT](https://github.com/Federerer/Notifications.Wpf/blob/master/LICENSE)
-* Newtonsoft.Json: [MIT](https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md)
-* Resource Embedder: [MIT](https://github.com/MarcStan/resource-embedder/blob/master/LICENSE)
+* Resource Embedder: [MIT](https://www.nuget.org/packages/Resource.Embedder/)
+* Windows Community Toolkit: [MIT](https://github.com/CommunityToolkit/WindowsCommunityToolkit/blob/main/License.md)
+* wpfui: [MIT](https://github.com/lepoco/wpfui/blob/main/LICENSE)
+* 7-Zip R: [GNU LGPL](https://www.7-zip.org/license.txt)
* Icon made by Freepik from www.flaticon.com
diff --git a/res/banner_bg.png b/res/banner_bg.png
new file mode 100644
index 0000000..350cd67
Binary files /dev/null and b/res/banner_bg.png differ