public static int QueryDriverStatus(string name, bool isKernelDriverService = false) { Logger.Info("{0} {1}", (object)MethodBase.GetCurrentMethod().Name, (object)name); IntPtr num1 = ServiceManager.OpenSCManager(ServiceManager.ServiceManagerRights.Connect); IntPtr num2 = IntPtr.Zero; try { num2 = ServiceManager.OpenService(num1, name, ServiceManager.ServiceRights.QueryStatus | ServiceManager.ServiceRights.Stop); if (num2 == IntPtr.Zero) { Logger.Info("service handle not created"); return(-1); } ServiceManager.SERVICE_STATUS lpServiceStatus = new ServiceManager.SERVICE_STATUS(isKernelDriverService); if (ServiceManager.QueryServiceStatus(num2, lpServiceStatus) != 0) { Logger.Info("current service state is: {0} for service: {1}", (object)lpServiceStatus.dwCurrentState, (object)name); return((int)lpServiceStatus.dwCurrentState); } Logger.Info("Error in getting service status.." + Marshal.GetLastWin32Error().ToString()); return(-1); } catch (Exception ex) { Logger.Error("Error in querying driver status err: " + ex.ToString()); return(-1); } finally { ServiceManager.CloseServiceHandle(num2); ServiceManager.CloseServiceHandle(num1); } }
private static void StopService(IntPtr hService, bool isKernelDriverService = false) { Logger.Info("{0} {1}", (object)MethodBase.GetCurrentMethod().Name, (object)Convert.ToString((object)hService, (IFormatProvider)CultureInfo.InvariantCulture)); ServiceManager.SERVICE_STATUS serviceStatus = new ServiceManager.SERVICE_STATUS(isKernelDriverService); ServiceManager.ControlService(hService, ServiceManager.ServiceControl.Stop, serviceStatus); ServiceManager.WaitForServiceStatus(hService, ServiceManager.ServiceState.StopPending, ServiceManager.ServiceState.Stopped, serviceStatus); }
private static void StartService(IntPtr hService, bool isKernelDriverService = false) { Logger.Info("{0} {1}", (object)MethodBase.GetCurrentMethod().Name, (object)Convert.ToString((object)hService, (IFormatProvider)CultureInfo.InvariantCulture)); int num = ServiceManager.StartService(hService, 0, 0); if (num == 0) { int lastWin32Error = Marshal.GetLastWin32Error(); Logger.Warning("Error in starting service, StartService ret: {0}, Last win32 error: {1}", (object)num, (object)lastWin32Error); } ServiceManager.SERVICE_STATUS ssStatus = new ServiceManager.SERVICE_STATUS(isKernelDriverService); ServiceManager.WaitForServiceStatus(hService, ServiceManager.ServiceState.StartPending, ServiceManager.ServiceState.Running, ssStatus); }
private static bool WaitForServiceStatus( IntPtr hService, ServiceManager.ServiceState waitStatus, ServiceManager.ServiceState desiredStatus, ServiceManager.SERVICE_STATUS ssStatus) { ServiceManager.QueryServiceStatus(hService, ssStatus); if (ssStatus.dwCurrentState == desiredStatus) { return(true); } int tickCount = Environment.TickCount; int dwCheckPoint = ssStatus.dwCheckPoint; while (ssStatus.dwCurrentState == waitStatus) { int millisecondsTimeout = ssStatus.dwWaitHint / 10; if (millisecondsTimeout < 1000) { millisecondsTimeout = 1000; } else if (millisecondsTimeout > 10000) { millisecondsTimeout = 10000; } Thread.Sleep(millisecondsTimeout); if (ServiceManager.QueryServiceStatus(hService, ssStatus) != 0) { if (ssStatus.dwCheckPoint > dwCheckPoint) { tickCount = Environment.TickCount; dwCheckPoint = ssStatus.dwCheckPoint; } else if (Environment.TickCount - tickCount > ssStatus.dwWaitHint) { break; } } else { break; } } return(ssStatus.dwCurrentState == desiredStatus); }
private static extern int ControlService( IntPtr hService, ServiceManager.ServiceControl dwControl, ServiceManager.SERVICE_STATUS lpServiceStatus);
private static extern int QueryServiceStatus( IntPtr hService, ServiceManager.SERVICE_STATUS lpServiceStatus);