107 lines
3.7 KiB
C++
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);
|
|
}
|
|
}
|