Alexandre Julliard : spoolsv: Improve the service stub so that it can be started and stopped.
Alexandre Julliard
julliard at winehq.org
Mon May 5 07:14:48 CDT 2008
Module: wine
Branch: master
Commit: ff0099df0d636586075fb69adefc7a18119202cf
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ff0099df0d636586075fb69adefc7a18119202cf
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon May 5 12:57:04 2008 +0200
spoolsv: Improve the service stub so that it can be started and stopped.
---
programs/spoolsv/main.c | 63 ++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 60 insertions(+), 3 deletions(-)
diff --git a/programs/spoolsv/main.c b/programs/spoolsv/main.c
index 365aff0..10a227f 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}
};
More information about the wine-cvs
mailing list