using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Linq; using System.Net; using System.Net.Http; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; using System.Security.AccessControl; using System.ServiceProcess; using System.Text; using System.Text.RegularExpressions; using System.Threading; using amecs.Actions; using Ameliorated.ConsoleUtils; using IWshRuntimeLibrary; using File = System.IO.File; namespace amecs.Extra { public class NVCP { private static readonly string DestinationDir = Environment.ExpandEnvironmentVariables(@"%PROGRAMFILES%\NVIDIA Control Panel"); public static bool Install(string NVCP) => amecs.RunBasicAction("Installing NVIDIA Control Panel", "NVIDIA Control Panel installed successfully", () => { Thread.Sleep(4000); try { foreach (var proc in Process.GetProcessesByName("nvcplui")) proc.Kill(); } catch { } if (Directory.Exists(DestinationDir)) Directory.Delete(DestinationDir, true); Directory.Move(NVCP, DestinationDir); var di = new DirectoryInfo(DestinationDir); var sec = di.GetAccessControl(); sec.AddAccessRule(new FileSystemAccessRule("Administrators", FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)); sec.AddAccessRule(new FileSystemAccessRule("Users", FileSystemRights.ReadAndExecute, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)); di.SetAccessControl(sec); Config(); }); public static bool InstallFromNetwork() { try { foreach (var proc in Process.GetProcessesByName("nvcplui")) proc.Kill(); } catch { } if (Directory.Exists(DestinationDir)) Directory.Delete(DestinationDir, true); var choice = new ChoicePrompt() {Text = "NVIDIA Control Panel must be downloaded\r\nContinue? (Y/N): "}.Start(); if (!choice.HasValue || choice == 1) return false; string link; string filter; string size; ConsoleTUI.OpenFrame.WriteCentered("\r\nFetching download link"); try { using (new ConsoleUtils.LoadingIndicator(true)) { using (HttpClient client = new HttpClient()) { using (HttpResponseMessage response = client.GetAsync("https://git.ameliorated.info/Styris/amecs/src/branch/master/links.txt").Result) { using (HttpContent content = response.Content) { string result = content.ReadAsStringAsync().Result; var line = result.SplitByLine().First(x => x.Contains("NVIDIA-Control-Panel = ")); var split = line.Split('|'); link = split[1]; filter = split[3]; if (link == "REMOVED") throw new Exception("Link is no longer available."); } } var values = new Dictionary { { "type", "url" }, { "url", link }, { "ring", "Retail" } }; var request = new FormUrlEncodedContent(values); using (HttpResponseMessage response = client.PostAsync("https://store.rg-adguard.net/api/GetFiles", request).Result) { using (HttpContent content = response.Content) { string result = content.ReadAsStringAsync().Result; var regex = new Regex($".*{filter}.*"); var match = regex.Match(result).Value; var split = match.Split('"'); link = split[3]; size = split[12].Remove(0, 1).Remove(split[12].Length - 11); if (!size.Contains("MB") && !size.Contains("KB") && !size.Contains("GB")) size = "0 MB"; } } } } } catch (Exception e) { Console.WriteLine(); ConsoleTUI.OpenFrame.Close("Could not fetch link: " + e.Message, ConsoleColor.Red, Console.BackgroundColor, new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "}); return false; } var temp = Environment.ExpandEnvironmentVariables(@"%TEMP%\[amecs]-NVCP-" + new Random().Next(0, 9999) + ".zip"); try { ConsoleTUI.OpenFrame.WriteCenteredLine($"\r\nDownloading NVIDIA Control Panel ({size})"); using (WebClient wc = new WebClient()) { var stdout = GetStdHandle(-11); var maxHashTags = (ConsoleTUI.OpenFrame.DisplayWidth - 5); wc.DownloadProgressChanged += delegate(object sender, DownloadProgressChangedEventArgs e) { var currentHashTags = (int)Math.Ceiling(Math.Min(((double)e.ProgressPercentage / 100) * maxHashTags, maxHashTags)); var spaces = maxHashTags - currentHashTags + (4 - e.ProgressPercentage.ToString().Length); var sb = new StringBuilder(new string('#', currentHashTags) + new string(' ', spaces) + e.ProgressPercentage + "%"); uint throwaway; WriteConsoleOutputCharacter(stdout, sb, (uint)sb.Length, new COORD((short)ConsoleTUI.OpenFrame.DisplayOffset, (short)Console.CursorTop), out throwaway); }; var task = wc.DownloadFileTaskAsync(new Uri(link), temp); task.Wait(); Thread.Sleep(100); var sb = new StringBuilder(new string('#', maxHashTags) + " 100%"); uint throwaway; WriteConsoleOutputCharacter(stdout, sb, (uint)sb.Length, new COORD((short)ConsoleTUI.OpenFrame.DisplayOffset, (short)Console.CursorTop), out throwaway); } Console.WriteLine(); ZipFile.ExtractToDirectory(temp, DestinationDir); if (!File.Exists(Path.Combine(DestinationDir, "nvcplui.exe"))) { try { Directory.Delete(DestinationDir, true);} catch {} Console.WriteLine(); ConsoleTUI.OpenFrame.Close("Download is missing critical executable.", ConsoleColor.Red, Console.BackgroundColor, new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "}); return false; } Config(); } catch (Exception e) { Console.WriteLine(); ConsoleTUI.OpenFrame.Close("Error: " + e.Message.TrimEnd('\n').TrimEnd('\r'), ConsoleColor.Red, Console.BackgroundColor, new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "}); return false; } Console.WriteLine(); ConsoleTUI.OpenFrame.Close("NVIDIA Control Panel installed successfully", ConsoleColor.Green, Console.BackgroundColor, new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "}); return true; } public static bool Uninstall() => amecs.RunBasicAction("Uninstalling NVIDIA Control Panel", "NVIDIA Control Panel uninstalled successfully", () => { var linkPath = Environment.ExpandEnvironmentVariables(@"%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\NVIDIA Control Panel.lnk"); if (File.Exists(linkPath)) File.Delete(linkPath); Directory.Delete(DestinationDir, true); Thread.Sleep(2000); }); public static void Config() { try { new Reg.Value() { KeyName = @"HKLM\System\CurrentControlSet\Services\nvlddmkm\Global\NVTweak", ValueName = "DisableStoreNvCplNotifications", Type = Reg.RegistryValueType.REG_DWORD, Data = 1 }.Apply(); } catch (Exception e) { ConsoleTUI.ShowErrorBox("Could not disable NVIDIA Microsoft Store notification: " + e.ToString(), "Error"); } var linkPath = Environment.ExpandEnvironmentVariables(@"%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\NVIDIA Control Panel.lnk"); if (File.Exists(linkPath)) File.Delete(linkPath); try { IShellLink link = (IShellLink)new ShellLink(); link.SetDescription("NVIDIA Control Panel"); link.SetPath(Path.Combine(DestinationDir, "nvcplui.exe")); IPersistFile file = (IPersistFile)link; file.Save(linkPath, false); } catch { WshShell shell = new WshShell(); IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(linkPath); shortcut.Description = "NVIDIA Control Panel"; shortcut.TargetPath = Path.Combine(DestinationDir, "nvcplui.exe"); shortcut.Save(); } new Reg.Value() { KeyName = @"HKLM\SYSTEM\CurrentControlSet\Services\NVDisplay.ContainerLocalSystem", ValueName = "Start", Type = Reg.RegistryValueType.REG_DWORD, Data = 2 }.Apply(); try { ServiceController.GetServices().First(x => x.ServiceName.Equals("NVDisplay.ContainerLocalSystem")).Start(); } catch (Exception e) { } } [DllImport("kernel32.dll", SetLastError = true)] internal static extern bool WriteConsoleOutputCharacter(IntPtr hConsoleOutput, StringBuilder lpCharacter, uint nLength, COORD dwWriteCoord, out uint lpNumberOfCharsWritten); [DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr GetStdHandle(int nStdHandle); [StructLayout(LayoutKind.Sequential)] public struct COORD { public short X; public short Y; public COORD(short X, short Y) { this.X = X; this.Y = Y; } }; } [ComImport] [Guid("00021401-0000-0000-C000-000000000046")] internal class ShellLink { } [ComImport] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("000214F9-0000-0000-C000-000000000046")] internal interface IShellLink { void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out IntPtr pfd, int fFlags); void GetIDList(out IntPtr ppidl); void SetIDList(IntPtr pidl); void GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName); void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName); void GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath); void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir); void GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath); void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs); void GetHotkey(out short pwHotkey); void SetHotkey(short wHotkey); void GetShowCmd(out int piShowCmd); void SetShowCmd(int iShowCmd); void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, int cchIconPath, out int piIcon); void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon); void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved); void Resolve(IntPtr hwnd, int fFlags); void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile); } }