X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Ffmsservice.cpp;fp=src%2Ffmsservice.cpp;h=0000000000000000000000000000000000000000;hb=dec33c63afafabf83c3039e916725cac6faef9b3;hp=03e2b8ed41857e136e99f8d916d2368b35198e34;hpb=9b22dd53fe62e312c1647310b7ec43aa127090af;p=fms.git diff --git a/src/fmsservice.cpp b/src/fmsservice.cpp deleted file mode 100644 index 03e2b8e..0000000 --- a/src/fmsservice.cpp +++ /dev/null @@ -1,230 +0,0 @@ -#include "../include/fmsservice.h" -#include "../include/global.h" -#include "../include/logfile.h" - -#include - -#ifdef _WIN32 - -#include - -#ifdef XMEM - #include -#endif - -SERVICE_STATUS ServiceStatus; -SERVICE_STATUS_HANDLE hStatus; - -void ControlHandler(DWORD request) -{ - switch(request) - { - case SERVICE_CONTROL_STOP: - case SERVICE_CONTROL_SHUTDOWN: - ServiceStatus.dwWin32ExitCode = 0; - ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; - LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"ControlHandler service got shutdown request"); - wantshutdown=true; - break; - - default: - break; - } - - /* Report current status */ - SetServiceStatus (hStatus, &ServiceStatus); - - return; -} - -BOOL ServiceInstall() -{ - SC_HANDLE hSCM, hService; - char szFilePath[FILENAME_MAX], szKey[256]; - HKEY hKey; - DWORD dwData; - - hSCM = OpenSCManager(NULL, /* local machine */ - NULL, /* ServicesActive database */ - SC_MANAGER_ALL_ACCESS); /* full access */ - - if (!hSCM) return FALSE; - - GetModuleFileName(NULL, szFilePath, sizeof(szFilePath)); - std::string commandline(szFilePath); - commandline+=" -s"; - - hService = CreateService(hSCM, - FMS_SERVICE_NAME, - FMS_SERVICE_NAME, - SERVICE_ALL_ACCESS, - SERVICE_WIN32_OWN_PROCESS, - SERVICE_AUTO_START, /* start condition */ - SERVICE_ERROR_NORMAL, - commandline.c_str(), - NULL, - NULL, - NULL, - NULL, - NULL); - - if (!hService) { - CloseServiceHandle(hSCM); - return FALSE; - } - - hKey = NULL; - strcpy(szKey, "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\"); - strcat(szKey, FMS_SERVICE_NAME); - if (RegCreateKey(HKEY_LOCAL_MACHINE, szKey, &hKey) != ERROR_SUCCESS) { - CloseServiceHandle(hService); - CloseServiceHandle(hSCM); - return FALSE; - } - - RegSetValueEx(hKey, - "EventMessageFile", - 0, - REG_EXPAND_SZ, - (CONST BYTE*)szFilePath, - (int) strlen(szFilePath) + 1); - - dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE; - RegSetValueEx(hKey, - "TypesSupported", - 0, - REG_DWORD, - (CONST BYTE*)&dwData, - sizeof(DWORD)); - RegCloseKey(hKey); - - CloseServiceHandle(hService); - CloseServiceHandle(hSCM); - - return TRUE; -} - -BOOL ServiceIsInstalled() -{ - BOOL bResult; - SC_HANDLE hSCM, hService; - - hSCM = OpenSCManager(NULL, /* local machine */ - NULL, /* ServicesActive database */ - SC_MANAGER_ALL_ACCESS); /* full access */ - - bResult = FALSE; - - if (hSCM) { - hService = OpenService(hSCM, - FMS_SERVICE_NAME, - SERVICE_QUERY_CONFIG); - - if (hService) { - bResult = TRUE; - CloseServiceHandle(hService); - } - CloseServiceHandle(hSCM); - } - - return bResult; -} - -void ServiceMain(int argc, char** argv) -{ - char szDocumentRoot[MAX_PATH]; - - ServiceStatus.dwServiceType = SERVICE_WIN32; - ServiceStatus.dwCurrentState = SERVICE_START_PENDING; - ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; - ServiceStatus.dwWin32ExitCode = 0; - ServiceStatus.dwServiceSpecificExitCode = 0; - ServiceStatus.dwCheckPoint = 0; - ServiceStatus.dwWaitHint = 0; - - hStatus = RegisterServiceCtrlHandler(FMS_SERVICE_NAME, (LPHANDLER_FUNCTION)ControlHandler); - - if (hStatus == (SERVICE_STATUS_HANDLE)0) { - /* Registering Control Handler failed */ - return; - } - - /* Initialize Service */ - - /* - Construct default paths & filenames and make sure we serve documents from the folder containing the executable. - If left without a default value, we will be serving from C:\WINDOWS\SYSTEM32 (we start there as a service)! - */ - GetModuleFileName(NULL, szDocumentRoot, MAX_PATH); - std::string path(szDocumentRoot); - std::string::size_type slashpos=path.rfind("\\"); - if(slashpos==std::string::npos) - { - slashpos=path.rfind("/"); - } - if(slashpos!=std::string::npos) - { - path.erase(slashpos); - } - chdir(path.c_str()); - - /* We report the running status to SCM. */ - ServiceStatus.dwCurrentState = SERVICE_RUNNING; - SetServiceStatus (hStatus, &ServiceStatus); - - LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"ServiceMain starting service"); - - MainFunction(); - - LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"ServiceMain stopping service"); - - ServiceStatus.dwCurrentState=SERVICE_STOPPED; - SetServiceStatus(hStatus,&ServiceStatus); - - LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"ServiceMain returning"); - - return; -} - -BOOL ServiceStart() -{ - SERVICE_TABLE_ENTRY ServiceTable[2]; - - ServiceTable[0].lpServiceName = FMS_SERVICE_NAME; - ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; - - ServiceTable[1].lpServiceName = NULL; - ServiceTable[1].lpServiceProc = NULL; - - /* Start the control dispatcher thread for our service */ - return StartServiceCtrlDispatcher(ServiceTable); -} - -BOOL ServiceUninstall() -{ - SC_HANDLE hSCM, hService; - BOOL bResult; - - hSCM = OpenSCManager(NULL, /* local machine */ - NULL, /* ServicesActive database */ - SC_MANAGER_ALL_ACCESS); /* full access */ - - if (!hSCM) return 0; - - bResult = FALSE; - - hService = OpenService(hSCM, - FMS_SERVICE_NAME, - DELETE); - - if (hService) { - if (DeleteService(hService)) bResult = TRUE; - CloseServiceHandle(hService); - } - - CloseServiceHandle(hSCM); - - return bResult; -} - -#endif // _WIN32