xmllite: Fail to set input for external IXmlReaderInput.
[wine] / dlls / wbemprox / service.c
1 /*
2  * Win32_Service methods implementation
3  *
4  * Copyright 2012 Hans Leidekker for CodeWeavers
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #define COBJMACROS
22
23 #include "config.h"
24 #include <stdarg.h>
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "wbemcli.h"
29 #include "winsvc.h"
30
31 #include "wine/debug.h"
32 #include "wbemprox_private.h"
33
34 WINE_DEFAULT_DEBUG_CHANNEL(wbemprox);
35
36 static UINT map_error( DWORD error )
37 {
38     switch (error)
39     {
40     case ERROR_SUCCESS:       return 0;
41     case ERROR_ACCESS_DENIED: return 2;
42     case ERROR_DEPENDENT_SERVICES_RUNNING: return 3;
43     case ERROR_INVALID_SERVICE_CONTROL:    return 4;
44     case ERROR_SERVICE_CANNOT_ACCEPT_CTRL: return 5;
45     case ERROR_SERVICE_NOT_ACTIVE:         return 6;
46     case ERROR_SERVICE_REQUEST_TIMEOUT:    return 7;
47     case ERROR_SERVICE_ALREADY_RUNNING:    return 10;
48     default:
49         WARN("unknown error %u\n", error);
50         break;
51     }
52     return 8;
53 }
54
55 static HRESULT control_service( const WCHAR *name, DWORD control, VARIANT *retval )
56 {
57     SC_HANDLE manager, service = NULL;
58     SERVICE_STATUS status;
59     UINT error = 0;
60
61     if (!(manager = OpenSCManagerW( NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE )))
62     {
63         error = map_error( GetLastError() );
64         goto done;
65     }
66     if (!(service = OpenServiceW( manager, name, SERVICE_STOP|SERVICE_START|SERVICE_PAUSE_CONTINUE )))
67     {
68         error = map_error( GetLastError() );
69         goto done;
70     }
71     if (!ControlService( service, control, &status )) error = map_error( GetLastError() );
72
73 done:
74     set_variant( VT_UI4, error, NULL, retval );
75     CloseServiceHandle( service );
76     CloseServiceHandle( manager );
77     return S_OK;
78 }
79
80 HRESULT service_pause_service( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
81 {
82     VARIANT name, retval;
83     IWbemClassObject *sig;
84     HRESULT hr;
85
86     TRACE("%p, %p, %p\n", obj, in, out);
87
88     hr = IWbemClassObject_Get( obj, prop_nameW, 0, &name, NULL, NULL );
89     if (hr != S_OK) return hr;
90
91     hr = create_signature( class_serviceW, method_pauseserviceW, PARAM_OUT, &sig );
92     if (hr != S_OK)
93     {
94         VariantClear( &name );
95         return hr;
96     }
97     hr = IWbemClassObject_SpawnInstance( sig, 0, out );
98     if (hr != S_OK)
99     {
100         VariantClear( &name );
101         IWbemClassObject_Release( sig );
102         return hr;
103     }
104     hr = control_service( V_BSTR(&name), SERVICE_CONTROL_PAUSE, &retval );
105     if (hr != S_OK) goto done;
106     hr = IWbemClassObject_Put( *out, param_returnvalueW, 0, &retval, CIM_UINT32 );
107
108 done:
109     VariantClear( &name );
110     IWbemClassObject_Release( sig );
111     if (hr != S_OK) IWbemClassObject_Release( *out );
112     return hr;
113 }
114
115 HRESULT service_resume_service( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
116 {
117     VARIANT name, retval;
118     IWbemClassObject *sig;
119     HRESULT hr;
120
121     TRACE("%p, %p, %p\n", obj, in, out);
122
123     hr = IWbemClassObject_Get( obj, prop_nameW, 0, &name, NULL, NULL );
124     if (hr != S_OK) return hr;
125
126     hr = create_signature( class_serviceW, method_resumeserviceW, PARAM_OUT, &sig );
127     if (hr != S_OK)
128     {
129         VariantClear( &name );
130         return hr;
131     }
132     hr = IWbemClassObject_SpawnInstance( sig, 0, out );
133     if (hr != S_OK)
134     {
135         VariantClear( &name );
136         IWbemClassObject_Release( sig );
137         return hr;
138     }
139     hr = control_service( V_BSTR(&name), SERVICE_CONTROL_CONTINUE, &retval );
140     if (hr != S_OK) goto done;
141     hr = IWbemClassObject_Put( *out, param_returnvalueW, 0, &retval, CIM_UINT32 );
142
143 done:
144     VariantClear( &name );
145     IWbemClassObject_Release( sig );
146     if (hr != S_OK) IWbemClassObject_Release( *out );
147     return hr;
148 }
149
150 static HRESULT start_service( const WCHAR *name, VARIANT *retval )
151 {
152     SC_HANDLE manager, service = NULL;
153     UINT error = 0;
154
155     if (!(manager = OpenSCManagerW( NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE )))
156     {
157         error = map_error( GetLastError() );
158         goto done;
159     }
160     if (!(service = OpenServiceW( manager, name, SERVICE_START )))
161     {
162         error = map_error( GetLastError() );
163         goto done;
164     }
165     if (!StartServiceW( service, 0, NULL )) error = map_error( GetLastError() );
166
167 done:
168     set_variant( VT_UI4, error, NULL, retval );
169     CloseServiceHandle( service );
170     CloseServiceHandle( manager );
171     return S_OK;
172 }
173
174 HRESULT service_start_service( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
175 {
176     VARIANT name, retval;
177     IWbemClassObject *sig;
178     HRESULT hr;
179
180     TRACE("%p, %p, %p\n", obj, in, out);
181
182     hr = IWbemClassObject_Get( obj, prop_nameW, 0, &name, NULL, NULL );
183     if (hr != S_OK) return hr;
184
185     hr = create_signature( class_serviceW, method_startserviceW, PARAM_OUT, &sig );
186     if (hr != S_OK)
187     {
188         VariantClear( &name );
189         return hr;
190     }
191     hr = IWbemClassObject_SpawnInstance( sig, 0, out );
192     if (hr != S_OK)
193     {
194         VariantClear( &name );
195         IWbemClassObject_Release( sig );
196         return hr;
197     }
198     hr = start_service( V_BSTR(&name), &retval );
199     if (hr != S_OK) goto done;
200     hr = IWbemClassObject_Put( *out, param_returnvalueW, 0, &retval, CIM_UINT32 );
201
202 done:
203     VariantClear( &name );
204     IWbemClassObject_Release( sig );
205     if (hr != S_OK) IWbemClassObject_Release( *out );
206     return hr;
207 }
208
209 HRESULT service_stop_service( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
210 {
211     VARIANT name, retval;
212     IWbemClassObject *sig;
213     HRESULT hr;
214
215     TRACE("%p, %p, %p\n", obj, in, out);
216
217     hr = IWbemClassObject_Get( obj, prop_nameW, 0, &name, NULL, NULL );
218     if (hr != S_OK) return hr;
219
220     hr = create_signature( class_serviceW, method_stopserviceW, PARAM_OUT, &sig );
221     if (hr != S_OK)
222     {
223         VariantClear( &name );
224         return hr;
225     }
226     hr = IWbemClassObject_SpawnInstance( sig, 0, out );
227     if (hr != S_OK)
228     {
229         VariantClear( &name );
230         IWbemClassObject_Release( sig );
231         return hr;
232     }
233     hr = control_service( V_BSTR(&name), SERVICE_CONTROL_STOP, &retval );
234     if (hr != S_OK) goto done;
235     hr = IWbemClassObject_Put( *out, param_returnvalueW, 0, &retval, CIM_UINT32 );
236
237 done:
238     VariantClear( &name );
239     IWbemClassObject_Release( sig );
240     if (hr != S_OK) IWbemClassObject_Release( *out );
241     return hr;
242 }