Beispiel #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);
}
Beispiel #2
0
static void WINAPI ServiceCtrlHandler(DWORD code)
{
    WINE_TRACE("%d\n", code);

    switch (code)
    {
        case SERVICE_CONTROL_SHUTDOWN:
        case SERVICE_CONTROL_STOP:
            UpdateSCMStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
            KillService();
            return;
        default:
            fprintf(stderr, "Unhandled service control code: %d\n", code);
            break;
    }

    UpdateSCMStatus(SERVICE_RUNNING, NO_ERROR, 0);
}
Beispiel #3
0
VOID ServiceCtrlHandler(DWORD controlCode)
{
    BOOL success;
    DWORD serviceCurrentStatus = controlCode;

    switch (controlCode)
    {
    case SERVICE_CONTROL_PAUSE:
        if (g_serviceRunning && !g_servicePaused)
        {
            success = UpdateSCMStatus(SERVICE_PAUSE_PENDING, NO_ERROR, 0, 1, 1000);
            g_servicePaused = TRUE;
        }
        break;

    case SERVICE_CONTROL_CONTINUE:
        if (g_serviceRunning && g_servicePaused)
        {
            success = UpdateSCMStatus(SERVICE_CONTINUE_PENDING, NO_ERROR, 0, 1, 1000);
            g_servicePaused = FALSE;
        }
        break;

    case SERVICE_CONTROL_INTERROGATE:
        break;

    case SERVICE_CONTROL_SHUTDOWN:
    case SERVICE_CONTROL_STOP:
        success = UpdateSCMStatus(SERVICE_STOP_PENDING, NO_ERROR, 0, 1, 5000);
        KillService();
        return;

    default:
        break;
    }

    UpdateSCMStatus(serviceCurrentStatus, NO_ERROR, 0, 0, 0);
}
Beispiel #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);
}