private static void Stop(IntPtr hService) { var status = new WinApi.ServiceStatus(); _ = WinApi.NativeMethods.ControlService(hService, WinApi.ServiceControlOptions.Stop, status); WaitForStatus(hService, WinApi.ServiceStateTypes.StopPending, WinApi.ServiceStateTypes.Stopped); }
private static ServiceState GetStatus(IntPtr hService) { var ssStatus = new WinApi.ServiceStatus(); try { if (WinApi.NativeMethods.QueryServiceStatus(hService, ssStatus) == 0) { throw new OperationCanceledException(ExceptionMessages.ServiceStatusQueryFailed); } } catch (Exception ex) when(ex.IsCaught()) { Log.Write(ex); } return((ServiceState)ssStatus.dwCurrentState); }
private static void WaitForStatus(IntPtr hService, WinApi.ServiceStateTypes waitStatus, WinApi.ServiceStateTypes desiredStatus) { var status = new WinApi.ServiceStatus(); try { _ = WinApi.NativeMethods.QueryServiceStatus(hService, status); if (status.dwCurrentState == desiredStatus) { return; } var dwStartTickCount = Environment.TickCount; var dwOldCheckPoint = status.dwCheckPoint; while (status.dwCurrentState == waitStatus) { var dwWaitTime = status.dwWaitHint / 10; dwWaitTime = dwWaitTime < 1000 ? 1000 : dwWaitTime > 10000 ? 10000 : dwWaitTime; Thread.Sleep(dwWaitTime); if (WinApi.NativeMethods.QueryServiceStatus(hService, status) == 0) { break; } if (status.dwCheckPoint > dwOldCheckPoint) { dwStartTickCount = Environment.TickCount; dwOldCheckPoint = status.dwCheckPoint; } else { if (Environment.TickCount - dwStartTickCount > status.dwWaitHint) { break; } } } } catch (Exception ex) when(ex.IsCaught()) { Log.Write(ex); } }