* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "precomp.h"
+#define WIN32_LEAN_AND_MEAN
+
+#include <stdio.h>
+#include <windows.h>
+#include <winsvc.h>
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(msiexec);
static SERVICE_STATUS_HANDLE hstatus;
status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
status.dwCurrentState = dwCurrentState;
- if (dwCurrentState == SERVICE_START_PENDING)
+ if (dwCurrentState == SERVICE_START_PENDING
+ || dwCurrentState == SERVICE_STOP_PENDING
+ || dwCurrentState == SERVICE_STOPPED)
status.dwControlsAccepted = 0;
else
{
case SERVICE_CONTROL_STOP:
UpdateSCMStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
KillService();
- return;
+ break;
default:
fprintf(stderr, "Unhandled service control code: %u\n", code);
+ UpdateSCMStatus(SERVICE_RUNNING, NO_ERROR, 0);
break;
}
-
- UpdateSCMStatus(SERVICE_RUNNING, NO_ERROR, 0);
}
static DWORD WINAPI ServiceExecutionThread(LPVOID param)
{
- while (TRUE)
- {
- /* do nothing */
- }
+ WaitForSingleObject(kill_event, INFINITE);
return 0;
}
{
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();
+ WaitForSingleObject(thread, INFINITE);
+ UpdateSCMStatus(SERVICE_STOPPED, NO_ERROR, 0);
}
DWORD DoService(void)