Moved some local variables from StartServiceCtrlDispatcherA/W to service environment block

Alexander Yaworsky yaworsky at migusoft.ru
Mon Sep 27 21:53:55 CDT 2004


Hello

ChangeLog:

Moved some local variables from StartServiceCtrlDispatcherA/W to service environment block.
Introduced helper function service_ctrl_dispatcher.

Index: dlls/advapi32/service.c
===================================================================
RCS file: /home/wine/wine/dlls/advapi32/service.c,v
retrieving revision 1.60
diff -u -r1.60 service.c
--- dlls/advapi32/service.c 27 Sep 2004 20:35:27 -0000 1.60
+++ dlls/advapi32/service.c 28 Sep 2004 02:24:52 -0000
@@ -45,6 +45,12 @@
 struct SEB              /* service environment block */
 {                       /*   resides in service's shared memory object */
     DWORD argc;
+    union               /* argument vectors */
+    {
+        LPSTR *A;
+        LPWSTR *W;
+    } argv;
+    LPSERVICE_MAIN_FUNCTIONW service_main;
     /* variable part of SEB contains service arguments */
 };
 
@@ -270,18 +276,27 @@
 }
 
 /******************************************************************************
+ * service_ctrl_dispatcher
+ *
+ * helper function for StartServiceCtrlDispatcherA/W
+ *
+ */
+static BOOL service_ctrl_dispatcher( struct SEB* seb )
+{
+    seb->service_main( seb->argc, seb->argv.W );
+    return TRUE;
+}
+
+/******************************************************************************
  * StartServiceCtrlDispatcherA [ADVAPI32.@]
  */
 BOOL WINAPI
 StartServiceCtrlDispatcherA( LPSERVICE_TABLE_ENTRYA servent )
 {
-    LPSERVICE_MAIN_FUNCTIONA fpMain;
     WCHAR service_name[ MAX_SERVICE_NAME ];
     HANDLE hServiceShmem = NULL;
     struct SEB *seb = NULL;
-    DWORD  dwNumServiceArgs = 0;
     LPWSTR *lpArgVecW = NULL;
-    LPSTR  *lpArgVecA = NULL;
     unsigned int i;
     BOOL ret = FALSE;
 
@@ -308,28 +323,27 @@
         goto done;
 
     lpArgVecW[0] = service_name;
-    dwNumServiceArgs = seb->argc + 1;
+    seb->argc++;
 
     /* Convert the Unicode arg vectors back to ASCII */
-    lpArgVecA = (LPSTR*) HeapAlloc( GetProcessHeap(), 0,
-                                    dwNumServiceArgs*sizeof(LPSTR) );
-    for(i=0; i<dwNumServiceArgs; i++)
-        lpArgVecA[i]=HEAP_strdupWtoA(GetProcessHeap(), 0, lpArgVecW[i]);
+    seb->argv.A = (LPSTR*) HeapAlloc( GetProcessHeap(), 0,
+                                      seb->argc*sizeof(LPSTR) );
+    for(i=0; i<seb->argc; i++)
+        seb->argv.A[i]=HEAP_strdupWtoA(GetProcessHeap(), 0, lpArgVecW[i]);
 
     /* FIXME: find service entry by name if SERVICE_WIN32_SHARE_PROCESS */
     TRACE("%s at %p)\n", debugstr_a(servent->lpServiceName),servent);
-    fpMain = servent->lpServiceProc;
+    seb->service_main = (LPSERVICE_MAIN_FUNCTIONW) servent->lpServiceProc;
 
-    /* try to start the service */
-    fpMain( dwNumServiceArgs, lpArgVecA);
+    ret = service_ctrl_dispatcher( seb );
 
 done:
-    if(dwNumServiceArgs)
+    if( seb->argv.A )
     {
         /* free arg strings */
-        for(i=0; i<dwNumServiceArgs; i++)
-            HeapFree(GetProcessHeap(), 0, lpArgVecA[i]);
-        HeapFree(GetProcessHeap(), 0, lpArgVecA);
+        for(i=0; i<seb->argc; i++)
+            HeapFree(GetProcessHeap(), 0, seb->argv.A[i]);
+        HeapFree(GetProcessHeap(), 0, seb->argv.A);
     }
 
     if( lpArgVecW ) HeapFree( GetProcessHeap(), 0, lpArgVecW );
@@ -347,12 +361,10 @@
 BOOL WINAPI
 StartServiceCtrlDispatcherW( LPSERVICE_TABLE_ENTRYW servent )
 {
-    LPSERVICE_MAIN_FUNCTIONW fpMain;
     WCHAR service_name[ MAX_SERVICE_NAME ];
     HANDLE hServiceShmem = NULL;
     struct SEB *seb;
-    DWORD  dwNumServiceArgs ;
-    LPWSTR *lpServiceArgVectors ;
+    BOOL ret;
 
     TRACE("(%p)\n", servent);
 
@@ -363,27 +375,27 @@
     if( NULL == seb )
         return FALSE;
 
-    lpServiceArgVectors = build_arg_vectors( seb );
-    if( NULL == lpServiceArgVectors )
+    seb->argv.W = build_arg_vectors( seb );
+    if( NULL == seb->argv.W )
     {
         UnmapViewOfFile( seb );
         CloseHandle( hServiceShmem );
         return FALSE;
     }
-    lpServiceArgVectors[0] = service_name;
-    dwNumServiceArgs = seb->argc + 1;
+
+    seb->argv.W[0] = service_name;
+    seb->argc++;
 
     /* FIXME: find service entry by name if SERVICE_WIN32_SHARE_PROCESS */
     TRACE("%s at %p)\n", debugstr_w(servent->lpServiceName),servent);
-    fpMain = servent->lpServiceProc;
+    seb->service_main = servent->lpServiceProc;
 
-    /* try to start the service */
-    fpMain( dwNumServiceArgs, lpServiceArgVectors);
+    ret = service_ctrl_dispatcher( seb );
 
-    HeapFree( GetProcessHeap(), 0, lpServiceArgVectors );
+    HeapFree( GetProcessHeap(), 0, seb->argv.W );
     UnmapViewOfFile( seb );
     CloseHandle( hServiceShmem );
-    return TRUE;
+    return ret;
 }
 
 /******************************************************************************




More information about the wine-patches mailing list