From 41796d61cf10ba4ab6161732c6eaa9494da30823 Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Wed, 9 Mar 2016 19:17:55 +0100 Subject: [PATCH] Implemented admin rights. --- Artemis/Artemis/App.xaml.cs | 34 ++++++++ Artemis/Artemis/Artemis.csproj | 3 + Artemis/Artemis/ArtemisBootstrapper.cs | 8 +- .../KeyboardProviders/Logitech/Orion.cs | 6 +- Artemis/Artemis/Properties/AssemblyInfo.cs | 6 +- .../Artemis/Properties/Resources.Designer.cs | 10 +++ Artemis/Artemis/Properties/Resources.resx | 3 + Artemis/Artemis/Resources/LogitechLED.dll | Bin 0 -> 67584 bytes .../Utilities/LogitechDll/DllManager.cs | 79 ++++++++++++++++++ 9 files changed, 140 insertions(+), 9 deletions(-) create mode 100644 Artemis/Artemis/Resources/LogitechLED.dll create mode 100644 Artemis/Artemis/Utilities/LogitechDll/DllManager.cs diff --git a/Artemis/Artemis/App.xaml.cs b/Artemis/Artemis/App.xaml.cs index 29b2f9489..4dc135af8 100644 --- a/Artemis/Artemis/App.xaml.cs +++ b/Artemis/Artemis/App.xaml.cs @@ -1,4 +1,7 @@ using System; +using System.Diagnostics; +using System.Reflection; +using System.Security.Principal; using System.Windows; using System.Windows.Threading; using WpfExceptionViewer; @@ -12,11 +15,42 @@ namespace Artemis { public App() { + if (!IsRunAsAdministrator()) + { + var processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase); + + // The following properties run the new process as administrator + processInfo.UseShellExecute = true; + processInfo.Verb = "runas"; + + // Start the new process + try + { + Process.Start(processInfo); + } + catch (Exception) + { + // The user did not allow the application to run as administrator + MessageBox.Show("Sorry, this application must be run as Administrator."); + } + + // Shut down the current process + Environment.Exit(0); + } + InitializeComponent(); } public bool DoHandle { get; set; } + private bool IsRunAsAdministrator() + { + var wi = WindowsIdentity.GetCurrent(); + var wp = new WindowsPrincipal(wi); + + return wp.IsInRole(WindowsBuiltInRole.Administrator); + } + private void Application_Startup(object sender, StartupEventArgs e) { AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj index 16aba318b..7962bd8fc 100644 --- a/Artemis/Artemis/Artemis.csproj +++ b/Artemis/Artemis/Artemis.csproj @@ -118,6 +118,7 @@ MinimumRecommendedRules.ruleset true + ..\packages\Autofac.4.0.0-rc1-177\lib\net45\Autofac.dll @@ -344,6 +345,7 @@ + @@ -463,6 +465,7 @@ + diff --git a/Artemis/Artemis/ArtemisBootstrapper.cs b/Artemis/Artemis/ArtemisBootstrapper.cs index e6f178e51..934a41e27 100644 --- a/Artemis/Artemis/ArtemisBootstrapper.cs +++ b/Artemis/Artemis/ArtemisBootstrapper.cs @@ -1,11 +1,14 @@ -using System.Diagnostics; +using System; +using System.Diagnostics; using System.Linq; using System.Windows; using System.Windows.Forms; +using Artemis.Utilities.LogitechDll; using Artemis.ViewModels; using Autofac; using Caliburn.Micro; using Caliburn.Micro.Autofac; +using Microsoft.Win32; using Application = System.Windows.Application; using MessageBox = System.Windows.Forms.MessageBox; @@ -15,7 +18,8 @@ namespace Artemis { public ArtemisBootstrapper() { - CheckDuplicateInstances(); + //CheckDuplicateInstances(); + DllManager.RestoreDll(); Initialize(); } diff --git a/Artemis/Artemis/KeyboardProviders/Logitech/Orion.cs b/Artemis/Artemis/KeyboardProviders/Logitech/Orion.cs index 3bd6fdb74..ffdf2bba0 100644 --- a/Artemis/Artemis/KeyboardProviders/Logitech/Orion.cs +++ b/Artemis/Artemis/KeyboardProviders/Logitech/Orion.cs @@ -10,9 +10,9 @@ namespace Artemis.KeyboardProviders.Logitech public Orion() { Name = "Logitech G910 RGB"; - CantEnableText = "Couldn't connect to your Logitech G910.\n " + + CantEnableText = "Couldn't connect to your Logitech G910.\n" + "Please check your cables and updating the Logitech Gaming Software\n" + - "A minimum version of 8.81.15 is required).\n\n " + + "A minimum version of 8.81.15 is required).\n\n" + "If needed, you can select a different keyboard in Artemis under settings."; Height = 6; Width = 21; @@ -24,9 +24,7 @@ namespace Artemis.KeyboardProviders.Logitech int majorNum = 0, minorNum = 0, buildNum = 0; LogitechGSDK.LogiLedInit(); - LogitechGSDK.LogiLedSetLightingForKeyWithKeyName(KeyboardNames.A, 100, 100, 100); LogitechGSDK.LogiLedGetSdkVersion(ref majorNum, ref minorNum, ref buildNum); - LogitechGSDK.LogiLedRestoreLighting(); LogitechGSDK.LogiLedShutdown(); // Turn it into one long number... diff --git a/Artemis/Artemis/Properties/AssemblyInfo.cs b/Artemis/Artemis/Properties/AssemblyInfo.cs index e40d120b9..9ae859273 100644 --- a/Artemis/Artemis/Properties/AssemblyInfo.cs +++ b/Artemis/Artemis/Properties/AssemblyInfo.cs @@ -7,11 +7,11 @@ using System.Windows; // associated with an assembly. [assembly: AssemblyTitle("Artemis")] -[assembly: AssemblyDescription("")] +[assembly: AssemblyDescription("Adds third-party support for RGB keyboards to games")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] +[assembly: AssemblyCompany("Artemis developers")] [assembly: AssemblyProduct("Artemis")] -[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyCopyright("Copyright © 2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/Artemis/Artemis/Properties/Resources.Designer.cs b/Artemis/Artemis/Properties/Resources.Designer.cs index 1d5940ce5..11d05e356 100644 --- a/Artemis/Artemis/Properties/Resources.Designer.cs +++ b/Artemis/Artemis/Properties/Resources.Designer.cs @@ -113,6 +113,16 @@ namespace Artemis.Properties { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + internal static byte[] LogitechLED { + get { + object obj = ResourceManager.GetObject("LogitechLED", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// diff --git a/Artemis/Artemis/Properties/Resources.resx b/Artemis/Artemis/Properties/Resources.resx index 1fa4c4c83..e1b6a705c 100644 --- a/Artemis/Artemis/Properties/Resources.resx +++ b/Artemis/Artemis/Properties/Resources.resx @@ -127,6 +127,9 @@ ..\resources\counterstrike\gamestateconfiguration.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + ..\Resources\LogitechLED.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + ..\Resources\logo.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/Artemis/Artemis/Resources/LogitechLED.dll b/Artemis/Artemis/Resources/LogitechLED.dll new file mode 100644 index 0000000000000000000000000000000000000000..9ecba3c771007852803d73dddedcbd6a01a4d5fd GIT binary patch literal 67584 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 literal 0 HcmV?d00001 diff --git a/Artemis/Artemis/Utilities/LogitechDll/DllManager.cs b/Artemis/Artemis/Utilities/LogitechDll/DllManager.cs new file mode 100644 index 000000000..af0782908 --- /dev/null +++ b/Artemis/Artemis/Utilities/LogitechDll/DllManager.cs @@ -0,0 +1,79 @@ +using System.IO; +using Artemis.Properties; +using Microsoft.Win32; + +namespace Artemis.Utilities.LogitechDll +{ + internal static class DllManager + { + public static void RestoreDll() + { + if (!BackupAvailable()) + return; + + // Get rid of our own DLL + File.Delete(@"C:\Program Files\Logitech Gaming Software\SDK\LED\x64\LogitechLed.dll"); + // Restore the backup + File.Move(@"C:\Program Files\Logitech Gaming Software\SDK\LED\x64\LogitechLed.dll.bak", + @"C:\Program Files\Logitech Gaming Software\SDK\LED\x64\LogitechLed.dll"); + } + + public static void PlaceDll() + { + if (DllPlaced()) + return; + + // Create directory structure, just in case + Directory.CreateDirectory(@"C:\Program Files\Logitech Gaming Software\SDK\LED\x64"); + + // Remove old backups if they are there + if (BackupAvailable()) + File.Delete(@"C:\Program Files\Logitech Gaming Software\SDK\LED\x64\LogitechLed.dll.bak"); + + // Backup the existing DLL + if (File.Exists(@"C:\Program Files\Logitech Gaming Software\SDK\LED\x64\LogitechLed.dll")) + File.Move(@"C:\Program Files\Logitech Gaming Software\SDK\LED\x64\LogitechLed.dll", + @"C:\Program Files\Logitech Gaming Software\SDK\LED\x64\LogitechLed.dll.bak"); + + // Copy our own DLL in place + File.WriteAllBytes(@"C:\Program Files\Logitech Gaming Software\SDK\LED\x64\LogitechLED.dll", + Resources.LogitechLED); + + // If the user doesn't have a Logitech device, the CLSID will be missing + // and we should create it ourselves. + if (!RegistryKeyPlaced()) + PlaceRegistryKey(); + } + + public static bool DllPlaced() + { + if (!Directory.Exists(@"C:\Program Files\Logitech Gaming Software\SDK\LED\x64")) + return false; + if (!RegistryKeyPlaced()) + return false; + + return File.Exists(@"C:\Program Files\Logitech Gaming Software\SDK\LED\x64\LogitechLed.dll"); + } + + private static bool BackupAvailable() + { + return File.Exists(@"C:\Program Files\Logitech Gaming Software\SDK\LED\x64\LogitechLed.dll.bak"); + } + + private static bool RegistryKeyPlaced() + { + var key = Registry + .LocalMachine.OpenSubKey( + @"SOFTWARE\Classes\CLSID\{a6519e67-7632-4375-afdf-caa889744403}\ServerBinary"); + return key != null; + } + + private static void PlaceRegistryKey() + { + var key = Registry + .LocalMachine.OpenSubKey( + @"SOFTWARE\Classes\CLSID\{a6519e67-7632-4375-afdf-caa889744403}\ServerBinary", true); + key?.SetValue(null, @"C:\Program Files\Logitech Gaming Software\SDK\LED\x64\LogitechLed.dll"); + } + } +} \ No newline at end of file