diff options
Diffstat (limited to 'UsbDkHelper/ServiceManager.cpp')
-rw-r--r-- | UsbDkHelper/ServiceManager.cpp | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/UsbDkHelper/ServiceManager.cpp b/UsbDkHelper/ServiceManager.cpp index 7265464..1145775 100644 --- a/UsbDkHelper/ServiceManager.cpp +++ b/UsbDkHelper/ServiceManager.cpp @@ -47,19 +47,7 @@ void ServiceManager::CreateServiceObject(const tstring &ServiceName, const tstri void ServiceManager::DeleteServiceObject(const tstring &ServiceName) { - assert(m_schSCManager); - - SCMHandleHolder schService(OpenService(m_schSCManager, ServiceName.c_str(), SERVICE_ALL_ACCESS)); - if (!schService) - { - auto err = GetLastError(); - if (err != ERROR_SERVICE_DOES_NOT_EXIST) - { - throw UsbDkServiceManagerFailedException(TEXT("OpenService failed with error "), err); - } - return; - } - + SCMHandleHolder schService(OpenServiceObject(ServiceName)); WaitForServiceStop(schService); if (!DeleteService(schService)) { @@ -67,6 +55,23 @@ void ServiceManager::DeleteServiceObject(const tstring &ServiceName) } } +void ServiceManager::StartServiceObject(const tstring &ServiceName) +{ + SCMHandleHolder schService(OpenServiceObject(ServiceName)); + + if (!StartService(SC_HANDLE(schService), 0, NULL)) + { + throw UsbDkServiceManagerFailedException(TEXT("StartService failed")); + } + return; +} + +void ServiceManager::StopServiceObject(const tstring & ServiceName) +{ + SCMHandleHolder schService(OpenServiceObject(ServiceName)); + WaitForServiceStop(schService); +} + void ServiceManager::WaitForServiceStop(const SCMHandleHolder &schService) { static const DWORD SERVICE_STOP_WAIT_QUANTUM = 50; @@ -86,3 +91,16 @@ void ServiceManager::WaitForServiceStop(const SCMHandleHolder &schService) } } while ((ssp.dwCurrentState != SERVICE_STOPPED) && (iterationNumber++ < SERVICE_STOP_ITERATIONS)); } + +SC_HANDLE ServiceManager::OpenServiceObject(const tstring & ServiceName) +{ + assert(m_schSCManager); + + SC_HANDLE sch = OpenService(m_schSCManager, ServiceName.c_str(), SERVICE_ALL_ACCESS); + if (!sch) + { + auto err = GetLastError(); + throw UsbDkServiceManagerFailedException(TEXT("OpenService failed"), err); + } + return sch; +} |