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);
167 const std::wstring wname = wstring::from_utf8(
config.
name);
170 std::unique_ptr<wchar_t[]> wname_raw = wstring::to_wchar_t(wname);
172 const SERVICE_TABLE_ENTRYW dispatch_table[] = {
178 if (!::StartServiceCtrlDispatcherW(dispatch_table))
181 OPENVPN_THROW(winsvc_error,
"StartServiceCtrlDispatcherW failed: " << err.message());
294 const std::wstring wname = wstring::from_utf8(
config.
name);
303 OPENVPN_THROW(winsvc_error,
"RegisterServiceCtrlHandlerW failed: " << err.message());
307 status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
308 status.dwServiceSpecificExitCode = 0;
319 catch (
const std::exception &e)
373 DWORD dwWin32ExitCode,
376 std::lock_guard<std::mutex> lock(
mutex);
380 status.dwCurrentState = dwCurrentState;
381 status.dwWin32ExitCode = dwWin32ExitCode;
382 status.dwWaitHint = dwWaitHint;
384 if (dwCurrentState == SERVICE_START_PENDING)
385 status.dwControlsAccepted = 0;
387 status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
388 if ((dwCurrentState == SERVICE_RUNNING) || (dwCurrentState == SERVICE_STOPPED))