100 {
103 SERVICE_FAILURE_ACTIONSA* fail_acts = get_failure_actions();
104
105 char sz_path[MAX_PATH];
106 ::GetModuleFileNameA(0, sz_path, sizeof(sz_path));
107 ::GetShortPathNameA(sz_path, sz_path, sizeof(sz_path));
108
109 while (TRUE) {
110 if (!m_manager) {
111 m_manager = ::OpenSCManager(NULL, NULL, GENERIC_ALL);
112 if (!m_manager) {
113 int err = GetLastError();
115 "Failed to OpenSCManager(), last err="
116 << log_space::get_win32_err_descr(err));
117 break;
118 }
119 }
121 SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START,
122 SERVICE_ERROR_IGNORE, sz_path, 0, 0, 0, 0, 0);
123 if (!m_service) {
124 int err = GetLastError();
126 "Failed to CreateService(), last err="
127 << log_space::get_win32_err_descr(err));
128 break;
129 }
130
131 if (psz_descr) {
132 SERVICE_DESCRIPTIONA sd = { (char*) psz_descr };
133 if (!::ChangeServiceConfig2A(m_service, SERVICE_CONFIG_DESCRIPTION,
134 &sd)) {
135 int err = GetLastError();
137 "Failed to ChangeServiceConfig2(SERVICE_CONFIG_DESCRIPTION), last err="
138 << log_space::get_win32_err_descr(err));
139 break;
140 }
141 }
142
143 if (fail_acts) {
144 if (!::ChangeServiceConfig2A(m_service, SERVICE_CONFIG_FAILURE_ACTIONS,
145 fail_acts)) {
146 int err = GetLastError();
148 "Failed to ChangeServiceConfig2(SERVICE_CONFIG_FAILURE_ACTIONS), last err="
149 << log_space::get_win32_err_descr(err));
150 break;
151 }
152 }
153 LOG_PRINT("Installed succesfully.", LOG_LEVEL_0);
154 return true;
155 }
156 LOG_PRINT("Failed to install.", LOG_LEVEL_0);
157 return false;
158}
virtual const char * get_name()=0
virtual const char * get_description()=0
virtual const char * get_caption()=0
#define CHECK_AND_ASSERT(expr, fail_ret_val)