diff --git a/src/WinSW.Core/Util/ProcessHelper.cs b/src/WinSW.Core/Util/ProcessHelper.cs index 28fbb37..47cbc53 100644 --- a/src/WinSW.Core/Util/ProcessHelper.cs +++ b/src/WinSW.Core/Util/ProcessHelper.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using System.Management; using System.Threading; using log4net; +using WinSW.Native; namespace WinSW.Util { @@ -168,7 +169,19 @@ namespace WinSW.Util } } - processToStart.Start(); + bool succeeded = ConsoleApis.SetConsoleCtrlHandler(null, false); // inherited + Debug.Assert(succeeded); + + try + { + processToStart.Start(); + } + finally + { + succeeded = ConsoleApis.SetConsoleCtrlHandler(null, true); + Debug.Assert(succeeded); + } + Logger.Info("Started process " + processToStart.Id); if (priority != null) diff --git a/src/WinSW.Core/Util/SignalHelper.cs b/src/WinSW.Core/Util/SignalHelper.cs index 7be1bfb..66a3350 100644 --- a/src/WinSW.Core/Util/SignalHelper.cs +++ b/src/WinSW.Core/Util/SignalHelper.cs @@ -29,9 +29,10 @@ namespace WinSW.Util return new KeyValuePair(false, error == Errors.ERROR_INVALID_PARAMETER); } - _ = ConsoleApis.SetConsoleCtrlHandler(null, true); + // Don't call GenerateConsoleCtrlEvent immediately after SetConsoleCtrlHandler. + // A delay was observed as of Windows 10, version 2004 and Windows Server 2019. _ = ConsoleApis.GenerateConsoleCtrlEvent(ConsoleApis.CtrlEvents.CTRL_C_EVENT, 0); - _ = ConsoleApis.SetConsoleCtrlHandler(null, false); + bool succeeded = ConsoleApis.FreeConsole(); Debug.Assert(succeeded); diff --git a/src/WinSW/WrapperService.cs b/src/WinSW/WrapperService.cs index 04ba60d..6641e20 100644 --- a/src/WinSW/WrapperService.cs +++ b/src/WinSW/WrapperService.cs @@ -182,6 +182,9 @@ namespace WinSW protected override void OnStart(string[] args) { + bool succeeded = ConsoleApis.SetConsoleCtrlHandler(null, true); + Debug.Assert(succeeded); + this.envs = this.descriptor.EnvironmentVariables; // TODO: Disabled according to security concerns in https://github.com/kohsuke/winsw/issues/54