Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
            }
        }