From 144f44abc5471caf9a4f6a3fd6028e13693c22a2 Mon Sep 17 00:00:00 2001 From: Adam Thorn <alt36@cam.ac.uk> Date: Wed, 10 Jun 2020 16:05:53 +0100 Subject: [PATCH] Boilerplate to handle starting/stopping WpkgInstaller service --- WpkgInstaller/WpkgInstaller.cs | 48 ++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/WpkgInstaller/WpkgInstaller.cs b/WpkgInstaller/WpkgInstaller.cs index 644bdac..4f430b2 100755 --- a/WpkgInstaller/WpkgInstaller.cs +++ b/WpkgInstaller/WpkgInstaller.cs @@ -1,17 +1,35 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Diagnostics; -using System.Linq; +using System.Runtime.InteropServices; using System.ServiceProcess; -using System.Text; -using System.Threading.Tasks; namespace WpkgInstaller { + public enum ServiceState + { + SERVICE_STOPPED = 0x00000001, + SERVICE_START_PENDING = 0x00000002, + SERVICE_STOP_PENDING = 0x00000003, + SERVICE_RUNNING = 0x00000004, + SERVICE_CONTINUE_PENDING = 0x00000005, + SERVICE_PAUSE_PENDING = 0x00000006, + SERVICE_PAUSED = 0x00000007, + } + + [StructLayout(LayoutKind.Sequential)] + public struct ServiceStatus + { + public int dwServiceType; + public ServiceState dwCurrentState; + public int dwControlsAccepted; + public int dwWin32ExitCode; + public int dwServiceSpecificExitCode; + public int dwCheckPoint; + public int dwWaitHint; + }; public partial class WpkgInstaller : ServiceBase { + + [DllImport("advapi32.dll", SetLastError = true)] + private static extern bool SetServiceStatus(System.IntPtr handle, ref ServiceStatus serviceStatus); public WpkgInstaller() { InitializeComponent(); @@ -19,10 +37,24 @@ namespace WpkgInstaller protected override void OnStart(string[] args) { + ServiceStatus serviceStatus = new ServiceStatus(); + serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING; + serviceStatus.dwWaitHint = 100000; + SetServiceStatus(this.ServiceHandle, ref serviceStatus); + + serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING; + SetServiceStatus(this.ServiceHandle, ref serviceStatus); } protected override void OnStop() { + ServiceStatus serviceStatus = new ServiceStatus(); + serviceStatus.dwCurrentState = ServiceState.SERVICE_STOP_PENDING; + serviceStatus.dwWaitHint = 100000; + SetServiceStatus(this.ServiceHandle, ref serviceStatus); + + serviceStatus.dwCurrentState = ServiceState.SERVICE_STOPPED; + SetServiceStatus(this.ServiceHandle, ref serviceStatus); } } } -- GitLab