in SimpleRemoteConsole/ServiceInterop/Service.cs [234:299]
public void RemoveService()
{
var hSCManager = IntPtr.Zero;
var hService = IntPtr.Zero;
try
{
hSCManager = NativeServiceWrapper.OpenSCManagerW(null, null, (uint)SCMPermissions.SC_MANAGER_ALL_ACCESS);
if (hSCManager == IntPtr.Zero)
{
var error = Marshal.GetLastWin32Error();
var errorMsg = "Error when opening SCM: " + error;
if (error == 0x5)
{
errorMsg = "Error when opening SCM: Access Denied. Please try again with administrator privileges.";
}
logger.Error("Remove service failed: " + errorMsg);
throw new Win32Exception(error, errorMsg);
}
hService = NativeServiceWrapper.OpenServiceW(hSCManager, serviceName, (uint)ServicePermissions.SERVICE_DELETE | (uint)ServicePermissions.SERVICE_STOP);
if (hService == IntPtr.Zero)
{
var error = Marshal.GetLastWin32Error();
var errorMsg = "Could not open the service for removal. Error: " + error;
logger.Error("Remove service failed: " + errorMsg);
throw new Win32Exception(error, errorMsg);
}
ServiceStatus status = new ServiceStatus();
if (!NativeServiceWrapper.ControlService(hService, ServiceControls.SERVICE_CONTROL_STOP, ref status))
{
var error = Marshal.GetLastWin32Error();
if (error != (int)ServiceErrorCodes.ERROR_SERVICE_NOT_ACTIVE &&
error != (int)ServiceErrorCodes.ERROR_SERVICE_CANNOT_ACCEPT_CTRL &&
error != (int)ServiceErrorCodes.ERROR_SHUTDOWN_IN_PROGRESS)
{
var errorMsg = "Could not stop the service for removal. Error: " + error;
logger.Error("Remove service failed: " + errorMsg);
throw new Win32Exception(error, errorMsg);
}
}
if (!NativeServiceWrapper.DeleteService(hService))
{
var error = Marshal.GetLastWin32Error();
var errorMsg = "Could not delete the service. Error: " + error;
logger.Error("Remove service failed: " + errorMsg);
throw new Win32Exception(error, errorMsg);
}
}
finally
{
if (hService != IntPtr.Zero)
{
NativeServiceWrapper.CloseServiceHandle(hService);
}
if (hSCManager != IntPtr.Zero)
{
NativeServiceWrapper.CloseServiceHandle(hSCManager);
}
}
}