Compare commits

..

31 commits
3.1 ... master

Author SHA1 Message Date
84dc1367d8 Update README.md 2025-07-21 11:16:15 +02:00
18816f3fbe fix links 2025-07-21 11:15:54 +02:00
625e509ede Update README.md 2025-07-18 12:03:32 +02:00
0a5227b071
Update README.md 2024-10-24 15:54:30 +02:00
c46294b46b
Update README.md 2024-10-24 09:29:38 +02:00
672449fb3e Update Nuget 2024-08-06 10:39:45 +02:00
09730bfbaf
Update README.md 2024-03-12 18:24:51 +01:00
b019023344 bump version 2024-02-26 20:05:47 +01:00
ee6489e090
Merge pull request #44 from fyr77/feature-autodownload
Feature autodownload
2024-02-26 20:03:05 +01:00
a4a97f7b99 finalize download check 2024-02-26 20:02:16 +01:00
76425a3c50 fix button 2024-02-26 19:50:56 +01:00
9eba20f28a save autodl setting 2024-02-26 19:46:46 +01:00
a271150b0c handle running download 2024-02-26 19:42:06 +01:00
bbe0e8dde9 Merge branch 'master' 2024-02-26 19:27:12 +01:00
48bb49671a handle unfinished downloads 2024-02-26 19:23:07 +01:00
6a97161ddd
Merge pull request #43 from fyr77/master
include changes from master
2024-02-26 19:03:18 +01:00
1aa93e2267 bump version 2024-02-25 15:09:21 +01:00
8ce6a92146 add notification exception handling 2024-02-24 13:44:34 +01:00
19cf5fb38e fix non-gtx detection 2024-02-23 20:36:05 +01:00
b9e7aac55f add auto download feature 2024-02-23 20:30:40 +01:00
3f925ee17a increase default size 2024-02-23 11:30:29 +01:00
9bd5cc3d88 bump version 2024-02-23 11:29:24 +01:00
b7590538f0
Update README.md 2024-02-23 10:33:43 +01:00
44c0e0ce91
Update LICENSE 2024-02-04 15:27:39 +01:00
3231cd4db2 bump version 2023-12-16 20:44:11 +01:00
3855076457
Merge pull request #39 from JohannesIBK/path-fix
fix issue with usernames that contain spaces
2023-12-16 20:02:19 +01:00
JohannesIBK
657ebb0d5f fix issue with usernames that contain spaces 2023-12-16 19:31:13 +01:00
aeaae1f827 Update README.md 2023-10-02 12:36:13 +02:00
a87a6deab4 bump version 2023-10-02 12:32:34 +02:00
babc550b6d add ability to save to appdata 2023-10-02 12:30:53 +02:00
e932255f59 fix download button 2023-10-02 11:04:33 +02:00
17 changed files with 329 additions and 93 deletions

View file

@ -77,11 +77,11 @@
</Grid> </Grid>
<ui:CardControl Margin="0,12,0,0" Grid.Row="4" Icon="Color24" Header="Studio Driver"> <ui:CardControl Margin="0,12,0,0" Grid.Row="4" Icon="Color24" Header="Studio Driver">
<ui:ToggleSwitch x:Name="switchStudioDriver" IsChecked="False" Checked="switchStudioDriver_Checked" Unchecked="switchStudioDriver_Unchecked" /> <ui:ToggleSwitch x:Name="switchStudioDriver" Checked="switchStudioDriver_Checked" Unchecked="switchStudioDriver_Unchecked" />
</ui:CardControl> </ui:CardControl>
<ui:CardControl Margin="0,12,0,0" Grid.Row="5" Icon="LightbulbFilament48" Header="{x:Static p:Resources.ui_autostart}"> <ui:CardControl Margin="0,12,0,0" Grid.Row="5" Icon="LightbulbFilament48" Header="{x:Static p:Resources.ui_autostart}">
<ui:ToggleSwitch x:Name="switchAutostart" IsChecked="False" Click="switchAutostart_Click" /> <ui:ToggleSwitch x:Name="switchAutostart" Click="switchAutostart_Click" />
</ui:CardControl> </ui:CardControl>
</Grid> </Grid>
<ui:Snackbar x:Name="snackbarInfo" Timeout="0"/> <ui:Snackbar x:Name="snackbarInfo" Timeout="0"/>

View file

@ -112,10 +112,10 @@ namespace EnvyUpdate
switchStudioDriver.IsChecked = false; switchStudioDriver.IsChecked = false;
} }
if (File.Exists(GlobalVars.exedirectory + "skip.envy")) if (File.Exists(Path.Combine(GlobalVars.saveDirectory,"skip.envy")))
{ {
Debug.LogToFile("INFO Found version skip config."); Debug.LogToFile("INFO Found version skip config.");
skippedVer = File.ReadLines(GlobalVars.exedirectory + "skip.envy").First(); skippedVer = File.ReadLines(Path.Combine(GlobalVars.saveDirectory, "skip.envy")).First();
} }
// This little bool check is necessary for debug fake mode. // This little bool check is necessary for debug fake mode.
@ -137,9 +137,9 @@ namespace EnvyUpdate
try try
{ {
// disable SD and try with GRD // disable SD and try with GRD
if (File.Exists(GlobalVars.exedirectory + "sd.envy")) if (File.Exists(Path.Combine(GlobalVars.saveDirectory, "sd.envy")))
{ {
File.Delete(GlobalVars.exedirectory + "sd.envy"); File.Delete(Path.Combine(GlobalVars.saveDirectory, "sd.envy"));
} }
gpuURL = Util.GetGpuUrl(); //try again with GRD gpuURL = Util.GetGpuUrl(); //try again with GRD
@ -210,6 +210,15 @@ namespace EnvyUpdate
if (skippedVer != onlineDriv) 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."); Debug.LogToFile("INFO Showing update popup notification.");
Notify.ShowDrivUpdatePopup(); Notify.ShowDrivUpdatePopup();
} }
@ -226,15 +235,15 @@ namespace EnvyUpdate
{ {
Debug.LogToFile("INFO Skipped version is surpassed, deleting setting."); Debug.LogToFile("INFO Skipped version is surpassed, deleting setting.");
skippedVer = null; skippedVer = null;
if (File.Exists(GlobalVars.exedirectory + "skip.envy")) if (File.Exists(Path.Combine(GlobalVars.saveDirectory, "skip.envy")))
File.Delete(GlobalVars.exedirectory + "skip.envy"); File.Delete(Path.Combine(GlobalVars.saveDirectory, "skip.envy"));
buttonSkipVersion.ToolTip = Properties.Resources.ui_skipversion; buttonSkipVersion.ToolTip = Properties.Resources.ui_skipversion;
buttonSkipVersion.IsEnabled = true; buttonSkipVersion.IsEnabled = true;
buttonSkipVersion.Visibility = Visibility.Visible; buttonSkipVersion.Visibility = Visibility.Visible;
} }
// Check if update file already exists and display install button instead // Check if update file already exists and display install button instead
if (File.Exists(Path.Combine(GlobalVars.exedirectory, onlineDriv + "-nvidia-installer.exe"))) if (File.Exists(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe")))
{ {
Debug.LogToFile("INFO Found downloaded driver installer, no need to redownload."); Debug.LogToFile("INFO Found downloaded driver installer, no need to redownload.");
buttonDownload.Visibility = Visibility.Collapsed; buttonDownload.Visibility = Visibility.Collapsed;
@ -244,20 +253,20 @@ namespace EnvyUpdate
private void switchStudioDriver_Unchecked(object sender, RoutedEventArgs e) private void switchStudioDriver_Unchecked(object sender, RoutedEventArgs e)
{ {
if (File.Exists(GlobalVars.exedirectory + "sd.envy")) if (File.Exists(Path.Combine(GlobalVars.saveDirectory, "sd.envy")))
{ {
Debug.LogToFile("INFO Switching to game ready driver."); Debug.LogToFile("INFO Switching to game ready driver.");
File.Delete(GlobalVars.exedirectory + "sd.envy"); File.Delete(Path.Combine(GlobalVars.saveDirectory, "sd.envy"));
Load(); Load();
} }
} }
private void switchStudioDriver_Checked(object sender, RoutedEventArgs e) private void switchStudioDriver_Checked(object sender, RoutedEventArgs e)
{ {
if (!File.Exists(GlobalVars.exedirectory + "sd.envy")) if (!File.Exists(Path.Combine(GlobalVars.saveDirectory, "sd.envy")))
{ {
Debug.LogToFile("INFO Switching to studio driver."); Debug.LogToFile("INFO Switching to studio driver.");
File.Create(GlobalVars.exedirectory + "sd.envy").Close(); File.Create(Path.Combine(GlobalVars.saveDirectory, "sd.envy")).Close();
Load(); Load();
} }
} }
@ -272,7 +281,7 @@ namespace EnvyUpdate
if (switchAutostart.IsChecked == true) if (switchAutostart.IsChecked == true)
{ {
Debug.LogToFile("INFO Creating autostart entry."); Debug.LogToFile("INFO Creating autostart entry.");
Util.CreateShortcut("EnvyUpdate", Environment.GetFolderPath(Environment.SpecialFolder.Startup), GlobalVars.exeloc, "NVidia Update Checker", "/minimize"); Util.CreateShortcut("EnvyUpdate", Environment.GetFolderPath(Environment.SpecialFolder.Startup), GlobalVars.pathToAppExe, "NVidia Update Checker", "/minimize");
} }
} }
@ -280,7 +289,7 @@ namespace EnvyUpdate
{ {
Debug.LogToFile("INFO Skipping version."); Debug.LogToFile("INFO Skipping version.");
skippedVer = onlineDriv; skippedVer = onlineDriv;
File.WriteAllText(GlobalVars.exedirectory + "skip.envy", onlineDriv); File.WriteAllText(Path.Combine(GlobalVars.saveDirectory, "skip.envy"), onlineDriv);
buttonSkipVersion.IsEnabled = false; buttonSkipVersion.IsEnabled = false;
buttonSkipVersion.ToolTip = Properties.Resources.ui_skipped; buttonSkipVersion.ToolTip = Properties.Resources.ui_skipped;
MessageBox.Show(Properties.Resources.skip_confirm); MessageBox.Show(Properties.Resources.skip_confirm);
@ -339,14 +348,22 @@ namespace EnvyUpdate
} }
private void buttonDownload_Click(object sender, RoutedEventArgs e) 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; progressbarDownload.Visibility = Visibility.Visible;
buttonDownload.IsEnabled = false; buttonDownload.IsEnabled = false;
GlobalVars.isDownloading = true;
if (File.Exists(Path.Combine(GlobalVars.exedirectory, onlineDriv + "-nvidia-installer.exe.downloading"))) if (File.Exists(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe.downloading")))
{ {
Debug.LogToFile("WARN Found previous unfinished download, retrying."); Debug.LogToFile("WARN Found previous unfinished download, retrying.");
File.Delete(Path.Combine(GlobalVars.exedirectory, onlineDriv + "-nvidia-installer.exe.downloading")); File.Delete(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe.downloading"));
} }
Thread thread = new Thread(() => { Thread thread = new Thread(() => {
using (WebClient client = new WebClient()) using (WebClient client = new WebClient())
@ -354,12 +371,13 @@ namespace EnvyUpdate
client.Headers["User-Agent"] = GlobalVars.useragent; client.Headers["User-Agent"] = GlobalVars.useragent;
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted); client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
client.DownloadFileAsync(new Uri(Util.GetDirectDownload(gpuURL)), Path.Combine(GlobalVars.exedirectory, onlineDriv + "-nvidia-installer.exe.downloading")); client.DownloadFileAsync(new Uri(Util.GetDirectDownload(gpuURL)), Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe.downloading"));
} }
}); });
thread.Start(); thread.Start();
Debug.LogToFile("INFO Started installer download."); Debug.LogToFile("INFO Started installer download.");
} }
}
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{ {
@ -376,6 +394,7 @@ namespace EnvyUpdate
Application.Current.Dispatcher.Invoke(new Action(() => { Application.Current.Dispatcher.Invoke(new Action(() => {
buttonDownload.IsEnabled = true; buttonDownload.IsEnabled = true;
progressbarDownload.Visibility = Visibility.Collapsed; progressbarDownload.Visibility = Visibility.Collapsed;
GlobalVars.isDownloading = false;
})); }));
if (e.Error == null) if (e.Error == null)
{ {
@ -385,13 +404,13 @@ namespace EnvyUpdate
buttonInstall.Visibility = Visibility.Visible; buttonInstall.Visibility = Visibility.Visible;
Debug.LogToFile("INFO Download successful."); Debug.LogToFile("INFO Download successful.");
})); }));
if (File.Exists(Path.Combine(GlobalVars.exedirectory, onlineDriv + "-nvidia-installer.exe"))) if (File.Exists(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe")))
File.Delete(Path.Combine(GlobalVars.exedirectory, onlineDriv + "-nvidia-installer.exe")); File.Delete(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe"));
File.Move(Path.Combine(GlobalVars.exedirectory, onlineDriv + "-nvidia-installer.exe.downloading"), Path.Combine(GlobalVars.exedirectory, onlineDriv + "-nvidia-installer.exe")); File.Move(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe.downloading"), Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe"));
} }
else else
{ {
File.Delete(Path.Combine(GlobalVars.exedirectory, onlineDriv + "-nvidia-installer.exe.downloading")); File.Delete(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe.downloading"));
Application.Current.Dispatcher.Invoke(new Action(() => { 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); 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()); Debug.LogToFile("INFO Download NOT successful. Error: " + e.Error.ToString());
@ -406,8 +425,8 @@ namespace EnvyUpdate
ShowSnackbar(Wpf.Ui.Common.ControlAppearance.Info, Wpf.Ui.Common.SymbolRegular.FolderZip24, Properties.Resources.info_extracting, Properties.Resources.info_extracting_title); 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.exedirectory, onlineDriv + "-nvidia-installer.exe"); string filePath = Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe");
string destinationDir = Path.Combine(GlobalVars.exedirectory, onlineDriv + "-extracted"); string destinationDir = Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-extracted");
if (!Directory.Exists(destinationDir)) if (!Directory.Exists(destinationDir))
Directory.CreateDirectory(destinationDir); Directory.CreateDirectory(destinationDir);
@ -420,7 +439,7 @@ namespace EnvyUpdate
WindowStyle = ProcessWindowStyle.Minimized, WindowStyle = ProcessWindowStyle.Minimized,
WorkingDirectory = destinationDir, WorkingDirectory = destinationDir,
FileName = sevenZipPath, 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" 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.EnableRaisingEvents = true;
process.StartInfo = startInfo; process.StartInfo = startInfo;
@ -430,13 +449,13 @@ namespace EnvyUpdate
private void ExtractionFinished(object sender, EventArgs e) private void ExtractionFinished(object sender, EventArgs e)
{ {
string extractedPath = Path.Combine(GlobalVars.exedirectory, onlineDriv + "-extracted"); string extractedPath = Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-extracted");
Application.Current.Dispatcher.Invoke(new Action(() => { 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); 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."); Debug.LogToFile("INFO Extraction exited, deleting 7-zip executable.");
File.Delete(Path.Combine(GlobalVars.exedirectory, "7zr.exe")); File.Delete(Path.Combine(GlobalVars.saveDirectory, "7zr.exe"));
Util.CleanInstallConfig(Path.Combine(extractedPath, "setup.cfg")); Util.CleanInstallConfig(Path.Combine(extractedPath, "setup.cfg"));
@ -462,13 +481,14 @@ namespace EnvyUpdate
ShowSnackbar(Wpf.Ui.Common.ControlAppearance.Success, Wpf.Ui.Common.SymbolRegular.CheckmarkCircle24, Properties.Resources.info_install_complete, Properties.Resources.info_install_complete_title); 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.IsEnabled = true;
buttonInstall.Visibility = Visibility.Collapsed; buttonInstall.Visibility = Visibility.Collapsed;
buttonDownload.Visibility = Visibility.Visible; buttonDownload.IsEnabled = true;
buttonDownload.Visibility = Visibility.Collapsed;
})); }));
Debug.LogToFile("INFO Driver setup complete. Cleaning up setup files."); Debug.LogToFile("INFO Driver setup complete. Cleaning up setup files.");
File.Delete(Path.Combine(GlobalVars.exedirectory, onlineDriv + "-nvidia-installer.exe")); File.Delete(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-nvidia-installer.exe"));
Directory.Delete(Path.Combine(GlobalVars.exedirectory, onlineDriv + "-extracted"), true); Directory.Delete(Path.Combine(GlobalVars.saveDirectory, onlineDriv + "-extracted"), true);
GlobalVars.isInstalling = false; GlobalVars.isInstalling = false;
Application.Current.Dispatcher.Invoke(delegate Application.Current.Dispatcher.Invoke(delegate
{ {

View file

@ -15,9 +15,6 @@ namespace EnvyUpdate
public static bool isVerbose = false; public static bool isVerbose = false;
#endif #endif
public static string debugFile = Path.Combine(GlobalVars.exedirectory, "envyupdate.log");
public static int LoadFakeIDs(string idType) public static int LoadFakeIDs(string idType)
{ {
/* /*
@ -52,7 +49,12 @@ namespace EnvyUpdate
public static void LogToFile(string content) public static void LogToFile(string content)
{ {
if (isVerbose) if (isVerbose)
System.IO.File.AppendAllText(Debug.debugFile, content + "\n"); {
if (GlobalVars.useAppdata)
File.AppendAllText(Path.Combine(GlobalVars.appdata, "envyupdate.log"), content + "\n");
else
File.AppendAllText(Path.Combine(GlobalVars.directoryOfExe, "envyupdate.log"), content + "\n");
}
} }
} }
} }

View file

@ -271,7 +271,7 @@
<Version>5.7.0</Version> <Version>5.7.0</Version>
</PackageReference> </PackageReference>
<PackageReference Include="Fody"> <PackageReference Include="Fody">
<Version>6.8.0</Version> <Version>6.8.1</Version>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
</PackageReference> </PackageReference>
@ -282,7 +282,7 @@
<Version>2.2.0</Version> <Version>2.2.0</Version>
</PackageReference> </PackageReference>
<PackageReference Include="System.Text.Json"> <PackageReference Include="System.Text.Json">
<Version>7.0.3</Version> <Version>8.0.4</Version>
</PackageReference> </PackageReference>
<PackageReference Include="WPF-UI"> <PackageReference Include="WPF-UI">
<Version>2.1.0</Version> <Version>2.1.0</Version>

View file

@ -6,14 +6,20 @@ namespace EnvyUpdate
class GlobalVars class GlobalVars
{ {
public static bool isMobile = false; public static bool isMobile = false;
public static readonly string exeloc = System.Reflection.Assembly.GetEntryAssembly().Location; public static readonly string pathToAppExe = System.Reflection.Assembly.GetEntryAssembly().Location;
public static readonly string exedirectory = Path.GetDirectoryName(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 string startmenu = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu);
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 startup = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
public static bool monitoringInstall = false; public static bool monitoringInstall = false;
public static bool startMinimized = false; public static bool startMinimized = false;
public static bool isInstalling = 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 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;
} }
} }

View file

@ -11,7 +11,7 @@
ExtendsContentIntoTitleBar="True" ExtendsContentIntoTitleBar="True"
WindowBackdropType="Mica" WindowBackdropType="Mica"
Title="EnvyUpdate" MinHeight="500" Height="500" MinWidth="600" Width="600" Icon="icon.ico" StateChanged="Window_StateChanged" Closing="Window_Closing" ResizeMode="CanMinimize" WindowStyle="None"> Title="EnvyUpdate" MinHeight="500" Height="550" MinWidth="700" Width="750" Icon="icon.ico" StateChanged="Window_StateChanged" Closing="Window_Closing" ResizeMode="CanMinimize" WindowStyle="None">
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />

View file

@ -28,8 +28,22 @@ namespace EnvyUpdate
// This is necessary, since .NET throws an exception if you check for a non-existant arg. // 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 // Check if Debug file exists
if (File.Exists(Path.Combine(GlobalVars.exedirectory, "envyupdate.log"))) if (File.Exists(Path.Combine(GlobalVars.saveDirectory, "envyupdate.log")))
{ {
Debug.isVerbose = true; Debug.isVerbose = true;
Debug.LogToFile("------"); Debug.LogToFile("------");
@ -37,6 +51,7 @@ namespace EnvyUpdate
} }
Debug.LogToFile("INFO Starting EnvyUpdate, version " + System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).FileVersion); 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. // Check if running on supported Windows version.
if (Environment.OSVersion.Version.Major < 10) if (Environment.OSVersion.Version.Major < 10)
@ -60,9 +75,9 @@ namespace EnvyUpdate
SystemEvents.UserPreferenceChanged += AdjustTheme; SystemEvents.UserPreferenceChanged += AdjustTheme;
// Delete installed legacy versions, required for people upgrading from very old versions. // Delete installed legacy versions, required for people upgrading from very old versions.
if (Directory.Exists(GlobalVars.appdata)) if (Directory.Exists(GlobalVars.legacyAppdata))
{ {
Debug.LogToFile("INFO Found old appdata installation, uninstalling."); Debug.LogToFile("INFO Found legacy appdata installation, uninstalling.");
Util.UninstallAll(); Util.UninstallAll();
} }
@ -87,8 +102,25 @@ namespace EnvyUpdate
GlobalVars.startMinimized = true; 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(); GlobalVars.isMobile = Util.IsMobile();
Debug.LogToFile("INFO Mobile: " + GlobalVars.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 Window_StateChanged(object sender, EventArgs e) private void Window_StateChanged(object sender, EventArgs e)
{ {

View file

@ -5,10 +5,17 @@ namespace EnvyUpdate
internal class Notify internal class Notify
{ {
public static void ShowDrivUpdatePopup() public static void ShowDrivUpdatePopup()
{
try
{ {
var toast = new ToastContentBuilder(); var toast = new ToastContentBuilder();
toast.AddText(Properties.Resources.update_popup_message); toast.AddText(Properties.Resources.update_popup_message);
toast.Show(); toast.Show();
} }
catch (System.Exception ex)
{
Debug.LogToFile("WARN Could not show notification. Error: " + ex.Message);
}
}
} }
} }

View file

@ -49,5 +49,5 @@ using System.Windows;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.1")] [assembly: AssemblyVersion("3.6")]
[assembly: AssemblyFileVersion("3.1")] [assembly: AssemblyFileVersion("3.6")]

View file

@ -105,6 +105,24 @@ namespace EnvyUpdate.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to A download process is already running!.
/// </summary>
public static string info_download_running {
get {
return ResourceManager.GetString("info_download_running", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Download running.
/// </summary>
public static string info_download_running_title {
get {
return ResourceManager.GetString("info_download_running_title", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Driver installer successfully downloaded.. /// Looks up a localized string similar to Driver installer successfully downloaded..
/// </summary> /// </summary>
@ -258,6 +276,24 @@ namespace EnvyUpdate.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to Save files to AppData.
/// </summary>
public static string ui_enable_appdata {
get {
return ResourceManager.GetString("ui_enable_appdata", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Download updates automatically.
/// </summary>
public static string ui_enable_autodownload {
get {
return ResourceManager.GetString("ui_enable_autodownload", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Enable logging to file. /// Looks up a localized string similar to Enable logging to file.
/// </summary> /// </summary>

View file

@ -132,6 +132,12 @@
<data name="info_download_error_title" xml:space="preserve"> <data name="info_download_error_title" xml:space="preserve">
<value>Fehler beim Herunterladen</value> <value>Fehler beim Herunterladen</value>
</data> </data>
<data name="info_download_running" xml:space="preserve">
<value>Ein Downloadvorgang läuft bereits!</value>
</data>
<data name="info_download_running_title" xml:space="preserve">
<value>Download läuft</value>
</data>
<data name="info_download_success" xml:space="preserve"> <data name="info_download_success" xml:space="preserve">
<value>Treiber-Installationsdatei erfolgreich heruntergeladen.</value> <value>Treiber-Installationsdatei erfolgreich heruntergeladen.</value>
</data> </data>
@ -183,6 +189,12 @@
<data name="ui_download" xml:space="preserve"> <data name="ui_download" xml:space="preserve">
<value>Herunterladen</value> <value>Herunterladen</value>
</data> </data>
<data name="ui_enable_appdata" xml:space="preserve">
<value>Programmdaten in AppData speichern</value>
</data>
<data name="ui_enable_autodownload" xml:space="preserve">
<value>Updates automatisch herunterladen</value>
</data>
<data name="ui_enable_logging" xml:space="preserve"> <data name="ui_enable_logging" xml:space="preserve">
<value>Programm-Log in Datei schreiben</value> <value>Programm-Log in Datei schreiben</value>
</data> </data>

View file

@ -132,6 +132,12 @@
<data name="info_download_error_title" xml:space="preserve"> <data name="info_download_error_title" xml:space="preserve">
<value>Error while downloading</value> <value>Error while downloading</value>
</data> </data>
<data name="info_download_running" xml:space="preserve">
<value>A download process is already running!</value>
</data>
<data name="info_download_running_title" xml:space="preserve">
<value>Download running</value>
</data>
<data name="info_download_success" xml:space="preserve"> <data name="info_download_success" xml:space="preserve">
<value>Driver installer successfully downloaded.</value> <value>Driver installer successfully downloaded.</value>
</data> </data>
@ -183,6 +189,12 @@
<data name="ui_download" xml:space="preserve"> <data name="ui_download" xml:space="preserve">
<value>Download</value> <value>Download</value>
</data> </data>
<data name="ui_enable_appdata" xml:space="preserve">
<value>Save files to AppData</value>
</data>
<data name="ui_enable_autodownload" xml:space="preserve">
<value>Download updates automatically</value>
</data>
<data name="ui_enable_logging" xml:space="preserve"> <data name="ui_enable_logging" xml:space="preserve">
<value>Enable logging to file</value> <value>Enable logging to file</value>
</data> </data>

View file

@ -15,7 +15,8 @@
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition /> <RowDefinition />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid Grid.Row="0"> <Grid Grid.Row="0">
@ -34,8 +35,22 @@
<ui:ToggleSwitch x:Name="chkLog" Checked="chkLog_Checked" Unchecked="chkLog_Unchecked"/> <ui:ToggleSwitch x:Name="chkLog" Checked="chkLog_Checked" Unchecked="chkLog_Unchecked"/>
</ui:CardControl> </ui:CardControl>
<Label Grid.Row="3" Content="{x:Static p:Resources.ui_licenses}" HorizontalAlignment="Left" VerticalAlignment="Top" FontWeight="Bold"/> <Grid Grid.Row="3">
<ScrollViewer Grid.Row="4" MaxHeight="700" HorizontalAlignment="Stretch"> <Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<ui:CardControl Grid.Column="0" Margin="0,12,0,0" Icon="Folder24" Header="{x:Static p:Resources.ui_enable_appdata}" VerticalAlignment="Top" >
<ui:ToggleSwitch x:Name="chkAppdata" Checked="chkAppdata_Checked" Unchecked="chkAppdata_Unchecked"/>
</ui:CardControl>
<ui:CardControl Grid.Column="2" Margin="0,12,0,0" Icon="ArrowDownload24" Header="{x:Static p:Resources.ui_enable_autodownload}" VerticalAlignment="Top">
<ui:ToggleSwitch x:Name="chkAutodl" Checked="chkAutodl_Checked" Unchecked="chkAutodl_Unchecked"/>
</ui:CardControl>
</Grid>
<Label Grid.Row="4" Content="{x:Static p:Resources.ui_licenses}" HorizontalAlignment="Left" VerticalAlignment="Top" FontWeight="Bold"/>
<ScrollViewer Grid.Row="5" MaxHeight="700" HorizontalAlignment="Stretch">
<StackPanel> <StackPanel>
<Expander Header="EnvyUpdate"> <Expander Header="EnvyUpdate">
<TextBox x:Name="textBoxLicEnvyupdate" IsReadOnly="True" TextWrapping="Wrap"/> <TextBox x:Name="textBoxLicEnvyupdate" IsReadOnly="True" TextWrapping="Wrap"/>

View file

@ -21,9 +21,25 @@ namespace EnvyUpdate
if (GlobalVars.monitoringInstall) if (GlobalVars.monitoringInstall)
textBlockVer.FontStyle = FontStyles.Italic; textBlockVer.FontStyle = FontStyles.Italic;
if (File.Exists(Path.Combine(GlobalVars.exedirectory, "envyupdate.log"))) if (File.Exists(Path.Combine(GlobalVars.saveDirectory, "envyupdate.log")) || File.Exists(Path.Combine(GlobalVars.appdata, "envyupdate.log")))
chkLog.IsChecked = true; 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; textBoxLicEnvyupdate.Text = Properties.Licenses.EnvyUpdate;
textBoxLicFody.Text = Properties.Licenses.Fody; textBoxLicFody.Text = Properties.Licenses.Fody;
textBoxLicCostura.Text = Properties.Licenses.CosturaFody; textBoxLicCostura.Text = Properties.Licenses.CosturaFody;
@ -54,10 +70,54 @@ namespace EnvyUpdate
if (Debug.isVerbose) if (Debug.isVerbose)
{ {
Debug.LogToFile("INFO Disabled logging to file."); Debug.LogToFile("INFO Disabled logging to file.");
if (File.Exists(Path.Combine(GlobalVars.exedirectory, "envyupdate.log"))) if (File.Exists(Path.Combine(GlobalVars.saveDirectory, "envyupdate.log")))
File.Move(Path.Combine(GlobalVars.exedirectory, "envyupdate.log"), Path.Combine(GlobalVars.exedirectory, "envyupdate." + DateTime.Now.ToString("yyyyMMdd-HHmmss") + ".log")); File.Move(Path.Combine(GlobalVars.saveDirectory, "envyupdate.log"), Path.Combine(GlobalVars.saveDirectory, "envyupdate." + DateTime.Now.ToString("yyyyMMdd-HHmmss") + ".log"));
Debug.isVerbose = false; 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"));
}
}
} }
} }

View file

@ -1,4 +1,5 @@
using IWshRuntimeLibrary; using IWshRuntimeLibrary;
using Microsoft.Build.Framework.XamlTypes;
using Microsoft.Win32; using Microsoft.Win32;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
@ -130,13 +131,11 @@ namespace EnvyUpdate
/// </summary> /// </summary>
public static void SelfDelete() public static void SelfDelete()
{ {
string appdata = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\envyupdate\\";
Process process = new Process(); Process process = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo ProcessStartInfo startInfo = new ProcessStartInfo
{ {
WindowStyle = ProcessWindowStyle.Hidden, WindowStyle = ProcessWindowStyle.Hidden,
WorkingDirectory = appdata, WorkingDirectory = GlobalVars.legacyAppdata,
FileName = "cmd.exe", FileName = "cmd.exe",
Arguments = "/C timeout 5 && del EnvyUpdate.exe" Arguments = "/C timeout 5 && del EnvyUpdate.exe"
}; };
@ -338,7 +337,7 @@ namespace EnvyUpdate
{ {
GPUName = obj["VideoProcessor"].ToString().ToLower(); GPUName = obj["VideoProcessor"].ToString().ToLower();
// Remove any 3GB, 6GB or similar from name. We don't need to know the VRAM to get results. // Remove any 3GB, 6GB or similar from name. We don't need to know the VRAM to get results.
GPUName = Regex.Match(GPUName, "(geforce )((.tx )|(mx))?\\w*\\d*( ti)?").Value; GPUName = Regex.Match(GPUName, "(geforce )((.t.? )|(mx ))?\\w*\\d*( ti)?").Value;
} }
else else
GPUName = obj["VideoProcessor"].ToString(); GPUName = obj["VideoProcessor"].ToString();
@ -433,7 +432,7 @@ namespace EnvyUpdate
*/ */
//TODO: find way to differentiate between driver types //TODO: find way to differentiate between driver types
if (System.IO.File.Exists(GlobalVars.exedirectory + "sd.envy")) if (System.IO.File.Exists(Path.Combine(GlobalVars.saveDirectory, "sd.envy")))
return 18; return 18;
else else
return 1; return 1;
@ -510,27 +509,27 @@ namespace EnvyUpdate
public static void UninstallAll() public static void UninstallAll()
{ {
if (System.IO.File.Exists(GlobalVars.startup + "\\EnvyUpdate.lnk")) if (System.IO.File.Exists(Path.Combine(GlobalVars.startup, "\\EnvyUpdate.lnk")))
{ {
Debug.LogToFile("INFO Deleted startup entry."); Debug.LogToFile("INFO Deleted startup entry.");
System.IO.File.Delete(GlobalVars.startup + "\\EnvyUpdate.lnk"); System.IO.File.Delete(Path.Combine(GlobalVars.startup, "\\EnvyUpdate.lnk"));
} }
if (System.IO.File.Exists(GlobalVars.startmenu + "\\EnvyUpdate.lnk")) if (System.IO.File.Exists(Path.Combine(GlobalVars.startmenu, "\\EnvyUpdate.lnk")))
{ {
Debug.LogToFile("INFO Deleted start menu entry."); Debug.LogToFile("INFO Deleted start menu entry.");
System.IO.File.Delete(GlobalVars.startmenu + "\\EnvyUpdate.lnk"); System.IO.File.Delete(Path.Combine(GlobalVars.startmenu, "\\EnvyUpdate.lnk"));
} }
if ((GlobalVars.exedirectory == GlobalVars.appdata) && System.IO.File.Exists(GlobalVars.appdata + "EnvyUpdate.exe")) if ((GlobalVars.saveDirectory == GlobalVars.legacyAppdata) && System.IO.File.Exists(Path.Combine(GlobalVars.legacyAppdata, "EnvyUpdate.exe")))
{ {
Debug.LogToFile("INFO Deleting EnvyUpdate appdata and self."); Debug.LogToFile("INFO Deleting EnvyUpdate appdata and self.");
MessageBox.Show(Properties.Resources.uninstall_legacy_message); MessageBox.Show(Properties.Resources.uninstall_legacy_message);
Util.SelfDelete(); Util.SelfDelete();
} }
else if (Directory.Exists(GlobalVars.appdata)) else if (Directory.Exists(GlobalVars.legacyAppdata))
{ {
Debug.LogToFile("INFO Deleting EnvyUpdate appdata folder"); Debug.LogToFile("INFO Deleting EnvyUpdate appdata folder");
Directory.Delete(GlobalVars.appdata, true); Directory.Delete(GlobalVars.legacyAppdata, true);
} }
} }
@ -579,7 +578,7 @@ namespace EnvyUpdate
} }
else else
{ {
path = Path.Combine(GlobalVars.exedirectory, "7zr.exe"); path = Path.Combine(GlobalVars.saveDirectory, "7zr.exe");
using (WebClient client = new WebClient()) using (WebClient client = new WebClient())
{ {
client.Headers["User-Agent"] = GlobalVars.useragent; client.Headers["User-Agent"] = GlobalVars.useragent;
@ -664,5 +663,37 @@ namespace EnvyUpdate
} }
return null; 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"));
}
} }
} }

View file

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2019-2023 Jakob Senkl Copyright (c) 2019-2024 fyr77
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View file

@ -1,21 +1,18 @@
![Logo](https://github.com/fyr77/envyupdate/blob/master/res/banner_bg.png?raw=true) # 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.
![Logo](https://vcs.diluvian.cc/fyr77/EnvyUpdate/raw/branch/master/res/banner.png)
# EnvyUpdate # EnvyUpdate
A small portable update checker application for Nvidia GPUs A small portable update checker application for Nvidia GPUs
![License](https://img.shields.io/github/license/fyr77/envyupdate?style=for-the-badge)
![Issues](https://img.shields.io/github/issues/fyr77/envyupdate?style=for-the-badge)
![Version](https://img.shields.io/github/v/release/fyr77/envyupdate?style=for-the-badge)
## How to use ## How to use
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. Download the latest release and run it. Windows SmartScreen Messages can be safely ignored. They only happen because this project is not digitally signed.
Legacy 2.x versions (old UI, no automatic driver installation) will continue to be supported and fixed for the time being. Please see [the v2 branch](https://github.com/fyr77/EnvyUpdate/tree/v2) for these.
The application itself does not update itself. If you notice any bugs or issues, be sure to check for a new version on GitHub! The application itself does not update itself. If you notice any bugs or issues, be sure to check for a new version on GitHub!
Enabling Autostart will create a shortcut of EnvyUpdate in the Windows startup folder. Enabling Autostart will create a shortcut of EnvyUpdate in the Windows startup folder (shell:startup).
### Virus warnings ### Virus warnings
@ -23,15 +20,21 @@ Sometimes EnvyUpdate is flagged as a virus by Windows Defender or other antiviru
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. 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.
### 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 ## Compatibility
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. 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. Generally others might work, but they are (currently) untested. 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 ## 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. 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.
@ -48,7 +51,7 @@ EnvyUpdate is not a replacement for any of these tools. I will still try to impl
## Licenses ## Licenses
* This project: [MIT](https://github.com/fyr77/EnvyUpdate/blob/master/LICENSE) * 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) * 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) * Costura.Fody (for embedding DLLs into the main executable): [MIT](https://github.com/Fody/Costura/blob/develop/LICENSE)
* Resource Embedder: [MIT](https://www.nuget.org/packages/Resource.Embedder/) * Resource Embedder: [MIT](https://www.nuget.org/packages/Resource.Embedder/)