|
|
|
|
@ -49,28 +49,34 @@ std::string InstallService(PSTR pszServiceName,
|
|
|
|
|
PSTR pszAccount,
|
|
|
|
|
PSTR pszPassword) |
|
|
|
|
{ |
|
|
|
|
std::string ret; |
|
|
|
|
char szPathTmp[MAX_PATH],szPath[MAX_PATH]; |
|
|
|
|
std::string ret; |
|
|
|
|
std::string path(0x7FFF, '\0'); |
|
|
|
|
|
|
|
|
|
SC_HANDLE schSCManager = NULL; |
|
|
|
|
SC_HANDLE schService = NULL; |
|
|
|
|
SERVICE_DESCRIPTION sd; |
|
|
|
|
LPTSTR szDesc = TEXT("ZeroTier network virtualization service."); |
|
|
|
|
|
|
|
|
|
if (GetModuleFileName(NULL, szPathTmp, ARRAYSIZE(szPath)) == 0) |
|
|
|
|
DWORD dwCharacters = GetModuleFileName(NULL, path.data(), path.size()); |
|
|
|
|
|
|
|
|
|
if (dwCharacters == 0) |
|
|
|
|
{ |
|
|
|
|
ret = "GetModuleFileName failed, unable to get path to self"; |
|
|
|
|
ret = "GetModuleFileName failed, unable to get path to self"; |
|
|
|
|
goto Cleanup; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Quote path in case it contains spaces
|
|
|
|
|
_snprintf_s(szPath,sizeof(szPath),"\"%s\"",szPathTmp); |
|
|
|
|
// Trim excess nulls which the returned size does not include
|
|
|
|
|
path.resize(dwCharacters); |
|
|
|
|
|
|
|
|
|
// Quote path in case it contains spaces
|
|
|
|
|
path = '"' + path + '"'; |
|
|
|
|
|
|
|
|
|
// Open the local default service control manager database
|
|
|
|
|
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT |
|
|
|
|
|
SC_MANAGER_CREATE_SERVICE); |
|
|
|
|
if (schSCManager == NULL) |
|
|
|
|
{ |
|
|
|
|
ret = "OpenSCManager failed"; |
|
|
|
|
ret = "OpenSCManager failed"; |
|
|
|
|
goto Cleanup; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -83,7 +89,7 @@ std::string InstallService(PSTR pszServiceName,
|
|
|
|
|
SERVICE_WIN32_OWN_PROCESS, // Service type
|
|
|
|
|
dwStartType, // Service start type
|
|
|
|
|
SERVICE_ERROR_NORMAL, // Error control type
|
|
|
|
|
szPath, // Service's binary
|
|
|
|
|
path.c_str(), // Service's binary
|
|
|
|
|
NULL, // No load ordering group
|
|
|
|
|
NULL, // No tag identifier
|
|
|
|
|
pszDependencies, // Dependencies
|
|
|
|
|
@ -92,7 +98,7 @@ std::string InstallService(PSTR pszServiceName,
|
|
|
|
|
); |
|
|
|
|
if (schService == NULL) |
|
|
|
|
{ |
|
|
|
|
ret = "CreateService failed"; |
|
|
|
|
ret = "CreateService failed"; |
|
|
|
|
goto Cleanup; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -112,7 +118,7 @@ Cleanup:
|
|
|
|
|
schService = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|