Exemplo n.º 1
0
int main(int argc, char* argv[])
{
	//LOGFILE.open("C:\\wlanauto4_log.txt");

	if (argc > 1)
	{
		if (strcmp(argv[1], "-i") == 0)
		{
			if (InstallService())
				printf("Service installed sucessfully\n");
			else
				printf("Error installing service\n");
		}

		if (strcmp(argv[1], "-u") == 0)
		{
			if (UninstallService())
				printf("Service uninstalled sucessfully\n");
			else
				printf("Error uninstalling service\n");
		}
	}
	else
	{
		// Start the service
		SERVICE_TABLE_ENTRY Table[] = {{"WlanAuto", ServiceMain}, {NULL, NULL}};
		StartServiceCtrlDispatcher(Table);
	}

	//LOGFILE.close();

	return 0;
}
Exemplo n.º 2
0
int wmain(int argc, wchar_t *argv[]) {
	std::cout << "    sleeping for debuger attachment" << std::endl;
	Sleep(10000);
	if (argc > 1 && (*argv[1] == L'-' || *argv[1] == L'/')) {
		if (_wcsicmp(L"install", argv[1] + 1) == 0) {
			InstallService( SERVICE_NAME, SERVICE_DISPLAY_NAME,
							SERVICE_STARTUP_TYPE,
							SERVICE_DEPENDENCIES,
							SERVICE_ACCOUNT,
							SERVICE_PASSWORD );
		}
		else if (_wcsicmp(L"remove", argv[1] + 1) == 0) {
			UninstallService( SERVICE_NAME );
		}
		else {
			wsprintf(L"valid Parameters:\n",L" ");
			wsprintf(L" -install to install the service\n",L" ");
			wsprintf(L" -remove to remove the service\n",L" ");
		}
	}
	else {
			// to run -- to be done later
	}
	return 0;
}
Exemplo n.º 3
0
HRESULT SetupUninstallService()
{
	HRESULT hr = UninstallService();
	if(FAILED(hr)) {
		TSERROR4CXX("UninstallService failed");
		return hr;
	}
	if(!DeleteSeriviceDll()) {
		TSWARN4CXX("Failed to delete service dll.");
	}
	return hr;
}
Exemplo n.º 4
0
		bool DaemonWin32::init(int argc, char* argv[])
		{
			setlocale(LC_CTYPE, "");
			SetConsoleCP(1251);
			SetConsoleOutputCP(1251);
			setlocale(LC_ALL, "Russian");

			if (!Daemon_Singleton::init(argc, argv)) return false;
			if (I2PService::isService())
				isDaemon = 1;
			else
				isDaemon = 0;

			std::string serviceControl = i2p::util::config::GetArg("-service", "none");
			if (serviceControl == "install")
			{
				InstallService(
					SERVICE_NAME,               // Name of service
					SERVICE_DISPLAY_NAME,       // Name to display
					SERVICE_START_TYPE,         // Service start type
					SERVICE_DEPENDENCIES,       // Dependencies
					SERVICE_ACCOUNT,            // Service running account
					SERVICE_PASSWORD            // Password of the account
					);
				exit(0);
			}
			else if (serviceControl == "remove")
			{
				UninstallService(SERVICE_NAME);
				exit(0);
			}
			else if (serviceControl != "none")
			{
				printf(" --service=install  to install the service.\n");
				printf(" --service=remove   to remove the service.\n");
			}
			
			if (isDaemon == 1)
			{
				LogPrint("Service session");
				I2PService service(SERVICE_NAME);
				if (!I2PService::Run(service))
				{
					LogPrint("Service failed to run w/err 0x%08lx\n", GetLastError());
					exit(EXIT_FAILURE);
				}
				exit(EXIT_SUCCESS);
			}
			else
				LogPrint("User session");

			return true;
		}
Exemplo n.º 5
0
HRESULT InstallService()
{
	TSAUTO();
	if(IsServiceInstalled()) {
		UninstallService();
	}
	wchar_t szPath[MAX_PATH];
    if(!GetModuleFileName(g_hModule, szPath, MAX_PATH)) {
		return HRESULT_FROM_WIN32(::GetLastError());
    }
	HRESULT hr = CreateGreenShieldService(szPath);
	return hr;
}
Exemplo n.º 6
0
		bool DaemonWin32::init(int argc, char* argv[])
		{
			setlocale(LC_CTYPE, "");
			SetConsoleCP(1251);
			SetConsoleOutputCP(1251);
			setlocale(LC_ALL, "Russian");

			if (!Daemon_Singleton::init(argc, argv))
				return false;

			std::string serviceControl; i2p::config::GetOption("svcctl", serviceControl);
			if (serviceControl == "install")
			{
				LogPrint(eLogInfo, "WinSVC: installing ", SERVICE_NAME, " as service");
				InstallService(
					SERVICE_NAME,               // Name of service
					SERVICE_DISPLAY_NAME,       // Name to display
					SERVICE_START_TYPE,         // Service start type
					SERVICE_DEPENDENCIES,       // Dependencies
					SERVICE_ACCOUNT,            // Service running account
					SERVICE_PASSWORD            // Password of the account
					);
				return false;
			}
			else if (serviceControl == "remove")
			{
				LogPrint(eLogInfo, "WinSVC: uninstalling ", SERVICE_NAME, " service");
				UninstallService(SERVICE_NAME);
				return false;
			}

			if (isDaemon)
			{
				LogPrint(eLogDebug, "Daemon: running as service");
				I2PService service(SERVICE_NAME);
				if (!I2PService::Run(service))
				{
					LogPrint(eLogError, "Daemon: Service failed to run w/err 0x%08lx\n", GetLastError());
					return false;
				}
				return false;
			}
			else
				LogPrint(eLogDebug, "Daemon: running as user");

			return true;
		}
Exemplo n.º 7
0
Arquivo: main.cpp Projeto: byteman/spi
int main(int argc, char* argv[])
{
    if (2 == argc)
    {
        if (0 == strcmp(argv[1], "install"))
        {
            if (InstallService())
            {
                printf("Installed service.");
                return 0;
            }
            else
            {
                printf("Installation failed.");
                return -1;
            }
        }
        else if (0 == strcmp(argv[1], "uninstall"))
        {
            if (UninstallService())
            {
                printf("Removed service.");
                return 0;
            }
            else
            {
                printf("Uninstall failed.");
                return -1;
            }
        }
    }
    else
    {
        SERVICE_TABLE_ENTRY dispatchTable[] = 
        {
            { serviceName, (LPSERVICE_MAIN_FUNCTION) ServiceMain },
            { NULL, NULL }
        };

        if (!StartServiceCtrlDispatcher(dispatchTable))
        {
            printf("Failed start service.");
            return -1;
        }
    }
	return 0;
}
int wmain( int argc, const wchar_t *argv[] )
{
#ifndef BUILD_SETUP
	if(argc==2)
	{
		if(wcscmp(L"-install",argv[1])==0)
			InstallService();
		else if (wcscmp(L"-uninstall",argv[1])==0)
			UninstallService();
		return 0;
	}
#endif
	SERVICE_TABLE_ENTRY DispatchTable[]={
		{(wchar_t*)g_ServiceName, ServiceMain},
		{NULL, NULL}
	};
	HKEY hKey;
	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"SOFTWARE\\IvoSoft\\ClassicShell",0,KEY_READ|KEY_WOW64_64KEY,&hKey)==ERROR_SUCCESS)
	{
		DWORD log;
		DWORD size=sizeof(log);
		if (RegQueryValueEx(hKey,L"LogService",0,NULL,(BYTE*)&log,&size)==ERROR_SUCCESS && log)
		{
			GetModuleFileName(NULL,g_LogName,_countof(g_LogName));
			PathRemoveFileSpec(g_LogName);
			PathAppend(g_LogName,L"service.log");
			LogText("Starting service\n");
		}

		DWORD dump;
		size=sizeof(dump);

		if (RegQueryValueEx(hKey,L"CrashDump",0,NULL,(BYTE*)&dump,&size)==ERROR_SUCCESS && dump>0)
		{
			if (dump==1) MiniDumpType=MiniDumpNormal;
			if (dump==2) MiniDumpType=MiniDumpWithDataSegs;
			if (dump==3) MiniDumpType=MiniDumpWithFullMemory;
			SetUnhandledExceptionFilter(TopLevelFilter);
		}
		RegCloseKey(hKey);
	}

	StartServiceCtrlDispatcher(DispatchTable);
	return 0;
}
Exemplo n.º 9
0
bool DaemonWin32::Init() {
  // TODO(unassigned): use Boost.Locale
  setlocale(LC_CTYPE, "");  // "" uses environment's default locale
  SetConsoleCP(65001);  // UTF-8
  SetConsoleOutputCP(65001);
  setlocale(LC_ALL, "");
  if (!Daemon_Singleton::Init())
    return false;
  if (I2PService::isService())
    m_isDaemon = 1;
  else
    m_isDaemon = 0;
  std::string serviceControl =
    i2p::util::config::varMap["service"].as<std::string>();
  if (serviceControl == "install") {
    InstallService(
        SERVICE_NAME,               // Name of service
        SERVICE_DISPLAY_NAME,       // Name to display
        SERVICE_START_TYPE,         // Service start type
        SERVICE_DEPENDENCIES,       // Dependencies
        SERVICE_ACCOUNT,            // Service running account
        SERVICE_PASSWORD);          // Password of the account
    exit(0);
  } else if (serviceControl == "remove") {
    UninstallService(SERVICE_NAME);
    exit(0);
  } else if (serviceControl != "none") {
    printf(" --service=install  to install the service.\n");
    printf(" --service=remove   to remove the service.\n");
  }
  if (m_isDaemon == 1) {
    LogPrint("Service session");
    I2PService service(SERVICE_NAME);
    if (!I2PService::Run(service)) {
      LogPrint("Service failed to run w/err 0x%08lx\n", GetLastError());
      exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
  } else {
    LogPrint("User session");
  }
  return true;
}
Exemplo n.º 10
0
/* In windows, our main() flows through here, before calling the 'real' main, smain() in inspircd.cpp */
int main(int argc, char* argv[])
{
	/* Check for parameters */
	if (argc > 1)
	{
		for (int i = 1; i < argc; i++)
		{
			if(!_stricmp(argv[i], "--installservice"))
			{
				InstallService();
				return 0;
			}
			if(!_stricmp(argv[i], "--uninstallservice") || !_stricmp(argv[i], "--removeservice"))
			{
				UninstallService();
				return 0;
			}
		}
	}

	SERVICE_TABLE_ENTRY serviceTable[] =
	{
		{ TEXT("InspIRCd"), (LPSERVICE_MAIN_FUNCTION)ServiceMain },
		{ NULL, NULL }
	};

	g_bRunningAsService = true;
	if( !StartServiceCtrlDispatcher(serviceTable) )
	{
		// This error means that the program was not started as service.
		if( GetLastError() == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT )
		{
			g_bRunningAsService = false;
			return smain(argc, argv);
		}
		else
		{
			return EXIT_STATUS_SERVICE;
		}
	}
	return 0;
}
Exemplo n.º 11
0
//
//  FUNCTION: wmain(int, wchar_t *[])
//
//  PURPOSE: entrypoint for the application.
// 
//  PARAMETERS:
//    argc - number of command line arguments
//    argv - array of command line arguments
//
//  RETURN VALUE:
//    none
//
//  COMMENTS:
//    wmain() either performs the command line task, or run the service.
//
int wmain(int argc, wchar_t *argv[])
{
	if ((argc > 1) && ((*argv[1] == L'-' || (*argv[1] == L'/'))))
	{
		if (_wcsicmp(L"install", argv[1] + 1) == 0)
		{
			// Install the service when the command is 
			// "-install" or "/install".
			InstallService(
				SERVICE_NAME,               // Name of service
				SERVICE_DISPLAY_NAME,       // Name to display
				SERVICE_START_TYPE,         // Service start type
				SERVICE_DEPENDENCIES,       // Dependencies
				SERVICE_ACCOUNT,            // Service running account
				SERVICE_PASSWORD            // Password of the account
				);
		}
		else if (_wcsicmp(L"remove", argv[1] + 1) == 0)
		{
			// Uninstall the service when the command is 
			// "-remove" or "/remove".
			UninstallService(SERVICE_NAME);
		}
	}
	else
	{
		wprintf(L"Parameters:\n");
		wprintf(L" -install  to install the service.\n");
		wprintf(L" -remove   to remove the service.\n");

		BackgroundTaskService service(SERVICE_NAME);
		if (!CServiceBase::Run(service))
		{
			wprintf(L"Service failed to run w/err 0x%08lx\n", GetLastError());
		}
	}

	return 0;
}
Exemplo n.º 12
0
BOOL Service::Execute(int argc, TCHAR **argv)
{
    // Check for installation options
    if (argc > 1) {
        if (_tcscmp(argv[1], _T("-i")) == 0) {
            if (IsInstalled())
                cerr << "service is already installed." << endl;
            else if (InstallService())
                cout << "service installed successfully." << endl;
            else cerr << "unable to install service." << endl;
        }
        else if (_tcscmp(argv[1], _T("-u")) == 0) {
            if (!IsInstalled())
                cerr << "service is not installed." << endl;
            else if (UninstallService())
                cout << "service uninstalled successfully." << endl;
            else cerr << "unable to uninstall service." << endl;
        }
        else cerr << usage << endl;

        return FALSE;
    }

    SERVICE_TABLE_ENTRY st[] = {
        (LPTSTR)m_name.c_str(), ServiceMain,
        NULL, NULL
    };

    if (!StartServiceCtrlDispatcher(st)) {
        // Check to see if we are running as a console
        if (GetLastError() == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) {
            ConsoleMain(argc, argv);
            return TRUE;
        }
        return FALSE;
    }

    return TRUE;
}
Exemplo n.º 13
0
HRESULT SetupInstallService()
{
	TSAUTO();
	wchar_t currentDllPath[MAX_PATH];
    if(!GetModuleFileName(g_hModule, currentDllPath, MAX_PATH)) {
		return HRESULT_FROM_WIN32(::GetLastError());
    }

	wchar_t serviceDllPath[MAX_PATH];
	if(!GetAllUsersPublicPath(serviceDllPath, MAX_PATH)) {
		TSERROR4CXX("Failed to get public path.");
		return false;
	}

	std::size_t pathLength = std::wcslen(serviceDllPath);
	if(pathLength == 0 || pathLength + 1 == sizeof(serviceDllPath) / sizeof(serviceDllPath[0])) {
		return false;
	}
	if(serviceDllPath[pathLength - 1] != '\\') {
		serviceDllPath[pathLength++] = '\\';
	}

	// ADClean\\addin\\CleanSvc.dll
	const wchar_t* addinSuffix = L"ADClean\\addin\\CleanSvc.dll";
	std::size_t addinSuffixLength = std::wcslen(addinSuffix);

	if(pathLength + addinSuffixLength + 1 > sizeof(serviceDllPath) / sizeof(serviceDllPath[0])) {
		return false;
	}
	std::copy(addinSuffix, addinSuffix + addinSuffixLength + 1, serviceDllPath + pathLength);

	if(IsServiceInstalled()) {
		if(::PathFileExists(serviceDllPath)) {
			// 版本比较
			DWORD old_v1, old_v2, old_v3, old_v4;
			DWORD new_v1, new_v2, new_v3, new_v4;
			if(!GetFileVersionNumber(serviceDllPath, old_v1, old_v2, old_v3, old_v4)
				|| !GetFileVersionNumber(currentDllPath, new_v1, new_v2, new_v3, new_v4)) {
				TSERROR4CXX("Failed to get file version number.");
				if(!GetFileVersionNumber(serviceDllPath, old_v1, old_v2, old_v3, old_v4)) {
					TSINFO4CXX(serviceDllPath);
				}
				else {
					TSINFO4CXX(currentDllPath);
				}
				return false;
			}
			if(old_v1 > new_v1 || old_v2 > new_v2 || old_v3 > new_v3 || old_v4 > new_v4) {
				TSERROR4CXX("The old service dll is later than this.");
				return false;
			}
		}
		UninstallService();
	}

	if(!CopyFilesToPublicFolder()) {
		TSERROR4CXX("CopyFilesToPublicFolder return false.");
		return E_FAIL;
	}

	return CreateGreenShieldService(serviceDllPath);
}
Exemplo n.º 14
0
/** main(int argc, char **argv)
 * ..
 */
int main(int argc, char **argv)
{
    char *tmpstr;
    char mypath[OS_MAXSTR +1];
    char myfinalpath[OS_MAXSTR +1];
    char myfile[OS_MAXSTR +1];

    /* Setting the name */
    OS_SetName(ARGV0);


    /* Find where I'm */
    mypath[OS_MAXSTR] = '\0';
    myfinalpath[OS_MAXSTR] = '\0';
    myfile[OS_MAXSTR] = '\0';


    /* mypath is going to be the whole path of the file */
    strncpy(mypath, argv[0], OS_MAXSTR);
    tmpstr = strrchr(mypath, '\\');
    if(tmpstr)
    {
        /* tmpstr is now the file name */
        *tmpstr = '\0';
        tmpstr++;
        strncpy(myfile, tmpstr, OS_MAXSTR);
    }
    else
    {
        strncpy(myfile, argv[0], OS_MAXSTR);
        mypath[0] = '.';
        mypath[1] = '\0';
    }
    chdir(mypath);
    getcwd(mypath, OS_MAXSTR -1);
    snprintf(myfinalpath, OS_MAXSTR, "\"%s\\%s\"", mypath, myfile);


    if(argc > 1)
    {
        if(strcmp(argv[1], "install-service") == 0)
        {
            return(InstallService(myfinalpath));
        }
        else if(strcmp(argv[1], "uninstall-service") == 0)
        {
            return(UninstallService());
        }
        else if(strcmp(argv[1], "start") == 0)
        {
            return(local_start());
        }
        else if(strcmp(argv[1], "-h") == 0)
        {
            agent_help();
        }
        else if(strcmp(argv[1], "help") == 0)
        {
            agent_help();
        }
        else
        {
            merror("%s: Unknown option: %s", ARGV0, argv[1]);
            exit(1);
        }
    }


    /* Start it */
    if(!os_WinMain(argc, argv))
    {
        ErrorExit("%s: Unable to start WinMain.", ARGV0);
    }

    return(0);
}
 bool WsGateService::ParseSpecialArgs(int argc, char **argv){
     if (argc < 2) {
         return false;
     }
     bool installed = false;
     try {
         installed = IsServiceInstalled();
     } catch (const tracing::runtime_error &e) {
         cerr << e.what() << endl;
         return true;
     }
     if (0 == strcmp(argv[1], "--query")) {
         // Report version of installed service
         cout << "The service is " << (installed ? "currently" : "not")
             << " installed." << endl;
         return true;
     }
     if (0 == strcmp(argv[1], "--start")) {
         // Start the service
         try {
             Start();
         } catch (const tracing::runtime_error &e) {
             cerr << "Failed to start " << m_sServiceName << endl;
             cerr << e.what() << endl;
         }
         return true;
     }
     if (0 == strcmp(argv[1], "--stop")) {
         // Start the service
         try {
             Stop();
         } catch (const tracing::runtime_error &e) {
             cerr << "Failed to stop " << m_sServiceName << endl;
             cerr << e.what() << endl;
         }
         return true;
     }
     if (0 == strcmp(argv[1], "--install")) {
         // Install the service
         if (installed) {
             cout << m_sServiceName << " is already installed." << endl;
         } else {
             try {
                 InstallService();
                 cout << m_sServiceName << " installed." << endl;
             } catch (const tracing::runtime_error &e) {
                 cerr << "Failed to install " << m_sServiceName << endl;
                 cerr << e.what() << endl;
             }
         }
         return true;
     }
     if (0 == strcmp(argv[1], "--remove")) {
         // Remove the service
         if (!installed) {
             cout << m_sServiceName << " is not installed." << endl;
         } else {
             try {
                 UninstallService();
                 cout << m_sServiceName << " removed." << endl;
             } catch (const tracing::runtime_error &e) {
                 cerr << "Failed to remove " << m_sServiceName << endl;
                 cerr << e.what() << endl;
             }
         }
         return true;
     }
     return false;
 }
bool InstallService(PWSTR pszServiceName,
	PWSTR pszDisplayName,
	DWORD dwStartType,
	PWSTR pszDependencies,
	PWSTR pszAccount,
	PWSTR pszPassword)
{

	UninstallService(pszServiceName);
	//std::ofstream file("c:\\users\\slee\\desktop\\text.txt", std::ios::app);
	wchar_t szPath[MAX_PATH];
	bool ret = false;
	if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)) == 0) {
		//file << "GetModuleFileName failed w/err " << GetLastError() << std::endl;
		//wprintf(L"GetModuleFileName failed w/err 0x%08lx\n", GetLastError());
		return false;
	}

	std::wstring tmp(szPath);
	tmp = L"\"" + tmp + L"\"";
	wcsncpy_s(szPath, tmp.c_str(), tmp.size()+1);

	auto schSCManager = RAIISC_HANDLE(OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE));
	if (schSCManager.get() == nullptr) {
		//file << "OpenSCManager failed w/err " << GetLastError() << std::endl;
		//wprintf(L"OpenSCManager failed w/err 0x%08lx\n", GetLastError());
	}
	else {
		wcscat_s(szPath, L" -service_mon");
		// Install the service into SCM by calling CreateService
		auto schService = RAIISC_HANDLE(CreateService(
			schSCManager.get(),                   // SCManager database
			pszServiceName,                 // Name of service
			pszDisplayName,                 // Name to display
			SERVICE_ALL_ACCESS,           // Desired access
			SERVICE_WIN32_OWN_PROCESS,      // Service type
			dwStartType,                    // Service start type
			SERVICE_ERROR_NORMAL,           // Error control type
			szPath,                         // Service's binary
			NULL,                           // No load ordering group
			NULL,                           // No tag identifier
			pszDependencies,                // Dependencies
			pszAccount,                     // Service running account
			pszPassword                     // Password of the account
			));
		if (schService.get() == nullptr){
	/*		file << "CreateService failed w/err " << GetLastError() << std::endl;
			DEBUG_MSG("CreateService failed w / err %", GetLastError());*/
			return false;
		}
		else {
		//	RemoteDesktop::EventLog::WriteLog(L"Service Installed " + std::wstring(pszServiceName), RemoteDesktop::EventLog::EventType::INFORMATIONAL, RemoteDesktop::EventLog::EventCategory::NETWORK_CATEGORY, RemoteDesktop::EventLog::EventID::SERVICE);
		//	file << "Service is installed" << std::endl;
			//wprintf(L"%s is installed.\n", pszServiceName);

			SERVICE_STATUS_PROCESS ssStatus;
			DWORD dwOldCheckPoint;
			DWORD dwStartTickCount;
			DWORD dwWaitTime;
			DWORD dwBytesNeeded;

			// Check the status in case the service is not stopped. 

			if (!QueryServiceStatusEx(
				schService.get(),                     // handle to service 
				SC_STATUS_PROCESS_INFO,         // information level
				(LPBYTE)&ssStatus,             // address of structure
				sizeof(SERVICE_STATUS_PROCESS), // size of structure
				&dwBytesNeeded))              // size needed if buffer is too small
			{
				//printf("QueryServiceStatusEx failed (%d)\n", GetLastError());
				return false;
			}

			// Check if the service is already running. It would be possible 
			// to stop the service here, but for simplicity this example just returns. 

			if (ssStatus.dwCurrentState != SERVICE_STOPPED && ssStatus.dwCurrentState != SERVICE_STOP_PENDING)
			{
				//printf("Cannot start the service because it is already running\n");
				return false;
			}

			// Save the tick count and initial checkpoint.

			dwStartTickCount = GetTickCount();
			dwOldCheckPoint = ssStatus.dwCheckPoint;

			// Wait for the service to stop before attempting to start it.

			while (ssStatus.dwCurrentState == SERVICE_STOP_PENDING)
			{
				// Do not wait longer than the wait hint. A good interval is 
				// one-tenth of the wait hint but not less than 1 second  
				// and not more than 10 seconds. 

				dwWaitTime = ssStatus.dwWaitHint / 10;

				if (dwWaitTime < 1000)
					dwWaitTime = 1000;
				else if (dwWaitTime > 10000)
					dwWaitTime = 10000;

				Sleep(dwWaitTime);

				// Check the status until the service is no longer stop pending. 

				if (!QueryServiceStatusEx(
					schService.get(),                     // handle to service 
					SC_STATUS_PROCESS_INFO,         // information level
					(LPBYTE)&ssStatus,             // address of structure
					sizeof(SERVICE_STATUS_PROCESS), // size of structure
					&dwBytesNeeded))              // size needed if buffer is too small
				{
					//printf("QueryServiceStatusEx failed (%d)\n", GetLastError());
					return false;
				}

				if (ssStatus.dwCheckPoint > dwOldCheckPoint)
				{
					// Continue to wait and check.

					dwStartTickCount = GetTickCount();
					dwOldCheckPoint = ssStatus.dwCheckPoint;
				}
				else
				{
					if (GetTickCount() - dwStartTickCount > ssStatus.dwWaitHint)
					{
						//printf("Timeout waiting for service to stop\n");
						return false;
					}
				}
			}

			// Attempt to start the service.

			if (!StartService( schService.get(),  0, NULL)) 
			{
				//printf("StartService failed (%d)\n", GetLastError());
				return false;
			}
		//	else printf("Service start pending...\n");

			// Check the status until the service is no longer start pending. 

			if (!QueryServiceStatusEx(
				schService.get(),                     // handle to service 
				SC_STATUS_PROCESS_INFO,         // info level
				(LPBYTE)&ssStatus,             // address of structure
				sizeof(SERVICE_STATUS_PROCESS), // size of structure
				&dwBytesNeeded))              // if buffer too small
			{
				//printf("QueryServiceStatusEx failed (%d)\n", GetLastError());
				return false;
			}

			// Save the tick count and initial checkpoint.

			dwStartTickCount = GetTickCount();
			dwOldCheckPoint = ssStatus.dwCheckPoint;

			while (ssStatus.dwCurrentState == SERVICE_START_PENDING)
			{
				// Do not wait longer than the wait hint. A good interval is 
				// one-tenth the wait hint, but no less than 1 second and no 
				// more than 10 seconds. 

				dwWaitTime = ssStatus.dwWaitHint / 10;

				if (dwWaitTime < 1000)
					dwWaitTime = 1000;
				else if (dwWaitTime > 10000)
					dwWaitTime = 10000;

				Sleep(dwWaitTime);

				// Check the status again. 

				if (!QueryServiceStatusEx(
					schService.get(),             // handle to service 
					SC_STATUS_PROCESS_INFO, // info level
					(LPBYTE)&ssStatus,             // address of structure
					sizeof(SERVICE_STATUS_PROCESS), // size of structure
					&dwBytesNeeded))              // if buffer too small
				{
					//printf("QueryServiceStatusEx failed (%d)\n", GetLastError());
					break;
				}

				if (ssStatus.dwCheckPoint > dwOldCheckPoint)
				{
					// Continue to wait and check.

					dwStartTickCount = GetTickCount();
					dwOldCheckPoint = ssStatus.dwCheckPoint;
				}
				else
				{
					if (GetTickCount() - dwStartTickCount > ssStatus.dwWaitHint)
					{
						// No progress made within the wait hint.
						break;
					}
				}
			}

			// Determine whether the service is running.

			if (ssStatus.dwCurrentState == SERVICE_RUNNING)
			{
				//printf("Service started successfully.\n");
				return true;
			}
			else
			{
		/*		printf("Service not started. \n");
				printf("  Current State: %d\n", ssStatus.dwCurrentState);
				printf("  Exit Code: %d\n", ssStatus.dwWin32ExitCode);
				printf("  Check Point: %d\n", ssStatus.dwCheckPoint);
				printf("  Wait Hint: %d\n", ssStatus.dwWaitHint);*/
				return false;
			}
			//return StartService(schService.get(), 0, NULL) == TRUE;
		}
	}
	return false;
}
Exemplo n.º 17
0
bool InstallService()
{
	SC_HANDLE hSCManager = NULL;
	SC_HANDLE hService = NULL;
	bool ret = false;

	do 
	{
		hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
		if (NULL == hSCManager) {
			break;;
		}

		hService = CreateService(hSCManager, srvName, srvName,
			SERVICE_ALL_ACCESS,
			SERVICE_KERNEL_DRIVER,
			srvStartType,
			SERVICE_ERROR_NORMAL,
			srvFilePath,
			NULL,
			NULL,
			NULL,
			NULL,
			NULL);
		if (hService == NULL) {
			hService = OpenService(hSCManager, srvName, SERVICE_ALL_ACCESS);
			if (hService == NULL) {
				break;
			}
		}

		if (StartService(hService, 0, NULL) == NULL) {
			break;
		}


		SERVICE_STATUS_PROCESS ssStatus;
		DWORD dwBytesNeeded;

		if (!QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssStatus,
			sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeeded)) {
			break;
		}

		DWORD dwStartTickCount = GetTickCount();
		DWORD dwOldCheckPoint = ssStatus.dwCheckPoint;
		DWORD dwWaitTime;
		while (ssStatus.dwCurrentState == SERVICE_START_PENDING) 
		{
			dwWaitTime = ssStatus.dwWaitHint / 10;
			if (dwWaitTime < 1000)
				dwWaitTime = 1000;
			else if (dwWaitTime > 10000)
				dwWaitTime = 10000;

			Sleep(dwWaitTime);
			if (!QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssStatus,
				sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeeded)) {
				break;
			}

			if (ssStatus.dwCheckPoint > dwOldCheckPoint)
			{
				dwStartTickCount = GetTickCount();
				dwOldCheckPoint = ssStatus.dwCheckPoint;
			}
			else
			{
				if (GetTickCount() - dwStartTickCount > ssStatus.dwWaitHint)
				{
					break;
				}
			}
		}

		if (ssStatus.dwCurrentState == SERVICE_RUNNING) {
			ret = true;
		}
		
	} while (0);

	if (!ret) {
		UninstallService();
	}
	if (hService) {
		CloseServiceHandle(hService);
	}
	if (hSCManager) {
		CloseServiceHandle(hSCManager);
	}

	return ret;
}
Exemplo n.º 18
0
Arquivo: main.c Projeto: lundman/llink
void arguments(int argc, char **argv)
{
	int opt;

	while ((opt=getopt(argc, argv,
					   "hdv:f:w:xXsLp:V"
#ifdef WIN32
					   "IUN:P"
#endif
					   )) != -1) {

		switch(opt) {

		case 'h':
			options(argv[0]);
			break;

		case 'd':
			foreground = 1;
			break;

		case 'v':
			debug_on=atoi(optarg);
			if (!debug_on) debug_options();
			break;

		case 'f':
			SAFE_DUPE(conf_file, optarg);
			break;

		case 'w':
			chdir(optarg);
			break;

		case 'p':
			SAFE_DUPE(conf_pidfile, optarg);
			break;

		case 'x':
			conf_xmlscan = 1;
			printf("This needs to be implemented, use -X\n");
			break;

		case 'X':
			conf_xmlscan = 2;
			break;

		case 's':
			conf_fixup_syabas_subtitles = 1;
			break;

		case 'L':
			conf_fixup_nokeepalive = 0;
			break;

		case 'V':
			conf_fixup_childCount = 1;
			break;

#ifdef WIN32
		case 'I':
			// When started as service, we demand -P dir before the rest, which
			// includes the -I we have to ignore.
			if (!windows_service) {
				windows_service = 1;
				InstallService(argc,argv);
				_exit(0);
			}
			break;
		case 'N':
			SAFE_DUPE(g_pzServiceName, optarg);
			break;
		case 'U':
			UninstallService();
			exit(0);
			break;
		case 'P':
			windows_service = 1;
			break;
#endif

		default:
			printf("Unknown option. '%c'\n", opt);
			options(argv[0]);
			break;
		}
	}

	argc -= optind;
	argv += optind;

	// argc and argv adjusted here.



}
Exemplo n.º 19
0
int main( int argc, char* argv[] )
{
  i2p::util::config::OptionParser(argc,argv);
  volatile int isDaemon = i2p::util::config::GetArg("-daemon", 0);
#ifdef _WIN32
  setlocale(LC_CTYPE, "");
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  setlocale(LC_ALL, "Russian");
#endif


  LogPrint("\n\n\n\ni2pd starting\n");
  LogPrint("data directory: ", i2p::util::filesystem::GetDataDir().string());
  i2p::util::filesystem::ReadConfigFile(i2p::util::config::mapArgs, i2p::util::config::mapMultiArgs);


#ifdef _WIN32
	std::string serviceControl = i2p::util::config::GetArg("-service", "none");
	if (serviceControl == "install")
	{
		InstallService(
			SERVICE_NAME,               // Name of service
			SERVICE_DISPLAY_NAME,       // Name to display
			SERVICE_START_TYPE,         // Service start type
			SERVICE_DEPENDENCIES,       // Dependencies
			SERVICE_ACCOUNT,            // Service running account
			SERVICE_PASSWORD            // Password of the account
			);
		return 0;
	}
	else if (serviceControl == "remove")
	{
		UninstallService(SERVICE_NAME);
		return 0;
	}
	else if (serviceControl != "none")
	{
		printf(" --service=install  to install the service.\n");
		printf(" --service=remove   to remove the service.\n");
		return 0;
	}
	else if (isDaemon)
	{
		std::string logfile = i2p::util::filesystem::GetDataDir().string();
		logfile.append("\\debug.log");
		FILE* openResult = freopen(logfile.c_str(), "a", stdout);
		if (!openResult)
		{
			return -17;
		}
		LogPrint("Service logging enabled.");
		I2PService service(SERVICE_NAME);
		if (!I2PService::Run(service))
		{
			LogPrint("Service failed to run w/err 0x%08lx\n", GetLastError());
		}
		return 0;
	}
#endif


  if (isLogging == 1)
  {
    std::string logfile = i2p::util::filesystem::GetDataDir().string();
#ifndef _WIN32
    logfile.append("/debug.log");
#else
    logfile.append("\\debug.log");
#endif
    FILE* openResult = freopen(logfile.c_str(),"a",stdout);
	// It seems that we need to add FLUSH() for LogPrint and call it in some important places
	if (!openResult)
	{
		LogPrint("Can't do [freopen()].");
		return -17;
	}
    LogPrint("Logging to file enabled.");
  }


#ifndef _WIN32
  if (isDaemon == 1)
  {
    pid_t pid;
    pid = fork();
    if (pid > 0)
    {
      g_Log.Stop();
      return 0;
    }
    if (pid < 0)
    {
      return -1;
    }

    umask(0);
    int sid = setsid();
    if (sid < 0)
    {
      LogPrint("Error, could not create process group.");
      return -1;
    }
    chdir(i2p::util::filesystem::GetDataDir().string().c_str());
  }

  // Pidfile
  std::string pidfile = i2p::util::filesystem::GetDataDir().string();
  pidfile.append("/i2pd.pid");
  int pidFilehandle = open(pidfile.c_str(), O_RDWR|O_CREAT, 0600);
  if (pidFilehandle == -1 )
  {
    LogPrint("Error, could not create pid file (", pidfile, ")\nIs an instance already running?");
    return -1;
  }
  if (lockf(pidFilehandle,F_TLOCK,0) == -1)
  {
    LogPrint("Error, could not lock pid file (", pidfile, ")\nIs an instance already running?");
    return -1;
  }
  char pid[10];
  sprintf(pid,"%d\n",getpid());
  write(pidFilehandle, pid, strlen(pid));

  // Signal handler
  struct sigaction sa;
  sa.sa_handler = handle_signal;
  sigemptyset(&sa.sa_mask);
  sa.sa_flags = SA_RESTART;
  sigaction(SIGHUP,&sa,0);
  sigaction(SIGABRT,&sa,0);
  sigaction(SIGTERM,&sa,0);
  sigaction(SIGINT,&sa,0);
#endif

  //TODO: This is an ugly workaround. fix it.
  //TODO: Autodetect public IP.
  i2p::context.OverrideNTCPAddress(i2p::util::config::GetCharArg("-host", "127.0.0.1"),
      i2p::util::config::GetArg("-port", 17070));

  i2p::util::HTTPServer httpServer (i2p::util::config::GetArg("-httpport", 7070));

  httpServer.Start ();
  i2p::data::netdb.Start ();
  i2p::transports.Start ();
  i2p::tunnel::tunnels.Start ();

  while (running)
  {
    //TODO Meeh: Find something better to do here.
    std::this_thread::sleep_for (std::chrono::seconds(1));
  }
  LogPrint("Shutdown started.");

  i2p::tunnel::tunnels.Stop ();
  i2p::transports.Stop ();
  i2p::data::netdb.Stop ();
  httpServer.Stop ();

  if (isLogging == 1)
  {
    fclose (stdout);
  }
#ifndef _WIN32
  close(pidFilehandle);
  unlink(pidfile.c_str());
#endif
  return 0;
}
Exemplo n.º 20
0
int __cdecl main(int argc, char* argv[]) {
    ::SetDllDirectory("");

#ifndef _WIN64
    HINSTANCE hKernel32 = ::LoadLibrary("Kernel32.dll");

    typedef BOOL (WINAPI * SPDEPP)(DWORD);
    SPDEPP pSPDEPP = (SPDEPP)::GetProcAddress(hKernel32, "SetProcessDEPPolicy");

    if(pSPDEPP != NULL) {
        pSPDEPP(PROCESS_DEP_ENABLE);
    }

    ::FreeLibrary(hKernel32);
#endif

	sTitle = "PtokaX DC Hub " + string(PtokaXVersionString);
#ifdef _DEBUG
	sTitle += " [debug]";
#endif

#ifdef _DEBUG
//    AllocConsole();
//    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
//    Cout("PtokaX Debug console\n");
#endif
	
	char sBuf[MAX_PATH+1];
	::GetModuleFileName(NULL, sBuf, MAX_PATH);
	char * sPath = strrchr(sBuf, '\\');
	if(sPath != NULL) {
		PATH = string(sBuf, sPath-sBuf);
	} else {
		PATH = sBuf;
	}

	char * sServiceName = NULL;
	
	bool bInstallService = false;
	
	for(int i = 0; i < argc; i++) {
	    if(stricmp(argv[i], "-s") == NULL || stricmp(argv[i], "/service") == NULL) {
	    	if(++i == argc) {
	            AppendLog("Missing service name!");
	            return EXIT_FAILURE;
	    	}
	    	sServiceName = argv[i];
	    	bService = true;
	    } else if(stricmp(argv[i], "-c") == 0) {
	        if(++i == argc) {
	            printf("Missing config directory!");
	            return EXIT_FAILURE;
	        }
	
	        size_t szLen = strlen(argv[i]);
	        if(szLen >= 1 && argv[i][0] != '\\' && argv[i][0] != '/') {
	            if(szLen < 4 || (argv[i][1] != ':' || (argv[i][2] != '\\' && argv[i][2] != '/'))) {
	                printf("Config directory must be absolute path!");
	                return EXIT_FAILURE;
	            }
	    	}
	
	    	if(argv[i][szLen - 1] == '/' || argv[i][szLen - 1] == '\\') {
	            PATH = string(argv[i], szLen - 1);
	    	} else {
	            PATH = string(argv[i], szLen);
	        }
	    
	        if(DirExist(PATH.c_str()) == false) {
	            if(CreateDirectory(PATH.c_str(), NULL) == 0) {
	                printf("Config directory not exist and can't be created!");
	                return EXIT_FAILURE;
	            }
	        }
	    } else if(stricmp(argv[i], "-i") == NULL || stricmp(argv[i], "/install") == NULL) {
	    	if(++i == argc) {
	            printf("Please specify service name!");
	    		return EXIT_FAILURE;
	    	}
	    	sServiceName = argv[i];
	    	bInstallService = true;
	    } else if(stricmp(argv[i], "-u") == NULL || stricmp(argv[i], "/uninstall") == NULL) {
	    	if(++i == argc) {
	            printf("Please specify service name!");
	    		return EXIT_FAILURE;
	    	}
	    	sServiceName = argv[i];
	    	return UninstallService(sServiceName);
	    } else if(stricmp(argv[i], "-v") == NULL || stricmp(argv[i], "/version") == NULL) {
	    	printf((sTitle+" built on "+__DATE__+" "+__TIME__).c_str());
	    	return EXIT_SUCCESS;
	    } else if(stricmp(argv[i], "-h") == NULL || stricmp(argv[i], "/help") == NULL) {
	    	printf("PtokaX [-c <configdir>] [-i <servicename>] [-u <servicename>] [-v]");
	    	return EXIT_SUCCESS;
	    } else if(stricmp(argv[i], "/nokeycheck") == NULL) {
	        bCmdNoKeyCheck = true;
	    } else if(stricmp(argv[i], "/generatexmllanguage") == NULL) {
	        LangMan::GenerateXmlExample();
	        return EXIT_SUCCESS;
	    }
	}

	if(bInstallService == true) {
	    if(sPath == NULL && strcmp(PATH.c_str(), sBuf) == 0) {
	        return InstallService(sServiceName, NULL);
		} else {
			return InstallService(sServiceName, PATH.c_str());
		}
	}

    ExceptionHandlingInitialize(PATH, sBuf);

	if(bService == false) {
	    ServerInitialize();
	
	    if(ServerStart() == false) {
	        printf("Server start failed!");

            ExceptionHandlingUnitialize();

	        return EXIT_FAILURE;
	    } else {
	        printf((sTitle+" running...\n").c_str());
	    }

	    MSG msg;
	    BOOL bRet;

	    while((bRet = ::GetMessage(&msg, NULL, 0, 0)) != 0) {
	        if(bRet == -1) {
	            // handle the error and possibly exit
	        } else {
	            if(msg.message == WM_USER+1) {
	                break;
	            } else if(msg.message == WM_TIMER) {
                    if(msg.wParam == srvLoopTimer) {
                        srvLoop->Looper();
                    } else if(msg.wParam == regtimer) {
                        ServerOnRegTimer();
                    } else {
                        //Must be script timer
                        ScriptOnTimer(msg.wParam);
                    }
                }
	
	    		::TranslateMessage(&msg);
	            ::DispatchMessage(&msg);
	        }
	    }

        ExceptionHandlingUnitialize();
	} else {
	    SERVICE_TABLE_ENTRY DispatchTable[] = {
	        { sServiceName, StartService },
	        { NULL, NULL }
	    };
	       
	    if(StartServiceCtrlDispatcher(DispatchTable) == false) {
			AppendLog("StartServiceCtrlDispatcher failed ("+string((uint32_t)GetLastError())+")!");

            ExceptionHandlingUnitialize();

	        return EXIT_FAILURE;
	    }
	}

    return EXIT_SUCCESS;
}
Exemplo n.º 21
0
int _tmain(int argc, char* argv[])//lint !e752 !e1768 !e1727
{
	//打开日志
	std::string strIniPath = eLTE_Tool::GetServicePath();
	strIniPath.append(LOG_INI_FILE_NAME);
	unsigned int logLevel[LOG_CATEGORY] = {INVALID_LOG_LEVEL,INVALID_LOG_LEVEL,INVALID_LOG_LEVEL};
	std::string strLogPath = eLTE_Tool::GetServicePath();
	strLogPath.append("log");
	int iRet = LOG_INIT(strIniPath.c_str(), logLevel, strLogPath.c_str());
	if(RET_SUCCESS != iRet)
	{
		return eLTE_SDK_ERR_LOG_INIT;
	}
	
	LOG_TRACE();

	if (INSTALL_AGRC == argc && NULL != argv)
	{
		if (0 == _stricmp(argv[1], "/install") || 0 == _stricmp(argv[1], "-install"))
		{
			InstallService();
		}
		else if (0 == _stricmp(argv[1], "/uninstall") || 0 == _stricmp(argv[1], "-uninstall"))
		{
			UninstallService();
		}
	}
	else
	{
		SERVICE_TABLE_ENTRY svcTable[2];
		svcTable[0].lpServiceName = MY_SERVICE_NAME;
		svcTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTIONA)ServiceMain;
		svcTable[1].lpServiceName = NULL;
		svcTable[1].lpServiceProc = NULL;

		if (!StartServiceCtrlDispatcher(svcTable))
		{
			LOG_RUN_ERROR("StartServiceCtrlDispatcher failed.");
		}
	}

	// 用于直接以普通应用程序的形式启动服务器,方便debug调试服务程序业务

	// 初始化SDK
	//int iRet = AppContextMgr::Instance().Init();
	//if (eLTE_SVC_ERR_SUCCESS != iRet)
	//{
	//	LOG_RUN_ERROR("Init elte sdk failed.(%d)", iRet);
	//}
	//else
	//{
	//	// 开启业务监听
	//	StartRun();

	//	// 退出SDK
	//	iRet = AppContextMgr::Instance().Exit();
	//	if (eLTE_SVC_ERR_SUCCESS != iRet)
	//	{
	//		LOG_RUN_ERROR("Exit elte sdk failed.(%d)", iRet);
	//	}
	//}

	LOG_EXIT();
	return 0;
}//lint !e818