diff options
Diffstat (limited to 'windows/ZeroTierOne/ServiceInstaller.cpp')
| -rw-r--r-- | windows/ZeroTierOne/ServiceInstaller.cpp | 43 |
1 files changed, 17 insertions, 26 deletions
diff --git a/windows/ZeroTierOne/ServiceInstaller.cpp b/windows/ZeroTierOne/ServiceInstaller.cpp index 9d7b22c7..5945ecdf 100644 --- a/windows/ZeroTierOne/ServiceInstaller.cpp +++ b/windows/ZeroTierOne/ServiceInstaller.cpp @@ -42,20 +42,21 @@ // NOTE: If the function fails to install the service, it prints the error // in the standard output stream for users to diagnose the problem. // -void InstallService(PSTR pszServiceName, +std::string InstallService(PSTR pszServiceName, PSTR pszDisplayName, DWORD dwStartType, PSTR pszDependencies, PSTR pszAccount, PSTR pszPassword) { + std::string ret; char szPath[MAX_PATH]; SC_HANDLE schSCManager = NULL; SC_HANDLE schService = NULL; if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)) == 0) { - wprintf(L"GetModuleFileName failed w/err 0x%08lx\n", GetLastError()); + ret = "GetModuleFileName failed, unable to get path to self"; goto Cleanup; } @@ -64,7 +65,7 @@ void InstallService(PSTR pszServiceName, SC_MANAGER_CREATE_SERVICE); if (schSCManager == NULL) { - wprintf(L"OpenSCManager failed w/err 0x%08lx\n", GetLastError()); + ret = "OpenSCManager failed"; goto Cleanup; } @@ -86,12 +87,10 @@ void InstallService(PSTR pszServiceName, ); if (schService == NULL) { - wprintf(L"CreateService failed w/err 0x%08lx\n", GetLastError()); + ret = "CreateService failed"; goto Cleanup; } - wprintf(L"%s is installed.\n", pszServiceName); - Cleanup: // Centralized cleanup for all allocated resources. if (schSCManager) @@ -104,6 +103,8 @@ Cleanup: CloseServiceHandle(schService); schService = NULL; } + + return ret; } @@ -119,8 +120,9 @@ Cleanup: // NOTE: If the function fails to uninstall the service, it prints the // error in the standard output stream for users to diagnose the problem. // -void UninstallService(PSTR pszServiceName) +std::string UninstallService(PSTR pszServiceName) { + std::string ret; SC_HANDLE schSCManager = NULL; SC_HANDLE schService = NULL; SERVICE_STATUS ssSvcStatus = {}; @@ -129,7 +131,7 @@ void UninstallService(PSTR pszServiceName) schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); if (schSCManager == NULL) { - wprintf(L"OpenSCManager failed w/err 0x%08lx\n", GetLastError()); + ret = "OpenSCManager failed"; goto Cleanup; } @@ -138,45 +140,32 @@ void UninstallService(PSTR pszServiceName) SERVICE_QUERY_STATUS | DELETE); if (schService == NULL) { - wprintf(L"OpenService failed w/err 0x%08lx\n", GetLastError()); + ret = "OpenService failed (is service installed?)"; goto Cleanup; } // Try to stop the service if (ControlService(schService, SERVICE_CONTROL_STOP, &ssSvcStatus)) { - wprintf(L"Stopping %s.", pszServiceName); - Sleep(1000); + Sleep(500); while (QueryServiceStatus(schService, &ssSvcStatus)) { if (ssSvcStatus.dwCurrentState == SERVICE_STOP_PENDING) { - wprintf(L"."); - Sleep(1000); + Sleep(500); } else break; } - - if (ssSvcStatus.dwCurrentState == SERVICE_STOPPED) - { - wprintf(L"\n%s is stopped.\n", pszServiceName); - } - else - { - wprintf(L"\n%s failed to stop.\n", pszServiceName); - } } // Now remove the service by calling DeleteService. if (!DeleteService(schService)) { - wprintf(L"DeleteService failed w/err 0x%08lx\n", GetLastError()); + ret = "DeleteService failed (is service running?)"; goto Cleanup; } - wprintf(L"%s is removed.\n", pszServiceName); - Cleanup: // Centralized cleanup for all allocated resources. if (schSCManager) @@ -189,4 +178,6 @@ Cleanup: CloseServiceHandle(schService); schService = NULL; } -}
\ No newline at end of file + + return ret; +} |
