Hans Leidekker : wbemprox: Implement Win32_Service.StartService.

Alexandre Julliard julliard at winehq.org
Wed Oct 17 14:32:27 CDT 2012


Module: wine
Branch: master
Commit: 60cab77b375e7cf3113fdb828c09ffa81eb302b9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=60cab77b375e7cf3113fdb828c09ffa81eb302b9

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Wed Oct 17 11:07:57 2012 +0200

wbemprox: Implement Win32_Service.StartService.

---

 dlls/wbemprox/builtin.c          |    6 +++-
 dlls/wbemprox/service.c          |   59 ++++++++++++++++++++++++++++++++++++++
 dlls/wbemprox/wbemprox_private.h |    2 +
 3 files changed, 66 insertions(+), 1 deletions(-)

diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c
index 5ed2742..69fbc18 100644
--- a/dlls/wbemprox/builtin.c
+++ b/dlls/wbemprox/builtin.c
@@ -294,7 +294,8 @@ static const struct column col_service[] =
     { prop_systemnameW,       CIM_STRING|COL_FLAG_DYNAMIC },
     /* methods */
     { method_pauseserviceW,   CIM_FLAG_ARRAY|COL_FLAG_METHOD },
-    { method_resumeserviceW,  CIM_FLAG_ARRAY|COL_FLAG_METHOD }
+    { method_resumeserviceW,  CIM_FLAG_ARRAY|COL_FLAG_METHOD },
+    { method_startserviceW,   CIM_FLAG_ARRAY|COL_FLAG_METHOD }
 };
 static const struct column col_sounddevice[] =
 {
@@ -475,6 +476,7 @@ struct record_service
     /* methods */
     class_method *pause_service;
     class_method *resume_service;
+    class_method *start_service;
 };
 struct record_sounddevice
 {
@@ -518,6 +520,7 @@ static const struct record_params data_params[] =
 {
     { class_serviceW, method_pauseserviceW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
     { class_serviceW, method_resumeserviceW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
+    { class_serviceW, method_startserviceW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
     { class_stdregprovW, method_enumkeyW, 1, param_defkeyW, CIM_SINT32, 0, 0x80000002 },
     { class_stdregprovW, method_enumkeyW, 1, param_subkeynameW, CIM_STRING },
     { class_stdregprovW, method_enumkeyW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
@@ -1118,6 +1121,7 @@ static void fill_service( struct table *table )
         rec->systemname     = heap_strdupW( sysnameW );
         rec->pause_service  = service_pause_service;
         rec->resume_service = service_resume_service;
+        rec->start_service  = service_start_service;
         heap_free( config );
         offset += sizeof(*rec);
         num_rows++;
diff --git a/dlls/wbemprox/service.c b/dlls/wbemprox/service.c
index f381a4b..cd377b9 100644
--- a/dlls/wbemprox/service.c
+++ b/dlls/wbemprox/service.c
@@ -146,3 +146,62 @@ done:
     if (hr != S_OK) IWbemClassObject_Release( *out );
     return hr;
 }
+
+static HRESULT start_service( const WCHAR *name, VARIANT *retval )
+{
+    SC_HANDLE manager, service = NULL;
+    UINT error = 0;
+
+    if (!(manager = OpenSCManagerW( NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE )))
+    {
+        error = map_error( GetLastError() );
+        goto done;
+    }
+    if (!(service = OpenServiceW( manager, name, SERVICE_START )))
+    {
+        error = map_error( GetLastError() );
+        goto done;
+    }
+    if (!StartServiceW( service, 0, NULL )) error = map_error( GetLastError() );
+
+done:
+    set_variant( VT_UI4, error, NULL, retval );
+    CloseServiceHandle( service );
+    CloseServiceHandle( manager );
+    return S_OK;
+}
+
+HRESULT service_start_service( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
+{
+    VARIANT name, retval;
+    IWbemClassObject *sig;
+    HRESULT hr;
+
+    TRACE("%p, %p, %p\n", obj, in, out);
+
+    hr = IWbemClassObject_Get( obj, prop_nameW, 0, &name, NULL, NULL );
+    if (hr != S_OK) return hr;
+
+    hr = create_signature( class_serviceW, method_startserviceW, PARAM_OUT, &sig );
+    if (hr != S_OK)
+    {
+        VariantClear( &name );
+        return hr;
+    }
+    hr = IWbemClassObject_SpawnInstance( sig, 0, out );
+    if (hr != S_OK)
+    {
+        VariantClear( &name );
+        IWbemClassObject_Release( sig );
+        return hr;
+    }
+    hr = start_service( V_BSTR(&name), &retval );
+    if (hr != S_OK) goto done;
+    hr = IWbemClassObject_Put( *out, param_returnvalueW, 0, &retval, CIM_UINT32 );
+
+done:
+    VariantClear( &name );
+    IWbemClassObject_Release( sig );
+    if (hr != S_OK) IWbemClassObject_Release( *out );
+    return hr;
+}
diff --git a/dlls/wbemprox/wbemprox_private.h b/dlls/wbemprox/wbemprox_private.h
index 7f5bc6a..39870bf 100644
--- a/dlls/wbemprox/wbemprox_private.h
+++ b/dlls/wbemprox/wbemprox_private.h
@@ -203,6 +203,7 @@ HRESULT reg_enum_values(IWbemClassObject *, IWbemClassObject *, IWbemClassObject
 HRESULT reg_get_stringvalue(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN;
 HRESULT service_pause_service(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN;
 HRESULT service_resume_service(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN;
+HRESULT service_start_service(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN;
 
 static void *heap_alloc( size_t len ) __WINE_ALLOC_SIZE(1);
 static inline void *heap_alloc( size_t len )
@@ -245,6 +246,7 @@ static const WCHAR method_enumvaluesW[] = {'E','n','u','m','V','a','l','u','e','
 static const WCHAR method_getstringvalueW[] = {'G','e','t','S','t','r','i','n','g','V','a','l','u','e',0};
 static const WCHAR method_pauseserviceW[] = {'P','a','u','s','e','S','e','r','v','i','c','e',0};
 static const WCHAR method_resumeserviceW[] = {'R','e','s','u','m','e','S','e','r','v','i','c','e',0};
+static const WCHAR method_startserviceW[] = {'S','t','a','r','t','S','e','r','v','i','c','e',0};
 
 static const WCHAR param_defkeyW[] = {'h','D','e','f','K','e','y',0};
 static const WCHAR param_namesW[] = {'s','N','a','m','e','s',0};




More information about the wine-cvs mailing list