From ff0099df0d636586075fb69adefc7a18119202cf Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 5 May 2008 12:57:04 +0200 Subject: [PATCH] spoolsv: Improve the service stub so that it can be started and stopped. --- programs/spoolsv/main.c | 63 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/programs/spoolsv/main.c b/programs/spoolsv/main.c index 365aff00bdf..10a227ff0f1 100644 --- a/programs/spoolsv/main.c +++ b/programs/spoolsv/main.c @@ -24,16 +24,73 @@ WINE_DEFAULT_DEBUG_CHANNEL(spoolsv); +static WCHAR spoolerW[] = {'S','p','o','o','l','e','r',0}; + +static SERVICE_STATUS_HANDLE service_handle; +static HANDLE stop_event; + +static DWORD WINAPI service_handler( DWORD ctrl, DWORD event_type, LPVOID event_data, LPVOID context ) +{ + SERVICE_STATUS status; + + status.dwServiceType = SERVICE_WIN32; + status.dwControlsAccepted = SERVICE_ACCEPT_STOP; + status.dwWin32ExitCode = 0; + status.dwServiceSpecificExitCode = 0; + status.dwCheckPoint = 0; + status.dwWaitHint = 0; + + switch(ctrl) + { + case SERVICE_CONTROL_STOP: + case SERVICE_CONTROL_SHUTDOWN: + WINE_TRACE( "shutting down\n" ); + status.dwCurrentState = SERVICE_STOP_PENDING; + status.dwControlsAccepted = 0; + SetServiceStatus( service_handle, &status ); + SetEvent( stop_event ); + return NO_ERROR; + default: + WINE_FIXME( "got service ctrl %x\n", ctrl ); + status.dwCurrentState = SERVICE_RUNNING; + SetServiceStatus( service_handle, &status ); + return NO_ERROR; + } +} + static void WINAPI serv_main(DWORD argc, LPWSTR *argv) { - WINE_FIXME("(%d %p)\n", argc, argv); + SERVICE_STATUS status; + + WINE_TRACE( "starting service\n" ); + + stop_event = CreateEventW( NULL, TRUE, FALSE, NULL ); + + service_handle = RegisterServiceCtrlHandlerExW( spoolerW, service_handler, NULL ); + if (!service_handle) + return; + + status.dwServiceType = SERVICE_WIN32; + status.dwCurrentState = SERVICE_RUNNING; + status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; + status.dwWin32ExitCode = 0; + status.dwServiceSpecificExitCode = 0; + status.dwCheckPoint = 0; + status.dwWaitHint = 10000; + SetServiceStatus( service_handle, &status ); + + WaitForSingleObject( stop_event, INFINITE ); + + status.dwCurrentState = SERVICE_STOPPED; + status.dwControlsAccepted = 0; + SetServiceStatus( service_handle, &status ); + WINE_TRACE( "service stopped\n" ); } int main(int argc, char **argv) { - static WCHAR wszSPOOLER[] = {'S','P','O','O','L','E','R',0}; static const SERVICE_TABLE_ENTRYW servtbl[] = { - {wszSPOOLER, serv_main}, + {spoolerW, serv_main}, {NULL, NULL} };