1 #include "../include/fmsservice.h"
\r
2 #include "../include/global.h"
\r
3 #include "../include/logfile.h"
\r
15 SERVICE_STATUS ServiceStatus;
\r
16 SERVICE_STATUS_HANDLE hStatus;
\r
18 void ControlHandler(DWORD request)
\r
22 case SERVICE_CONTROL_STOP:
\r
23 case SERVICE_CONTROL_SHUTDOWN:
\r
24 ServiceStatus.dwWin32ExitCode = 0;
\r
25 ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
\r
26 LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"ControlHandler service got shutdown request");
\r
34 /* Report current status */
\r
35 SetServiceStatus (hStatus, &ServiceStatus);
\r
40 BOOL ServiceInstall()
\r
42 SC_HANDLE hSCM, hService;
\r
43 char szFilePath[FILENAME_MAX], szKey[256];
\r
47 hSCM = OpenSCManager(NULL, /* local machine */
\r
48 NULL, /* ServicesActive database */
\r
49 SC_MANAGER_ALL_ACCESS); /* full access */
\r
51 if (!hSCM) return FALSE;
\r
53 GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));
\r
54 std::string commandline(szFilePath);
\r
57 hService = CreateService(hSCM,
\r
61 SERVICE_WIN32_OWN_PROCESS,
\r
62 SERVICE_AUTO_START, /* start condition */
\r
63 SERVICE_ERROR_NORMAL,
\r
64 commandline.c_str(),
\r
72 CloseServiceHandle(hSCM);
\r
77 strcpy(szKey, "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\");
\r
78 strcat(szKey, FMS_SERVICE_NAME);
\r
79 if (RegCreateKey(HKEY_LOCAL_MACHINE, szKey, &hKey) != ERROR_SUCCESS) {
\r
80 CloseServiceHandle(hService);
\r
81 CloseServiceHandle(hSCM);
\r
89 (CONST BYTE*)szFilePath,
\r
90 (int) strlen(szFilePath) + 1);
\r
92 dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;
\r
97 (CONST BYTE*)&dwData,
\r
101 CloseServiceHandle(hService);
\r
102 CloseServiceHandle(hSCM);
\r
107 BOOL ServiceIsInstalled()
\r
110 SC_HANDLE hSCM, hService;
\r
112 hSCM = OpenSCManager(NULL, /* local machine */
\r
113 NULL, /* ServicesActive database */
\r
114 SC_MANAGER_ALL_ACCESS); /* full access */
\r
119 hService = OpenService(hSCM,
\r
121 SERVICE_QUERY_CONFIG);
\r
125 CloseServiceHandle(hService);
\r
127 CloseServiceHandle(hSCM);
\r
133 void ServiceMain(int argc, char** argv)
\r
135 char szDocumentRoot[MAX_PATH];
\r
137 ServiceStatus.dwServiceType = SERVICE_WIN32;
\r
138 ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
\r
139 ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
\r
140 ServiceStatus.dwWin32ExitCode = 0;
\r
141 ServiceStatus.dwServiceSpecificExitCode = 0;
\r
142 ServiceStatus.dwCheckPoint = 0;
\r
143 ServiceStatus.dwWaitHint = 0;
\r
145 hStatus = RegisterServiceCtrlHandler(FMS_SERVICE_NAME, (LPHANDLER_FUNCTION)ControlHandler);
\r
147 if (hStatus == (SERVICE_STATUS_HANDLE)0) {
\r
148 /* Registering Control Handler failed */
\r
152 /* Initialize Service */
\r
155 Construct default paths & filenames and make sure we serve documents from the folder containing the executable.
\r
156 If left without a default value, we will be serving from C:\WINDOWS\SYSTEM32 (we start there as a service)!
\r
158 GetModuleFileName(NULL, szDocumentRoot, MAX_PATH);
\r
159 std::string path(szDocumentRoot);
\r
160 std::string::size_type slashpos=path.rfind("\\");
\r
161 if(slashpos==std::string::npos)
\r
163 slashpos=path.rfind("/");
\r
165 if(slashpos!=std::string::npos)
\r
167 path.erase(slashpos);
\r
169 chdir(path.c_str());
\r
171 /* We report the running status to SCM. */
\r
172 ServiceStatus.dwCurrentState = SERVICE_RUNNING;
\r
173 SetServiceStatus (hStatus, &ServiceStatus);
\r
175 LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"ServiceMain starting service");
\r
179 LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"ServiceMain stopping service");
\r
181 ServiceStatus.dwCurrentState=SERVICE_STOPPED;
\r
182 SetServiceStatus(hStatus,&ServiceStatus);
\r
184 LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"ServiceMain returning");
\r
189 BOOL ServiceStart()
\r
191 SERVICE_TABLE_ENTRY ServiceTable[2];
\r
193 ServiceTable[0].lpServiceName = FMS_SERVICE_NAME;
\r
194 ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
\r
196 ServiceTable[1].lpServiceName = NULL;
\r
197 ServiceTable[1].lpServiceProc = NULL;
\r
199 /* Start the control dispatcher thread for our service */
\r
200 return StartServiceCtrlDispatcher(ServiceTable);
\r
203 BOOL ServiceUninstall()
\r
205 SC_HANDLE hSCM, hService;
\r
208 hSCM = OpenSCManager(NULL, /* local machine */
\r
209 NULL, /* ServicesActive database */
\r
210 SC_MANAGER_ALL_ACCESS); /* full access */
\r
212 if (!hSCM) return 0;
\r
216 hService = OpenService(hSCM,
\r
221 if (DeleteService(hService)) bResult = TRUE;
\r
222 CloseServiceHandle(hService);
\r
225 CloseServiceHandle(hSCM);
\r