[WBEMPROX] Sync with Wine Staging 1.7.55. CORE-10536
[reactos.git] / rostests / winetests / wbemprox / query.c
1 /*
2 * Copyright 2012 Hans Leidekker for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19 #define COBJMACROS
20
21 #include <stdio.h>
22 #include "windows.h"
23 #include "ocidl.h"
24 #include "sddl.h"
25 #include "initguid.h"
26 #include "objidl.h"
27 #include "wbemcli.h"
28 #include "wine/test.h"
29
30 static const WCHAR wqlW[] = {'w','q','l',0};
31
32 static HRESULT exec_query( IWbemServices *services, const WCHAR *str, IEnumWbemClassObject **result )
33 {
34 static const WCHAR captionW[] = {'C','a','p','t','i','o','n',0};
35 static const WCHAR descriptionW[] = {'D','e','s','c','r','i','p','t','i','o','n',0};
36 HRESULT hr;
37 IWbemClassObject *obj;
38 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( str );
39 LONG flags = WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY;
40 ULONG count;
41
42 hr = IWbemServices_ExecQuery( services, wql, query, flags, NULL, result );
43 if (hr == S_OK)
44 {
45 trace("%s\n", wine_dbgstr_w(str));
46 for (;;)
47 {
48 VARIANT var;
49
50 IEnumWbemClassObject_Next( *result, 10000, 1, &obj, &count );
51 if (!count) break;
52
53 if (IWbemClassObject_Get( obj, captionW, 0, &var, NULL, NULL ) == WBEM_S_NO_ERROR)
54 {
55 trace("caption: %s\n", wine_dbgstr_w(V_BSTR(&var)));
56 VariantClear( &var );
57 }
58 if (IWbemClassObject_Get( obj, descriptionW, 0, &var, NULL, NULL ) == WBEM_S_NO_ERROR)
59 {
60 trace("description: %s\n", wine_dbgstr_w(V_BSTR(&var)));
61 VariantClear( &var );
62 }
63 IWbemClassObject_Release( obj );
64 }
65 }
66 SysFreeString( wql );
67 SysFreeString( query );
68 return hr;
69 }
70
71 static void test_select( IWbemServices *services )
72 {
73 static const WCHAR emptyW[] = {0};
74 static const WCHAR sqlW[] = {'S','Q','L',0};
75 static const WCHAR query1[] =
76 {'S','E','L','E','C','T',' ','H','O','T','F','I','X','I','D',' ','F','R','O','M',' ',
77 'W','i','n','3','2','_','Q','u','i','c','k','F','i','x','E','n','g','i','n','e','e','r','i','n','g',0};
78 static const WCHAR query2[] =
79 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_','B','I','O','S',0};
80 static const WCHAR query3[] =
81 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
82 'L','o','g','i','c','a','l','D','i','s','k',' ','W','H','E','R','E',' ',
83 '\"','N','T','F','S','\"',' ','=',' ','F','i','l','e','S','y','s','t','e','m',0};
84 static const WCHAR query4[] =
85 {'S','E','L','E','C','T',' ','a',' ','F','R','O','M',' ','b',0};
86 static const WCHAR query5[] =
87 {'S','E','L','E','C','T',' ','a',' ','F','R','O','M',' ','W','i','n','3','2','_','B','i','o','s',0};
88 static const WCHAR query6[] =
89 {'S','E','L','E','C','T',' ','D','e','s','c','r','i','p','t','i','o','n',' ','F','R','O','M',' ',
90 'W','i','n','3','2','_','B','i','o','s',0};
91 static const WCHAR query7[] =
92 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
93 'P','r','o','c','e','s','s',' ','W','H','E','R','E',' ','C','a','p','t','i','o','n',' ',
94 'L','I','K','E',' ','\'','%','%','R','E','G','E','D','I','T','%','\'',0};
95 static const WCHAR query8[] =
96 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
97 'D','i','s','k','D','r','i','v','e',' ','W','H','E','R','E',' ','D','e','v','i','c','e','I','D','=',
98 '\"','\\','\\','\\','\\','.','\\','\\','P','H','Y','S','I','C','A','L','D','R','I','V','E','0','\"',0};
99 static const WCHAR query9[] =
100 {'S','E','L','E','C','T','\n','a','\r','F','R','O','M','\t','b',0};
101 static const WCHAR *test[] = { query1, query2, query3, query4, query5, query6, query7, query8, query9 };
102 HRESULT hr;
103 IEnumWbemClassObject *result;
104 BSTR wql = SysAllocString( wqlW );
105 BSTR sql = SysAllocString( sqlW );
106 BSTR query = SysAllocString( query1 );
107 UINT i;
108
109 hr = IWbemServices_ExecQuery( services, NULL, NULL, 0, NULL, &result );
110 ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
111
112 hr = IWbemServices_ExecQuery( services, NULL, query, 0, NULL, &result );
113 ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
114
115 hr = IWbemServices_ExecQuery( services, wql, NULL, 0, NULL, &result );
116 ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
117
118 hr = IWbemServices_ExecQuery( services, sql, query, 0, NULL, &result );
119 ok( hr == WBEM_E_INVALID_QUERY_TYPE, "query failed %08x\n", hr );
120
121 hr = IWbemServices_ExecQuery( services, sql, NULL, 0, NULL, &result );
122 ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
123
124 SysFreeString( query );
125 query = SysAllocString( emptyW );
126 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
127 ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
128
129 for (i = 0; i < sizeof(test)/sizeof(test[0]); i++)
130 {
131 hr = exec_query( services, test[i], &result );
132 ok( hr == S_OK, "query %u failed: %08x\n", i, hr );
133 if (result) IEnumWbemClassObject_Release( result );
134 }
135
136 SysFreeString( wql );
137 SysFreeString( sql );
138 SysFreeString( query );
139 }
140
141 static void test_Win32_Service( IWbemServices *services )
142 {
143 static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
144 static const WCHAR pauseserviceW[] = {'P','a','u','s','e','S','e','r','v','i','c','e',0};
145 static const WCHAR resumeserviceW[] = {'R','e','s','u','m','e','S','e','r','v','i','c','e',0};
146 static const WCHAR startserviceW[] = {'S','t','a','r','t','S','e','r','v','i','c','e',0};
147 static const WCHAR stopserviceW[] = {'S','t','o','p','S','e','r','v','i','c','e',0};
148 static const WCHAR stateW[] = {'S','t','a','t','e',0};
149 static const WCHAR stoppedW[] = {'S','t','o','p','p','e','d',0};
150 static const WCHAR serviceW[] = {'W','i','n','3','2','_','S','e','r','v','i','c','e','.',
151 'N','a','m','e','=','"','S','p','o','o','l','e','r','"',0};
152 static const WCHAR emptyW[] = {0};
153 BSTR class = SysAllocString( serviceW ), empty = SysAllocString( emptyW ), method;
154 IWbemClassObject *service, *out;
155 VARIANT state, retval;
156 CIMTYPE type;
157 HRESULT hr;
158
159 hr = IWbemServices_GetObject( services, class, 0, NULL, &service, NULL );
160 if (hr != S_OK)
161 {
162 win_skip( "Win32_Service not available\n" );
163 goto out;
164 }
165 type = 0xdeadbeef;
166 VariantInit( &state );
167 hr = IWbemClassObject_Get( service, stateW, 0, &state, &type, NULL );
168 ok( hr == S_OK, "failed to get service state %08x\n", hr );
169 ok( V_VT( &state ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &state ) );
170 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
171
172 if (!lstrcmpW( V_BSTR( &state ), stoppedW ))
173 {
174 out = NULL;
175 method = SysAllocString( startserviceW );
176 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
177 ok( hr == S_OK, "failed to execute method %08x\n", hr );
178 SysFreeString( method );
179
180 VariantInit( &retval );
181 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL );
182 ok( hr == S_OK, "failed to get return value %08x\n", hr );
183 ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
184 IWbemClassObject_Release( out );
185 }
186 out = NULL;
187 method = SysAllocString( pauseserviceW );
188 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
189 ok( hr == S_OK, "failed to execute method %08x\n", hr );
190 SysFreeString( method );
191
192 VariantInit( &retval );
193 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL );
194 ok( hr == S_OK, "failed to get return value %08x\n", hr );
195 ok( V_I4( &retval ), "unexpected success\n" );
196 IWbemClassObject_Release( out );
197
198 out = NULL;
199 method = SysAllocString( resumeserviceW );
200 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
201 ok( hr == S_OK, "failed to execute method %08x\n", hr );
202 SysFreeString( method );
203
204 VariantInit( &retval );
205 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL );
206 ok( hr == S_OK, "failed to get return value %08x\n", hr );
207 ok( V_I4( &retval ), "unexpected success\n" );
208 IWbemClassObject_Release( out );
209
210 if (!lstrcmpW( V_BSTR( &state ), stoppedW ))
211 {
212 out = NULL;
213 method = SysAllocString( stopserviceW );
214 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
215 ok( hr == S_OK, "failed to execute method %08x\n", hr );
216 SysFreeString( method );
217
218 VariantInit( &retval );
219 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL );
220 ok( hr == S_OK, "failed to get return value %08x\n", hr );
221 ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
222 IWbemClassObject_Release( out );
223 }
224 VariantClear( &state );
225 IWbemClassObject_Release( service );
226
227 service = NULL;
228 hr = IWbemServices_GetObject( services, NULL, 0, NULL, &service, NULL );
229 ok( hr == S_OK, "got %08x\n", hr );
230 if (service) IWbemClassObject_Release( service );
231
232 service = NULL;
233 hr = IWbemServices_GetObject( services, empty, 0, NULL, &service, NULL );
234 ok( hr == S_OK, "got %08x\n", hr );
235 if (service) IWbemClassObject_Release( service );
236
237 out:
238 SysFreeString( empty );
239 SysFreeString( class );
240 }
241
242 static void test_Win32_Process( IWbemServices *services )
243 {
244 static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
245 static const WCHAR getownerW[] = {'G','e','t','O','w','n','e','r',0};
246 static const WCHAR userW[] = {'U','s','e','r',0};
247 static const WCHAR domainW[] = {'D','o','m','a','i','n',0};
248 static const WCHAR processW[] = {'W','i','n','3','2','_','P','r','o','c','e','s','s',0};
249 static const WCHAR idW[] = {'I','D',0};
250 static const WCHAR fmtW[] = {'W','i','n','3','2','_','P','r','o','c','e','s','s','.',
251 'H','a','n','d','l','e','=','"','%','u','"',0};
252 static const LONG expected_flavor = WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE |
253 WBEM_FLAVOR_NOT_OVERRIDABLE |
254 WBEM_FLAVOR_ORIGIN_PROPAGATED;
255 BSTR class, method;
256 IWbemClassObject *process, *out;
257 IWbemQualifierSet *qualifiers;
258 VARIANT user, domain, retval, val;
259 LONG flavor;
260 CIMTYPE type;
261 HRESULT hr;
262
263 class = SysAllocString( processW );
264 hr = IWbemServices_GetObject( services, class, 0, NULL, &process, NULL );
265 SysFreeString( class );
266 if (hr != S_OK)
267 {
268 win_skip( "Win32_Process not available\n" );
269 return;
270 }
271 hr = IWbemClassObject_GetMethod( process, getownerW, 0, NULL, NULL );
272 ok( hr == S_OK, "failed to get GetOwner method %08x\n", hr );
273 IWbemClassObject_Release( process );
274
275 out = NULL;
276 method = SysAllocString( getownerW );
277 class = SysAllocStringLen( NULL, sizeof(fmtW)/sizeof(fmtW[0]) + 10 );
278 wsprintfW( class, fmtW, GetCurrentProcessId() );
279 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
280 ok( hr == S_OK, "failed to execute method %08x\n", hr );
281 SysFreeString( method );
282 SysFreeString( class );
283
284 type = 0xdeadbeef;
285 VariantInit( &retval );
286 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
287 ok( hr == S_OK, "failed to get return value %08x\n", hr );
288 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
289 ok( !V_I4( &retval ), "unexpected error %u\n", V_I4( &retval ) );
290 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
291
292 type = 0xdeadbeef;
293 VariantInit( &user );
294 hr = IWbemClassObject_Get( out, userW, 0, &user, &type, NULL );
295 ok( hr == S_OK, "failed to get user %08x\n", hr );
296 ok( V_VT( &user ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &user ) );
297 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
298 trace("%s\n", wine_dbgstr_w(V_BSTR(&user)));
299
300 type = 0xdeadbeef;
301 VariantInit( &domain );
302 hr = IWbemClassObject_Get( out, domainW, 0, &domain, &type, NULL );
303 ok( hr == S_OK, "failed to get domain %08x\n", hr );
304 ok( V_VT( &domain ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &domain ) );
305 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
306 trace("%s\n", wine_dbgstr_w(V_BSTR(&domain)));
307
308 hr = IWbemClassObject_GetPropertyQualifierSet( out, userW, &qualifiers );
309 ok( hr == S_OK, "failed to get qualifier set %08x\n", hr );
310
311 flavor = -1;
312 V_I4(&val) = -1;
313 V_VT(&val) = VT_ERROR;
314 hr = IWbemQualifierSet_Get( qualifiers, idW, 0, &val, &flavor );
315 ok( hr == S_OK, "got %08x\n", hr );
316 ok( flavor == expected_flavor, "got %d\n", flavor );
317 ok( V_VT(&val) == VT_I4, "got %u\n", V_VT(&val) );
318 ok( V_I4(&val) == 0, "got %u\n", V_I4(&val) );
319 VariantClear( &val );
320
321 IWbemQualifierSet_Release( qualifiers );
322 hr = IWbemClassObject_GetPropertyQualifierSet( out, domainW, &qualifiers );
323 ok( hr == S_OK, "failed to get qualifier set %08x\n", hr );
324
325 flavor = -1;
326 V_I4(&val) = -1;
327 V_VT(&val) = VT_ERROR;
328 hr = IWbemQualifierSet_Get( qualifiers, idW, 0, &val, &flavor );
329 ok( hr == S_OK, "got %08x\n", hr );
330 ok( flavor == expected_flavor, "got %d\n", flavor );
331 ok( V_VT(&val) == VT_I4, "got %u\n", V_VT(&val) );
332 ok( V_I4(&val) == 1, "got %u\n", V_I4(&val) );
333 VariantClear( &val );
334
335 IWbemQualifierSet_Release( qualifiers );
336 hr = IWbemClassObject_GetPropertyQualifierSet( out, returnvalueW, &qualifiers );
337 ok( hr == S_OK, "failed to get qualifier set %08x\n", hr );
338
339 hr = IWbemQualifierSet_Get( qualifiers, idW, 0, &val, &flavor );
340 ok( hr == WBEM_E_NOT_FOUND, "got %08x\n", hr );
341
342 IWbemQualifierSet_Release( qualifiers );
343 VariantClear( &user );
344 VariantClear( &domain );
345 IWbemClassObject_Release( out );
346 }
347
348 static void test_Win32_ComputerSystem( IWbemServices *services )
349 {
350 static const WCHAR nameW[] = {'N','a','m','e',0};
351 static const WCHAR usernameW[] = {'U','s','e','r','N','a','m','e',0};
352 static const WCHAR backslashW[] = {'\\',0};
353 static const WCHAR queryW[] =
354 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
355 'C','o','m','p','u','t','e','r','S','y','s','t','e','m',0};
356 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
357 IEnumWbemClassObject *result;
358 IWbemClassObject *service;
359 VARIANT value;
360 CIMTYPE type;
361 HRESULT hr;
362 WCHAR compname[MAX_COMPUTERNAME_LENGTH + 1];
363 WCHAR username[128];
364 DWORD len, count;
365
366 len = sizeof(compname) / sizeof(compname[0]);
367 if (!GetComputerNameW( compname, &len ))
368 compname[0] = 0;
369
370 lstrcpyW( username, compname );
371 lstrcatW( username, backslashW );
372 len = sizeof(username) / sizeof(username[0]) - lstrlenW( username );
373 if (!GetUserNameW( username + lstrlenW( username ), &len ))
374 username[0] = 0;
375
376 if (!compname[0] || !username[0])
377 {
378 skip( "Failed to get user or computer name\n" );
379 goto out;
380 }
381
382 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
383 if (hr != S_OK)
384 {
385 win_skip( "Win32_ComputerSystem not available\n" );
386 goto out;
387 }
388
389 hr = IEnumWbemClassObject_Next( result, 10000, 1, &service, &count );
390 ok( hr == S_OK, "got %08x\n", hr );
391
392 type = 0xdeadbeef;
393 VariantInit( &value );
394 hr = IWbemClassObject_Get( service, nameW, 0, &value, &type, NULL );
395 ok( hr == S_OK, "failed to get computer name %08x\n", hr );
396 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
397 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
398 ok( !lstrcmpiW( V_BSTR( &value ), compname ), "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value)), wine_dbgstr_w(compname) );
399 VariantClear( &value );
400
401 type = 0xdeadbeef;
402 VariantInit( &value );
403 hr = IWbemClassObject_Get( service, usernameW, 0, &value, &type, NULL );
404 ok( hr == S_OK, "failed to get computer name %08x\n", hr );
405 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
406 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
407 ok( !lstrcmpiW( V_BSTR( &value ), username ), "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value)), wine_dbgstr_w(username) );
408 VariantClear( &value );
409
410 IWbemClassObject_Release( service );
411 IEnumWbemClassObject_Release( result );
412 out:
413 SysFreeString( query );
414 SysFreeString( wql );
415 }
416
417 static void test_Win32_SystemEnclosure( IWbemServices *services )
418 {
419 static const WCHAR queryW[] =
420 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
421 'S','y','s','t','e','m','E','n','c','l','o','s','u','r','e',0};
422 static const WCHAR captionW[] = {'C','a','p','t','i','o','n',0};
423 static const WCHAR chassistypesW[] = {'C','h','a','s','s','i','s','T','y','p','e','s',0};
424 static const WCHAR descriptionW[] = {'D','e','s','c','r','i','p','t','i','o','n',0};
425 static const WCHAR lockpresentW[] = {'L','o','c','k','P','r','e','s','e','n','t',0};
426 static const WCHAR manufacturerW[] = {'M','a','n','u','f','a','c','t','u','r','e','r',0};
427 static const WCHAR nameW[] = {'N','a','m','e',0};
428 static const WCHAR tagW[] = {'T','a','g',0};
429 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
430 IEnumWbemClassObject *result;
431 IWbemClassObject *obj;
432 CIMTYPE type;
433 ULONG count;
434 VARIANT val;
435 DWORD *data;
436 HRESULT hr;
437
438 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
439 ok( hr == S_OK, "IWbemServices_ExecQuery failed %08x\n", hr );
440
441 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
442 ok( hr == S_OK, "IEnumWbemClassObject_Next failed %08x\n", hr );
443
444 type = 0xdeadbeef;
445 VariantInit( &val );
446 hr = IWbemClassObject_Get( obj, captionW, 0, &val, &type, NULL );
447 ok( hr == S_OK, "failed to get caption %08x\n", hr );
448 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
449 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
450 trace( "caption: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
451 VariantClear( &val );
452
453 type = 0xdeadbeef;
454 VariantInit( &val );
455 hr = IWbemClassObject_Get( obj, chassistypesW, 0, &val, &type, NULL );
456 ok( hr == S_OK, "failed to get chassis types %08x\n", hr );
457 todo_wine
458 ok( V_VT( &val ) == (VT_I4|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &val ) );
459 ok( type == (CIM_UINT16|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
460 hr = SafeArrayAccessData( V_ARRAY( &val ), (void **)&data );
461 ok( hr == S_OK, "SafeArrayAccessData failed %x\n", hr );
462 if (SUCCEEDED(hr))
463 {
464 LONG i, lower, upper;
465
466 hr = SafeArrayGetLBound( V_ARRAY( &val ), 1, &lower );
467 ok( hr == S_OK, "SafeArrayGetLBound failed %x\n", hr );
468 hr = SafeArrayGetUBound( V_ARRAY( &val ), 1, &upper );
469 ok( hr == S_OK, "SafeArrayGetUBound failed %x\n", hr );
470 if (V_VT( &val ) == (VT_I4|VT_ARRAY))
471 {
472 for (i = 0; i < upper - lower + 1; i++)
473 trace( "chassis type: %u\n", data[i] );
474 }
475 hr = SafeArrayUnaccessData( V_ARRAY( &val ) );
476 ok( hr == S_OK, "SafeArrayUnaccessData failed %x\n", hr );
477 }
478 VariantClear( &val );
479
480 type = 0xdeadbeef;
481 VariantInit( &val );
482 hr = IWbemClassObject_Get( obj, descriptionW, 0, &val, &type, NULL );
483 ok( hr == S_OK, "failed to get description %08x\n", hr );
484 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
485 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
486 trace( "description: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
487 VariantClear( &val );
488
489 type = 0xdeadbeef;
490 VariantInit( &val );
491 hr = IWbemClassObject_Get( obj, lockpresentW, 0, &val, &type, NULL );
492 ok( hr == S_OK, "failed to get lockpresent %08x\n", hr );
493 ok( V_VT( &val ) == VT_BOOL, "unexpected variant type 0x%x\n", V_VT( &val ) );
494 ok( type == CIM_BOOLEAN, "unexpected type 0x%x\n", type );
495 trace( "lockpresent: %u\n", V_BOOL( &val ) );
496 VariantClear( &val );
497
498 type = 0xdeadbeef;
499 VariantInit( &val );
500 hr = IWbemClassObject_Get( obj, manufacturerW, 0, &val, &type, NULL );
501 ok( hr == S_OK, "failed to get manufacturer %08x\n", hr );
502 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
503 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
504 trace( "manufacturer: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
505 VariantClear( &val );
506
507 type = 0xdeadbeef;
508 VariantInit( &val );
509 hr = IWbemClassObject_Get( obj, nameW, 0, &val, &type, NULL );
510 ok( hr == S_OK, "failed to get name %08x\n", hr );
511 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
512 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
513 trace( "name: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
514 VariantClear( &val );
515
516 type = 0xdeadbeef;
517 VariantInit( &val );
518 hr = IWbemClassObject_Get( obj, tagW, 0, &val, &type, NULL );
519 ok( hr == S_OK, "failed to get tag %08x\n", hr );
520 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
521 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
522 trace( "tag: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
523 VariantClear( &val );
524
525 IWbemClassObject_Release( obj );
526 IEnumWbemClassObject_Release( result );
527 SysFreeString( query );
528 SysFreeString( wql );
529 }
530
531 static void test_StdRegProv( IWbemServices *services )
532 {
533 static const WCHAR enumkeyW[] = {'E','n','u','m','K','e','y',0};
534 static const WCHAR enumvaluesW[] = {'E','n','u','m','V','a','l','u','e','s',0};
535 static const WCHAR getstringvalueW[] = {'G','e','t','S','t','r','i','n','g','V','a','l','u','e',0};
536 static const WCHAR stdregprovW[] = {'S','t','d','R','e','g','P','r','o','v',0};
537 static const WCHAR defkeyW[] = {'h','D','e','f','K','e','y',0};
538 static const WCHAR subkeynameW[] = {'s','S','u','b','K','e','y','N','a','m','e',0};
539 static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
540 static const WCHAR namesW[] = {'s','N','a','m','e','s',0};
541 static const WCHAR typesW[] = {'T','y','p','e','s',0};
542 static const WCHAR valueW[] = {'s','V','a','l','u','e',0};
543 static const WCHAR valuenameW[] = {'s','V','a','l','u','e','N','a','m','e',0};
544 static const WCHAR programfilesW[] = {'P','r','o','g','r','a','m','F','i','l','e','s','D','i','r',0};
545 static const WCHAR windowsW[] =
546 {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
547 'W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n',0};
548 BSTR class = SysAllocString( stdregprovW ), method;
549 IWbemClassObject *reg, *sig_in, *in, *out;
550 VARIANT defkey, subkey, retval, names, types, value, valuename;
551 CIMTYPE type;
552 HRESULT hr;
553
554 hr = IWbemServices_GetObject( services, class, 0, NULL, &reg, NULL );
555 if (hr != S_OK)
556 {
557 win_skip( "StdRegProv not available\n" );
558 return;
559 }
560 hr = IWbemClassObject_GetMethod( reg, enumkeyW, 0, &sig_in, NULL );
561 ok( hr == S_OK, "failed to get EnumKey method %08x\n", hr );
562
563 hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in );
564 ok( hr == S_OK, "failed to spawn instance %08x\n", hr );
565
566 V_VT( &defkey ) = VT_I4;
567 V_I4( &defkey ) = 0x80000002;
568 hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 );
569 ok( hr == S_OK, "failed to set root %08x\n", hr );
570
571 V_VT( &subkey ) = VT_BSTR;
572 V_BSTR( &subkey ) = SysAllocString( windowsW );
573 hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 );
574 ok( hr == S_OK, "failed to set subkey %08x\n", hr );
575
576 out = NULL;
577 method = SysAllocString( enumkeyW );
578 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL );
579 ok( hr == S_OK, "failed to execute method %08x\n", hr );
580 SysFreeString( method );
581
582 type = 0xdeadbeef;
583 VariantInit( &retval );
584 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
585 ok( hr == S_OK, "failed to get return value %08x\n", hr );
586 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
587 ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
588 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
589
590 type = 0xdeadbeef;
591 VariantInit( &names );
592 hr = IWbemClassObject_Get( out, namesW, 0, &names, &type, NULL );
593 ok( hr == S_OK, "failed to get names %08x\n", hr );
594 ok( V_VT( &names ) == (VT_BSTR|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &names ) );
595 ok( type == (CIM_STRING|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
596
597 VariantClear( &names );
598 VariantClear( &subkey );
599 IWbemClassObject_Release( in );
600 IWbemClassObject_Release( out );
601 IWbemClassObject_Release( sig_in );
602
603 hr = IWbemClassObject_GetMethod( reg, enumvaluesW, 0, &sig_in, NULL );
604 ok( hr == S_OK, "failed to get EnumValues method %08x\n", hr );
605
606 hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in );
607 ok( hr == S_OK, "failed to spawn instance %08x\n", hr );
608
609 V_VT( &defkey ) = VT_I4;
610 V_I4( &defkey ) = 0x80000002;
611 hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 );
612 ok( hr == S_OK, "failed to set root %08x\n", hr );
613
614 V_VT( &subkey ) = VT_BSTR;
615 V_BSTR( &subkey ) = SysAllocString( windowsW );
616 hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 );
617 ok( hr == S_OK, "failed to set subkey %08x\n", hr );
618
619 out = NULL;
620 method = SysAllocString( enumvaluesW );
621 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL );
622 ok( hr == S_OK, "failed to execute method %08x\n", hr );
623 SysFreeString( method );
624
625 type = 0xdeadbeef;
626 VariantInit( &retval );
627 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
628 ok( hr == S_OK, "failed to get return value %08x\n", hr );
629 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
630 ok( !V_I4( &retval ), "unexpected error %u\n", V_I4( &retval ) );
631 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
632
633 type = 0xdeadbeef;
634 VariantInit( &names );
635 hr = IWbemClassObject_Get( out, namesW, 0, &names, &type, NULL );
636 ok( hr == S_OK, "failed to get names %08x\n", hr );
637 ok( V_VT( &names ) == (VT_BSTR|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &names ) );
638 ok( type == (CIM_STRING|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
639
640 type = 0xdeadbeef;
641 VariantInit( &types );
642 hr = IWbemClassObject_Get( out, typesW, 0, &types, &type, NULL );
643 ok( hr == S_OK, "failed to get names %08x\n", hr );
644 ok( V_VT( &types ) == (VT_I4|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &types ) );
645 ok( type == (CIM_SINT32|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
646
647 VariantClear( &types );
648 VariantClear( &names );
649 VariantClear( &subkey );
650 IWbemClassObject_Release( in );
651 IWbemClassObject_Release( out );
652 IWbemClassObject_Release( sig_in );
653
654 hr = IWbemClassObject_GetMethod( reg, getstringvalueW, 0, &sig_in, NULL );
655 ok( hr == S_OK, "failed to get GetStringValue method %08x\n", hr );
656
657 hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in );
658 ok( hr == S_OK, "failed to spawn instance %08x\n", hr );
659
660 V_VT( &defkey ) = VT_I4;
661 V_I4( &defkey ) = 0x80000002;
662 hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 );
663 ok( hr == S_OK, "failed to set root %08x\n", hr );
664
665 V_VT( &subkey ) = VT_BSTR;
666 V_BSTR( &subkey ) = SysAllocString( windowsW );
667 hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 );
668 ok( hr == S_OK, "failed to set subkey %08x\n", hr );
669
670 V_VT( &valuename ) = VT_BSTR;
671 V_BSTR( &valuename ) = SysAllocString( programfilesW );
672 hr = IWbemClassObject_Put( in, valuenameW, 0, &valuename, 0 );
673 ok( hr == S_OK, "failed to set value name %08x\n", hr );
674
675 out = NULL;
676 method = SysAllocString( getstringvalueW );
677 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL );
678 ok( hr == S_OK, "failed to execute method %08x\n", hr );
679 SysFreeString( method );
680
681 type = 0xdeadbeef;
682 VariantInit( &retval );
683 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
684 ok( hr == S_OK, "failed to get return value %08x\n", hr );
685 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
686 ok( !V_I4( &retval ), "unexpected error %u\n", V_I4( &retval ) );
687 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
688
689 type = 0xdeadbeef;
690 VariantInit( &value );
691 hr = IWbemClassObject_Get( out, valueW, 0, &value, &type, NULL );
692 ok( hr == S_OK, "failed to get value %08x\n", hr );
693 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
694 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
695
696 VariantClear( &value );
697 VariantClear( &valuename );
698 VariantClear( &subkey );
699 IWbemClassObject_Release( in );
700 IWbemClassObject_Release( out );
701 IWbemClassObject_Release( sig_in );
702
703 IWbemClassObject_Release( reg );
704 SysFreeString( class );
705 }
706
707 static HRESULT WINAPI sink_QueryInterface(
708 IWbemObjectSink *iface, REFIID riid, void **ppv )
709 {
710 *ppv = NULL;
711 if (IsEqualGUID( &IID_IUnknown, riid ) || IsEqualGUID( &IID_IWbemObjectSink, riid ))
712 {
713 *ppv = iface;
714 IWbemObjectSink_AddRef( iface );
715 return S_OK;
716 }
717 return E_NOINTERFACE;
718 }
719
720 static ULONG sink_refs;
721
722 static ULONG WINAPI sink_AddRef(
723 IWbemObjectSink *iface )
724 {
725 return ++sink_refs;
726 }
727
728 static ULONG WINAPI sink_Release(
729 IWbemObjectSink *iface )
730 {
731 return --sink_refs;
732 }
733
734 static HRESULT WINAPI sink_Indicate(
735 IWbemObjectSink *iface, LONG count, IWbemClassObject **objects )
736 {
737 trace("Indicate: %d, %p\n", count, objects);
738 return S_OK;
739 }
740
741 static HRESULT WINAPI sink_SetStatus(
742 IWbemObjectSink *iface, LONG flags, HRESULT hresult, BSTR str_param, IWbemClassObject *obj_param )
743 {
744 trace("SetStatus: %08x, %08x, %s, %p\n", flags, hresult, wine_dbgstr_w(str_param), obj_param);
745 return S_OK;
746 }
747
748 static IWbemObjectSinkVtbl sink_vtbl =
749 {
750 sink_QueryInterface,
751 sink_AddRef,
752 sink_Release,
753 sink_Indicate,
754 sink_SetStatus
755 };
756
757 static IWbemObjectSink sink = { &sink_vtbl };
758
759 static void test_notification_query_async( IWbemServices *services )
760 {
761 static const WCHAR queryW[] =
762 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
763 'D','e','v','i','c','e','C','h','a','n','g','e','E','v','e','n','t',0};
764 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
765 ULONG prev_sink_refs;
766 HRESULT hr;
767
768 hr = IWbemServices_ExecNotificationQueryAsync( services, wql, query, 0, NULL, NULL );
769 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
770
771 prev_sink_refs = sink_refs;
772 hr = IWbemServices_ExecNotificationQueryAsync( services, wql, query, 0, NULL, &sink );
773 ok( hr == S_OK || broken(hr == WBEM_E_NOT_FOUND), "got %08x\n", hr );
774 ok( sink_refs > prev_sink_refs || broken(!sink_refs), "got %u refs\n", sink_refs );
775
776 hr = IWbemServices_CancelAsyncCall( services, &sink );
777 ok( hr == S_OK || broken(hr == WBEM_E_NOT_FOUND), "got %08x\n", hr );
778
779 SysFreeString( wql );
780 SysFreeString( query );
781 }
782
783 static void test_query_async( IWbemServices *services )
784 {
785 static const WCHAR queryW[] =
786 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
787 'P','r','o','c','e','s','s',0};
788 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
789 HRESULT hr;
790
791 hr = IWbemServices_ExecQueryAsync( services, wql, query, 0, NULL, NULL );
792 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
793
794 hr = IWbemServices_ExecQueryAsync( services, wql, query, 0, NULL, &sink );
795 ok( hr == S_OK || broken(hr == WBEM_E_NOT_FOUND), "got %08x\n", hr );
796
797 hr = IWbemServices_CancelAsyncCall( services, NULL );
798 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
799
800 hr = IWbemServices_CancelAsyncCall( services, &sink );
801 ok( hr == S_OK, "got %08x\n", hr );
802
803 SysFreeString( wql );
804 SysFreeString( query );
805 }
806
807 static void test_GetNames( IWbemServices *services )
808 {
809 static const WCHAR queryW[] =
810 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
811 'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
812 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
813 IEnumWbemClassObject *result;
814 HRESULT hr;
815
816 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
817 ok( hr == S_OK, "got %08x\n", hr );
818
819 for (;;)
820 {
821 IWbemClassObject *obj;
822 SAFEARRAY *names;
823 ULONG count;
824 VARIANT val;
825
826 IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
827 if (!count) break;
828
829 VariantInit( &val );
830 hr = IWbemClassObject_GetNames( obj, NULL, WBEM_FLAG_NONSYSTEM_ONLY, &val, &names );
831 ok( hr == S_OK, "got %08x\n", hr );
832
833 SafeArrayDestroy( names );
834 IWbemClassObject_Release( obj );
835 }
836 IEnumWbemClassObject_Release( result );
837 SysFreeString( query );
838 SysFreeString( wql );
839 }
840
841 static void test_SystemSecurity( IWbemServices *services )
842 {
843 static const WCHAR systemsecurityW[] = {'_','_','S','y','s','t','e','m','S','e','c','u','r','i','t','y',0};
844 static const WCHAR getsdW[] = {'G','e','t','S','D',0};
845 static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
846 static const WCHAR sdW[] = {'S','D',0};
847 BSTR class = SysAllocString( systemsecurityW ), method;
848 IWbemClassObject *reg, *out;
849 VARIANT retval, var_sd;
850 void *data;
851 SECURITY_DESCRIPTOR_RELATIVE *sd;
852 CIMTYPE type;
853 HRESULT hr;
854 BYTE sid_admin_buffer[SECURITY_MAX_SID_SIZE];
855 SID *sid_admin = (SID*)sid_admin_buffer;
856 DWORD sid_size;
857 BOOL ret;
858
859 hr = IWbemServices_GetObject( services, class, 0, NULL, &reg, NULL );
860 if (hr != S_OK)
861 {
862 win_skip( "__SystemSecurity not available\n" );
863 return;
864 }
865
866 sid_size = sizeof(sid_admin_buffer);
867 ret = CreateWellKnownSid( WinBuiltinAdministratorsSid, NULL, sid_admin, &sid_size );
868 ok( ret, "CreateWellKnownSid failed\n" );
869
870 out = NULL;
871 method = SysAllocString( getsdW );
872 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
873 ok( hr == S_OK || hr == WBEM_E_ACCESS_DENIED, "failed to execute method %08x\n", hr );
874 SysFreeString( method );
875
876 if (SUCCEEDED(hr))
877 {
878 type = 0xdeadbeef;
879 VariantInit( &retval );
880 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
881 ok( hr == S_OK, "failed to get return value %08x\n", hr );
882 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
883 ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
884 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
885
886 type = 0xdeadbeef;
887 VariantInit( &var_sd );
888 hr = IWbemClassObject_Get( out, sdW, 0, &var_sd, &type, NULL );
889 ok( hr == S_OK, "failed to get names %08x\n", hr );
890 ok( V_VT( &var_sd ) == (VT_UI1|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &var_sd ) );
891 ok( type == (CIM_UINT8|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
892
893 hr = SafeArrayAccessData( V_ARRAY( &var_sd ), &data );
894 ok( hr == S_OK, "SafeArrayAccessData failed %x\n", hr );
895 if (SUCCEEDED(hr))
896 {
897 sd = data;
898
899 ok( (sd->Control & SE_SELF_RELATIVE) == SE_SELF_RELATIVE, "relative flag unset\n" );
900 ok( sd->Owner != 0, "no owner SID\n");
901 ok( sd->Group != 0, "no owner SID\n");
902 ok( EqualSid( (PSID)((LPBYTE)sd + sd->Owner), sid_admin ), "unexpected owner SID\n" );
903 ok( EqualSid( (PSID)((LPBYTE)sd + sd->Group), sid_admin ), "unexpected group SID\n" );
904
905 hr = SafeArrayUnaccessData( V_ARRAY( &var_sd ) );
906 ok( hr == S_OK, "SafeArrayUnaccessData failed %x\n", hr );
907 }
908
909 VariantClear( &var_sd );
910 IWbemClassObject_Release( out );
911 }
912 else if (hr == WBEM_E_ACCESS_DENIED)
913 win_skip( "insufficient privs to test __SystemSecurity\n" );
914
915 SysFreeString( class );
916 }
917
918 START_TEST(query)
919 {
920 static const WCHAR cimv2W[] = {'R','O','O','T','\\','C','I','M','V','2',0};
921 BSTR path = SysAllocString( cimv2W );
922 IWbemLocator *locator;
923 IWbemServices *services;
924 HRESULT hr;
925
926 CoInitialize( NULL );
927 CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
928 RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL );
929 hr = CoCreateInstance( &CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, &IID_IWbemLocator,
930 (void **)&locator );
931 if (hr != S_OK)
932 {
933 win_skip("can't create instance of WbemLocator\n");
934 return;
935 }
936 hr = IWbemLocator_ConnectServer( locator, path, NULL, NULL, NULL, 0, NULL, NULL, &services );
937 ok( hr == S_OK, "failed to get IWbemServices interface %08x\n", hr );
938
939 hr = CoSetProxyBlanket( (IUnknown *)services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL,
940 RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE );
941 ok( hr == S_OK, "failed to set proxy blanket %08x\n", hr );
942
943 test_select( services );
944 test_Win32_Process( services );
945 test_Win32_Service( services );
946 test_Win32_ComputerSystem( services );
947 test_Win32_SystemEnclosure( services );
948 test_StdRegProv( services );
949 test_notification_query_async( services );
950 test_query_async( services );
951 test_GetNames( services );
952 test_SystemSecurity( services );
953
954 SysFreeString( path );
955 IWbemServices_Release( services );
956 IWbemLocator_Release( locator );
957 CoUninitialize();
958 }