Exemple #1
0
static void WINAPI ServiceMain(DWORD argc, LPSTR *argv)
{
    hstatus = RegisterServiceCtrlHandlerA("MSIServer", ServiceCtrlHandler);
    if (!hstatus)
    {
        fprintf(stderr, "Failed to register service ctrl handler\n");
        return;
    }

    UpdateSCMStatus(SERVICE_START_PENDING, NO_ERROR, 0);

    kill_event = CreateEventW(0, TRUE, FALSE, 0);
    if (!kill_event)
    {
        fprintf(stderr, "Failed to create event\n");
        KillService();
        UpdateSCMStatus(SERVICE_STOPPED, NO_ERROR, 0);
        return;
    }

    if (!StartServiceThread())
    {
        KillService();
        UpdateSCMStatus(SERVICE_STOPPED, NO_ERROR, 0);
        return;
    }

    UpdateSCMStatus(SERVICE_RUNNING, NO_ERROR, 0);

    WaitForSingleObject(kill_event, INFINITE);
    KillService();

    UpdateSCMStatus(SERVICE_STOPPED, NO_ERROR, 0);
}
void SFServiceController::ServiceMain(DWORD argc, LPTSTR *argv)
{
	UNREFERENCED_PARAMETER(argc);

	BOOL success;
	nServiceStatusHandle = RegisterServiceCtrlHandler(argv[0],
		(LPHANDLER_FUNCTION)ServiceCtrlHandler);
	if(!nServiceStatusHandle)
	{
		return;
	}
	success=UpdateServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,1,3000);
	if(!success)
	{
		return;
	}
	killServiceEvent=CreateEvent(0,TRUE,FALSE,0);
	if(killServiceEvent==NULL)
	{
		return;
	}
	success=UpdateServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,2,1000);
	if(!success)
	{
		return;
	}
	success=StartServiceThread();
	if(!success)
	{
		return;
	}
	nServiceCurrentStatus=SERVICE_RUNNING;
	success=UpdateServiceStatus(SERVICE_RUNNING,NO_ERROR,0,0,0);
	if(!success)
	{
		return;
	}
	WaitForSingleObject(killServiceEvent,INFINITE);
	CloseHandle(killServiceEvent);
}
//--------------------------------------------------------------------------------
BOOL CNTService::ProcessCommandLine(LPCTSTR pCmdLine)
	{
	AFX_MANAGE_STATE_IF_DLL

	CCmdLine cmdLine(pCmdLine);
	int nIndex;
	if(cmdLine.HasParam('D', nIndex) || cmdLine.HasParam(_T("-debug"), nIndex))
		return FALSE;

	if(cmdLine.HasParam('I', nIndex) || cmdLine.HasParam(_T("-install"), nIndex))
		{
		InstallService();
		return TRUE;
		}

	if(cmdLine.HasParam('R', nIndex) || cmdLine.HasParam(_T("-remove"), nIndex))
		{
		RemoveService();
		return TRUE;
		}

	if(cmdLine.HasParam('E', nIndex) || cmdLine.HasParam(_T("-end"), nIndex) || cmdLine.HasParam(_T("-stop"), nIndex))
		{
		EndService();
		return TRUE;
		}

	if(cmdLine.HasParam('S', nIndex) || cmdLine.HasParam(_T("-start"), nIndex))
		{
		StartupService();
		return TRUE;
		}

	StartServiceThread();
	return FALSE;
	}
Exemple #4
0
VOID ServiceMain(DWORD argc, LPTSTR *argv)
{
#if _DEBUG
    ::OutputDebugString(L"ServiceMain started.\n");
#endif

    BOOL success;
    g_serviceStatusHandle = RegisterServiceCtrlHandler(SERVICE_NAME,
        (LPHANDLER_FUNCTION)ServiceCtrlHandler);

    if (!g_serviceStatusHandle)
    {
        OutputError(L"RegisterServiceCtrlHandler fails! (%d)", GetLastError());
        return;
    }

    do
    {
        success = UpdateSCMStatus(SERVICE_START_PENDING, NO_ERROR, 0, 1, 5000);
        if (!success)
        {
            OutputError(L"1. UpdateSCMStatus fails! (%d)", GetLastError());
            break;
        }

        g_killSafeExitEvent = CreateEvent(0, TRUE, FALSE, 0);
        if (!g_killSafeExitEvent)
        {
            OutputError(L"CreateEvent-2 fails! (%d)", GetLastError());
            break;
        }

        success = UpdateSCMStatus(SERVICE_START_PENDING, NO_ERROR, 0, 2, 1000);
        if (!success)
        {
            OutputError(L"2. UpdateSCMStatus fails! (%d)", GetLastError());
            break;
        }

        success = UpdateSCMStatus(SERVICE_START_PENDING, NO_ERROR, 0, 3, 5000);
        if (!success)
        {
            OutputError(L"3. UpdateSCMStatus fails! (%d)", GetLastError());
            break;
        }

        success = StartServiceThread();
        if (!success)
        {
            OutputError(L"StartServiceThread fails! (%d)", GetLastError());
            break;
        }

        success = UpdateSCMStatus(SERVICE_RUNNING, NO_ERROR, 0, 0, 0);
        if (!success)
        {
            OutputError(L"4. UpdateSCMStatus fails! (%d)", GetLastError());
            break;
        }

#if _DEBUG
        ::OutputDebugString(L"WaitForSingleObject - started.\n");
#endif

        WaitForSingleObject(g_killSafeExitEvent, INFINITE);

        UpdateSCMStatus(SERVICE_STOPPED, NO_ERROR, 0, 0, 0);

#if _DEBUG
        ::OutputDebugString(L"WaitForSingleObject - end.\n");
#endif
    } while (false);
}