ReactOS  0.4.15-dev-483-ga77a65a
service.c
Go to the documentation of this file.
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 <stdarg.h>
24 
25 #include "windef.h"
26 #include "winbase.h"
27 #include "wbemcli.h"
28 #include "winsvc.h"
29 
30 #include "wine/debug.h"
31 #include "wbemprox_private.h"
32 
34 
36 {
37  switch (error)
38  {
39  case ERROR_SUCCESS: return 0;
40  case ERROR_ACCESS_DENIED: return 2;
41  case ERROR_DEPENDENT_SERVICES_RUNNING: return 3;
42  case ERROR_INVALID_SERVICE_CONTROL: return 4;
43  case ERROR_SERVICE_CANNOT_ACCEPT_CTRL: return 5;
44  case ERROR_SERVICE_NOT_ACTIVE: return 6;
45  case ERROR_SERVICE_REQUEST_TIMEOUT: return 7;
46  case ERROR_SERVICE_ALREADY_RUNNING: return 10;
47  default:
48  WARN("unknown error %u\n", error);
49  break;
50  }
51  return 8;
52 }
53 
54 static HRESULT control_service( const WCHAR *name, DWORD control, VARIANT *retval )
55 {
56  SC_HANDLE manager, service = NULL;
58  UINT error = 0;
59 
61  {
63  goto done;
64  }
66  {
68  goto done;
69  }
70  if (!ControlService( service, control, &status )) error = map_error( GetLastError() );
71  CloseServiceHandle( service );
72 
73 done:
74  set_variant( VT_UI4, error, NULL, retval );
75  if (manager) CloseServiceHandle( manager );
76  return S_OK;
77 }
78 
80 {
81  VARIANT name, retval;
83  HRESULT hr;
84 
85  TRACE("%p, %p, %p\n", obj, in, out);
86 
87  hr = IWbemClassObject_Get( obj, prop_nameW, 0, &name, NULL, NULL );
88  if (hr != S_OK) return hr;
89 
91  if (hr != S_OK)
92  {
93  VariantClear( &name );
94  return hr;
95  }
96  if (out)
97  {
98  hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
99  if (hr != S_OK)
100  {
101  VariantClear( &name );
102  IWbemClassObject_Release( sig );
103  return hr;
104  }
105  }
107  if (hr != S_OK) goto done;
108 
109  if (out_params)
110  hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
111 
112 done:
113  VariantClear( &name );
114  IWbemClassObject_Release( sig );
115  if (hr == S_OK && out)
116  {
117  *out = out_params;
118  IWbemClassObject_AddRef( out_params );
119  }
120  if (out_params) IWbemClassObject_Release( out_params );
121  return hr;
122 }
123 
125 {
126  VARIANT name, retval;
128  HRESULT hr;
129 
130  TRACE("%p, %p, %p\n", obj, in, out);
131 
132  hr = IWbemClassObject_Get( obj, prop_nameW, 0, &name, NULL, NULL );
133  if (hr != S_OK) return hr;
134 
136  if (hr != S_OK)
137  {
138  VariantClear( &name );
139  return hr;
140  }
141  if (out)
142  {
143  hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
144  if (hr != S_OK)
145  {
146  VariantClear( &name );
147  IWbemClassObject_Release( sig );
148  return hr;
149  }
150  }
152  if (hr != S_OK) goto done;
153 
154  if (out_params)
155  hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
156 
157 done:
158  VariantClear( &name );
159  IWbemClassObject_Release( sig );
160  if (hr == S_OK && out)
161  {
162  *out = out_params;
163  IWbemClassObject_AddRef( out_params );
164  }
165  if (out_params) IWbemClassObject_Release( out_params );
166  return hr;
167 }
168 
169 static HRESULT start_service( const WCHAR *name, VARIANT *retval )
170 {
171  SC_HANDLE manager, service = NULL;
172  UINT error = 0;
173 
175  {
177  goto done;
178  }
179  if (!(service = OpenServiceW( manager, name, SERVICE_START )))
180  {
182  goto done;
183  }
184  if (!StartServiceW( service, 0, NULL )) error = map_error( GetLastError() );
185  CloseServiceHandle( service );
186 
187 done:
188  set_variant( VT_UI4, error, NULL, retval );
189  if (manager) CloseServiceHandle( manager );
190  return S_OK;
191 }
192 
194 {
195  VARIANT name, retval;
197  HRESULT hr;
198 
199  TRACE("%p, %p, %p\n", obj, in, out);
200 
201  hr = IWbemClassObject_Get( obj, prop_nameW, 0, &name, NULL, NULL );
202  if (hr != S_OK) return hr;
203 
205  if (hr != S_OK)
206  {
207  VariantClear( &name );
208  return hr;
209  }
210  if (out)
211  {
212  hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
213  if (hr != S_OK)
214  {
215  VariantClear( &name );
216  IWbemClassObject_Release( sig );
217  return hr;
218  }
219  }
220  hr = start_service( V_BSTR(&name), &retval );
221  if (hr != S_OK) goto done;
222 
223  if (out_params)
224  hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
225 
226 done:
227  VariantClear( &name );
228  IWbemClassObject_Release( sig );
229  if (hr == S_OK && out)
230  {
231  *out = out_params;
232  IWbemClassObject_AddRef( out_params );
233  }
234  if (out_params) IWbemClassObject_Release( out_params );
235  return hr;
236 }
237 
239 {
240  VARIANT name, retval;
242  HRESULT hr;
243 
244  TRACE("%p, %p, %p\n", obj, in, out);
245 
246  hr = IWbemClassObject_Get( obj, prop_nameW, 0, &name, NULL, NULL );
247  if (hr != S_OK) return hr;
248 
250  if (hr != S_OK)
251  {
252  VariantClear( &name );
253  return hr;
254  }
255  if (out)
256  {
257  hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
258  if (hr != S_OK)
259  {
260  VariantClear( &name );
261  IWbemClassObject_Release( sig );
262  return hr;
263  }
264  }
266  if (hr != S_OK) goto done;
267 
268  if (out_params)
269  hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
270 
271 done:
272  VariantClear( &name );
273  IWbemClassObject_Release( sig );
274  if (hr == S_OK && out)
275  {
276  *out = out_params;
277  IWbemClassObject_AddRef( out_params );
278  }
279  if (out_params) IWbemClassObject_Release( out_params );
280  return hr;
281 }
HRESULT service_pause_service(IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out)
Definition: service.c:79
#define SC_MANAGER_ENUMERATE_SERVICE
Definition: winsvc.h:16
#define ERROR_SERVICE_CANNOT_ACCEPT_CTRL
Definition: winerror.h:612
#define ERROR_SUCCESS
Definition: deptool.c:10
HRESULT hr
Definition: shlfolder.c:183
#define error(str)
Definition: mkdosfs.c:1605
HRESULT service_stop_service(IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out)
Definition: service.c:238
#define WARN(fmt,...)
Definition: debug.h:112
#define ERROR_SERVICE_REQUEST_TIMEOUT
Definition: winerror.h:604
static const WCHAR method_pauseserviceW[]
static const WCHAR method_resumeserviceW[]
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
WINE_DEFAULT_DEBUG_CHANNEL(msiexec)
#define ERROR_SERVICE_NOT_ACTIVE
Definition: winerror.h:613
HRESULT service_start_service(IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out)
Definition: service.c:193
#define ERROR_ACCESS_DENIED
Definition: compat.h:87
#define ERROR_INVALID_SERVICE_CONTROL
Definition: winerror.h:603
SC_HANDLE WINAPI OpenServiceW(SC_HANDLE hSCManager, LPCWSTR lpServiceName, DWORD dwDesiredAccess)
Definition: scm.c:2103
BOOL WINAPI CloseServiceHandle(SC_HANDLE hSCObject)
Definition: scm.c:577
smooth NULL
Definition: ftsmooth.c:416
void set_variant(VARTYPE type, LONGLONG val, void *val_ptr, VARIANT *ret)
Definition: query.c:1093
static HRESULT start_service(const WCHAR *name, VARIANT *retval)
Definition: service.c:169
HRESULT service_resume_service(IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out)
Definition: service.c:124
static const WCHAR prop_nameW[]
BOOL WINAPI StartServiceW(SC_HANDLE hService, DWORD dwNumServiceArgs, LPCWSTR *lpServiceArgVectors)
Definition: scm.c:2923
#define TRACE(s)
Definition: solgame.cpp:4
static HRESULT control_service(const WCHAR *name, DWORD control, VARIANT *retval)
Definition: service.c:54
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:78
static const WCHAR class_serviceW[]
static FILE * out
Definition: regtests2xml.c:44
static void out_params(void)
Definition: nanoxwin.c:1413
unsigned long DWORD
Definition: ntddk_ex.h:95
static const WCHAR method_startserviceW[]
#define SERVICE_CONTROL_PAUSE
Definition: winsvc.h:37
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
SC_HANDLE WINAPI OpenSCManagerW(LPCWSTR lpMachineName, LPCWSTR lpDatabaseName, DWORD dwDesiredAccess)
Definition: scm.c:2011
#define V_BSTR(A)
Definition: oleauto.h:226
#define ERROR_DEPENDENT_SERVICES_RUNNING
Definition: winerror.h:602
#define SERVICE_START
Definition: winsvc.h:57
static const WCHAR method_stopserviceW[]
#define S_OK
Definition: intsafe.h:59
GLuint in
Definition: glext.h:9616
#define SERVICE_STOP
Definition: winsvc.h:58
#define SERVICE_CONTROL_CONTINUE
Definition: winsvc.h:38
BOOL WINAPI ControlService(SC_HANDLE hService, DWORD dwControl, LPSERVICE_STATUS lpServiceStatus)
Definition: scm.c:619
unsigned int UINT
Definition: ndis.h:50
HRESULT create_signature(const WCHAR *class, const WCHAR *method, enum param_direction dir, IWbemClassObject **sig)
Definition: class.c:819
Definition: name.c:38
static const WCHAR param_returnvalueW[]
static UINT map_error(DWORD error)
Definition: service.c:35
#define SERVICE_CONTROL_STOP
Definition: winsvc.h:36
#define ERROR_SERVICE_ALREADY_RUNNING
Definition: winerror.h:607
static SERVICE_STATUS status
Definition: service.c:31
#define SERVICE_PAUSE_CONTINUE
Definition: winsvc.h:59
Definition: ps.c:97
GLuint const GLchar * name
Definition: glext.h:6031