namespace RadeonResetBugFixService { using System.ComponentModel; using System.Configuration.Install; using System.Linq; using System.Management; using Microsoft.Win32; [RunInstaller(true)] public partial class ProjectInstaller : System.Configuration.Install.Installer { public ProjectInstaller() { InitializeComponent(); } private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e) { ManagementObject wmiService = null; ManagementBaseObject InParam = null; try { wmiService = new ManagementObject($"Win32_Service.Name='{this.serviceInstaller1.ServiceName}'"); InParam = wmiService.GetMethodParameters("Change"); InParam["DesktopInteract"] = true; wmiService.InvokeMethod("Change", InParam, null); } finally { if (InParam != null) InParam.Dispose(); if (wmiService != null) wmiService.Dispose(); } ThirdParty.ServicePreshutdownHelpers.ServicePreshutdownHelpers.SetPreShutdownTimeOut(this.serviceInstaller1.ServiceName, (uint)Constants.ServiceTimeout.TotalMilliseconds); var preshutdownOrder = GetPreshutdownOrder(); if (!preshutdownOrder.Contains(this.serviceInstaller1.ServiceName)) { SetPreshutdownOrder(new[] { this.serviceInstaller1.ServiceName }.Concat(preshutdownOrder).ToArray()); } } private void serviceInstaller1_AfterUninstall(object sender, InstallEventArgs e) { var preshutdownOrder = GetPreshutdownOrder(); if (preshutdownOrder.Contains(this.serviceInstaller1.ServiceName)) { SetPreshutdownOrder(preshutdownOrder.Where((name) => name != this.serviceInstaller1.ServiceName).ToArray()); } } private void serviceProcessInstaller1_AfterInstall(object sender, InstallEventArgs e) { } private string[] GetPreshutdownOrder() { return (string[])Registry.GetValue(Constants.RegistryKeySystemControl, "PreshutdownOrder", new string[0]); } private void SetPreshutdownOrder(string[] data) { Registry.SetValue(Constants.RegistryKeySystemControl, "PreshutdownOrder", data, RegistryValueKind.MultiString); } } }