19#if !defined(WINADVAPI)
20#if !defined(_ADVAPI32_)
21#define WINADVAPI DECLSPEC_IMPORT
27extern int main(
int argc,
char** argv);
28extern char serviceLongName[];
29extern char serviceName[];
30extern char serviceDescription[];
32extern int m_ServiceStatus;
34SERVICE_STATUS serviceStatus;
36SERVICE_STATUS_HANDLE serviceStatusHandle = 0;
38typedef WINADVAPI BOOL(WINAPI* CSD_T)(SC_HANDLE, DWORD, LPCVOID);
40bool WinServiceInstall()
42 SC_HANDLE serviceControlManager = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
44 if (serviceControlManager)
46 char path[_MAX_PATH + 10];
47 if (GetModuleFileName(0, path,
sizeof(path) /
sizeof(path[0])) > 0)
50 std::strcat(path,
" --service");
51 service = CreateService(serviceControlManager,
56 SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
67 HMODULE advapi32 = GetModuleHandle(
"ADVAPI32.DLL");
70 CloseServiceHandle(service);
71 CloseServiceHandle(serviceControlManager);
75 CSD_T ChangeService_Config2 = (CSD_T)GetProcAddress(advapi32,
"ChangeServiceConfig2A");
76 if (!ChangeService_Config2)
78 CloseServiceHandle(service);
79 CloseServiceHandle(serviceControlManager);
83 SERVICE_DESCRIPTION sdBuf;
84 sdBuf.lpDescription = serviceDescription;
85 ChangeService_Config2(
87 SERVICE_CONFIG_DESCRIPTION,
91 _action[0].Type = SC_ACTION_RESTART;
92 _action[0].Delay = 10000;
93 SERVICE_FAILURE_ACTIONS sfa;
94 ZeroMemory(&sfa,
sizeof(SERVICE_FAILURE_ACTIONS));
95 sfa.lpsaActions = _action;
97 sfa.dwResetPeriod = INFINITE;
98 ChangeService_Config2(
100 SERVICE_CONFIG_FAILURE_ACTIONS,
103 CloseServiceHandle(service);
106 CloseServiceHandle(serviceControlManager);
111bool WinServiceUninstall()
113 SC_HANDLE serviceControlManager = OpenSCManager(0, 0, SC_MANAGER_CONNECT);
115 if (serviceControlManager)
117 SC_HANDLE service = OpenService(serviceControlManager,
118 serviceName, SERVICE_QUERY_STATUS | DELETE);
121 SERVICE_STATUS serviceStatus2;
122 if (QueryServiceStatus(service, &serviceStatus2))
124 if (serviceStatus2.dwCurrentState == SERVICE_STOPPED)
125 DeleteService(service);
127 CloseServiceHandle(service);
130 CloseServiceHandle(serviceControlManager);
135void WINAPI ServiceControlHandler(DWORD controlCode)
139 case SERVICE_CONTROL_INTERROGATE:
142 case SERVICE_CONTROL_SHUTDOWN:
143 case SERVICE_CONTROL_STOP:
144 serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
145 SetServiceStatus(serviceStatusHandle, &serviceStatus);
150 case SERVICE_CONTROL_PAUSE:
152 serviceStatus.dwCurrentState = SERVICE_PAUSED;
153 SetServiceStatus(serviceStatusHandle, &serviceStatus);
156 case SERVICE_CONTROL_CONTINUE:
157 serviceStatus.dwCurrentState = SERVICE_RUNNING;
158 SetServiceStatus(serviceStatusHandle, &serviceStatus);
163 if (controlCode >= 128 && controlCode <= 255)
171 SetServiceStatus(serviceStatusHandle, &serviceStatus);
174void WINAPI ServiceMain(DWORD argc,
char* argv[])
177 serviceStatus.dwServiceType = SERVICE_WIN32;
178 serviceStatus.dwCurrentState = SERVICE_START_PENDING;
179 serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
180 serviceStatus.dwWin32ExitCode = NO_ERROR;
181 serviceStatus.dwServiceSpecificExitCode = NO_ERROR;
182 serviceStatus.dwCheckPoint = 0;
183 serviceStatus.dwWaitHint = 0;
185 serviceStatusHandle = RegisterServiceCtrlHandler(serviceName, ServiceControlHandler);
187 if (serviceStatusHandle)
189 char path[_MAX_PATH + 1];
190 unsigned int i, last_slash = 0;
192 GetModuleFileName(0, path,
sizeof(path) /
sizeof(path[0]));
194 for (i = 0; i < std::strlen(path); i++)
196 if (path[i] ==
'\\') last_slash = i;
199 path[last_slash] = 0;
202 serviceStatus.dwCurrentState = SERVICE_START_PENDING;
203 SetServiceStatus(serviceStatusHandle, &serviceStatus);
206 SetCurrentDirectory(path);
209 serviceStatus.dwControlsAccepted |= (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
210 serviceStatus.dwCurrentState = SERVICE_RUNNING;
211 SetServiceStatus(serviceStatusHandle, &serviceStatus);
222 serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
223 SetServiceStatus(serviceStatusHandle, &serviceStatus);
228 serviceStatus.dwControlsAccepted &= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
229 serviceStatus.dwCurrentState = SERVICE_STOPPED;
230 SetServiceStatus(serviceStatusHandle, &serviceStatus);
236 SERVICE_TABLE_ENTRY serviceTable[] =
238 { serviceName, ServiceMain },
242 if (!StartServiceCtrlDispatcher(serviceTable))
244 SF_LOG_ERROR(
"server.worldserver",
"StartService Failed. Error [%u]", ::GetLastError());
#define SF_LOG_ERROR(filterType__,...)
int main(int argc, char **argv)
Launch the auth server.