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