diff --git a/RadeonResetBugFixService/Constants.cs b/RadeonResetBugFixService/Constants.cs index 3402328..5efba3b 100644 --- a/RadeonResetBugFixService/Constants.cs +++ b/RadeonResetBugFixService/Constants.cs @@ -6,6 +6,8 @@ { public static TimeSpan ServiceTimeout { get; } = TimeSpan.FromMinutes(5); - public static string BasicDisplayRegistryKey { get; } = @"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BasicDisplay"; + public static string RegistryKeyBasicDisplay { get; } = @"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BasicDisplay"; + + public static string RegistryKeySystemControl { get; } = @"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control"; } } diff --git a/RadeonResetBugFixService/MainHandler.cs b/RadeonResetBugFixService/MainHandler.cs index d8eb37a..95f6a40 100644 --- a/RadeonResetBugFixService/MainHandler.cs +++ b/RadeonResetBugFixService/MainHandler.cs @@ -51,8 +51,8 @@ { new EnableBasicDisplayStartupTask(), new SleepTask(TimeSpan.FromSeconds(20)), - new DisableVirtualVideoTask(this.StartupDevicesStatus), new EnableAmdVideoTask(this.StartupDevicesStatus), + new DisableVirtualVideoTask(this.StartupDevicesStatus), new SleepTask(TimeSpan.FromSeconds(40)), new FixMonitorTask(), new DisableVirtualVideoTask(this.StartupDevicesStatus), @@ -84,12 +84,11 @@ new ITask[] { new StopAudioServiceTask(), - new SleepTask(TimeSpan.FromSeconds(15)), - new DisableAmdVideoTask(this.ShutdownDevicesStatus), new EnableVirtualVideoTask(this.ShutdownDevicesStatus), + new DisableAmdVideoTask(this.ShutdownDevicesStatus), new LastResortDevicesRestoreTask(this.StartupDevicesStatus), new LastResortDevicesRestoreTask(this.StartupDevicesStatus), // just in case - new DisableBasicDisplayStartupTask(), + new DisableBasicDisplayStartupTask(this.StartupDevicesStatus), }); } } diff --git a/RadeonResetBugFixService/ProjectInstaller.Designer.cs b/RadeonResetBugFixService/ProjectInstaller.Designer.cs index 16bec57..072a5ce 100644 --- a/RadeonResetBugFixService/ProjectInstaller.Designer.cs +++ b/RadeonResetBugFixService/ProjectInstaller.Designer.cs @@ -45,6 +45,7 @@ this.serviceInstaller1.ServiceName = "RadeonResetBugFixService"; this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic; this.serviceInstaller1.AfterInstall += new System.Configuration.Install.InstallEventHandler(this.serviceInstaller1_AfterInstall); + this.serviceInstaller1.AfterUninstall += new System.Configuration.Install.InstallEventHandler(this.serviceInstaller1_AfterUninstall); // // ProjectInstaller // diff --git a/RadeonResetBugFixService/ProjectInstaller.cs b/RadeonResetBugFixService/ProjectInstaller.cs index f29c0d2..355f705 100644 --- a/RadeonResetBugFixService/ProjectInstaller.cs +++ b/RadeonResetBugFixService/ProjectInstaller.cs @@ -2,7 +2,9 @@ { 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 @@ -32,11 +34,36 @@ } 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); + } } } diff --git a/RadeonResetBugFixService/Tasks/DisableBasicDisplayStartupTask.cs b/RadeonResetBugFixService/Tasks/DisableBasicDisplayStartupTask.cs index 6953bd1..898ae94 100644 --- a/RadeonResetBugFixService/Tasks/DisableBasicDisplayStartupTask.cs +++ b/RadeonResetBugFixService/Tasks/DisableBasicDisplayStartupTask.cs @@ -1,17 +1,41 @@ namespace RadeonResetBugFixService.Tasks { + using System; using Microsoft.Win32; using Contracts; + using Devices; class DisableBasicDisplayStartupTask : ITask { string ITask.TaskName => "Disabling basic display automatic start"; + private DevicesStatus StartupDevicesStatus { get; } + + public DisableBasicDisplayStartupTask(DevicesStatus startupDevicesStatus) + { + if (startupDevicesStatus == null) + { + throw new ArgumentNullException(nameof(startupDevicesStatus)); + } + + this.StartupDevicesStatus = startupDevicesStatus; + } + void ITask.Run(ILogger logger) { - var originalValue = Registry.GetValue(Constants.BasicDisplayRegistryKey, "Start", -1); - logger.Log($"Original start value {originalValue}"); - Registry.SetValue(Constants.BasicDisplayRegistryKey, "Start", 4); + foreach (var device in this.StartupDevicesStatus.DisabledDevices) + { + logger.Log($"Processing {device.Description}; should be enabled"); + var disabledStatus = DeviceHelper.IsDeviceCurrentlyDisabled(device); + + if (disabledStatus.HasValue && !disabledStatus.Value) + { + logger.Log($"Device is enabled; disabling BasicDisplay service"); + var originalValue = Registry.GetValue(Constants.RegistryKeyBasicDisplay, "Start", -1); + logger.Log($"Original start value {originalValue}"); + Registry.SetValue(Constants.RegistryKeyBasicDisplay, "Start", 4); + } + } } } } diff --git a/RadeonResetBugFixService/Tasks/EnableBasicDisplayStartupTask.cs b/RadeonResetBugFixService/Tasks/EnableBasicDisplayStartupTask.cs index b3b3809..e9226ed 100644 --- a/RadeonResetBugFixService/Tasks/EnableBasicDisplayStartupTask.cs +++ b/RadeonResetBugFixService/Tasks/EnableBasicDisplayStartupTask.cs @@ -9,9 +9,9 @@ void ITask.Run(ILogger logger) { - var originalValue = Registry.GetValue(Constants.BasicDisplayRegistryKey, "Start", -1); + var originalValue = Registry.GetValue(Constants.RegistryKeyBasicDisplay, "Start", -1); logger.Log($"Original start value {originalValue}"); - Registry.SetValue(Constants.BasicDisplayRegistryKey, "Start", 3); + Registry.SetValue(Constants.RegistryKeyBasicDisplay, "Start", 3); } } } diff --git a/RadeonResetBugFixService/Tasks/LastResortDevicesRestoreTask.cs b/RadeonResetBugFixService/Tasks/LastResortDevicesRestoreTask.cs index 41be2e6..4bd553d 100644 --- a/RadeonResetBugFixService/Tasks/LastResortDevicesRestoreTask.cs +++ b/RadeonResetBugFixService/Tasks/LastResortDevicesRestoreTask.cs @@ -22,9 +22,9 @@ void ITask.Run(ILogger logger) { - foreach (var device in this.StartupDevicesStatus.EnabledDevices) + foreach (var device in this.StartupDevicesStatus.DisabledDevices) { - logger.Log($"Processing {device.Description}; should be disabled"); + logger.Log($"Processing {device.Description}; should be enabled"); try { var disabledStatus = DeviceHelper.IsDeviceCurrentlyDisabled(device); @@ -32,19 +32,18 @@ { logger.Log("Device not present"); } - else if (!disabledStatus.Value) + else if (disabledStatus.Value) { - logger.Log("Device enabled; attempting to disable..."); - DeviceHelper.DisableDevice(device); - logger.Log("Disabled device; checking status..."); + logger.Log("Device disabled; attempting to enable..."); + DeviceHelper.EnableDevice(device); + logger.Log("Enabled device; checking status..."); var newStatus = DeviceHelper.IsDeviceCurrentlyDisabled(device); if (!newStatus.HasValue) { logger.LogError("Device not present"); - } - else if (!newStatus.Value) + } else if (newStatus.Value) { - logger.LogError("Device is enabled but should be disabled"); + logger.LogError("Device is disabled but should be enabled"); } else { @@ -53,7 +52,7 @@ } else { - logger.Log("Device is disabled"); + logger.Log("Device is enabled"); } } catch (Exception e) @@ -62,9 +61,9 @@ } } - foreach (var device in this.StartupDevicesStatus.DisabledDevices) + foreach (var device in this.StartupDevicesStatus.EnabledDevices) { - logger.Log($"Processing {device.Description}; should be enabled"); + logger.Log($"Processing {device.Description}; should be disabled"); try { var disabledStatus = DeviceHelper.IsDeviceCurrentlyDisabled(device); @@ -72,18 +71,19 @@ { logger.Log("Device not present"); } - else if (disabledStatus.Value) + else if (!disabledStatus.Value) { - logger.Log("Device disabled; attempting to enable..."); - DeviceHelper.EnableDevice(device); - logger.Log("Enabled device; checking status..."); + logger.Log("Device enabled; attempting to disable..."); + DeviceHelper.DisableDevice(device); + logger.Log("Disabled device; checking status..."); var newStatus = DeviceHelper.IsDeviceCurrentlyDisabled(device); if (!newStatus.HasValue) { logger.LogError("Device not present"); - } else if (newStatus.Value) + } + else if (!newStatus.Value) { - logger.LogError("Device is disabled but should be enabled"); + logger.LogError("Device is enabled but should be disabled"); } else { @@ -92,7 +92,7 @@ } else { - logger.Log("Device is enabled"); + logger.Log("Device is disabled"); } } catch (Exception e)