1 #include "../include/fmsservice.h"
\r
2 #include "../include/global.h"
\r
14 SERVICE_STATUS ServiceStatus;
\r
15 SERVICE_STATUS_HANDLE hStatus;
\r
17 void ControlHandler(DWORD request)
\r
21 case SERVICE_CONTROL_STOP:
\r
22 case SERVICE_CONTROL_SHUTDOWN:
\r
23 ServiceStatus.dwWin32ExitCode = 0;
\r
24 ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
\r
32 /* Report current status */
\r
33 SetServiceStatus (hStatus, &ServiceStatus);
\r
38 BOOL ServiceInstall()
\r
40 SC_HANDLE hSCM, hService;
\r
41 char szFilePath[FILENAME_MAX], szKey[256];
\r
45 hSCM = OpenSCManager(NULL, /* local machine */
\r
46 NULL, /* ServicesActive database */
\r
47 SC_MANAGER_ALL_ACCESS); /* full access */
\r
49 if (!hSCM) return FALSE;
\r
51 GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));
\r
52 std::string commandline(szFilePath);
\r
55 hService = CreateService(hSCM,
\r
59 SERVICE_WIN32_OWN_PROCESS,
\r
60 SERVICE_AUTO_START, /* start condition */
\r
61 SERVICE_ERROR_NORMAL,
\r
62 commandline.c_str(),
\r
70 CloseServiceHandle(hSCM);
\r
75 strcpy(szKey, "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\");
\r
76 strcat(szKey, FMS_SERVICE_NAME);
\r
77 if (RegCreateKey(HKEY_LOCAL_MACHINE, szKey, &hKey) != ERROR_SUCCESS) {
\r
78 CloseServiceHandle(hService);
\r
79 CloseServiceHandle(hSCM);
\r
87 (CONST BYTE*)szFilePath,
\r
88 (int) strlen(szFilePath) + 1);
\r
90 dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;
\r
95 (CONST BYTE*)&dwData,
\r
99 CloseServiceHandle(hService);
\r
100 CloseServiceHandle(hSCM);
\r
105 BOOL ServiceIsInstalled()
\r
108 SC_HANDLE hSCM, hService;
\r
110 hSCM = OpenSCManager(NULL, /* local machine */
\r
111 NULL, /* ServicesActive database */
\r
112 SC_MANAGER_ALL_ACCESS); /* full access */
\r
117 hService = OpenService(hSCM,
\r
119 SERVICE_QUERY_CONFIG);
\r
123 CloseServiceHandle(hService);
\r
125 CloseServiceHandle(hSCM);
\r
131 void ServiceMain(int argc, char** argv)
\r
133 char szDocumentRoot[MAX_PATH];
\r
135 ServiceStatus.dwServiceType = SERVICE_WIN32;
\r
136 ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
\r
137 ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
\r
138 ServiceStatus.dwWin32ExitCode = 0;
\r
139 ServiceStatus.dwServiceSpecificExitCode = 0;
\r
140 ServiceStatus.dwCheckPoint = 0;
\r
141 ServiceStatus.dwWaitHint = 0;
\r
143 hStatus = RegisterServiceCtrlHandler(FMS_SERVICE_NAME, (LPHANDLER_FUNCTION)ControlHandler);
\r
145 if (hStatus == (SERVICE_STATUS_HANDLE)0) {
\r
146 /* Registering Control Handler failed */
\r
150 /* Initialize Service */
\r
153 Construct default paths & filenames and make sure we serve documents from the folder containing the executable.
\r
154 If left without a default value, we will be serving from C:\WINDOWS\SYSTEM32 (we start there as a service)!
\r
156 GetModuleFileName(NULL, szDocumentRoot, MAX_PATH);
\r
157 std::string path(szDocumentRoot);
\r
158 std::string::size_type slashpos=path.rfind("\\");
\r
159 if(slashpos==std::string::npos)
\r
161 slashpos=path.rfind("/");
\r
163 if(slashpos!=std::string::npos)
\r
165 path.erase(slashpos);
\r
167 chdir(path.c_str());
\r
169 /* We report the running status to SCM. */
\r
170 ServiceStatus.dwCurrentState = SERVICE_RUNNING;
\r
171 SetServiceStatus (hStatus, &ServiceStatus);
\r
175 ServiceStatus.dwCurrentState=SERVICE_STOPPED;
\r
176 SetServiceStatus(hStatus,&ServiceStatus);
\r
181 BOOL ServiceStart()
\r
183 SERVICE_TABLE_ENTRY ServiceTable[2];
\r
185 ServiceTable[0].lpServiceName = FMS_SERVICE_NAME;
\r
186 ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
\r
188 ServiceTable[1].lpServiceName = NULL;
\r
189 ServiceTable[1].lpServiceProc = NULL;
\r
191 /* Start the control dispatcher thread for our service */
\r
192 return StartServiceCtrlDispatcher(ServiceTable);
\r
195 BOOL ServiceUninstall()
\r
197 SC_HANDLE hSCM, hService;
\r
200 hSCM = OpenSCManager(NULL, /* local machine */
\r
201 NULL, /* ServicesActive database */
\r
202 SC_MANAGER_ALL_ACCESS); /* full access */
\r
204 if (!hSCM) return 0;
\r
208 hService = OpenService(hSCM,
\r
213 if (DeleteService(hService)) bResult = TRUE;
\r
214 CloseServiceHandle(hService);
\r
217 CloseServiceHandle(hSCM);
\r