65 SC_MANAGER_ALL_ACCESS));
69 OPENVPN_THROW(winsvc_error,
"OpenSCManagerW failed: " << err.message());
73 const std::wstring wname = wstring::from_utf8(
config.
name);
87 wdisplay_name.c_str(),
89 SERVICE_WIN32_OWN_PROCESS,
101 OPENVPN_THROW(winsvc_error,
"CreateServiceW failed: " << err.message());
106 SERVICE_FAILURE_ACTIONS servFailActions;
107 SC_ACTION failActions[3];
109 failActions[0].Type = SC_ACTION_RESTART;
110 failActions[0].Delay = 1000;
111 failActions[1].Type = SC_ACTION_RESTART;
112 failActions[1].Delay = 5000;
113 failActions[2].Type = SC_ACTION_RESTART;
114 failActions[2].Delay = 30000;
116 servFailActions.dwResetPeriod = 86400;
117 servFailActions.lpCommand = NULL;
118 servFailActions.lpRebootMsg = NULL;
119 servFailActions.cActions = 3;
120 servFailActions.lpsaActions = failActions;
122 ::ChangeServiceConfig2(
svc(), SERVICE_CONFIG_FAILURE_ACTIONS, &servFailActions);
123 ::StartService(
svc(), 0, NULL);
291 const std::wstring wname = wstring::from_utf8(
config.
name);
300 OPENVPN_THROW(winsvc_error,
"RegisterServiceCtrlHandlerW failed: " << err.message());
304 status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
305 status.dwServiceSpecificExitCode = 0;
316 catch (
const std::exception &e)
370 DWORD dwWin32ExitCode,
373 std::lock_guard<std::mutex> lock(
mutex);
377 status.dwCurrentState = dwCurrentState;
378 status.dwWin32ExitCode = dwWin32ExitCode;
379 status.dwWaitHint = dwWaitHint;
381 if (dwCurrentState == SERVICE_START_PENDING)
382 status.dwControlsAccepted = 0;
384 status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
385 if ((dwCurrentState == SERVICE_RUNNING) || (dwCurrentState == SERVICE_STOPPED))