Files
Work/watchdog/ServiceControlManager.cpp
2024-08-07 09:16:27 -04:00

107 lines
3.7 KiB
C++

#include <watchdog/ServiceControlManager.hpp>
bool ServiceControlManager::startService(const String &serviceName,Block<String> &serviceArgs)
{
char **pArgs=(char**)0;
DWORD access=0;
bool retCode=false;
if(!isOkay())return false;
ServiceHandle serviceHandle;
serviceHandle.setHandle(::OpenService(mServiceHandle.getHandle(),serviceName,
SERVICE_PAUSE_CONTINUE|SERVICE_START|SERVICE_STOP),ServiceHandle::Delete);
if(!serviceHandle.isOkay())
{
mLastError=::GetLastError();
return retCode;
}
pArgs=new (char*[serviceArgs.size()]);
for(int index=0;index<serviceArgs.size();index++)
{
pArgs[index]=serviceArgs[index].str();
}
retCode=::StartService(serviceHandle.getHandle(),serviceArgs.size(),(const char**)pArgs);
if(!retCode)mLastError=::GetLastError();
return retCode;
}
bool ServiceControlManager::createService(CreateServiceParams &csp,ServiceHandle &serviceHandle)
{
Array<char> dependencies;
if(!isOkay())return false;
csp.getNullSeparatedDependencies(dependencies);
serviceHandle.setHandle(::CreateService(mServiceHandle.getHandle(),csp.getServiceName().str(),
csp.getDisplayName().str(),csp.getDesiredAccess(),csp.getServiceType(),
csp.getStartType(),csp.getErrorControl(),csp.getBinaryPathName().str(),
csp.getLoadOrderGroup().isNull()?(char*)0:csp.getLoadOrderGroup().str(),
0,dependencies.size()?&dependencies[0]:0,
csp.getServiceStartName().isNull()?(char*)0:csp.getServiceStartName().str(),
csp.getPassword().isNull()?(char*)0:csp.getPassword().str()),ServiceHandle::Delete);
if(!serviceHandle.isOkay())mLastError=::GetLastError();
return serviceHandle.isOkay();
}
bool ServiceControlManager::deleteService(const String &serviceName)
{
bool retCode=false;
if(!isOkay())return retCode;
ServiceHandle serviceHandle;
serviceHandle.setHandle(::OpenService(mServiceHandle.getHandle(),serviceName,DELETE),ServiceHandle::Delete);
if(!serviceHandle.isOkay())
{
mLastError=::GetLastError();
return retCode;
}
retCode=::DeleteService(serviceHandle.getHandle())?true:false;
if(!retCode)mLastError=::GetLastError();
return retCode;
}
String ServiceControlManager::getLastErrorCode(void)const
{
switch(mLastError)
{
case ERROR_ACCESS_DENIED :
return "ERROR_ACCESS_DENIED";
case ERROR_CIRCULAR_DEPENDENCY :
return "ERROR_CIRCULAR_DEPENDENCY";
case ERROR_DUP_NAME :
return "ERROR_DUP_NAME";
case ERROR_INVALID_HANDLE :
return "ERROR_INVALID_HANDLE";
case ERROR_INVALID_NAME :
return "ERROR_INVALID_NAME";
case ERROR_INVALID_PARAMETER :
return "ERROR_INVALID_PARAMETER";
case ERROR_INVALID_SERVICE_ACCOUNT :
return "ERROR_INVALID_SERVICE_ACCOUNT";
case ERROR_SERVICE_EXISTS :
return "ERROR_SERVICE_EXISTS";
case ERROR_PATH_NOT_FOUND :
return "ERROR_PATH_NOT_FOUND";
case ERROR_SERVICE_ALREADY_RUNNING :
return "ERROR_SERVICE_ALREADY_RUNNING";
case ERROR_SERVICE_DATABASE_LOCKED :
return "ERROR_SERVICE_DATABASE_LOCKED";
case ERROR_SERVICE_DEPENDENCY_DELETED :
return "ERROR_SERVICE_DEPENDENCY_DELETED";
case ERROR_SERVICE_DEPENDENCY_FAIL :
return "ERROR_SERVICE_DEPENDENCY_FAIL";
case ERROR_SERVICE_DISABLED :
return "ERROR_SERVICE_DISABLED";
case ERROR_SERVICE_LOGON_FAILED :
return "ERROR_SERVICE_LOGON_FAILED";
case ERROR_SERVICE_MARKED_FOR_DELETE :
return "ERROR_SERVICE_MARKED_FOR_DELETE";
case ERROR_SERVICE_NO_THREAD :
return "ERROR_SERVICE_NO_THREAD";
case ERROR_SERVICE_REQUEST_TIMEOUT :
return "ERROR_SERVICE_REQUEST_TIMEOUT";
case ERROR_SERVICE_DOES_NOT_EXIST :
return "ERROR_SERVICE_DOES_NOT_EXIST";
default :
return String("WinError code:")+String().fromInt(mLastError);
}
}