51 SC_HANDLE serviceControlManager = OpenSCManager(
nullptr,
nullptr, SC_MANAGER_CREATE_SERVICE);
53 if (serviceControlManager)
55 TCHAR path[_MAX_PATH + 10];
56 if (GetModuleFileName(
nullptr, path, std::size(path)) > 0)
58 _tcscat(path, _T(
" --service run"));
59 SC_HANDLE service = CreateService(serviceControlManager,
64 SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
75 SERVICE_DESCRIPTION sdBuf;
76 sdBuf.lpDescription = ServiceDescription;
79 SERVICE_CONFIG_DESCRIPTION,
83 _action[0].Type = SC_ACTION_RESTART;
84 _action[0].Delay = 10000;
85 SERVICE_FAILURE_ACTIONS sfa;
86 ZeroMemory(&sfa,
sizeof(SERVICE_FAILURE_ACTIONS));
87 sfa.lpsaActions = _action;
89 sfa.dwResetPeriod = INFINITE;
92 SERVICE_CONFIG_FAILURE_ACTIONS,
95 CloseServiceHandle(service);
99 CloseServiceHandle(serviceControlManager);
102 printf(
"Service installed\n");
108 SC_HANDLE serviceControlManager = OpenSCManager(
nullptr,
nullptr, SC_MANAGER_CONNECT);
110 if (serviceControlManager)
112 SC_HANDLE service = OpenService(serviceControlManager,
113 ServiceName, SERVICE_QUERY_STATUS | DELETE);
116 SERVICE_STATUS serviceStatus2;
117 if (QueryServiceStatus(service, &serviceStatus2))
119 if (serviceStatus2.dwCurrentState == SERVICE_STOPPED)
120 DeleteService(service);
122 CloseServiceHandle(service);
125 CloseServiceHandle(serviceControlManager);
128 printf(
"Service uninstalled\n");
136 case SERVICE_CONTROL_INTERROGATE:
139 case SERVICE_CONTROL_SHUTDOWN:
140 case SERVICE_CONTROL_STOP:
141 ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
142 SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
144 *ServiceStatusPtr = 0;
147 case SERVICE_CONTROL_PAUSE:
148 *ServiceStatusPtr = 2;
149 ServiceStatus.dwCurrentState = SERVICE_PAUSED;
150 SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
153 case SERVICE_CONTROL_CONTINUE:
154 ServiceStatus.dwCurrentState = SERVICE_RUNNING;
155 SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
156 *ServiceStatusPtr = 1;
160 if (controlCode >= 128 && controlCode <= 255)
168 SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
183 ServiceStatus.dwServiceType = SERVICE_WIN32;
184 ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
185 ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
186 ServiceStatus.dwWin32ExitCode = NO_ERROR;
187 ServiceStatus.dwServiceSpecificExitCode = NO_ERROR;
188 ServiceStatus.dwCheckPoint = 0;
189 ServiceStatus.dwWaitHint = 0;
193 if (ServiceStatusHandle)
195 TCHAR path[_MAX_PATH + 1];
196 size_t last_slash = 0;
198 size_t pathLen = GetModuleFileName(
nullptr, path, std::size(path));
199 for (
size_t i = 0; i < pathLen; i++)
203 path[last_slash] = 0;
206 ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
207 SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
210 SetCurrentDirectory(path);
213 ServiceStatus.dwControlsAccepted |= (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
214 ServiceStatus.dwCurrentState = SERVICE_RUNNING;
215 SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
221 *ServiceStatusPtr = 1;
223 char cArg[_MAX_PATH + 1];
225 char* cArgv[] = { cArg };
227 ServiceEntryPoint(1, cArgv);
230 ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
231 SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
236 ServiceStatus.dwControlsAccepted &= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
237 ServiceStatus.dwCurrentState = SERVICE_STOPPED;
238 SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
TCHAR serviceDescription[]
TC_COMMON_API void Init(_TCHAR *serviceLongName, _TCHAR *serviceName, _TCHAR *serviceDescription, int(*entryPoint)(int argc, char **argv), int *status)