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