2 * Win32_Service methods implementation
4 * Copyright 2012 Hans Leidekker for CodeWeavers
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.
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.
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
21 #define WIN32_NO_STATUS
23 #define COM_NO_WINDOWS_H
37 #include "wine/debug.h"
38 #include "wbemprox_private.h"
40 WINE_DEFAULT_DEBUG_CHANNEL(wbemprox
);
42 static UINT
map_error( DWORD error
)
46 case ERROR_SUCCESS
: return 0;
47 case ERROR_ACCESS_DENIED
: return 2;
48 case ERROR_DEPENDENT_SERVICES_RUNNING
: return 3;
49 case ERROR_INVALID_SERVICE_CONTROL
: return 4;
50 case ERROR_SERVICE_CANNOT_ACCEPT_CTRL
: return 5;
51 case ERROR_SERVICE_NOT_ACTIVE
: return 6;
52 case ERROR_SERVICE_REQUEST_TIMEOUT
: return 7;
53 case ERROR_SERVICE_ALREADY_RUNNING
: return 10;
55 WARN("unknown error %u\n", error
);
61 static HRESULT
control_service( const WCHAR
*name
, DWORD control
, VARIANT
*retval
)
63 SC_HANDLE manager
, service
= NULL
;
64 SERVICE_STATUS status
;
67 if (!(manager
= OpenSCManagerW( NULL
, NULL
, SC_MANAGER_ENUMERATE_SERVICE
)))
69 error
= map_error( GetLastError() );
72 if (!(service
= OpenServiceW( manager
, name
, SERVICE_STOP
|SERVICE_START
|SERVICE_PAUSE_CONTINUE
)))
74 error
= map_error( GetLastError() );
77 if (!ControlService( service
, control
, &status
)) error
= map_error( GetLastError() );
80 set_variant( VT_UI4
, error
, NULL
, retval
);
81 CloseServiceHandle( service
);
82 CloseServiceHandle( manager
);
86 HRESULT
service_pause_service( IWbemClassObject
*obj
, IWbemClassObject
*in
, IWbemClassObject
**out
)
89 IWbemClassObject
*sig
;
92 TRACE("%p, %p, %p\n", obj
, in
, out
);
94 hr
= IWbemClassObject_Get( obj
, prop_nameW
, 0, &name
, NULL
, NULL
);
95 if (hr
!= S_OK
) return hr
;
97 hr
= create_signature( class_serviceW
, method_pauseserviceW
, PARAM_OUT
, &sig
);
100 VariantClear( &name
);
103 hr
= IWbemClassObject_SpawnInstance( sig
, 0, out
);
106 VariantClear( &name
);
107 IWbemClassObject_Release( sig
);
110 hr
= control_service( V_BSTR(&name
), SERVICE_CONTROL_PAUSE
, &retval
);
111 if (hr
!= S_OK
) goto done
;
112 hr
= IWbemClassObject_Put( *out
, param_returnvalueW
, 0, &retval
, CIM_UINT32
);
115 VariantClear( &name
);
116 IWbemClassObject_Release( sig
);
117 if (hr
!= S_OK
) IWbemClassObject_Release( *out
);
121 HRESULT
service_resume_service( IWbemClassObject
*obj
, IWbemClassObject
*in
, IWbemClassObject
**out
)
123 VARIANT name
, retval
;
124 IWbemClassObject
*sig
;
127 TRACE("%p, %p, %p\n", obj
, in
, out
);
129 hr
= IWbemClassObject_Get( obj
, prop_nameW
, 0, &name
, NULL
, NULL
);
130 if (hr
!= S_OK
) return hr
;
132 hr
= create_signature( class_serviceW
, method_resumeserviceW
, PARAM_OUT
, &sig
);
135 VariantClear( &name
);
138 hr
= IWbemClassObject_SpawnInstance( sig
, 0, out
);
141 VariantClear( &name
);
142 IWbemClassObject_Release( sig
);
145 hr
= control_service( V_BSTR(&name
), SERVICE_CONTROL_CONTINUE
, &retval
);
146 if (hr
!= S_OK
) goto done
;
147 hr
= IWbemClassObject_Put( *out
, param_returnvalueW
, 0, &retval
, CIM_UINT32
);
150 VariantClear( &name
);
151 IWbemClassObject_Release( sig
);
152 if (hr
!= S_OK
) IWbemClassObject_Release( *out
);
156 static HRESULT
start_service( const WCHAR
*name
, VARIANT
*retval
)
158 SC_HANDLE manager
, service
= NULL
;
161 if (!(manager
= OpenSCManagerW( NULL
, NULL
, SC_MANAGER_ENUMERATE_SERVICE
)))
163 error
= map_error( GetLastError() );
166 if (!(service
= OpenServiceW( manager
, name
, SERVICE_START
)))
168 error
= map_error( GetLastError() );
171 if (!StartServiceW( service
, 0, NULL
)) error
= map_error( GetLastError() );
174 set_variant( VT_UI4
, error
, NULL
, retval
);
175 CloseServiceHandle( service
);
176 CloseServiceHandle( manager
);
180 HRESULT
service_start_service( IWbemClassObject
*obj
, IWbemClassObject
*in
, IWbemClassObject
**out
)
182 VARIANT name
, retval
;
183 IWbemClassObject
*sig
;
186 TRACE("%p, %p, %p\n", obj
, in
, out
);
188 hr
= IWbemClassObject_Get( obj
, prop_nameW
, 0, &name
, NULL
, NULL
);
189 if (hr
!= S_OK
) return hr
;
191 hr
= create_signature( class_serviceW
, method_startserviceW
, PARAM_OUT
, &sig
);
194 VariantClear( &name
);
197 hr
= IWbemClassObject_SpawnInstance( sig
, 0, out
);
200 VariantClear( &name
);
201 IWbemClassObject_Release( sig
);
204 hr
= start_service( V_BSTR(&name
), &retval
);
205 if (hr
!= S_OK
) goto done
;
206 hr
= IWbemClassObject_Put( *out
, param_returnvalueW
, 0, &retval
, CIM_UINT32
);
209 VariantClear( &name
);
210 IWbemClassObject_Release( sig
);
211 if (hr
!= S_OK
) IWbemClassObject_Release( *out
);
215 HRESULT
service_stop_service( IWbemClassObject
*obj
, IWbemClassObject
*in
, IWbemClassObject
**out
)
217 VARIANT name
, retval
;
218 IWbemClassObject
*sig
;
221 TRACE("%p, %p, %p\n", obj
, in
, out
);
223 hr
= IWbemClassObject_Get( obj
, prop_nameW
, 0, &name
, NULL
, NULL
);
224 if (hr
!= S_OK
) return hr
;
226 hr
= create_signature( class_serviceW
, method_stopserviceW
, PARAM_OUT
, &sig
);
229 VariantClear( &name
);
232 hr
= IWbemClassObject_SpawnInstance( sig
, 0, out
);
235 VariantClear( &name
);
236 IWbemClassObject_Release( sig
);
239 hr
= control_service( V_BSTR(&name
), SERVICE_CONTROL_STOP
, &retval
);
240 if (hr
!= S_OK
) goto done
;
241 hr
= IWbemClassObject_Put( *out
, param_returnvalueW
, 0, &retval
, CIM_UINT32
);
244 VariantClear( &name
);
245 IWbemClassObject_Release( sig
);
246 if (hr
!= S_OK
) IWbemClassObject_Release( *out
);