diff --git a/dlls/advapi32/service.c b/dlls/advapi32/service.c index b338634f0b5..51766e2a23f 100644 --- a/dlls/advapi32/service.c +++ b/dlls/advapi32/service.c @@ -28,7 +28,6 @@ #include "winerror.h" #include "winreg.h" #include "wine/unicode.h" -#include "heap.h" #include "wine/debug.h" #include "winternl.h" @@ -225,7 +224,7 @@ EnumServicesStatusW( SC_HANDLE hSCManager, DWORD dwServiceType, /****************************************************************************** * read_scm_lock_data * - * helper function for StartServiceCtrlDispatcherA/W + * helper function for service control dispatcher * * SCM database is locked by StartService; * open global SCM lock object and read service name @@ -257,7 +256,7 @@ static BOOL read_scm_lock_data( LPWSTR buffer ) /****************************************************************************** * open_seb_shmem * - * helper function for StartServiceCtrlDispatcherA/W + * helper function for service control dispatcher */ static struct SEB* open_seb_shmem( LPWSTR service_name, HANDLE* hServiceShmem ) { @@ -281,7 +280,7 @@ static struct SEB* open_seb_shmem( LPWSTR service_name, HANDLE* hServiceShmem ) /****************************************************************************** * build_arg_vectors * - * helper function for StartServiceCtrlDispatcherA/W + * helper function for service control dispatcher * * Allocate and initialize array of LPWSTRs to arguments in variable part * of service environment block. @@ -307,23 +306,20 @@ static LPWSTR* build_arg_vectors( struct SEB* seb ) } /****************************************************************************** - * StartServiceCtrlDispatcherA [ADVAPI32.@] + * service_ctrl_dispatcher + * + * helper function for StartServiceCtrlDispatcherA/W */ -BOOL WINAPI -StartServiceCtrlDispatcherA( LPSERVICE_TABLE_ENTRYA servent ) +static BOOL service_ctrl_dispatcher( LPSERVICE_TABLE_ENTRYW servent, BOOL ascii ) { - LPSERVICE_MAIN_FUNCTIONA fpMain; WCHAR service_name[ MAX_SERVICE_NAME ]; HANDLE hServiceShmem = NULL; struct SEB *seb = NULL; - DWORD dwNumServiceArgs = 0; + DWORD dwNumServiceArgs; LPWSTR *lpArgVecW = NULL; - LPSTR *lpArgVecA = NULL; unsigned int i; BOOL ret = FALSE; - TRACE("(%p)\n", servent); - if( ! read_scm_lock_data( service_name ) ) { /* FIXME: Instead of exiting we allow @@ -347,34 +343,69 @@ StartServiceCtrlDispatcherA( LPSERVICE_TABLE_ENTRYA servent ) lpArgVecW[0] = service_name; dwNumServiceArgs = seb->argc + 1; - /* Convert the Unicode arg vectors back to ASCII */ - lpArgVecA = (LPSTR*) HeapAlloc( GetProcessHeap(), 0, - dwNumServiceArgs*sizeof(LPSTR) ); - for(i=0; ilpServiceName),servent); - fpMain = servent->lpServiceProc; + if( ascii ) + /* Convert the Unicode arg vectors back to ASCII */ + for(i=0; ilpServiceProc( dwNumServiceArgs, lpArgVecW); + ret = TRUE; done: - if(dwNumServiceArgs) - { - /* free arg strings */ - for(i=0; iargc + 1; - - /* FIXME: find service entry by name if SERVICE_WIN32_SHARE_PROCESS */ - TRACE("%s at %p)\n", debugstr_w(servent->lpServiceName),servent); - fpMain = servent->lpServiceProc; - - /* try to start the service */ - fpMain( dwNumServiceArgs, lpServiceArgVectors); - - HeapFree( GetProcessHeap(), 0, lpServiceArgVectors ); - UnmapViewOfFile( seb ); - CloseHandle( hServiceShmem ); - return TRUE; + return service_ctrl_dispatcher( servent, FALSE ); } /******************************************************************************