Search code examples
c++windowswinapiservice

How to create service which restarts on crash


I am creating a service using CreateService. The service will run again fine if it happens to crash and I would like to have Windows restart the service if it crashes. I know it is possible to set this up from the services msc see below.

Windows Service Recovery Dialog

How can I programatically configure the service to always restart if it happens to crash.


Solution

  • You want to call ChangeServiceConfig2 after you've installed the service. Set the second parameter to SERVICE_CONFIG_FAILURE_ACTIONS and pass in an instance of SERVICE_FAILURE_ACTIONS as the third parameter, something like this:

    int numBytes = sizeof(SERVICE_FAILURE_ACTIONS) + sizeof(SC_ACTION);
    std::vector<char> buffer(numBytes);
    
    SERVICE_FAILURE_ACTIONS *sfa = reinterpret_cast<SERVICE_FAILURE_ACTIONS *>(&buffer[0]);
    sfa.dwResetPeriod = INFINITE;
    sfa.cActions = 1;
    sfa.lpsaActions[0].Type = SC_ACTION_RESTART;
    sfa.lpsaActions[0].Delay = 5000; // wait 5 seconds before restarting
    
    ChangeServiceConfig2(hService, SERVICE_CONFIG_FAILURE_ACTIONS, sfa);