Compare commits

...

188 commits
1.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
fcbac6a19b add v2 info 2023-09-28 22:56:20 +02:00
3db1a2a2e4 typo 2023-09-28 22:48:11 +02:00
02984e0d2b bump version, add button labels 2023-09-28 22:46:19 +02:00
e8af34b79c add x64 2023-09-25 22:17:45 +02:00
624801ceec update costura 2023-09-25 22:05:26 +02:00
868a13139d fix watcher, fix tray click 2023-09-25 21:53:21 +02:00
8ec0b67896 remove unnecessary nuget package 2023-09-25 20:27:44 +02:00
aa7aeff1f8 fix tray icon 2023-09-25 20:26:35 +02:00
Jakob
a601b8937c remove workaround from old wpfui 2023-08-31 09:15:57 +02:00
Jakob
02e92e782f fix typo 2023-08-29 20:17:26 +02:00
Jakob
5234ee06e0 fix dark theme again 2023-08-29 17:09:21 +02:00
Jakob
70cef4a361 cleanup code 2023-08-29 16:10:12 +02:00
Jakob
3e2f389fc3 Remove DCH warning, force update to DCH 2023-08-29 15:44:32 +02:00
Jakob
72a714e1f4 add exclusion for md.backup 2023-08-29 15:40:31 +02:00
Jakob
0599e715b6 update licenses and readme 2023-08-29 15:40:10 +02:00
Jakob
6233a5d88e add support for system 7zip installations 2023-08-29 15:30:11 +02:00
Jakob
3fb5799b00 add logging for new features 2023-08-29 15:13:37 +02:00
Jakob
15202c9dfd add automatic driver installing 2023-08-29 14:37:36 +02:00
Jakob
8f26383166 support install after restart 2023-08-29 10:06:06 +02:00
Jakob
3a8eb0a76c better download naming 2023-08-29 09:41:31 +02:00
Jakob
d408b51b0e add os check and detect win11 2023-08-29 09:16:28 +02:00
Jakob
d7e2b8a294
Merge pull request #33 from fyr77/v2 2023-08-11 19:45:56 +02:00
Jakob
b2d0e9764f fix gpu detection 2023-08-11 19:45:22 +02:00
Jakob
452790d923 simplify notification 2023-07-14 22:03:26 +02:00
Jakob
726adc7193 finish downloader 2023-07-14 21:52:27 +02:00
Jakob
0760600d47 add download for driver 2023-07-14 21:04:54 +02:00
Jakob
58bef7537f edit dark theme implementation 2023-07-14 12:55:18 +02:00
Jakob
6d281e4e44 add dark mode 2023-07-14 12:37:00 +02:00
Jakob
6b745618e6 fix debug & skip 2023-07-14 12:05:06 +02:00
Jakob
99267bdf9d cleanup 2023-07-14 11:46:12 +02:00
Jakob
e42fbf9b2a fix settingspage details 2023-07-14 11:33:38 +02:00
Jakob
938afbd85b bump version 2023-07-14 11:23:56 +02:00
Jakob
8df1f95123 layout adjustments 2023-07-14 11:23:10 +02:00
Jakob
d147415feb fix fake profile and studio driver 2023-07-14 11:16:21 +02:00
Jakob
cdcfccd87c complete UI rewrite 2023-07-14 00:16:57 +02:00
Jakob
45c6dbce70 remove confusing warning 2023-07-09 18:43:52 +02:00
Jakob
ee31cf06d4 improve logging 2023-07-09 18:35:46 +02:00
Jakob
a28b56f481 improve skip check and fix old format 2023-07-09 18:33:17 +02:00
Jakob
e9c83dd8ce replace old format 2023-07-09 18:28:11 +02:00
Jakob
71221ef5b4 bump version 2023-07-09 18:25:55 +02:00
Jakob
1517bc3f92 fix typo in infowindow 2023-07-09 18:24:44 +02:00
Jakob
d347ccefdf improve logging 2023-07-09 18:19:33 +02:00
Jakob
90fc53ce00 potential solution for #31? 2023-07-08 23:18:53 +02:00
Jakob
645c9e72d2 fix debug log 2023-04-03 21:01:32 +02:00
Jakob
ae9f50354e set verbose default for debug 2023-04-03 20:57:46 +02:00
Jakob
e4281943cd finish implementing logging 2023-04-03 20:55:22 +02:00
Jakob
671824f3cd working to implement full logging 2023-04-03 20:37:11 +02:00
Jakob
adb8a5508b cleanup util 2023-04-03 19:16:01 +02:00
Jakob
41f25d48fb add comments for GetOSID 2023-04-03 19:00:51 +02:00
Jakob
7d0460d1c2 remove langid stubs 2023-04-03 18:57:04 +02:00
Jakob
6a10abc334 better error reporting 2023-04-01 20:24:23 +02:00
Jakob
94a4fff52b fix regex for ti 2023-04-01 20:01:58 +02:00
Jakob
7173f2ec5e replace gpu detection regex 2023-04-01 18:04:34 +02:00
Jakob
01c6f81da6 bump version 2023-03-14 21:01:39 +01:00
Jakob
2e4fa930ff add check for cards not supporting studio drivers 2023-03-14 20:59:44 +01:00
Jakob
25bd864e76
Add check for MAX-Q 2023-03-14 20:32:17 +01:00
Jakob
d985f60855 fix crash because of threads 2023-01-11 21:24:09 +01:00
Jakob
c2f0e350b0 add delay to prevent crash 2023-01-11 20:47:57 +01:00
Jakob
1b8e59cf14 update infowindow, bump license year 2023-01-11 20:05:58 +01:00
Jakob
ebcb8c0a75 edit banner for dark mode 2022-12-26 17:48:20 +01:00
Jakob
40f0deffd2 fix typo 2022-12-26 17:29:40 +01:00
Jakob
ef13c67968 add download button to notification 2022-12-26 17:28:38 +01:00
Jakob
88e7610a46 implement native notifications 2022-12-26 16:30:02 +01:00
Jakob
b8ec8ab7b3 update notify lib 2022-12-26 16:19:00 +01:00
Jakob
9f7d72c258 remove old notification lib 2022-12-26 16:09:08 +01:00
Jakob
2c0da5f9ea update framework, change notification library 2022-12-26 16:05:21 +01:00
Jakob
e054fda4dd update deps 2022-12-26 15:40:01 +01:00
Jakob
06122111aa update readme, project format 2022-12-26 15:34:44 +01:00
Jakob
91442e7edd catch worst-case 2022-11-04 17:16:19 +01:00
Jakob
3cdc8a0172 add more nvidia api checks 2022-11-04 17:13:00 +01:00
Jakob
f86025f63d fix for new Nvidia links 2022-11-04 17:03:45 +01:00
Jakob
cc4f7b19f6
Remove Scoop 2022-07-01 18:37:14 +02:00
Jakob
25fa94144b add version skipping 2022-05-21 22:49:43 +02:00
Jakob
80badd436e
Update README.md 2022-02-17 15:19:50 +01:00
Jakob
820047f290
Update README.md 2022-02-17 15:19:18 +01:00
Jakob
51bb0fe625
fix typo 2022-01-19 16:46:12 +01:00
Jakob
d7ada2b49f
Update README.md 2022-01-19 16:37:24 +01:00
Jakob
2891006d89 update dependencies, remove selfupdater as described in #23 2022-01-19 16:24:35 +01:00
Jakob
3801e1adac Update README.md 2022-01-19 12:22:01 +01:00
Jakob
337779b646 bump version 2022-01-19 12:19:59 +01:00
Jakob
3471fadfa2 fix #22 2022-01-19 12:16:29 +01:00
Jakob
a3576f8c34 move scoop to own repo 2022-01-09 16:52:06 +01:00
Jakob
87586f3521
Update envyupdate.json 2022-01-09 16:40:50 +01:00
Jakob
851dbc66fb
fix missing extension 2022-01-09 16:36:44 +01:00
Jakob
e77c1e4145 fix update 2021-09-17 12:41:08 +02:00
Jakob
02d0074e5c Revert "Update envyupdate.json"
This reverts commit 888ed52745.
2021-09-17 12:22:28 +02:00
Jakob
888ed52745 Update envyupdate.json 2021-09-17 12:20:36 +02:00
Jakob
d8889fc19b bump version 2021-09-17 12:18:32 +02:00
Jakob
d43b417cff fix #21 2021-09-17 12:15:55 +02:00
Jakob
0b376689cc Update README.md 2021-09-09 21:00:47 +02:00
Jakob
19509cddd7 add scoop manifest 2021-09-09 20:59:21 +02:00
Jakob
d454db4579 add ability to disable updater 2021-09-09 20:21:05 +02:00
Jakob
7169325e7e fix updater, fix multiple crashes 2021-09-09 19:54:44 +02:00
Jakob
051c4df2b6 remove unnecessary debug and fix locale issues 2021-09-06 22:49:56 +02:00
Jakob
e41b348acb add onova and debug 2021-09-06 22:26:41 +02:00
Jakob
c2b42d40db Update README.md 2021-09-06 18:11:35 +02:00
Jakob
29e65e6f0a Add support for Studio without automatic detection 2021-05-08 17:29:21 +02:00
Jakob
71cdd9ab92 update translations 2021-05-08 13:28:20 +02:00
fyr77
d48b683fe8 change debug to hardcoded 2021-05-08 12:46:03 +02:00
fyr77
dea07706ac Update licenses 2021-05-08 12:45:39 +02:00
fyr77
fbbe3e0b81 Update README.md 2021-05-08 12:06:42 +02:00
fyr77
e037be70a1 update nuget dependencies 2021-05-08 12:03:36 +02:00
fyr77
1fb4427757 remove overrides and leftover code 2021-05-08 11:57:16 +02:00
fyr77
af089f732b prepare for portable-install split 2021-05-08 11:51:49 +02:00
fyr77
b54de3eb36 remove broken updater for now 2021-05-08 00:04:40 +02:00
fyr77
85ae027c28 bump version 2021-05-02 17:03:44 +02:00
fyr77
48786a49f7 Fix updater 2021-05-02 17:00:39 +02:00
fyr77
ef98df1c92 Fix different bug in detection 2021-05-02 16:48:44 +02:00
fyr77
bc26b5caac Bump and argh 2021-05-02 16:24:05 +02:00
fyr77
babacb68dd add workaround for registry read error 2021-05-02 16:16:03 +02:00
fyr77
a42641fdce add DCH compat, better debug 2020-09-06 11:03:04 +02:00
fyr77
58631d5d8a fix potential memory leak 2020-09-03 22:24:22 +02:00
fyr77
4e58a588f1 add IsDCH function 2020-08-19 19:35:21 +02:00
fyr77
3c4dc9da2b Update AssemblyInfo to reflect actual version 2020-08-18 15:37:34 +02:00
fyr77
fff0d76b83 change version comparisons
it is now possible to locally use newer application or driver versions without envyupdate yelling at you.
2020-08-18 15:19:38 +02:00
fyr77
b99a2ee8c9 fix typo 2020-08-17 11:15:45 +02:00
fyr77
611a6568d6 Update README.md 2020-08-17 11:14:59 +02:00
fyr77
386fabcbbb Update README.md 2020-08-14 10:05:38 +02:00
fyr77
7ea4d65def Update README.md 2020-08-11 11:39:32 +02:00
Jakob
9d70fa3ea3
Update README.md 2020-08-11 10:28:45 +02:00
Jakob
1ecc0ef104
Update README.md 2020-08-11 10:28:30 +02:00
Jakob
56ff98d5b4
Update README.md 2020-08-11 10:27:05 +02:00
fyr77
1931225377 remove debug code 2020-08-04 18:14:17 +02:00
fyr77
26df20827f fix updater 2020-08-04 18:11:04 +02:00
fyr77
67c4697134 bump version 2020-08-04 17:53:22 +02:00
fyr77
82b32eaf42 fix self-deletion 2020-08-04 17:51:48 +02:00
Jakob
b8afdb35a8
Create version.txt
this is just for compat
2020-08-04 17:47:57 +02:00
Jakob
48d1476f4c
Delete version.txt 2020-08-04 12:26:21 +02:00
fyr77
98e26b6e34 add license 2020-08-04 12:24:04 +02:00
fyr77
a665ecc2ea fix logic errors and typo 2020-08-04 12:16:27 +02:00
fyr77
5f56d07f19 working towards 2.0
there is a bug in my gpu detection code somewhere but i don't have an nvidia gpu right now to debug it.
hmm.
2020-08-03 19:54:08 +02:00
Jakob
ae4a661959
Update README.md 2020-08-03 12:37:46 +02:00
fyr77
6dc3511e9a fix licenses 2020-07-31 15:58:03 +02:00
fyr77
0bcafdf4a0 fix new install handling 2020-07-31 15:50:35 +02:00
fyr77
6bec92eebc Update LICENSE 2020-07-31 15:32:43 +02:00
fyr77
64653885a0 finalize autodetection
also add mainfest for win10 compat
2020-07-30 18:30:37 +02:00
fyr77
1acf5f44df Update Util.cs 2020-07-29 16:08:08 +02:00
Jakob
de633792a5 add xmltest solution
this is temporary.
2020-07-25 13:29:41 +02:00
Jakob
bf9814cfd0 working towards 2.0
add better version detection
add new licenses
working on automatic GPU, lang and os detection
add debug mode for non-nivida
2020-07-25 13:29:15 +02:00
fyr77
5580669497 Update README.md 2020-07-23 15:54:42 +02:00
Jakob
8231a29588
Update README.md 2020-07-14 17:35:56 +02:00
fyr77
6e43f4c0ea Merge branch 'master' of https://github.com/fyr77/EnvyUpdate 2020-07-14 17:32:50 +02:00
fyr77
d7ccddd0ec Update MainWindow.xaml.cs 2020-07-14 17:32:40 +02:00
Jakob
1d7ba7a29a
Update version.txt 2020-07-14 17:30:15 +02:00
fyr77
20020b91ee remove debug feature 2020-07-14 17:27:06 +02:00
Jakob
f762e91cb4
Create version.txt 2020-07-14 17:21:42 +02:00
Jakob
8a56d2f2b3
Delete version.txt 2020-07-14 17:18:30 +02:00
Jakob
1d142f15b2
Update version.txt 2020-07-14 17:15:07 +02:00
fyr77
952f5fbe2c i am an idiot 2020-07-14 17:11:52 +02:00
fyr77
c390a05c61 move banner 2020-07-14 15:38:54 +02:00
fyr77
80cc710e94 add banner 2020-07-14 15:38:11 +02:00
fyr77
6f202f11cd update fody 2020-07-14 15:33:21 +02:00
fyr77
5c7831b855 add debug feature, update icon, add licenses, bump version 2020-07-14 15:31:32 +02:00
Jakob
9cc8e88698
Update README.md 2020-07-14 14:32:47 +02:00
fyr77
2b523fa7d4 cleanup code and update packages 2020-05-29 11:21:03 +02:00
Jakob
b7ae273fa3 optimise startup a bit 2019-12-30 21:21:22 +01:00
Jakob
1f29a05e80
Update README.md 2019-12-30 21:19:42 +01:00
35 changed files with 3376 additions and 405 deletions

3
.gitignore vendored
View file

@ -347,3 +347,6 @@ healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017 # Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/ MigrationBackup/
# Markdown backups
*.md.backup

View file

@ -1,20 +1,41 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 17
VisualStudioVersion = 16.0.29411.108 VisualStudioVersion = 17.6.33829.357
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnvyUpdate", "EnvyUpdate\EnvyUpdate.csproj", "{1BF2468D-9579-462D-9153-4836E9C8721F}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnvyUpdate", "EnvyUpdate\EnvyUpdate.csproj", "{1BF2468D-9579-462D-9153-4836E9C8721F}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution 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|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution 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.ActiveCfg = Debug|Any CPU
{1BF2468D-9579-462D-9153-4836E9C8721F}.Debug|Any CPU.Build.0 = 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.ActiveCfg = Release|Any CPU
{1BF2468D-9579-462D-9153-4836E9C8721F}.Release|Any CPU.Build.0 = 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 EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View file

@ -1,6 +1,34 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<startup> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
</startup> </startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.0.0.2" newVersion="5.0.0.2"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration> </configuration>

View file

@ -2,8 +2,14 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:EnvyUpdate" xmlns:local="clr-namespace:EnvyUpdate"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
StartupUri="MainWindow.xaml"> StartupUri="MainWindow.xaml">
<Application.Resources> <Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ui:ThemesDictionary Theme="Light"/>
<ui:ControlsDictionary />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources> </Application.Resources>
</Application> </Application>

View file

@ -1,10 +1,14 @@
using System; using Microsoft.Toolkit.Uwp.Notifications;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Configuration; using System.Configuration;
using System.Data; using System.Data;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows; using System.Windows;
using Windows.Foundation.Collections;
using Wpf.Ui.Markup;
namespace EnvyUpdate namespace EnvyUpdate
{ {
@ -13,5 +17,19 @@ namespace EnvyUpdate
/// </summary> /// </summary>
public partial class App : Application 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();
});
}
} }
} }

View file

@ -0,0 +1,89 @@
<ui:UiPage x:Class="EnvyUpdate.DashboardPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:EnvyUpdate"
xmlns:p="clr-namespace:EnvyUpdate.Properties"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
mc:Ignorable="d"
d:DesignHeight="400" d:DesignWidth="600"
Title="DashboardPage">
<Grid Margin="8,0,8,8">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ui:SymbolIcon Symbol="DeveloperBoard24" FontSize="56"/>
<TextBlock Margin="8,0,0,0" x:Name="textblockGPUName" Grid.Column="1" Text="GPU..." FontSize="32" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
</Grid>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ui:InfoBar x:Name="infoBarStatus"
Title="Checking"
IsOpen="True"
IsClosable="False"
Message="..."
Severity="Informational" />
<ui:Button x:Name="buttonSkipVersion" Margin="8,0,0,0" Grid.Column="1" Appearance="Dark" Icon="ArrowForward24" Visibility="Collapsed" ToolTip="{x:Static p:Resources.ui_skipversion}" Click="buttonSkipVersion_Click" />
<ui:Button x:Name="buttonDownload" Margin="8,0,0,0" MinWidth="100" Grid.Column="2" Appearance="Primary" Content="{x:Static p:Resources.ui_download}" Icon="ArrowDownload24" Visibility="Collapsed" Click="buttonDownload_Click" />
<ui:Button x:Name="buttonInstall" Margin="8,0,0,0" MinWidth="100" Grid.Column="2" Appearance="Primary" Content="{x:Static p:Resources.ui_install}" Icon="AppsAddIn24" Visibility="Collapsed" Click="buttonInstall_Click" />
</Grid>
<ProgressBar x:Name="progressbarDownload" Grid.Row="2" Value="0" Visibility="Collapsed"/>
<!-- This is for later automatic downloading. Todo! -->
<Grid Margin="0,12,0,0" Grid.Row="3">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ui:CardExpander x:Name="cardLocal" Margin="0,0,4,0" Grid.Column="0" Grid.Row="0" Icon="Desktop32" Header="..." ToolTip="{x:Static p:Resources.ui_localdriver}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" FontWeight="Bold" Text="{x:Static p:Resources.ui_localdriver_type}"/>
<TextBlock Grid.Column="1" x:Name="textblockLocalType" Text="?" />
</Grid>
</ui:CardExpander>
<ui:CardExpander x:Name="cardOnline" Margin="4,0,0,0" Grid.Column="1" Grid.Row="0" Icon="Earth32" Header="..." ToolTip="{x:Static p:Resources.ui_onlinedriver}">
<ui:Button Icon="Open24" Click="CardOnline_Click" Content="{x:Static p:Resources.ui_openwebsite}" HorizontalAlignment="Stretch"/>
</ui:CardExpander>
</Grid>
<ui:CardControl Margin="0,12,0,0" Grid.Row="4" Icon="Color24" Header="Studio Driver">
<ui:ToggleSwitch x:Name="switchStudioDriver" Checked="switchStudioDriver_Checked" Unchecked="switchStudioDriver_Unchecked" />
</ui:CardControl>
<ui:CardControl Margin="0,12,0,0" Grid.Row="5" Icon="LightbulbFilament48" Header="{x:Static p:Resources.ui_autostart}">
<ui:ToggleSwitch x:Name="switchAutostart" Click="switchAutostart_Click" />
</ui:CardControl>
</Grid>
<ui:Snackbar x:Name="snackbarInfo" Timeout="0"/>
</Grid>
</ui:UiPage>

View file

@ -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
{
/// <summary>
/// Interaction logic for Dashboard.xaml
/// </summary>
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();
}
}
}

60
EnvyUpdate/Debug.cs Normal file
View file

@ -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");
}
}
}
}

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\Costura.Fody.4.1.0\build\Costura.Fody.props" Condition="Exists('..\packages\Costura.Fody.4.1.0\build\Costura.Fody.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@ -9,7 +8,7 @@
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<RootNamespace>EnvyUpdate</RootNamespace> <RootNamespace>EnvyUpdate</RootNamespace>
<AssemblyName>EnvyUpdate</AssemblyName> <AssemblyName>EnvyUpdate</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion> <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
@ -17,6 +16,22 @@
<Deterministic>true</Deterministic> <Deterministic>true</Deterministic>
<NuGetPackageImportStamp> <NuGetPackageImportStamp>
</NuGetPackageImportStamp> </NuGetPackageImportStamp>
<IsWebBootstrapper>false</IsWebBootstrapper>
<TargetFrameworkProfile />
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
@ -43,19 +58,90 @@
<PropertyGroup> <PropertyGroup>
<SignAssembly>false</SignAssembly> <SignAssembly>false</SignAssembly>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug - ignoregpu|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug - ignoregpu|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug - ignoregpu\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug - ignoregpu|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug - ignoregpu\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Costura, Version=4.1.0.0, Culture=neutral, PublicKeyToken=9919ef960d84173d, processorArchitecture=MSIL"> <Reference Include="Microsoft.Build.Framework" />
<HintPath>..\packages\Costura.Fody.4.1.0\lib\net40\Costura.dll</HintPath> <Reference Include="Microsoft.Build.Utilities.v4.0" />
</Reference>
<Reference Include="Hardcodet.Wpf.TaskbarNotification, Version=1.0.5.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Hardcodet.NotifyIcon.Wpf.1.0.8\lib\net451\Hardcodet.Wpf.TaskbarNotification.dll</HintPath>
</Reference>
<Reference Include="Notifications.Wpf, Version=0.1.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Notifications.Wpf.0.1.1\lib\net461\Notifications.Wpf.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Management" /> <Reference Include="System.Management" />
<Reference Include="System.Numerics" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
@ -74,7 +160,25 @@
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</ApplicationDefinition> </ApplicationDefinition>
<Compile Include="Debug.cs" />
<Compile Include="GlobalVars.cs" />
<Compile Include="Notify.cs" /> <Compile Include="Notify.cs" />
<Compile Include="DashboardPage.xaml.cs">
<DependentUpon>DashboardPage.xaml</DependentUpon>
</Compile>
<Compile Include="Properties\Licenses.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Licenses.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Resources.de.Designer.cs">
<DependentUpon>Resources.de.resx</DependentUpon>
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
</Compile>
<Compile Include="SettingsPage.xaml.cs">
<DependentUpon>SettingsPage.xaml</DependentUpon>
</Compile>
<Compile Include="StringExt.cs" /> <Compile Include="StringExt.cs" />
<Compile Include="Util.cs" /> <Compile Include="Util.cs" />
<Page Include="MainWindow.xaml"> <Page Include="MainWindow.xaml">
@ -89,6 +193,14 @@
<DependentUpon>MainWindow.xaml</DependentUpon> <DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Page Include="DashboardPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="SettingsPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs"> <Compile Include="Properties\AssemblyInfo.cs">
@ -104,11 +216,19 @@
<DependentUpon>Settings.settings</DependentUpon> <DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput> <DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile> </Compile>
<EmbeddedResource Include="Properties\Resources.resx"> <EmbeddedResource Include="Properties\Licenses.resx">
<Generator>ResXFileCodeGenerator</Generator> <Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Licenses.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.de.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.de.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput> <LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource> </EmbeddedResource>
<None Include="packages.config" /> <None Include="app.manifest" />
<None Include="Properties\Settings.settings"> <None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator> <Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput> <LastGenOutput>Settings.Designer.cs</LastGenOutput>
@ -134,13 +254,39 @@
<EmbedInteropTypes>True</EmbedInteropTypes> <EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference> </COMReference>
</ItemGroup> </ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.7.2">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.7.2 %28x86 and x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Costura.Fody" PrivateAssets="all">
<Version>5.7.0</Version>
</PackageReference>
<PackageReference Include="Fody">
<Version>6.8.1</Version>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.Toolkit.Uwp.Notifications">
<Version>7.1.3</Version>
</PackageReference>
<PackageReference Include="Resource.Embedder">
<Version>2.2.0</Version>
</PackageReference>
<PackageReference Include="System.Text.Json">
<Version>8.0.4</Version>
</PackageReference>
<PackageReference Include="WPF-UI">
<Version>2.1.0</Version>
</PackageReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>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}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Costura.Fody.4.1.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Costura.Fody.4.1.0\build\Costura.Fody.props'))" />
<Error Condition="!Exists('..\packages\Fody.6.0.5\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Fody.6.0.5\build\Fody.targets'))" />
</Target>
<Import Project="..\packages\Fody.6.0.5\build\Fody.targets" Condition="Exists('..\packages\Fody.6.0.5\build\Fody.targets')" />
</Project> </Project>

View file

@ -17,6 +17,16 @@
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation> <xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
</xs:annotation> </xs:annotation>
</xs:element> </xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="ExcludeRuntimeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="IncludeRuntimeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged32Assemblies" type="xs:string"> <xs:element minOccurs="0" maxOccurs="1" name="Unmanaged32Assemblies" type="xs:string">
<xs:annotation> <xs:annotation>
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with line breaks.</xs:documentation> <xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with line breaks.</xs:documentation>
@ -43,6 +53,16 @@
<xs:documentation>Controls if .pdbs for reference assemblies are also embedded.</xs:documentation> <xs:documentation>Controls if .pdbs for reference assemblies are also embedded.</xs:documentation>
</xs:annotation> </xs:annotation>
</xs:attribute> </xs:attribute>
<xs:attribute name="IncludeRuntimeReferences" type="xs:boolean">
<xs:annotation>
<xs:documentation>Controls if runtime assemblies are also embedded.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="UseRuntimeReferencePaths" type="xs:boolean">
<xs:annotation>
<xs:documentation>Controls whether the runtime assemblies are embedded with their full path or only with their assembly name.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="DisableCompression" type="xs:boolean"> <xs:attribute name="DisableCompression" type="xs:boolean">
<xs:annotation> <xs:annotation>
<xs:documentation>Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option.</xs:documentation> <xs:documentation>Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option.</xs:documentation>
@ -73,6 +93,16 @@
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation> <xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
</xs:annotation> </xs:annotation>
</xs:attribute> </xs:attribute>
<xs:attribute name="ExcludeRuntimeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="IncludeRuntimeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="Unmanaged32Assemblies" type="xs:string"> <xs:attribute name="Unmanaged32Assemblies" type="xs:string">
<xs:annotation> <xs:annotation>
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with |.</xs:documentation> <xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with |.</xs:documentation>

25
EnvyUpdate/GlobalVars.cs Normal file
View file

@ -0,0 +1,25 @@
using System;
using System.IO;
namespace EnvyUpdate
{
class GlobalVars
{
public static bool isMobile = false;
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 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 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;
}
}

View file

@ -1,22 +1,64 @@
<Window x:Class="EnvyUpdate.MainWindow" <ui:UiWindow x:Class="EnvyUpdate.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:EnvyUpdate" xmlns:local="clr-namespace:EnvyUpdate"
xmlns:p="clr-namespace:EnvyUpdate.Properties"
xmlns:tb="http://www.hardcodet.net/taskbar" xmlns:tb="http://www.hardcodet.net/taskbar"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
mc:Ignorable="d" mc:Ignorable="d"
Title="EnvyUpdate" Height="170.864" Width="463.435" Icon="icon.ico" ResizeMode="CanMinimize" StateChanged="Window_StateChanged" Closing="Window_Closing"> ExtendsContentIntoTitleBar="True"
<Grid Margin="0,0,0,6"> WindowBackdropType="Mica"
<tb:TaskbarIcon IconSource="/icon.ico" ToolTipText="EnvyUpdate" TrayLeftMouseDown="TaskbarIcon_TrayLeftMouseDown" />
<TextBlock HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" FontWeight="Bold" Width="151"><Run Text="Local d"/><Run Text="river "/><Run Text="v"/><Run Text="ersion:"/></TextBlock> Title="EnvyUpdate" MinHeight="500" Height="550" MinWidth="700" Width="750" Icon="icon.ico" StateChanged="Window_StateChanged" Closing="Window_Closing" ResizeMode="CanMinimize" WindowStyle="None">
<TextBlock x:Name="textblockGPU" HorizontalAlignment="Left" Margin="166,10,0,0" TextWrapping="Wrap" Text="&lt;none&gt;" VerticalAlignment="Top" RenderTransformOrigin="-0.346,0.564"/> <Grid>
<Label x:Name="labelDrag" Content="Drag nvidia.com-cookies.txt here..." Margin="10,98,12,10" HorizontalAlignment="Center" VerticalAlignment="Center" AllowDrop="True" Drop="Grid_Drop" Height="28" Width="435"/> <Grid.RowDefinitions>
<Button x:Name="buttonHelp" Content="?" HorizontalAlignment="Left" Margin="425,11,0,0" VerticalAlignment="Top" Width="20" Click="buttonHelp_Click"/> <RowDefinition Height="Auto" />
<TextBlock HorizontalAlignment="Left" Margin="10,31,0,0" TextWrapping="Wrap" VerticalAlignment="Top" FontWeight="Bold" Width="151"><Run Text="Online "/><Run Text="d"/><Run Text="river "/><Run Text="v"/><Run Text="ersion:"/></TextBlock> <RowDefinition Height="*" />
<TextBlock x:Name="textblockOnline" HorizontalAlignment="Left" Margin="166,31,0,0" TextWrapping="Wrap" Text="&lt;none&gt;" VerticalAlignment="Top" RenderTransformOrigin="-0.346,0.564"/> </Grid.RowDefinitions>
<CheckBox x:Name="chkPortable" Content="Portable mode" HorizontalAlignment="Left" Margin="10,78,0,0" VerticalAlignment="Top" IsChecked="True" Unchecked="chkPortable_Unchecked" Checked="chkPortable_Checked"/> <ui:TitleBar
<Button x:Name="buttonDL" Content="⟱" HorizontalAlignment="Left" Margin="250,10,0,0" VerticalAlignment="Top" Width="37" FontSize="20" Height="37" Click="buttonDL_Click" Foreground="White" Background="#FF3CDA00" Visibility="Hidden"/> Title="EnvyUpdate"
<CheckBox x:Name="chkAutostart" Content="Autostart" HorizontalAlignment="Left" Margin="10,58,0,0" VerticalAlignment="Top" IsEnabled="False" Checked="chkAutostart_Checked" Unchecked="chkAutostart_Unchecked"/> Grid.Row="0"
CanMaximize="False"
ShowMaximize="False"
Icon="/icon.ico">
<ui:TitleBar.Tray>
<ui:NotifyIcon
LeftClick="NotifyIcon_LeftClick"
Icon="/icon.ico"
MenuOnRightClick="False"
TooltipText="EnvyUpdate">
</ui:NotifyIcon>
</ui:TitleBar.Tray>
</ui:TitleBar>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ui:NavigationCompact
x:Name="RootNavigation"
Frame="{Binding ElementName=MainFrame}"
Grid.Column="0"
SelectedPageIndex="0">
<ui:NavigationCompact.Items>
<ui:NavigationItem
Content="{x:Static p:Resources.ui_home}"
Icon="Home24"
PageType="{x:Type local:DashboardPage}"
/>
</ui:NavigationCompact.Items>
<ui:NavigationCompact.Footer>
<ui:NavigationItem
Content="{x:Static p:Resources.ui_settings}"
Icon="Settings24"
PageType="{x:Type local:SettingsPage}"/>
</ui:NavigationCompact.Footer>
</ui:NavigationCompact>
<Frame
x:Name="MainFrame"
Grid.Column="1" />
</Grid> </Grid>
</Window> </Grid>
</ui:UiWindow>

View file

@ -1,247 +1,154 @@
using System; using Microsoft.Toolkit.Uwp.Notifications;
using System.Windows; using Microsoft.Win32;
using System;
using System.IO; using System.IO;
using System.Net; using System.Linq;
using System.Text.RegularExpressions; using System.Windows;
using System.Windows.Media;
using System.Windows.Threading;
namespace EnvyUpdate namespace EnvyUpdate
{ {
/// <summary> /// <summary>
/// Interaction logic for MainWindow.xaml /// Interaction logic for MainWindow.xaml
/// </summary> /// </summary>
public partial class MainWindow : Window public partial class MainWindow
{ {
string localDriv = null; private string[] arguments = null;
string onlineDriv = null;
readonly string appdata = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\envyupdate\\";
readonly string startup = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
string gpuURL = null;
readonly string exeloc = System.Reflection.Assembly.GetEntryAssembly().Location;
readonly string exepath = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + "\\";
readonly string startmenu = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu);
readonly string version = "1.1";
public MainWindow() public MainWindow()
{ {
InitializeComponent(); InitializeComponent();
Title += " " + version;
if (Util.IsInstanceOpen("EnvyUpdate")) // Try to get command line arguments
try
{ {
MessageBox.Show("Application is already running."); 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); Environment.Exit(1);
} }
if (!Directory.Exists(appdata))
// Check if EnvyUpdate is already running
if (Util.IsInstanceOpen("EnvyUpdate"))
{ {
Directory.CreateDirectory(appdata); Debug.LogToFile("FATAL Found another instance, terminating.");
MessageBox.Show(Properties.Resources.instance_already_running);
Environment.Exit(1);
} }
try // Check dark theme
AdjustTheme();
SystemEvents.UserPreferenceChanged += AdjustTheme;
// Delete installed legacy versions, required for people upgrading from very old versions.
if (Directory.Exists(GlobalVars.legacyAppdata))
{ {
if (Util.GetNewVer() != version && exepath == appdata) Debug.LogToFile("INFO Found legacy appdata installation, uninstalling.");
{ Util.UninstallAll();
Util.UpdateApp();
}
}
catch (WebException)
{
//Silently fail.
} }
if (Util.GetLocDriv() != null) // Allow for running using a fake graphics card if no nvidia card is present.
if (arguments.Contains("/fake"))
{ {
localDriv = Util.GetLocDriv(); Debug.isFake = true;
textblockGPU.Text = localDriv; Debug.LogToFile("WARN Faking GPU with debug info.");
} }
else else if (!Util.IsNvidia())
{ {
MessageBox.Show("No NVIDIA GPU found. Application will exit."); Debug.LogToFile("FATAL No supported GPU found, terminating.");
MessageBox.Show(Properties.Resources.no_compatible_gpu);
Environment.Exit(255); Environment.Exit(255);
} }
if (File.Exists(appdata + "nvidia-update.txt"))
{
chkPortable.IsChecked = false;
DispatcherTimer Dt = new DispatcherTimer();
Dt.Tick += new EventHandler(Dt_Tick);
Dt.Interval = new TimeSpan(5, 0, 0);
Dt.Start();
Load();
}
if (File.Exists(startup + "\\EnvyUpdate.lnk"))
{
chkAutostart.IsChecked = true;
}
}
private void Dt_Tick(object sender, EventArgs e) //Check if launched as miminized with arg
{ if (arguments.Contains("/minimize"))
Load();
}
private void buttonHelp_Click(object sender, RoutedEventArgs e)
{
System.Diagnostics.Process.Start("https://github.com/fyr77/EnvyUpdate/");
}
private void Grid_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
try
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
Load(files);
}
catch (WebException)
{
MessageBox.Show("Network Error. Are you connected to the internet?", "Network Error");
}
}
}
private void Load()
{
FileInfo f = new FileInfo(appdata + "nvidia-update.txt");
int psid;
int pfid;
int osid;
int langid;
chkPortable.Visibility = Visibility.Hidden;
labelDrag.Content = "Drag nvidia.com-cookies.txt here if you have changed your graphics card.";
psid = Util.GetData(f.FullName, "ProductSeries");
pfid = Util.GetData(f.FullName, "ProductType");
osid = Util.GetData(f.FullName, "OperatingSystem");
langid = Util.GetData(f.FullName, "Language");
gpuURL = "http://www.nvidia.com/Download/processDriver.aspx?psid=" + psid.ToString() + "&pfid=" + pfid.ToString() + "&rpf=1&osid=" + osid.ToString() + "&lid=" + langid.ToString() + "&ctk=0";
WebClient c = new WebClient();
gpuURL = c.DownloadString(gpuURL);
string pContent = c.DownloadString(gpuURL);
var pattern = @"\d{3}\.\d{2}&nbsp";
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 (localDriv != onlineDriv)
{
textblockOnline.Foreground = Brushes.Red;
buttonDL.Visibility = Visibility.Visible;
Notify.ShowDrivUpdatePopup();
}
else
textblockOnline.Foreground = Brushes.Green;
if (exepath == appdata)
{ {
Debug.LogToFile("INFO Launching minimized.");
WindowState = WindowState.Minimized; WindowState = WindowState.Minimized;
Hide(); GlobalVars.startMinimized = true;
} }
}
private void Load(string[] files) //Check for old unfinished downloads
string[] leftovers = Directory.GetFiles(GlobalVars.directoryOfExe, "*-nvidia-installer.exe.downloading");
if (leftovers.Length > 0)
{ {
FileInfo f = new FileInfo(files[0]); foreach (string leftover in leftovers)
int psid;
int pfid;
int osid;
int langid;
if (chkPortable.IsChecked == false)
{ {
File.Copy(f.FullName, appdata + "nvidia-update.txt", true); Debug.LogToFile("INFO Deleting leftover download " + leftover);
f = new FileInfo(appdata + "nvidia-update.txt"); File.Delete(leftover);
}
chkPortable.Visibility = Visibility.Hidden;
labelDrag.Content = "Drag nvidia.com-cookies.txt here if you have changed your graphics card.";
} }
psid = Util.GetData(f.FullName, "ProductSeries");
pfid = Util.GetData(f.FullName, "ProductType");
osid = Util.GetData(f.FullName, "OperatingSystem");
langid = Util.GetData(f.FullName, "Language");
gpuURL = "http://www.nvidia.com/Download/processDriver.aspx?psid=" + psid.ToString() + "&pfid=" + pfid.ToString() + "&rpf=1&osid=" + osid.ToString() + "&lid=" + langid.ToString() + "&ctk=0";
WebClient c = new WebClient();
gpuURL = c.DownloadString(gpuURL);
string pContent = c.DownloadString(gpuURL);
var pattern = @"\d{3}\.\d{2}&nbsp";
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 (localDriv != onlineDriv) GlobalVars.isMobile = Util.IsMobile();
Debug.LogToFile("INFO Mobile: " + GlobalVars.isMobile);
if (File.Exists(Path.Combine(GlobalVars.saveDirectory, "autodl.envy")))
{ {
textblockOnline.Foreground = Brushes.Red; Debug.LogToFile("INFO Auto-download is enabled.");
buttonDL.Visibility = Visibility.Visible; GlobalVars.autoDownload = true;
} }
else
textblockOnline.Foreground = Brushes.Green;
} }
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) private void Window_StateChanged(object sender, EventArgs e)
{ {
if (WindowState == WindowState.Minimized) if (WindowState == WindowState.Minimized)
{ {
Debug.LogToFile("INFO Window was minimized, closing to tray.");
Hide(); Hide();
} }
} }
private void chkPortable_Unchecked(object sender, RoutedEventArgs e)
{
if (chkAutostart != null)
{
chkAutostart.IsEnabled = true;
}
}
private void chkPortable_Checked(object sender, RoutedEventArgs e)
{
if (chkAutostart != null)
{
chkAutostart.IsEnabled = false;
chkAutostart.IsChecked = false;
}
}
private void chkAutostart_Checked(object sender, RoutedEventArgs e)
{
if (exepath != appdata)
{
File.Copy(exeloc, appdata + "EnvyUpdate.exe", true);
Util.CreateShortcut("EnvyUpdate", startup, appdata + "EnvyUpdate.exe", "Nvidia Updater Application.");
Util.CreateShortcut("EnvyUpdate", startmenu, appdata + "EnvyUpdate.exe", "Nvidia Updater Application.");
}
else
{
chkAutostart.IsEnabled = false;
}
}
private void chkAutostart_Unchecked(object sender, RoutedEventArgs e)
{
File.Delete(appdata + "EnvyUpdate.exe");
File.Delete(startup + "\\EnvyUpdate.lnk");
File.Delete(startmenu + "\\EnvyUpdate.lnk");
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{ {
var window = MessageBox.Show("Exit EnvyUpdate?", "", MessageBoxButton.YesNo); Debug.LogToFile("INFO Uninstalling notifications and shutting down.");
e.Cancel = (window == MessageBoxResult.No); ToastNotificationManagerCompat.Uninstall(); // Uninstall notifications to prevent issues with the app being portable.
Application.Current.Shutdown(); 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
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();
}
} }
} }

View file

@ -1,19 +1,21 @@
using Notifications.Wpf; using Microsoft.Toolkit.Uwp.Notifications;
namespace EnvyUpdate namespace EnvyUpdate
{ {
class Notify internal class Notify
{ {
public static void ShowDrivUpdatePopup() public static void ShowDrivUpdatePopup()
{ {
var notificationManager = new NotificationManager(); try
notificationManager.Show(new NotificationContent
{ {
Title = "EnvyUpdate", var toast = new ToastContentBuilder();
Message = "A new driver update is available for your graphics card. Click for more info.", toast.AddText(Properties.Resources.update_popup_message);
Type = NotificationType.Information toast.Show();
}, onClick: Util.ShowMain); }
catch (System.Exception ex)
{
Debug.LogToFile("WARN Could not show notification. Error: " + ex.Message);
}
} }
} }
} }

View file

@ -1,6 +1,4 @@
using System.Reflection; using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Windows; using System.Windows;
@ -8,11 +6,11 @@ using System.Windows;
// set of attributes. Change these attribute values to modify the information // set of attributes. Change these attribute values to modify the information
// associated with an assembly. // associated with an assembly.
[assembly: AssemblyTitle("EnvyUpdate")] [assembly: AssemblyTitle("EnvyUpdate")]
[assembly: AssemblyDescription("")] [assembly: AssemblyDescription("Small update checker application for Nvidia GPUs")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")] [assembly: AssemblyCompany("fyr77")]
[assembly: AssemblyProduct("EnvyUpdate")] [assembly: AssemblyProduct("EnvyUpdate")]
[assembly: AssemblyCopyright("Copyright © 2019")] [assembly: AssemblyCopyright("Copyright © 2023")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
@ -51,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("1.0.0.0")] [assembly: AssemblyVersion("3.6")]
[assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyFileVersion("3.6")]

166
EnvyUpdate/Properties/Licenses.Designer.cs generated Normal file
View file

@ -0,0 +1,166 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 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.
// </auto-generated>
//------------------------------------------------------------------------------
namespace EnvyUpdate.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// 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() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[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;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// 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]&quot;;.
/// </summary>
internal static string _7zip {
get {
return ResourceManager.GetString("7zip", resourceCulture);
}
}
/// <summary>
/// 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 &quot;Software&quot;), 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]&quot;;.
/// </summary>
internal static string CosturaFody {
get {
return ResourceManager.GetString("CosturaFody", resourceCulture);
}
}
/// <summary>
/// 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 &quot;Software&quot;), 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]&quot;;.
/// </summary>
internal static string EnvyUpdate {
get {
return ResourceManager.GetString("EnvyUpdate", resourceCulture);
}
}
/// <summary>
/// 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 &quot;Software&quot;), 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]&quot;;.
/// </summary>
internal static string Fody {
get {
return ResourceManager.GetString("Fody", resourceCulture);
}
}
/// <summary>
/// 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 &quot;Software&quot;), 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]&quot;;.
/// </summary>
internal static string ResourceEmbedder {
get {
return ResourceManager.GetString("ResourceEmbedder", resourceCulture);
}
}
/// <summary>
/// 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]&quot;;.
/// </summary>
internal static string WindowsCommunityToolkit {
get {
return ResourceManager.GetString("WindowsCommunityToolkit", resourceCulture);
}
}
/// <summary>
/// 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 &quot;Software&quot;), 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]&quot;;.
/// </summary>
internal static string wpfui {
get {
return ResourceManager.GetString("wpfui", resourceCulture);
}
}
}
}

View file

@ -0,0 +1,199 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="7zip" xml:space="preserve">
<value>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/</value>
</data>
<data name="CosturaFody" xml:space="preserve">
<value>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.</value>
</data>
<data name="EnvyUpdate" xml:space="preserve">
<value>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.</value>
</data>
<data name="Fody" xml:space="preserve">
<value>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.</value>
</data>
<data name="ResourceEmbedder" xml:space="preserve">
<value>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.</value>
</data>
<data name="WindowsCommunityToolkit" xml:space="preserve">
<value># 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.</value>
</data>
<data name="wpfui" xml:space="preserve">
<value>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.</value>
</data>
</root>

View file

@ -8,8 +8,8 @@
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
namespace EnvyUpdate.Properties namespace EnvyUpdate.Properties {
{ using System;
/// <summary> /// <summary>
@ -19,31 +19,26 @@ namespace EnvyUpdate.Properties
// class via a tool like ResGen or Visual Studio. // class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen // To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project. // with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources public class Resources {
{
private static global::System.Resources.ResourceManager resourceMan; private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture; private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() internal Resources() {
{
} }
/// <summary> /// <summary>
/// Returns the cached ResourceManager instance used by this class. /// Returns the cached ResourceManager instance used by this class.
/// </summary> /// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager public static global::System.Resources.ResourceManager ResourceManager {
{ get {
get if (object.ReferenceEquals(resourceMan, null)) {
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EnvyUpdate.Properties.Resources", typeof(Resources).Assembly); global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EnvyUpdate.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp; resourceMan = temp;
} }
@ -56,16 +51,472 @@ namespace EnvyUpdate.Properties
/// resource lookups using this strongly typed resource class. /// resource lookups using this strongly typed resource class.
/// </summary> /// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture public static global::System.Globalization.CultureInfo Culture {
{ get {
get
{
return resourceCulture; return resourceCulture;
} }
set set {
{
resourceCulture = value; resourceCulture = value;
} }
} }
/// <summary>
/// Looks up a localized string similar to NVIDIA Updater Application..
/// </summary>
public static string app_description {
get {
return ResourceManager.GetString("app_description", resourceCulture);
}
}
/// <summary>
/// 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!.
/// </summary>
public static string error_installing {
get {
return ResourceManager.GetString("error_installing", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Exit EnvyUpdate?.
/// </summary>
public static string exit_confirm {
get {
return ResourceManager.GetString("exit_confirm", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to There was a problem downloading the driver installer. Please try again..
/// </summary>
public static string info_download_error {
get {
return ResourceManager.GetString("info_download_error", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Error while downloading.
/// </summary>
public static string info_download_error_title {
get {
return ResourceManager.GetString("info_download_error_title", resourceCulture);
}
}
/// <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>
/// Looks up a localized string similar to Driver installer successfully downloaded..
/// </summary>
public static string info_download_success {
get {
return ResourceManager.GetString("info_download_success", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Download successful.
/// </summary>
public static string info_download_success_title {
get {
return ResourceManager.GetString("info_download_success_title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The driver files have finished extracting..
/// </summary>
public static string info_extract_complete {
get {
return ResourceManager.GetString("info_extract_complete", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Extraction complete.
/// </summary>
public static string info_extract_complete_title {
get {
return ResourceManager.GetString("info_extract_complete_title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The driver files are being extracted. This could take a few minutes..
/// </summary>
public static string info_extracting {
get {
return ResourceManager.GetString("info_extracting", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Extracting driver files.
/// </summary>
public static string info_extracting_title {
get {
return ResourceManager.GetString("info_extracting_title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The installation of the new driver version was completed..
/// </summary>
public static string info_install_complete {
get {
return ResourceManager.GetString("info_install_complete", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Update finished.
/// </summary>
public static string info_install_complete_title {
get {
return ResourceManager.GetString("info_install_complete_title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Preference reset..
/// </summary>
public static string info_reset_caption {
get {
return ResourceManager.GetString("info_reset_caption", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Preference reset.\nEnvyUpdate will ask for computer form factor the next time it is started..
/// </summary>
public static string info_reset_message {
get {
return ResourceManager.GetString("info_reset_message", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Application is already running..
/// </summary>
public static string instance_already_running {
get {
return ResourceManager.GetString("instance_already_running", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to New version of EnvyUpdate found. Application will restart.\nThis will probably take a few seconds..
/// </summary>
public static string message_new_version {
get {
return ResourceManager.GetString("message_new_version", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to No.
/// </summary>
public static string no {
get {
return ResourceManager.GetString("no", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to No NVIDIA GPU found. Application will exit..
/// </summary>
public static string no_compatible_gpu {
get {
return ResourceManager.GetString("no_compatible_gpu", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Version was skipped. Update popups will be disabled until a new version releases..
/// </summary>
public static string skip_confirm {
get {
return ResourceManager.GetString("skip_confirm", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Run at Windows startup.
/// </summary>
public static string ui_autostart {
get {
return ResourceManager.GetString("ui_autostart", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Download.
/// </summary>
public static string ui_download {
get {
return ResourceManager.GetString("ui_download", resourceCulture);
}
}
/// <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>
/// Looks up a localized string similar to Enable logging to file.
/// </summary>
public static string ui_enable_logging {
get {
return ResourceManager.GetString("ui_enable_logging", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Home.
/// </summary>
public static string ui_home {
get {
return ResourceManager.GetString("ui_home", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to DCH driver.
/// </summary>
public static string ui_info_dch {
get {
return ResourceManager.GetString("ui_info_dch", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Mobile GPU (Laptop, etc)?.
/// </summary>
public static string ui_info_mobile {
get {
return ResourceManager.GetString("ui_info_mobile", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Update available..
/// </summary>
public static string ui_info_outdated {
get {
return ResourceManager.GetString("ui_info_outdated", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Up to date..
/// </summary>
public static string ui_info_uptodate {
get {
return ResourceManager.GetString("ui_info_uptodate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to EnvyUpdate website.
/// </summary>
public static string ui_info_website {
get {
return ResourceManager.GetString("ui_info_website", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Install.
/// </summary>
public static string ui_install {
get {
return ResourceManager.GetString("ui_install", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Licenses.
/// </summary>
public static string ui_licenses {
get {
return ResourceManager.GetString("ui_licenses", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Local driver version:.
/// </summary>
public static string ui_localdriver {
get {
return ResourceManager.GetString("ui_localdriver", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Local driver type:.
/// </summary>
public static string ui_localdriver_type {
get {
return ResourceManager.GetString("ui_localdriver_type", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to All good..
/// </summary>
public static string ui_message_good {
get {
return ResourceManager.GetString("ui_message_good", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to New driver found..
/// </summary>
public static string ui_message_update {
get {
return ResourceManager.GetString("ui_message_update", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Online driver version:.
/// </summary>
public static string ui_onlinedriver {
get {
return ResourceManager.GetString("ui_onlinedriver", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Open website.
/// </summary>
public static string ui_openwebsite {
get {
return ResourceManager.GetString("ui_openwebsite", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Settings.
/// </summary>
public static string ui_settings {
get {
return ResourceManager.GetString("ui_settings", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Version skipped.
/// </summary>
public static string ui_skipped {
get {
return ResourceManager.GetString("ui_skipped", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Skip this version.
/// </summary>
public static string ui_skipversion {
get {
return ResourceManager.GetString("ui_skipversion", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Studio Driver is not supported by this graphics card..
/// </summary>
public static string ui_studionotsupported {
get {
return ResourceManager.GetString("ui_studionotsupported", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Are you sure you want to uninstall EnvyUpdate?.
/// </summary>
public static string uninstall_confirm {
get {
return ResourceManager.GetString("uninstall_confirm", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Uninstall?.
/// </summary>
public static string uninstall_heading {
get {
return ResourceManager.GetString("uninstall_heading", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to EnvyUpdate must be uninstalled because of an application bug. Please download the most recent version again..
/// </summary>
public static string uninstall_legacy_message {
get {
return ResourceManager.GetString("uninstall_legacy_message", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Your operating system is not supported by EnvyUpdate. Windows 10 or later is required..
/// </summary>
public static string unsupported_os {
get {
return ResourceManager.GetString("unsupported_os", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to A new driver update is available for your graphics card..
/// </summary>
public static string update_popup_message {
get {
return ResourceManager.GetString("update_popup_message", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Yes.
/// </summary>
public static string yes {
get {
return ResourceManager.GetString("yes", resourceCulture);
}
}
} }
} }

View file

View file

@ -0,0 +1,273 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="app_description" xml:space="preserve">
<value>NVIDIA Aktualisierungsanwendung.</value>
</data>
<data name="error_installing" xml:space="preserve">
<value>Ein Fehler ist bei der Installation aufgetreten. Bitte aktivieren Sie den Log und melden Sie den Fehler auf GitHub!</value>
</data>
<data name="exit_confirm" xml:space="preserve">
<value>EnvyUpdate schließen?</value>
</data>
<data name="info_download_error" xml:space="preserve">
<value>Fehler beim Herunterladen der Treiber-Installationsdatei. Bitte versuchen Sie es erneut.</value>
</data>
<data name="info_download_error_title" xml:space="preserve">
<value>Fehler beim Herunterladen</value>
</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">
<value>Treiber-Installationsdatei erfolgreich heruntergeladen.</value>
</data>
<data name="info_download_success_title" xml:space="preserve">
<value>Herunterladen erfolgreich abgeschlossen</value>
</data>
<data name="info_extracting" xml:space="preserve">
<value>Die Treiberdateien werden nun extrahiert. Dies könnte einige Minuten dauern.</value>
</data>
<data name="info_extracting_title" xml:space="preserve">
<value>Dateien werden extrahiert</value>
</data>
<data name="info_extract_complete" xml:space="preserve">
<value>Die Treiberdateien wurden vollständig extrahiert.</value>
</data>
<data name="info_extract_complete_title" xml:space="preserve">
<value>Extrahierung abgeschlossen</value>
</data>
<data name="info_install_complete" xml:space="preserve">
<value>Die Installation der neuen Treiberversion wurde abgeschlossen.</value>
</data>
<data name="info_install_complete_title" xml:space="preserve">
<value>Update abgeschlossen</value>
</data>
<data name="info_reset_caption" xml:space="preserve">
<value>Einstellung zurückgesetzt.</value>
</data>
<data name="info_reset_message" xml:space="preserve">
<value>Einstellung zurückgesetzt.\nBeim nächsten Start wird EnvyUpdate erneut nach dem Computerformfaktor fragen.</value>
</data>
<data name="instance_already_running" xml:space="preserve">
<value>Anwendung läuft bereits.</value>
</data>
<data name="message_new_version" xml:space="preserve">
<value>Neue Version von EnvyUpdate gefunden. Die Anwendung wird neu starten.\nDies wird wahrscheinlich einige Sekunden dauern.</value>
</data>
<data name="no" xml:space="preserve">
<value>Nein</value>
</data>
<data name="no_compatible_gpu" xml:space="preserve">
<value>Keine NVIDIA GPU gefunden. EnvyUpdate wird sich nun schließen.</value>
</data>
<data name="skip_confirm" xml:space="preserve">
<value>Version übersprungen. Aktualisierungsbenachrichtigungen werden bis zur nächsten Version deaktiviert.</value>
</data>
<data name="ui_autostart" xml:space="preserve">
<value>Beim Start von Windows ausführen</value>
</data>
<data name="ui_download" xml:space="preserve">
<value>Herunterladen</value>
</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">
<value>Programm-Log in Datei schreiben</value>
</data>
<data name="ui_home" xml:space="preserve">
<value>Start</value>
</data>
<data name="ui_info_dch" xml:space="preserve">
<value>DCH Treiber</value>
</data>
<data name="ui_info_mobile" xml:space="preserve">
<value>Mobile Grafikkarte (Laptop, etc)?</value>
</data>
<data name="ui_info_outdated" xml:space="preserve">
<value>Aktualisierung verfügbar.</value>
</data>
<data name="ui_info_uptodate" xml:space="preserve">
<value>Aktuell.</value>
</data>
<data name="ui_info_website" xml:space="preserve">
<value>EnvyUpdate Webseite</value>
</data>
<data name="ui_install" xml:space="preserve">
<value>Installieren</value>
</data>
<data name="ui_licenses" xml:space="preserve">
<value>Lizenzen</value>
</data>
<data name="ui_localdriver" xml:space="preserve">
<value>Lokale Treiberversion:</value>
</data>
<data name="ui_localdriver_type" xml:space="preserve">
<value>Lokaler Treibertyp:</value>
</data>
<data name="ui_message_good" xml:space="preserve">
<value>Alles in Ordnung.</value>
</data>
<data name="ui_message_update" xml:space="preserve">
<value>Neue Treiberversion gefunden.</value>
</data>
<data name="ui_onlinedriver" xml:space="preserve">
<value>Online Treiberversion:</value>
</data>
<data name="ui_openwebsite" xml:space="preserve">
<value>Webseite öffnen</value>
</data>
<data name="ui_settings" xml:space="preserve">
<value>Einstellungen</value>
</data>
<data name="ui_skipped" xml:space="preserve">
<value>Version übersprungen</value>
</data>
<data name="ui_skipversion" xml:space="preserve">
<value>Diese Version überspringen</value>
</data>
<data name="ui_studionotsupported" xml:space="preserve">
<value>Studio Treiber wird von dieser Grafikkarte nicht unterstützt.</value>
</data>
<data name="uninstall_confirm" xml:space="preserve">
<value>Sind Sie sich sicher, dass Sie EnvyUpdate deinstallieren wollen?</value>
</data>
<data name="uninstall_heading" xml:space="preserve">
<value>Deinstallieren?</value>
</data>
<data name="uninstall_legacy_message" xml:space="preserve">
<value>Aufgrund eines Programmfehlers musste EnvyUpdate deinstalliert werden. Bitte laden Sie die neuste Version erneut manuell herunter.</value>
</data>
<data name="unsupported_os" xml:space="preserve">
<value>Diese Betriebssystemversion wird von EnvyUpdate nicht unterstützt. Windows 10 oder neuer wird vorausgesetzt.</value>
</data>
<data name="update_popup_message" xml:space="preserve">
<value>Eine neue Treiberversion ist verfügbar.</value>
</data>
<data name="yes" xml:space="preserve">
<value>Ja</value>
</data>
</root>

View file

@ -46,7 +46,7 @@
mimetype: application/x-microsoft.net.object.binary.base64 mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64 mimetype: application/x-microsoft.net.object.soap.base64
@ -60,6 +60,7 @@
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
--> -->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true"> <xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType> <xsd:complexType>
<xsd:choice maxOccurs="unbounded"> <xsd:choice maxOccurs="unbounded">
@ -68,9 +69,10 @@
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" /> <xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" /> <xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="assembly"> <xsd:element name="assembly">
@ -85,9 +87,10 @@
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="resheader"> <xsd:element name="resheader">
@ -109,9 +112,162 @@
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="app_description" xml:space="preserve">
<value>NVIDIA Updater Application.</value>
</data>
<data name="error_installing" xml:space="preserve">
<value>An error occurred attempting to install the new version. Please enable logging in the settings and report the issue on GitHub!</value>
</data>
<data name="exit_confirm" xml:space="preserve">
<value>Exit EnvyUpdate?</value>
</data>
<data name="info_download_error" xml:space="preserve">
<value>There was a problem downloading the driver installer. Please try again.</value>
</data>
<data name="info_download_error_title" xml:space="preserve">
<value>Error while downloading</value>
</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">
<value>Driver installer successfully downloaded.</value>
</data>
<data name="info_download_success_title" xml:space="preserve">
<value>Download successful</value>
</data>
<data name="info_extracting" xml:space="preserve">
<value>The driver files are being extracted. This could take a few minutes.</value>
</data>
<data name="info_extracting_title" xml:space="preserve">
<value>Extracting driver files</value>
</data>
<data name="info_extract_complete" xml:space="preserve">
<value>The driver files have finished extracting.</value>
</data>
<data name="info_extract_complete_title" xml:space="preserve">
<value>Extraction complete</value>
</data>
<data name="info_install_complete" xml:space="preserve">
<value>The installation of the new driver version was completed.</value>
</data>
<data name="info_install_complete_title" xml:space="preserve">
<value>Update finished</value>
</data>
<data name="info_reset_caption" xml:space="preserve">
<value>Preference reset.</value>
</data>
<data name="info_reset_message" xml:space="preserve">
<value>Preference reset.\nEnvyUpdate will ask for computer form factor the next time it is started.</value>
</data>
<data name="instance_already_running" xml:space="preserve">
<value>Application is already running.</value>
</data>
<data name="message_new_version" xml:space="preserve">
<value>New version of EnvyUpdate found. Application will restart.\nThis will probably take a few seconds.</value>
</data>
<data name="no" xml:space="preserve">
<value>No</value>
</data>
<data name="no_compatible_gpu" xml:space="preserve">
<value>No NVIDIA GPU found. Application will exit.</value>
</data>
<data name="skip_confirm" xml:space="preserve">
<value>Version was skipped. Update popups will be disabled until a new version releases.</value>
</data>
<data name="ui_autostart" xml:space="preserve">
<value>Run at Windows startup</value>
</data>
<data name="ui_download" xml:space="preserve">
<value>Download</value>
</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">
<value>Enable logging to file</value>
</data>
<data name="ui_home" xml:space="preserve">
<value>Home</value>
</data>
<data name="ui_info_dch" xml:space="preserve">
<value>DCH driver</value>
</data>
<data name="ui_info_mobile" xml:space="preserve">
<value>Mobile GPU (Laptop, etc)?</value>
</data>
<data name="ui_info_outdated" xml:space="preserve">
<value>Update available.</value>
</data>
<data name="ui_info_uptodate" xml:space="preserve">
<value>Up to date.</value>
</data>
<data name="ui_info_website" xml:space="preserve">
<value>EnvyUpdate website</value>
</data>
<data name="ui_install" xml:space="preserve">
<value>Install</value>
</data>
<data name="ui_licenses" xml:space="preserve">
<value>Licenses</value>
</data>
<data name="ui_localdriver" xml:space="preserve">
<value>Local driver version:</value>
</data>
<data name="ui_localdriver_type" xml:space="preserve">
<value>Local driver type:</value>
</data>
<data name="ui_message_good" xml:space="preserve">
<value>All good.</value>
</data>
<data name="ui_message_update" xml:space="preserve">
<value>New driver found.</value>
</data>
<data name="ui_onlinedriver" xml:space="preserve">
<value>Online driver version:</value>
</data>
<data name="ui_openwebsite" xml:space="preserve">
<value>Open website</value>
</data>
<data name="ui_settings" xml:space="preserve">
<value>Settings</value>
</data>
<data name="ui_skipped" xml:space="preserve">
<value>Version skipped</value>
</data>
<data name="ui_skipversion" xml:space="preserve">
<value>Skip this version</value>
</data>
<data name="ui_studionotsupported" xml:space="preserve">
<value>Studio Driver is not supported by this graphics card.</value>
</data>
<data name="uninstall_confirm" xml:space="preserve">
<value>Are you sure you want to uninstall EnvyUpdate?</value>
</data>
<data name="uninstall_heading" xml:space="preserve">
<value>Uninstall?</value>
</data>
<data name="uninstall_legacy_message" xml:space="preserve">
<value>EnvyUpdate must be uninstalled because of an application bug. Please download the most recent version again.</value>
</data>
<data name="unsupported_os" xml:space="preserve">
<value>Your operating system is not supported by EnvyUpdate. Windows 10 or later is required.</value>
</data>
<data name="update_popup_message" xml:space="preserve">
<value>A new driver update is available for your graphics card.</value>
</data>
<data name="yes" xml:space="preserve">
<value>Yes</value>
</data>
</root> </root>

View file

@ -8,21 +8,17 @@
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
namespace EnvyUpdate.Properties namespace EnvyUpdate.Properties {
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default public static Settings Default {
{ get {
get
{
return defaultInstance; return defaultInstance;
} }
} }

View file

@ -0,0 +1,79 @@
<ui:UiPage x:Class="EnvyUpdate.SettingsPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:EnvyUpdate"
xmlns:p="clr-namespace:EnvyUpdate.Properties"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
mc:Ignorable="d"
d:DesignHeight="400" d:DesignWidth="600"
Title="SettingsPage">
<Grid Margin="8,0,8,8">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ui:SymbolIcon Grid.Column="1" Symbol="WindowApps24" FontSize="32" />
<TextBlock Margin="8,0,0,0" Grid.Column="2" x:Name="textBlockVer" Text="" VerticalAlignment="Center" FontSize="24"/>
</Grid>
<ui:CardAction Grid.Row="1" Margin="0,12,0,0" Icon="Open24" Content="{x:Static p:Resources.ui_info_website}" Click="CardWeb_Click"/>
<ui:CardControl Grid.Row="2" Margin="0,12,0,0" Icon="Bug24" Header="{x:Static p:Resources.ui_enable_logging}" >
<ui:ToggleSwitch x:Name="chkLog" Checked="chkLog_Checked" Unchecked="chkLog_Unchecked"/>
</ui:CardControl>
<Grid Grid.Row="3">
<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>
<Expander Header="EnvyUpdate">
<TextBox x:Name="textBoxLicEnvyupdate" IsReadOnly="True" TextWrapping="Wrap"/>
</Expander>
<Expander Margin="0,4,0,0" Header="Fody">
<TextBox x:Name="textBoxLicFody" IsReadOnly="True" TextWrapping="Wrap"/>
</Expander>
<Expander Margin="0,4,0,0" Header="Costura.Fody">
<TextBox x:Name="textBoxLicCostura" IsReadOnly="True" TextWrapping="Wrap"/>
</Expander>
<Expander Margin="0,4,0,0" Header="ResourceEmbedder">
<TextBox x:Name="textBoxLicResourceembedder" IsReadOnly="True" TextWrapping="Wrap"/>
</Expander>
<Expander Margin="0,4,0,0" Header="Windows Community Toolkit">
<TextBox x:Name="textBoxLicWindowscommunitytoolkit" IsReadOnly="True" TextWrapping="Wrap"/>
</Expander>
<Expander Margin="0,4,0,0" Header="WPF-UI">
<TextBox x:Name="textBoxLicWpfui" IsReadOnly="True" TextWrapping="Wrap"/>
</Expander>
<Expander Margin="0,4,0,0" Header="7-Zip">
<TextBox x:Name="textBoxLic7zip" IsReadOnly="True" TextWrapping="Wrap"/>
</Expander>
</StackPanel>
</ScrollViewer>
</Grid>
</ui:UiPage>

View file

@ -0,0 +1,123 @@
using System;
using System.IO;
using System.Windows;
namespace EnvyUpdate
{
/// <summary>
/// Interaction logic for SettingsPage.xaml
/// </summary>
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"));
}
}
}
}

View file

@ -1,10 +1,4 @@
using System; namespace EnvyUpdate
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EnvyUpdate
{ {
public static class StringExt public static class StringExt
{ {

View file

@ -1,40 +1,20 @@
using System; using IWshRuntimeLibrary;
using Microsoft.Build.Framework.XamlTypes;
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq; using System.Linq;
using System.Management; using System.Management;
using System.IO;
using IWshRuntimeLibrary;
using System.Diagnostics;
using System.Windows;
using System.Net; using System.Net;
using System.Text.RegularExpressions;
using System.Windows;
using System.Xml.Linq;
namespace EnvyUpdate namespace EnvyUpdate
{ {
class Util internal class Util
{ {
/// <summary>
/// Parses GPU info from a cookie file
/// </summary>
/// <param name="path"></param>
/// <param name="term"></param>
/// <returns></returns>
public static int GetData(string path, string term)
{
string found = null;
string line;
using (StreamReader file = new StreamReader(path))
{
while ((line = file.ReadLine()) != null)
{
if (line.Contains(term))
{
found = line;
break;
}
}
}
int lastno = Convert.ToInt32(found.Split().Last());
return lastno;
}
/// <summary> /// <summary>
/// Gets local driver version. /// Gets local driver version.
/// </summary> /// </summary>
@ -47,19 +27,26 @@ namespace EnvyUpdate
// query local driver version // query local driver version
try try
{ {
Debug.LogToFile("INFO Looking for driver version in ManagementObjects");
foreach (ManagementObject obj in new ManagementObjectSearcher("SELECT * FROM Win32_VideoController").Get()) foreach (ManagementObject obj in new ManagementObjectSearcher("SELECT * FROM Win32_VideoController").Get())
{ {
if (obj["Description"].ToString().ToLower().Contains("nvidia")) 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 OfflineGPUVersion = OfflineGPUVersion.Substring(0, 3) + "." + OfflineGPUVersion.Substring(3); // add dot
foundGpu = true; foundGpu = true;
Debug.LogToFile("INFO Found driver in ManagementObjects.");
break; break;
} }
} }
if (!foundGpu) if (!foundGpu)
{
Debug.LogToFile("WARN Did NOT find driver in ManagementObjects.");
throw new InvalidDataException(); throw new InvalidDataException();
}
return OfflineGPUVersion; return OfflineGPUVersion;
} }
@ -68,6 +55,23 @@ namespace EnvyUpdate
return null; return null;
} }
} }
/// <summary>
/// Check for existence of Nvidia GPU
/// </summary>
/// <returns></returns>
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;
}
/// <summary> /// <summary>
/// Creates a standard Windows shortcut. /// Creates a standard Windows shortcut.
/// </summary> /// </summary>
@ -75,18 +79,29 @@ namespace EnvyUpdate
/// <param name="shortcutPath"></param> /// <param name="shortcutPath"></param>
/// <param name="targetFileLocation"></param> /// <param name="targetFileLocation"></param>
/// <param name="description"></param> /// <param name="description"></param>
public static void CreateShortcut(string shortcutName, string shortcutPath, string targetFileLocation, string description) /// <param name="arguments"></param>
public static void CreateShortcut(string shortcutName, string shortcutPath, string targetFileLocation, string description, string arguments = "")
{ {
string shortcutLocation = System.IO.Path.Combine(shortcutPath, shortcutName + ".lnk"); // It seems unnecessarily complex to create a simple shortcut using C#. Oh well.
string shortcutLocation = Path.Combine(shortcutPath, shortcutName + ".lnk");
WshShell shell = new WshShell(); WshShell shell = new WshShell();
IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutLocation); IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutLocation);
shortcut.Arguments = arguments;
shortcut.Description = description; shortcut.Description = description;
shortcut.TargetPath = targetFileLocation; shortcut.TargetPath = targetFileLocation;
Debug.LogToFile("INFO Saving shortcut link.");
shortcut.Save(); shortcut.Save();
} }
/// <summary>
/// Checks if application is already running.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static bool IsInstanceOpen(string name) public static bool IsInstanceOpen(string name)
{ {
// This basically counts the processes named like the supplied string. If the count is more than 0, it will return true.
// Let's hope nobody manages to open this application 2,147,483,647 times, because then the int would overflow and crash EnvyUpdate. But I suppose you've got worse problems than that if you've got 2,147,483,647 instances of any process.
int count = 0; int count = 0;
foreach (Process clsProcess in Process.GetProcesses()) foreach (Process clsProcess in Process.GetProcesses())
{ {
@ -101,47 +116,584 @@ namespace EnvyUpdate
else else
return false; return false;
} }
/// <summary>
/// Shows main window and restores WindowState
/// </summary>
public static void ShowMain() public static void ShowMain()
{ {
Application.Current.MainWindow.Show(); Application.Current.MainWindow.Show();
Application.Current.MainWindow.WindowState = WindowState.Normal; Application.Current.MainWindow.WindowState = WindowState.Normal;
Application.Current.MainWindow.Activate();
} }
public static string GetNewVer()
{
string updPath = "https://raw.githubusercontent.com/fyr77/EnvyUpdate/master/res/version.txt";
System.Net.WebClient wc = new System.Net.WebClient();
string webData = wc.DownloadString(updPath).Truncate(3);
return webData;
}
/// <summary> /// <summary>
/// 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
/// </summary> /// </summary>
public static void UpdateApp() public static void SelfDelete()
{ {
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("New version of EnvyUpdate found. Application will restart.\nThis will probably take a few seconds.");
// Replace exe with new one
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 && ren EnvyUpdated.exe EnvyUpdate.exe && EnvyUpdate.exe" Arguments = "/C timeout 5 && del EnvyUpdate.exe"
}; };
process.StartInfo = startInfo; process.StartInfo = startInfo;
process.Start(); process.Start();
Environment.Exit(2); Environment.Exit(2);
} }
public static int GetIDs(string IDtype, bool retry = true)
{
string xmlcontent = null;
int id = -1;
Debug.LogToFile("INFO Getting Nvidia GPU list...");
using (var wc = new WebClient())
{
switch (IDtype)
{
case "psid":
case "pfid":
xmlcontent = wc.DownloadString("https://www.nvidia.com/Download/API/lookupValueSearch.aspx?TypeID=3");
break;
default:
break;
}
}
Debug.LogToFile("INFO Got Nvidia GPU list.");
if (xmlcontent == null)
{
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;
}
/// <summary>
/// Gets Value from Nvidias XML docs by searching for the name. Can be used for OS, Lang and GPU.
/// This will produce problems when run on Linux. Good thing Linux has nice package managers to take care of driver updating.
/// </summary>
/// <param name="xDoc"></param>
/// <param name="query"></param>
/// <param name="psid"></param>
/// <returns></returns>
private static int GetValueFromName(XDocument xDoc, string query, bool psid)
{
int value = 0;
int i = 0;
int value1 = 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) // Looping through the XML Doc because the name is not the primary key
{
string sName = name.Value.ToString().ToLower();
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
value2 = int.Parse(name.Parent.FirstAttribute.Value);
}
else
{
Debug.LogToFile("INFO Getting something other than psid.");
string result = name.Parent.Value.ToLower();
int index = result.IndexOf(sName);
cleanResult = (index < 0)
? result
: result.Remove(index, sName.Length);
if (i == 0)
{
value1 = int.Parse(cleanResult);
}
else
{
value2 = int.Parse(cleanResult);
}
}
if (GlobalVars.isMobile && (value2 != 0))
{
value = value2;
}
else
{
value = value1;
}
if (value2 != 0)
break;
i++;
}
}
return value;
}
/// <summary>
/// Returns hardcoded values for the supported operating systems.
/// </summary>
/// <param name="xDoc"></param>
/// <returns></returns>
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;
if (Environment.OSVersion.Version.Build < 22000)
{
// This means we are running Windows 10.
if (Environment.Is64BitOperatingSystem)
value = 57;
else
value = 56;
}
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;
}
/// <summary>
/// Returns GPU name in lower case.
/// </summary>
/// <returns></returns>
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 (obj["Description"].ToString().ToLower().Contains("nvidia"))
{
// If it's an Nvidia GPU, use VideoProcessor so we don't have to truncate the resulting string.
if (lower)
{
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.Match(GPUName, "(geforce )((.t.? )|(mx ))?\\w*\\d*( ti)?").Value;
}
else
GPUName = obj["VideoProcessor"].ToString();
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;
}
/// <summary>
/// Checks for Battery and assumes a mobile GPU if present.
/// </summary>
/// <returns></returns>
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;
}
/// <summary>
/// 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
/// </summary>
/// <returns></returns>
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"));
}
} }
} }

76
EnvyUpdate/app.manifest Normal file
View file

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC Manifest Options
If you want to change the Windows User Account Control level replace the
requestedExecutionLevel node with one of the following.
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Specifying requestedExecutionLevel element will disable file and registry virtualization.
Remove this element if your application requires this virtualization for backwards
compatibility.
-->
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- A list of the Windows versions that this application has been tested on
and is designed to work with. Uncomment the appropriate elements
and Windows will automatically select the most compatible environment. -->
<!-- Windows Vista -->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
<!-- Windows 7 -->
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
<!-- Windows 8 -->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
<!-- Windows 8.1 -->
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
<!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher
DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need
to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should
also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. -->
<!--
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
-->
<!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
<!--
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
-->
</assembly>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before After
Before After

View file

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Costura.Fody" version="4.1.0" targetFramework="net472" />
<package id="Fody" version="6.0.5" targetFramework="net472" developmentDependency="true" />
<package id="Hardcodet.NotifyIcon.Wpf" version="1.0.8" targetFramework="net472" />
<package id="Notifications.Wpf" version="0.1.1" targetFramework="net472" />
</packages>

View file

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2019 Jakob 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,32 +1,61 @@
# 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 update checker application for Nvidia GPUs A small portable update checker application for Nvidia GPUs
## How to use ## How to use
1. Download the latest release from the [releases page](https://github.com/fyr77/EnvyUpdate/releases) 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.
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 The application itself does not update itself. If you notice any bugs or issues, be sure to check for a new version on GitHub!
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. Enabling Autostart will create a shortcut of EnvyUpdate in the Windows startup folder (shell:startup).
### Virus warnings
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.
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 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.
## Planned features 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.
* Translation support ## Development
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.
If you want to help me develop EnvyUpdate, you can start by creating issues with your bug reports and/or feature requests. Pull requests are also welcome, especially regarding translations.
## Other interesting tools
* [TinyNvidiaUpdateChecker](https://github.com/ElPumpo/TinyNvidiaUpdateChecker) - a command line update checker and installer. Inspired EnvyUpdate to begin with.
* [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 ## 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 (for embedding DLLs into the main executable): [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)
* wpf-notifyicon (for showing an icon in the system tray): [CPOL](https://github.com/hardcodet/wpf-notifyicon/blob/master/LICENSE) * Costura.Fody (for embedding DLLs into the main executable): [MIT](https://github.com/Fody/Costura/blob/develop/LICENSE)
* Notifications.Wpf [MIT](https://github.com/Federerer/Notifications.Wpf/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

BIN
res/banner.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
res/banner_bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View file

@ -1 +1 @@
1.1 9999