wbemprox: Fix evaluation of LIKE queries.
[wine/multimedia.git] / dlls / wbemprox / tests / query.c
blob09c8734fb7f007904eed3d7ca2e95086a40452d2
1 /*
2 * Copyright 2012 Hans Leidekker for CodeWeavers
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.
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.
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
19 #define COBJMACROS
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"
30 static const WCHAR wqlW[] = {'w','q','l',0};
32 static HRESULT exec_query( IWbemServices *services, const WCHAR *str, IEnumWbemClassObject **result )
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;
42 hr = IWbemServices_ExecQuery( services, wql, query, flags, NULL, result );
43 if (hr == S_OK)
45 trace("%s\n", wine_dbgstr_w(str));
46 for (;;)
48 VARIANT var;
50 IEnumWbemClassObject_Next( *result, 10000, 1, &obj, &count );
51 if (!count) break;
53 if (IWbemClassObject_Get( obj, captionW, 0, &var, NULL, NULL ) == WBEM_S_NO_ERROR)
55 trace("caption: %s\n", wine_dbgstr_w(V_BSTR(&var)));
56 VariantClear( &var );
58 if (IWbemClassObject_Get( obj, descriptionW, 0, &var, NULL, NULL ) == WBEM_S_NO_ERROR)
60 trace("description: %s\n", wine_dbgstr_w(V_BSTR(&var)));
61 VariantClear( &var );
63 IWbemClassObject_Release( obj );
66 SysFreeString( wql );
67 SysFreeString( query );
68 return hr;
71 static void test_select( IWbemServices *services )
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 query10[] =
102 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
103 'P','r','o','c','e','s','s',' ','W','H','E','R','E',' ','C','a','p','t','i','o','n',' ',
104 'L','I','K','E',' ','"','%','f','i','r','e','f','o','x','.','e','x','e','"',0};
105 static const WCHAR *test[] = { query1, query2, query3, query4, query5, query6, query7, query8, query9, query10 };
106 HRESULT hr;
107 IEnumWbemClassObject *result;
108 BSTR wql = SysAllocString( wqlW );
109 BSTR sql = SysAllocString( sqlW );
110 BSTR query = SysAllocString( query1 );
111 UINT i;
113 hr = IWbemServices_ExecQuery( services, NULL, NULL, 0, NULL, &result );
114 ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
116 hr = IWbemServices_ExecQuery( services, NULL, query, 0, NULL, &result );
117 ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
119 hr = IWbemServices_ExecQuery( services, wql, NULL, 0, NULL, &result );
120 ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
122 hr = IWbemServices_ExecQuery( services, sql, query, 0, NULL, &result );
123 ok( hr == WBEM_E_INVALID_QUERY_TYPE, "query failed %08x\n", hr );
125 hr = IWbemServices_ExecQuery( services, sql, NULL, 0, NULL, &result );
126 ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
128 SysFreeString( query );
129 query = SysAllocString( emptyW );
130 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
131 ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
133 for (i = 0; i < sizeof(test)/sizeof(test[0]); i++)
135 hr = exec_query( services, test[i], &result );
136 ok( hr == S_OK, "query %u failed: %08x\n", i, hr );
137 if (result) IEnumWbemClassObject_Release( result );
140 SysFreeString( wql );
141 SysFreeString( sql );
142 SysFreeString( query );
145 static void test_Win32_Service( IWbemServices *services )
147 static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
148 static const WCHAR pauseserviceW[] = {'P','a','u','s','e','S','e','r','v','i','c','e',0};
149 static const WCHAR resumeserviceW[] = {'R','e','s','u','m','e','S','e','r','v','i','c','e',0};
150 static const WCHAR startserviceW[] = {'S','t','a','r','t','S','e','r','v','i','c','e',0};
151 static const WCHAR stopserviceW[] = {'S','t','o','p','S','e','r','v','i','c','e',0};
152 static const WCHAR stateW[] = {'S','t','a','t','e',0};
153 static const WCHAR stoppedW[] = {'S','t','o','p','p','e','d',0};
154 static const WCHAR serviceW[] = {'W','i','n','3','2','_','S','e','r','v','i','c','e','.',
155 'N','a','m','e','=','"','S','p','o','o','l','e','r','"',0};
156 static const WCHAR emptyW[] = {0};
157 BSTR class = SysAllocString( serviceW ), empty = SysAllocString( emptyW ), method;
158 IWbemClassObject *service, *out;
159 VARIANT state, retval;
160 CIMTYPE type;
161 HRESULT hr;
163 hr = IWbemServices_GetObject( services, class, 0, NULL, &service, NULL );
164 if (hr != S_OK)
166 win_skip( "Win32_Service not available\n" );
167 goto out;
169 type = 0xdeadbeef;
170 VariantInit( &state );
171 hr = IWbemClassObject_Get( service, stateW, 0, &state, &type, NULL );
172 ok( hr == S_OK, "failed to get service state %08x\n", hr );
173 ok( V_VT( &state ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &state ) );
174 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
176 if (!lstrcmpW( V_BSTR( &state ), stoppedW ))
178 out = NULL;
179 method = SysAllocString( startserviceW );
180 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
181 ok( hr == S_OK, "failed to execute method %08x\n", hr );
182 SysFreeString( method );
184 VariantInit( &retval );
185 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL );
186 ok( hr == S_OK, "failed to get return value %08x\n", hr );
187 ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
188 IWbemClassObject_Release( out );
190 out = NULL;
191 method = SysAllocString( pauseserviceW );
192 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
193 ok( hr == S_OK, "failed to execute method %08x\n", hr );
194 SysFreeString( method );
196 VariantInit( &retval );
197 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL );
198 ok( hr == S_OK, "failed to get return value %08x\n", hr );
199 ok( V_I4( &retval ), "unexpected success\n" );
200 IWbemClassObject_Release( out );
202 out = NULL;
203 method = SysAllocString( resumeserviceW );
204 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
205 ok( hr == S_OK, "failed to execute method %08x\n", hr );
206 SysFreeString( method );
208 VariantInit( &retval );
209 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL );
210 ok( hr == S_OK, "failed to get return value %08x\n", hr );
211 ok( V_I4( &retval ), "unexpected success\n" );
212 IWbemClassObject_Release( out );
214 if (!lstrcmpW( V_BSTR( &state ), stoppedW ))
216 out = NULL;
217 method = SysAllocString( stopserviceW );
218 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
219 ok( hr == S_OK, "failed to execute method %08x\n", hr );
220 SysFreeString( method );
222 VariantInit( &retval );
223 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL );
224 ok( hr == S_OK, "failed to get return value %08x\n", hr );
225 ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
226 IWbemClassObject_Release( out );
228 VariantClear( &state );
229 IWbemClassObject_Release( service );
231 service = NULL;
232 hr = IWbemServices_GetObject( services, NULL, 0, NULL, &service, NULL );
233 ok( hr == S_OK, "got %08x\n", hr );
234 if (service) IWbemClassObject_Release( service );
236 service = NULL;
237 hr = IWbemServices_GetObject( services, empty, 0, NULL, &service, NULL );
238 ok( hr == S_OK, "got %08x\n", hr );
239 if (service) IWbemClassObject_Release( service );
241 out:
242 SysFreeString( empty );
243 SysFreeString( class );
246 static void test_Win32_Process( IWbemServices *services )
248 static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
249 static const WCHAR getownerW[] = {'G','e','t','O','w','n','e','r',0};
250 static const WCHAR userW[] = {'U','s','e','r',0};
251 static const WCHAR domainW[] = {'D','o','m','a','i','n',0};
252 static const WCHAR processW[] = {'W','i','n','3','2','_','P','r','o','c','e','s','s',0};
253 static const WCHAR idW[] = {'I','D',0};
254 static const WCHAR fmtW[] = {'W','i','n','3','2','_','P','r','o','c','e','s','s','.',
255 'H','a','n','d','l','e','=','"','%','u','"',0};
256 static const LONG expected_flavor = WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE |
257 WBEM_FLAVOR_NOT_OVERRIDABLE |
258 WBEM_FLAVOR_ORIGIN_PROPAGATED;
259 BSTR class, method;
260 IWbemClassObject *process, *out;
261 IWbemQualifierSet *qualifiers;
262 VARIANT user, domain, retval, val;
263 LONG flavor;
264 CIMTYPE type;
265 HRESULT hr;
267 class = SysAllocString( processW );
268 hr = IWbemServices_GetObject( services, class, 0, NULL, &process, NULL );
269 SysFreeString( class );
270 if (hr != S_OK)
272 win_skip( "Win32_Process not available\n" );
273 return;
275 hr = IWbemClassObject_GetMethod( process, getownerW, 0, NULL, NULL );
276 ok( hr == S_OK, "failed to get GetOwner method %08x\n", hr );
277 IWbemClassObject_Release( process );
279 out = NULL;
280 method = SysAllocString( getownerW );
281 class = SysAllocStringLen( NULL, sizeof(fmtW)/sizeof(fmtW[0]) + 10 );
282 wsprintfW( class, fmtW, GetCurrentProcessId() );
283 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
284 ok( hr == S_OK, "failed to execute method %08x\n", hr );
285 SysFreeString( method );
286 SysFreeString( class );
288 type = 0xdeadbeef;
289 VariantInit( &retval );
290 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
291 ok( hr == S_OK, "failed to get return value %08x\n", hr );
292 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
293 ok( !V_I4( &retval ), "unexpected error %u\n", V_I4( &retval ) );
294 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
296 type = 0xdeadbeef;
297 VariantInit( &user );
298 hr = IWbemClassObject_Get( out, userW, 0, &user, &type, NULL );
299 ok( hr == S_OK, "failed to get user %08x\n", hr );
300 ok( V_VT( &user ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &user ) );
301 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
302 trace("%s\n", wine_dbgstr_w(V_BSTR(&user)));
304 type = 0xdeadbeef;
305 VariantInit( &domain );
306 hr = IWbemClassObject_Get( out, domainW, 0, &domain, &type, NULL );
307 ok( hr == S_OK, "failed to get domain %08x\n", hr );
308 ok( V_VT( &domain ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &domain ) );
309 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
310 trace("%s\n", wine_dbgstr_w(V_BSTR(&domain)));
312 hr = IWbemClassObject_GetPropertyQualifierSet( out, userW, &qualifiers );
313 ok( hr == S_OK, "failed to get qualifier set %08x\n", hr );
315 flavor = -1;
316 V_I4(&val) = -1;
317 V_VT(&val) = VT_ERROR;
318 hr = IWbemQualifierSet_Get( qualifiers, idW, 0, &val, &flavor );
319 ok( hr == S_OK, "got %08x\n", hr );
320 ok( flavor == expected_flavor, "got %d\n", flavor );
321 ok( V_VT(&val) == VT_I4, "got %u\n", V_VT(&val) );
322 ok( V_I4(&val) == 0, "got %u\n", V_I4(&val) );
323 VariantClear( &val );
325 IWbemQualifierSet_Release( qualifiers );
326 hr = IWbemClassObject_GetPropertyQualifierSet( out, domainW, &qualifiers );
327 ok( hr == S_OK, "failed to get qualifier set %08x\n", hr );
329 flavor = -1;
330 V_I4(&val) = -1;
331 V_VT(&val) = VT_ERROR;
332 hr = IWbemQualifierSet_Get( qualifiers, idW, 0, &val, &flavor );
333 ok( hr == S_OK, "got %08x\n", hr );
334 ok( flavor == expected_flavor, "got %d\n", flavor );
335 ok( V_VT(&val) == VT_I4, "got %u\n", V_VT(&val) );
336 ok( V_I4(&val) == 1, "got %u\n", V_I4(&val) );
337 VariantClear( &val );
339 IWbemQualifierSet_Release( qualifiers );
340 hr = IWbemClassObject_GetPropertyQualifierSet( out, returnvalueW, &qualifiers );
341 ok( hr == S_OK, "failed to get qualifier set %08x\n", hr );
343 hr = IWbemQualifierSet_Get( qualifiers, idW, 0, &val, &flavor );
344 ok( hr == WBEM_E_NOT_FOUND, "got %08x\n", hr );
346 IWbemQualifierSet_Release( qualifiers );
347 VariantClear( &user );
348 VariantClear( &domain );
349 IWbemClassObject_Release( out );
352 static void test_Win32_ComputerSystem( IWbemServices *services )
354 static const WCHAR nameW[] = {'N','a','m','e',0};
355 static const WCHAR usernameW[] = {'U','s','e','r','N','a','m','e',0};
356 static const WCHAR backslashW[] = {'\\',0};
357 static const WCHAR queryW[] =
358 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
359 'C','o','m','p','u','t','e','r','S','y','s','t','e','m',0};
360 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
361 IEnumWbemClassObject *result;
362 IWbemClassObject *service;
363 VARIANT value;
364 CIMTYPE type;
365 HRESULT hr;
366 WCHAR compname[MAX_COMPUTERNAME_LENGTH + 1];
367 WCHAR username[128];
368 DWORD len, count;
370 len = sizeof(compname) / sizeof(compname[0]);
371 if (!GetComputerNameW( compname, &len ))
372 compname[0] = 0;
374 lstrcpyW( username, compname );
375 lstrcatW( username, backslashW );
376 len = sizeof(username) / sizeof(username[0]) - lstrlenW( username );
377 if (!GetUserNameW( username + lstrlenW( username ), &len ))
378 username[0] = 0;
380 if (!compname[0] || !username[0])
382 skip( "Failed to get user or computer name\n" );
383 goto out;
386 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
387 if (hr != S_OK)
389 win_skip( "Win32_ComputerSystem not available\n" );
390 goto out;
393 hr = IEnumWbemClassObject_Next( result, 10000, 1, &service, &count );
394 ok( hr == S_OK, "got %08x\n", hr );
396 type = 0xdeadbeef;
397 VariantInit( &value );
398 hr = IWbemClassObject_Get( service, nameW, 0, &value, &type, NULL );
399 ok( hr == S_OK, "failed to get computer name %08x\n", hr );
400 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
401 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
402 ok( !lstrcmpiW( V_BSTR( &value ), compname ), "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value)), wine_dbgstr_w(compname) );
403 VariantClear( &value );
405 type = 0xdeadbeef;
406 VariantInit( &value );
407 hr = IWbemClassObject_Get( service, usernameW, 0, &value, &type, NULL );
408 ok( hr == S_OK, "failed to get computer name %08x\n", hr );
409 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
410 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
411 ok( !lstrcmpiW( V_BSTR( &value ), username ), "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value)), wine_dbgstr_w(username) );
412 VariantClear( &value );
414 IWbemClassObject_Release( service );
415 IEnumWbemClassObject_Release( result );
416 out:
417 SysFreeString( query );
418 SysFreeString( wql );
421 static void test_Win32_SystemEnclosure( IWbemServices *services )
423 static const WCHAR queryW[] =
424 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
425 'S','y','s','t','e','m','E','n','c','l','o','s','u','r','e',0};
426 static const WCHAR captionW[] = {'C','a','p','t','i','o','n',0};
427 static const WCHAR chassistypesW[] = {'C','h','a','s','s','i','s','T','y','p','e','s',0};
428 static const WCHAR descriptionW[] = {'D','e','s','c','r','i','p','t','i','o','n',0};
429 static const WCHAR lockpresentW[] = {'L','o','c','k','P','r','e','s','e','n','t',0};
430 static const WCHAR manufacturerW[] = {'M','a','n','u','f','a','c','t','u','r','e','r',0};
431 static const WCHAR nameW[] = {'N','a','m','e',0};
432 static const WCHAR tagW[] = {'T','a','g',0};
433 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
434 IEnumWbemClassObject *result;
435 IWbemClassObject *obj;
436 CIMTYPE type;
437 ULONG count;
438 VARIANT val;
439 DWORD *data;
440 HRESULT hr;
442 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
443 ok( hr == S_OK, "IWbemServices_ExecQuery failed %08x\n", hr );
445 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
446 ok( hr == S_OK, "IEnumWbemClassObject_Next failed %08x\n", hr );
448 type = 0xdeadbeef;
449 VariantInit( &val );
450 hr = IWbemClassObject_Get( obj, captionW, 0, &val, &type, NULL );
451 ok( hr == S_OK, "failed to get caption %08x\n", hr );
452 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
453 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
454 trace( "caption: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
455 VariantClear( &val );
457 type = 0xdeadbeef;
458 VariantInit( &val );
459 hr = IWbemClassObject_Get( obj, chassistypesW, 0, &val, &type, NULL );
460 ok( hr == S_OK, "failed to get chassis types %08x\n", hr );
461 todo_wine
462 ok( V_VT( &val ) == (VT_I4|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &val ) );
463 ok( type == (CIM_UINT16|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
464 hr = SafeArrayAccessData( V_ARRAY( &val ), (void **)&data );
465 ok( hr == S_OK, "SafeArrayAccessData failed %x\n", hr );
466 if (SUCCEEDED(hr))
468 LONG i, lower, upper;
470 hr = SafeArrayGetLBound( V_ARRAY( &val ), 1, &lower );
471 ok( hr == S_OK, "SafeArrayGetLBound failed %x\n", hr );
472 hr = SafeArrayGetUBound( V_ARRAY( &val ), 1, &upper );
473 ok( hr == S_OK, "SafeArrayGetUBound failed %x\n", hr );
474 if (V_VT( &val ) == (VT_I4|VT_ARRAY))
476 for (i = 0; i < upper - lower + 1; i++)
477 trace( "chassis type: %u\n", data[i] );
479 hr = SafeArrayUnaccessData( V_ARRAY( &val ) );
480 ok( hr == S_OK, "SafeArrayUnaccessData failed %x\n", hr );
482 VariantClear( &val );
484 type = 0xdeadbeef;
485 VariantInit( &val );
486 hr = IWbemClassObject_Get( obj, descriptionW, 0, &val, &type, NULL );
487 ok( hr == S_OK, "failed to get description %08x\n", hr );
488 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
489 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
490 trace( "description: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
491 VariantClear( &val );
493 type = 0xdeadbeef;
494 VariantInit( &val );
495 hr = IWbemClassObject_Get( obj, lockpresentW, 0, &val, &type, NULL );
496 ok( hr == S_OK, "failed to get lockpresent %08x\n", hr );
497 ok( V_VT( &val ) == VT_BOOL, "unexpected variant type 0x%x\n", V_VT( &val ) );
498 ok( type == CIM_BOOLEAN, "unexpected type 0x%x\n", type );
499 trace( "lockpresent: %u\n", V_BOOL( &val ) );
500 VariantClear( &val );
502 type = 0xdeadbeef;
503 VariantInit( &val );
504 hr = IWbemClassObject_Get( obj, manufacturerW, 0, &val, &type, NULL );
505 ok( hr == S_OK, "failed to get manufacturer %08x\n", hr );
506 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
507 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
508 trace( "manufacturer: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
509 VariantClear( &val );
511 type = 0xdeadbeef;
512 VariantInit( &val );
513 hr = IWbemClassObject_Get( obj, nameW, 0, &val, &type, NULL );
514 ok( hr == S_OK, "failed to get name %08x\n", hr );
515 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
516 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
517 trace( "name: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
518 VariantClear( &val );
520 type = 0xdeadbeef;
521 VariantInit( &val );
522 hr = IWbemClassObject_Get( obj, tagW, 0, &val, &type, NULL );
523 ok( hr == S_OK, "failed to get tag %08x\n", hr );
524 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
525 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
526 trace( "tag: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
527 VariantClear( &val );
529 IWbemClassObject_Release( obj );
530 IEnumWbemClassObject_Release( result );
531 SysFreeString( query );
532 SysFreeString( wql );
535 static void test_StdRegProv( IWbemServices *services )
537 static const WCHAR enumkeyW[] = {'E','n','u','m','K','e','y',0};
538 static const WCHAR enumvaluesW[] = {'E','n','u','m','V','a','l','u','e','s',0};
539 static const WCHAR getstringvalueW[] = {'G','e','t','S','t','r','i','n','g','V','a','l','u','e',0};
540 static const WCHAR stdregprovW[] = {'S','t','d','R','e','g','P','r','o','v',0};
541 static const WCHAR defkeyW[] = {'h','D','e','f','K','e','y',0};
542 static const WCHAR subkeynameW[] = {'s','S','u','b','K','e','y','N','a','m','e',0};
543 static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
544 static const WCHAR namesW[] = {'s','N','a','m','e','s',0};
545 static const WCHAR typesW[] = {'T','y','p','e','s',0};
546 static const WCHAR valueW[] = {'s','V','a','l','u','e',0};
547 static const WCHAR valuenameW[] = {'s','V','a','l','u','e','N','a','m','e',0};
548 static const WCHAR programfilesW[] = {'P','r','o','g','r','a','m','F','i','l','e','s','D','i','r',0};
549 static const WCHAR windowsW[] =
550 {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
551 'W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n',0};
552 BSTR class = SysAllocString( stdregprovW ), method;
553 IWbemClassObject *reg, *sig_in, *in, *out;
554 VARIANT defkey, subkey, retval, names, types, value, valuename;
555 CIMTYPE type;
556 HRESULT hr;
558 hr = IWbemServices_GetObject( services, class, 0, NULL, &reg, NULL );
559 if (hr != S_OK)
561 win_skip( "StdRegProv not available\n" );
562 return;
564 hr = IWbemClassObject_GetMethod( reg, enumkeyW, 0, &sig_in, NULL );
565 ok( hr == S_OK, "failed to get EnumKey method %08x\n", hr );
567 hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in );
568 ok( hr == S_OK, "failed to spawn instance %08x\n", hr );
570 V_VT( &defkey ) = VT_I4;
571 V_I4( &defkey ) = 0x80000002;
572 hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 );
573 ok( hr == S_OK, "failed to set root %08x\n", hr );
575 V_VT( &subkey ) = VT_BSTR;
576 V_BSTR( &subkey ) = SysAllocString( windowsW );
577 hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 );
578 ok( hr == S_OK, "failed to set subkey %08x\n", hr );
580 out = NULL;
581 method = SysAllocString( enumkeyW );
582 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL );
583 ok( hr == S_OK, "failed to execute method %08x\n", hr );
584 SysFreeString( method );
586 type = 0xdeadbeef;
587 VariantInit( &retval );
588 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
589 ok( hr == S_OK, "failed to get return value %08x\n", hr );
590 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
591 ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
592 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
594 type = 0xdeadbeef;
595 VariantInit( &names );
596 hr = IWbemClassObject_Get( out, namesW, 0, &names, &type, NULL );
597 ok( hr == S_OK, "failed to get names %08x\n", hr );
598 ok( V_VT( &names ) == (VT_BSTR|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &names ) );
599 ok( type == (CIM_STRING|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
601 VariantClear( &names );
602 VariantClear( &subkey );
603 IWbemClassObject_Release( in );
604 IWbemClassObject_Release( out );
605 IWbemClassObject_Release( sig_in );
607 hr = IWbemClassObject_GetMethod( reg, enumvaluesW, 0, &sig_in, NULL );
608 ok( hr == S_OK, "failed to get EnumValues method %08x\n", hr );
610 hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in );
611 ok( hr == S_OK, "failed to spawn instance %08x\n", hr );
613 V_VT( &defkey ) = VT_I4;
614 V_I4( &defkey ) = 0x80000002;
615 hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 );
616 ok( hr == S_OK, "failed to set root %08x\n", hr );
618 V_VT( &subkey ) = VT_BSTR;
619 V_BSTR( &subkey ) = SysAllocString( windowsW );
620 hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 );
621 ok( hr == S_OK, "failed to set subkey %08x\n", hr );
623 out = NULL;
624 method = SysAllocString( enumvaluesW );
625 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL );
626 ok( hr == S_OK, "failed to execute method %08x\n", hr );
627 SysFreeString( method );
629 type = 0xdeadbeef;
630 VariantInit( &retval );
631 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
632 ok( hr == S_OK, "failed to get return value %08x\n", hr );
633 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
634 ok( !V_I4( &retval ), "unexpected error %u\n", V_I4( &retval ) );
635 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
637 type = 0xdeadbeef;
638 VariantInit( &names );
639 hr = IWbemClassObject_Get( out, namesW, 0, &names, &type, NULL );
640 ok( hr == S_OK, "failed to get names %08x\n", hr );
641 ok( V_VT( &names ) == (VT_BSTR|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &names ) );
642 ok( type == (CIM_STRING|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
644 type = 0xdeadbeef;
645 VariantInit( &types );
646 hr = IWbemClassObject_Get( out, typesW, 0, &types, &type, NULL );
647 ok( hr == S_OK, "failed to get names %08x\n", hr );
648 ok( V_VT( &types ) == (VT_I4|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &types ) );
649 ok( type == (CIM_SINT32|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
651 VariantClear( &types );
652 VariantClear( &names );
653 VariantClear( &subkey );
654 IWbemClassObject_Release( in );
655 IWbemClassObject_Release( out );
656 IWbemClassObject_Release( sig_in );
658 hr = IWbemClassObject_GetMethod( reg, getstringvalueW, 0, &sig_in, NULL );
659 ok( hr == S_OK, "failed to get GetStringValue method %08x\n", hr );
661 hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in );
662 ok( hr == S_OK, "failed to spawn instance %08x\n", hr );
664 V_VT( &defkey ) = VT_I4;
665 V_I4( &defkey ) = 0x80000002;
666 hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 );
667 ok( hr == S_OK, "failed to set root %08x\n", hr );
669 V_VT( &subkey ) = VT_BSTR;
670 V_BSTR( &subkey ) = SysAllocString( windowsW );
671 hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 );
672 ok( hr == S_OK, "failed to set subkey %08x\n", hr );
674 V_VT( &valuename ) = VT_BSTR;
675 V_BSTR( &valuename ) = SysAllocString( programfilesW );
676 hr = IWbemClassObject_Put( in, valuenameW, 0, &valuename, 0 );
677 ok( hr == S_OK, "failed to set value name %08x\n", hr );
679 out = NULL;
680 method = SysAllocString( getstringvalueW );
681 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL );
682 ok( hr == S_OK, "failed to execute method %08x\n", hr );
683 SysFreeString( method );
685 type = 0xdeadbeef;
686 VariantInit( &retval );
687 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
688 ok( hr == S_OK, "failed to get return value %08x\n", hr );
689 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
690 ok( !V_I4( &retval ), "unexpected error %u\n", V_I4( &retval ) );
691 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
693 type = 0xdeadbeef;
694 VariantInit( &value );
695 hr = IWbemClassObject_Get( out, valueW, 0, &value, &type, NULL );
696 ok( hr == S_OK, "failed to get value %08x\n", hr );
697 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
698 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
700 VariantClear( &value );
701 VariantClear( &valuename );
702 VariantClear( &subkey );
703 IWbemClassObject_Release( in );
704 IWbemClassObject_Release( out );
705 IWbemClassObject_Release( sig_in );
707 IWbemClassObject_Release( reg );
708 SysFreeString( class );
711 static HRESULT WINAPI sink_QueryInterface(
712 IWbemObjectSink *iface, REFIID riid, void **ppv )
714 *ppv = NULL;
715 if (IsEqualGUID( &IID_IUnknown, riid ) || IsEqualGUID( &IID_IWbemObjectSink, riid ))
717 *ppv = iface;
718 IWbemObjectSink_AddRef( iface );
719 return S_OK;
721 return E_NOINTERFACE;
724 static ULONG sink_refs;
726 static ULONG WINAPI sink_AddRef(
727 IWbemObjectSink *iface )
729 return ++sink_refs;
732 static ULONG WINAPI sink_Release(
733 IWbemObjectSink *iface )
735 return --sink_refs;
738 static HRESULT WINAPI sink_Indicate(
739 IWbemObjectSink *iface, LONG count, IWbemClassObject **objects )
741 trace("Indicate: %d, %p\n", count, objects);
742 return S_OK;
745 static HRESULT WINAPI sink_SetStatus(
746 IWbemObjectSink *iface, LONG flags, HRESULT hresult, BSTR str_param, IWbemClassObject *obj_param )
748 trace("SetStatus: %08x, %08x, %s, %p\n", flags, hresult, wine_dbgstr_w(str_param), obj_param);
749 return S_OK;
752 static IWbemObjectSinkVtbl sink_vtbl =
754 sink_QueryInterface,
755 sink_AddRef,
756 sink_Release,
757 sink_Indicate,
758 sink_SetStatus
761 static IWbemObjectSink sink = { &sink_vtbl };
763 static void test_notification_query_async( IWbemServices *services )
765 static const WCHAR queryW[] =
766 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
767 'D','e','v','i','c','e','C','h','a','n','g','e','E','v','e','n','t',0};
768 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
769 ULONG prev_sink_refs;
770 HRESULT hr;
772 hr = IWbemServices_ExecNotificationQueryAsync( services, wql, query, 0, NULL, NULL );
773 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
775 prev_sink_refs = sink_refs;
776 hr = IWbemServices_ExecNotificationQueryAsync( services, wql, query, 0, NULL, &sink );
777 ok( hr == S_OK || broken(hr == WBEM_E_NOT_FOUND), "got %08x\n", hr );
778 ok( sink_refs > prev_sink_refs || broken(!sink_refs), "got %u refs\n", sink_refs );
780 hr = IWbemServices_CancelAsyncCall( services, &sink );
781 ok( hr == S_OK || broken(hr == WBEM_E_NOT_FOUND), "got %08x\n", hr );
783 SysFreeString( wql );
784 SysFreeString( query );
787 static void test_query_async( IWbemServices *services )
789 static const WCHAR queryW[] =
790 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
791 'P','r','o','c','e','s','s',0};
792 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
793 HRESULT hr;
795 hr = IWbemServices_ExecQueryAsync( services, wql, query, 0, NULL, NULL );
796 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
798 hr = IWbemServices_ExecQueryAsync( services, wql, query, 0, NULL, &sink );
799 ok( hr == S_OK || broken(hr == WBEM_E_NOT_FOUND), "got %08x\n", hr );
801 hr = IWbemServices_CancelAsyncCall( services, NULL );
802 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
804 hr = IWbemServices_CancelAsyncCall( services, &sink );
805 ok( hr == S_OK, "got %08x\n", hr );
807 SysFreeString( wql );
808 SysFreeString( query );
811 static void test_GetNames( IWbemServices *services )
813 static const WCHAR queryW[] =
814 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
815 'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
816 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
817 IEnumWbemClassObject *result;
818 HRESULT hr;
820 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
821 ok( hr == S_OK, "got %08x\n", hr );
823 for (;;)
825 IWbemClassObject *obj;
826 SAFEARRAY *names;
827 ULONG count;
828 VARIANT val;
830 IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
831 if (!count) break;
833 VariantInit( &val );
834 hr = IWbemClassObject_GetNames( obj, NULL, WBEM_FLAG_NONSYSTEM_ONLY, &val, &names );
835 ok( hr == S_OK, "got %08x\n", hr );
837 SafeArrayDestroy( names );
838 IWbemClassObject_Release( obj );
840 IEnumWbemClassObject_Release( result );
841 SysFreeString( query );
842 SysFreeString( wql );
845 static void test_SystemSecurity( IWbemServices *services )
847 static const WCHAR systemsecurityW[] = {'_','_','S','y','s','t','e','m','S','e','c','u','r','i','t','y',0};
848 static const WCHAR getsdW[] = {'G','e','t','S','D',0};
849 static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
850 static const WCHAR sdW[] = {'S','D',0};
851 BSTR class = SysAllocString( systemsecurityW ), method;
852 IWbemClassObject *reg, *out;
853 VARIANT retval, var_sd;
854 void *data;
855 SECURITY_DESCRIPTOR_RELATIVE *sd;
856 CIMTYPE type;
857 HRESULT hr;
858 BYTE sid_admin_buffer[SECURITY_MAX_SID_SIZE];
859 SID *sid_admin = (SID*)sid_admin_buffer;
860 DWORD sid_size;
861 BOOL ret;
863 hr = IWbemServices_GetObject( services, class, 0, NULL, &reg, NULL );
864 if (hr != S_OK)
866 win_skip( "__SystemSecurity not available\n" );
867 return;
870 sid_size = sizeof(sid_admin_buffer);
871 ret = CreateWellKnownSid( WinBuiltinAdministratorsSid, NULL, sid_admin, &sid_size );
872 ok( ret, "CreateWellKnownSid failed\n" );
874 out = NULL;
875 method = SysAllocString( getsdW );
876 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
877 ok( hr == S_OK || hr == WBEM_E_ACCESS_DENIED, "failed to execute method %08x\n", hr );
878 SysFreeString( method );
880 if (SUCCEEDED(hr))
882 type = 0xdeadbeef;
883 VariantInit( &retval );
884 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
885 ok( hr == S_OK, "failed to get return value %08x\n", hr );
886 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
887 ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
888 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
890 type = 0xdeadbeef;
891 VariantInit( &var_sd );
892 hr = IWbemClassObject_Get( out, sdW, 0, &var_sd, &type, NULL );
893 ok( hr == S_OK, "failed to get names %08x\n", hr );
894 ok( V_VT( &var_sd ) == (VT_UI1|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &var_sd ) );
895 ok( type == (CIM_UINT8|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
897 hr = SafeArrayAccessData( V_ARRAY( &var_sd ), &data );
898 ok( hr == S_OK, "SafeArrayAccessData failed %x\n", hr );
899 if (SUCCEEDED(hr))
901 sd = data;
903 ok( (sd->Control & SE_SELF_RELATIVE) == SE_SELF_RELATIVE, "relative flag unset\n" );
904 ok( sd->Owner != 0, "no owner SID\n");
905 ok( sd->Group != 0, "no owner SID\n");
906 ok( EqualSid( (PSID)((LPBYTE)sd + sd->Owner), sid_admin ), "unexpected owner SID\n" );
907 ok( EqualSid( (PSID)((LPBYTE)sd + sd->Group), sid_admin ), "unexpected group SID\n" );
909 hr = SafeArrayUnaccessData( V_ARRAY( &var_sd ) );
910 ok( hr == S_OK, "SafeArrayUnaccessData failed %x\n", hr );
913 VariantClear( &var_sd );
914 IWbemClassObject_Release( out );
916 else if (hr == WBEM_E_ACCESS_DENIED)
917 win_skip( "insufficient privs to test __SystemSecurity\n" );
919 SysFreeString( class );
922 START_TEST(query)
924 static const WCHAR cimv2W[] = {'R','O','O','T','\\','C','I','M','V','2',0};
925 BSTR path = SysAllocString( cimv2W );
926 IWbemLocator *locator;
927 IWbemServices *services;
928 HRESULT hr;
930 CoInitialize( NULL );
931 CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
932 RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL );
933 hr = CoCreateInstance( &CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, &IID_IWbemLocator,
934 (void **)&locator );
935 if (hr != S_OK)
937 win_skip("can't create instance of WbemLocator\n");
938 return;
940 hr = IWbemLocator_ConnectServer( locator, path, NULL, NULL, NULL, 0, NULL, NULL, &services );
941 ok( hr == S_OK, "failed to get IWbemServices interface %08x\n", hr );
943 hr = CoSetProxyBlanket( (IUnknown *)services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL,
944 RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE );
945 ok( hr == S_OK, "failed to set proxy blanket %08x\n", hr );
947 test_select( services );
948 test_Win32_Process( services );
949 test_Win32_Service( services );
950 test_Win32_ComputerSystem( services );
951 test_Win32_SystemEnclosure( services );
952 test_StdRegProv( services );
953 test_notification_query_async( services );
954 test_query_async( services );
955 test_GetNames( services );
956 test_SystemSecurity( services );
958 SysFreeString( path );
959 IWbemServices_Release( services );
960 IWbemLocator_Release( locator );
961 CoUninitialize();