private bool WaitForServiceStatus(ServiceController serviceController, ServiceControllerStatus status, Unlimited <EnhancedTimeSpan> maximumWaitTime, bool ignoreFailures, bool sendWatsonReportForHungService) { ExDateTime now = ExDateTime.Now; string serviceName = serviceController.ServiceName; SafeHandle safeHandle = null; try { safeHandle = serviceController.ServiceHandle; } catch (Exception e) { base.WriteVerbose(Strings.ExceptionCannotGetServiceHandle(serviceName, e)); } ExDateTime exDateTime = now; SERVICE_STATUS service_STATUS = default(SERVICE_STATUS); service_STATUS.dwCheckPoint = 0U; service_STATUS.dwWaitHint = 25000U; bool result; try { for (;;) { ExDateTime exDateTime2 = exDateTime; SERVICE_STATUS service_STATUS2 = service_STATUS; exDateTime = ExDateTime.Now; if (safeHandle != null) { if (NativeMethods.QueryServiceStatus(safeHandle, ref service_STATUS) == 0) { base.WriteError(new Win32Exception(Marshal.GetLastWin32Error()), ErrorCategory.InvalidOperation, null); } if ((ulong)service_STATUS.dwCurrentState == (ulong)((long)status)) { break; } if (service_STATUS.dwCheckPoint == service_STATUS2.dwCheckPoint) { this.WriteWarning(Strings.CheckPointNotProgressed(service_STATUS2.dwCheckPoint, service_STATUS.dwCheckPoint)); base.WriteVerbose(Strings.PreviousQueryTime(exDateTime2.ToString())); base.WriteVerbose(Strings.CurrentQueryTime(exDateTime.ToString())); if (exDateTime2.AddMilliseconds(service_STATUS2.dwWaitHint + 600000U) < exDateTime) { goto Block_9; } } else { base.WriteVerbose(Strings.CheckPointProgressed(service_STATUS2.dwCheckPoint, service_STATUS.dwCheckPoint)); } } uint num = (service_STATUS.dwWaitHint == 0U) ? 25000U : service_STATUS.dwWaitHint; try { base.WriteVerbose(Strings.WaitForServiceStatusChange(num, serviceName, status.ToString())); serviceController.WaitForStatus(status, TimeSpan.FromMilliseconds(num)); base.WriteVerbose(Strings.ServiceReachedStatusDuringWait(serviceName, status.ToString())); return(true); } catch (System.ServiceProcess.TimeoutException) { base.WriteVerbose(Strings.ServiceDidNotReachStatusDuringWait(serviceName, status.ToString(), num)); if (!maximumWaitTime.IsUnlimited && now.AddMilliseconds(maximumWaitTime.Value.TotalMilliseconds) < ExDateTime.Now) { if (!ignoreFailures) { if (sendWatsonReportForHungService) { this.SendWatsonReportForHungService(serviceName); } base.WriteError(new ServiceDidNotReachStatusException(serviceName, status.ToString()), ErrorCategory.InvalidOperation, null); } else { this.WriteWarning(Strings.ServiceDidNotReachStatus(serviceName, status.ToString())); } return(false); } } } base.WriteVerbose(Strings.ServiceReachedStatus(serviceName, status.ToString())); return(true); Block_9: if (!ignoreFailures) { if (sendWatsonReportForHungService) { this.SendWatsonReportForHungService(serviceName); } base.WriteError(new ServiceDidNotReachStatusException(serviceName, status.ToString()), ErrorCategory.InvalidOperation, null); } else { this.WriteWarning(Strings.ServiceDidNotReachStatus(serviceName, status.ToString())); } result = false; } finally { if (safeHandle != null) { safeHandle.Close(); } } return(result); }