|
|
- 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<string, string>
- {
- { "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);
- }
- }
|