public bool Delete() { IntPtr manager = AdvApi32.OpenSCManager(null, null, AdvApi32.SC_MANAGER_ACCESS_MASK.SC_MANAGER_ALL_ACCESS); if (manager == IntPtr.Zero) { return(false); } IntPtr service = AdvApi32.OpenService(manager, _id, AdvApi32.SERVICE_ACCESS_MASK.SERVICE_ALL_ACCESS); if (service == IntPtr.Zero) { return(true); } AdvApi32.SERVICE_STATUS status = new AdvApi32.SERVICE_STATUS(); AdvApi32.ControlService(service, AdvApi32.SERVICE_CONTROL.SERVICE_CONTROL_STOP, ref status); AdvApi32.DeleteService(service); AdvApi32.CloseServiceHandle(service); AdvApi32.CloseServiceHandle(manager); return(true); }
public static bool DeleteService(string serviceName) // Marks the specified service for deletion from // the service control manager database { Trace.WriteLine( "Deleting service: \'" + serviceName + "\'" ); IntPtr scManagerHandle = AdvApi32.OpenSCManager( null, null, AdvApi32.SC_MANAGER_ALL_ACCESS ); if (scManagerHandle == IntPtr.Zero) { Win32Error.Set("OpenSCManager"); Trace.WriteLine(Win32Error.GetFullErrMsg()); return(false); } IntPtr serviceHandle = AdvApi32.OpenService( scManagerHandle, serviceName, AdvApi32.DELETE ); if (serviceHandle == IntPtr.Zero) { Win32Error.Set("OpenService"); Trace.WriteLine(Win32Error.GetFullErrMsg()); AdvApi32.CloseServiceHandle(scManagerHandle); return(false); } bool success = AdvApi32.DeleteService(serviceHandle); if (success) { Trace.WriteLine("Service deleted successfully"); } else { Win32Error.Set("DeleteService"); Trace.WriteLine(Win32Error.GetFullErrMsg()); } AdvApi32.CloseServiceHandle(serviceHandle); AdvApi32.CloseServiceHandle(scManagerHandle); return(success); }
public static bool ChangeServiceStartMode( string serviceName, ExpandedServiceStartMode mode) { Trace.WriteLine( "Changing Start Mode of service: \'" + serviceName + "\'" ); IntPtr scManagerHandle = AdvApi32.OpenSCManager( null, null, AdvApi32.SC_MANAGER_ALL_ACCESS ); if (scManagerHandle == IntPtr.Zero) { Trace.WriteLine("Open Service Manager Error"); return(false); } IntPtr serviceHandle = AdvApi32.OpenService( scManagerHandle, serviceName, AdvApi32.SERVICE_QUERY_CONFIG | AdvApi32.SERVICE_CHANGE_CONFIG ); if (serviceHandle == IntPtr.Zero) { Trace.WriteLine("Open Service Error"); return(false); } if (!AdvApi32.ChangeServiceConfig( serviceHandle, AdvApi32.SERVICE_NO_CHANGE, (uint)mode, AdvApi32.SERVICE_NO_CHANGE, null, null, IntPtr.Zero, null, null, null, null)) { Win32Error.Set("ChangeServiceConfig"); Trace.WriteLine(Win32Error.GetFullErrMsg()); return(false); } AdvApi32.CloseServiceHandle(serviceHandle); AdvApi32.CloseServiceHandle(scManagerHandle); Trace.WriteLine( "Start Mode successfully changed to: \'" + mode.ToString() + "\'" ); return(true); }
public bool Install(string path, out string errorMessage) { IntPtr manager = AdvApi32.OpenSCManager(null, null, AdvApi32.SC_MANAGER_ACCESS_MASK.SC_MANAGER_ALL_ACCESS); if (manager == IntPtr.Zero) { errorMessage = "OpenSCManager returned zero."; return(false); } IntPtr service = AdvApi32.CreateService(manager, _id, _id, AdvApi32.SERVICE_ACCESS_MASK.SERVICE_ALL_ACCESS, AdvApi32.SERVICE_TYPE.SERVICE_KERNEL_DRIVER, AdvApi32.SERVICE_START.SERVICE_DEMAND_START, AdvApi32.SERVICE_ERROR.SERVICE_ERROR_NORMAL, path, null, null, null, null, null); if (service == IntPtr.Zero) { if (Marshal.GetHRForLastWin32Error() == Kernel32.ERROR_SERVICE_EXISTS) { errorMessage = "Service already exists"; return(false); } errorMessage = "CreateService returned the error: " + Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()).Message; AdvApi32.CloseServiceHandle(manager); return(false); } if (!AdvApi32.StartService(service, 0, null)) { if (Marshal.GetHRForLastWin32Error() != Kernel32.ERROR_SERVICE_ALREADY_RUNNING) { errorMessage = "StartService returned the error: " + Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()).Message; AdvApi32.CloseServiceHandle(service); AdvApi32.CloseServiceHandle(manager); return(false); } } AdvApi32.CloseServiceHandle(service); AdvApi32.CloseServiceHandle(manager); #if NETFRAMEWORK try { // restrict the driver access to system (SY) and builtin admins (BA) // TODO: replace with a call to IoCreateDeviceSecure in the driver FileSecurity fileSecurity = File.GetAccessControl(@"\\.\" + _id); fileSecurity.SetSecurityDescriptorSddlForm("O:BAG:SYD:(A;;FA;;;SY)(A;;FA;;;BA)"); File.SetAccessControl(@"\\.\" + _id, fileSecurity); } catch { } #endif errorMessage = null; return(true); }