0fa6b5e9668bbe2abac19d3bbeecf244ffbe9b93
[reactos.git] / modules / 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 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 query11[] =
106 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
107 'W','i','n','3','2','_','V','i','d','e','o','C','o','n','t','r','o','l','l','e','r',' ','w','h','e','r','e',' ',
108 'a','v','a','i','l','a','b','i','l','i','t','y',' ','=',' ','\'','3','\'',0};
109 static const WCHAR query12[] =
110 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_','B','I','O','S',
111 ' ','W','H','E','R','E',' ','N','A','M','E',' ','<','>',' ','N','U','L','L', 0};
112 static const WCHAR query13[] =
113 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_','B','I','O','S',
114 ' ','W','H','E','R','E',' ','N','U','L','L',' ','=',' ','N','A','M','E', 0};
115 static const WCHAR *test[] = { query1, query2, query3, query4, query5, query6, query7, query8, query9, query10,
116 query11, query12, query13 };
117 HRESULT hr;
118 IEnumWbemClassObject *result;
119 BSTR wql = SysAllocString( wqlW );
120 BSTR sql = SysAllocString( sqlW );
121 BSTR query = SysAllocString( query1 );
122 UINT i;
123
124 hr = IWbemServices_ExecQuery( services, NULL, NULL, 0, NULL, &result );
125 ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
126
127 hr = IWbemServices_ExecQuery( services, NULL, query, 0, NULL, &result );
128 ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
129
130 hr = IWbemServices_ExecQuery( services, wql, NULL, 0, NULL, &result );
131 ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
132
133 hr = IWbemServices_ExecQuery( services, sql, query, 0, NULL, &result );
134 ok( hr == WBEM_E_INVALID_QUERY_TYPE, "query failed %08x\n", hr );
135
136 hr = IWbemServices_ExecQuery( services, sql, NULL, 0, NULL, &result );
137 ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
138
139 SysFreeString( query );
140 query = SysAllocString( emptyW );
141 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
142 ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
143
144 for (i = 0; i < ARRAY_SIZE( test ); i++)
145 {
146 hr = exec_query( services, test[i], &result );
147 ok( hr == S_OK, "query %u failed: %08x\n", i, hr );
148 if (result) IEnumWbemClassObject_Release( result );
149 }
150
151 SysFreeString( wql );
152 SysFreeString( sql );
153 SysFreeString( query );
154 }
155
156 static void test_associators( IWbemServices *services )
157 {
158 static const WCHAR query1[] =
159 {'A','S','S','O','C','I','A','T','O','R','S',' ','O','F',' ','{','W','i','n','3','2','_',
160 'L','o','g','i','c','a','l','D','i','s','k','.','D','e','v','i','c','e','I','D','=','"','C',':','"','}',0};
161 static const WCHAR query2[] =
162 {'A','S','S','O','C','I','A','T','O','R','S',' ','O','F',' ','{','W','i','n','3','2','_',
163 'L','o','g','i','c','a','l','D','i','s','k','.','D','e','v','i','c','e','I','D','=','"','C',':','"','}',' ',
164 'W','H','E','R','E',' ','A','s','s','o','c','C','l','a','s','s',' ','=',' ','W','i','n','3','2','_',
165 'L','o','g','i','c','a','l','D','i','s','k','T','o','P','a','r','t','i','t','i','o','n',0};
166 static const WCHAR *test[] = { query1, query2 };
167 HRESULT hr;
168 IEnumWbemClassObject *result;
169 UINT i;
170
171 for (i = 0; i < ARRAY_SIZE( test ); i++)
172 {
173 hr = exec_query( services, test[i], &result );
174 todo_wine ok( hr == S_OK, "query %u failed: %08x\n", i, hr );
175 if (result) IEnumWbemClassObject_Release( result );
176 }
177 }
178
179 static void test_Win32_Service( IWbemServices *services )
180 {
181 static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
182 static const WCHAR pauseserviceW[] = {'P','a','u','s','e','S','e','r','v','i','c','e',0};
183 static const WCHAR resumeserviceW[] = {'R','e','s','u','m','e','S','e','r','v','i','c','e',0};
184 static const WCHAR startserviceW[] = {'S','t','a','r','t','S','e','r','v','i','c','e',0};
185 static const WCHAR stopserviceW[] = {'S','t','o','p','S','e','r','v','i','c','e',0};
186 static const WCHAR stateW[] = {'S','t','a','t','e',0};
187 static const WCHAR stoppedW[] = {'S','t','o','p','p','e','d',0};
188 static const WCHAR serviceW[] = {'W','i','n','3','2','_','S','e','r','v','i','c','e','.',
189 'N','a','m','e','=','"','S','p','o','o','l','e','r','"',0};
190 static const WCHAR emptyW[] = {0};
191 BSTR class = SysAllocString( serviceW ), empty = SysAllocString( emptyW ), method;
192 IWbemClassObject *service, *out;
193 VARIANT state, retval;
194 CIMTYPE type;
195 HRESULT hr;
196
197 hr = IWbemServices_GetObject( services, class, 0, NULL, &service, NULL );
198 if (hr != S_OK)
199 {
200 win_skip( "Win32_Service not available\n" );
201 goto out;
202 }
203 type = 0xdeadbeef;
204 VariantInit( &state );
205 hr = IWbemClassObject_Get( service, stateW, 0, &state, &type, NULL );
206 ok( hr == S_OK, "failed to get service state %08x\n", hr );
207 ok( V_VT( &state ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &state ) );
208 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
209
210 if (!lstrcmpW( V_BSTR( &state ), stoppedW ))
211 {
212 out = NULL;
213 method = SysAllocString( startserviceW );
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 out = NULL;
225 method = SysAllocString( pauseserviceW );
226 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
227 ok( hr == S_OK, "failed to execute method %08x\n", hr );
228 SysFreeString( method );
229
230 VariantInit( &retval );
231 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL );
232 ok( hr == S_OK, "failed to get return value %08x\n", hr );
233 ok( V_I4( &retval ), "unexpected success\n" );
234 IWbemClassObject_Release( out );
235
236 out = NULL;
237 method = SysAllocString( resumeserviceW );
238 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
239 ok( hr == S_OK, "failed to execute method %08x\n", hr );
240 SysFreeString( method );
241
242 VariantInit( &retval );
243 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL );
244 ok( hr == S_OK, "failed to get return value %08x\n", hr );
245 ok( V_I4( &retval ), "unexpected success\n" );
246 IWbemClassObject_Release( out );
247
248 if (!lstrcmpW( V_BSTR( &state ), stoppedW ))
249 {
250 out = NULL;
251 method = SysAllocString( stopserviceW );
252 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
253 ok( hr == S_OK, "failed to execute method %08x\n", hr );
254 SysFreeString( method );
255
256 VariantInit( &retval );
257 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL );
258 ok( hr == S_OK, "failed to get return value %08x\n", hr );
259 ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
260 IWbemClassObject_Release( out );
261 }
262 VariantClear( &state );
263 IWbemClassObject_Release( service );
264
265 service = NULL;
266 hr = IWbemServices_GetObject( services, NULL, 0, NULL, &service, NULL );
267 ok( hr == S_OK, "got %08x\n", hr );
268 if (service) IWbemClassObject_Release( service );
269
270 service = NULL;
271 hr = IWbemServices_GetObject( services, empty, 0, NULL, &service, NULL );
272 ok( hr == S_OK, "got %08x\n", hr );
273 if (service) IWbemClassObject_Release( service );
274
275 out:
276 SysFreeString( empty );
277 SysFreeString( class );
278 }
279
280 static void test_Win32_Bios( IWbemServices *services )
281 {
282 static const WCHAR queryW[] =
283 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_', 'B','i','o','s',0};
284 static const WCHAR descriptionW[] = {'D','e','s','c','r','i','p','t','i','o','n',0};
285 static const WCHAR identificationcodeW[] = {'I','d','e','n','t','i','f','i','c','a','t','i','o','n','C','o','d','e',0};
286 static const WCHAR manufacturerW[] = {'M','a','n','u','f','a','c','t','u','r','e','r',0};
287 static const WCHAR nameW[] = {'N','a','m','e',0};
288 static const WCHAR releasedateW[] = {'R','e','l','e','a','s','e','D','a','t','e',0};
289 static const WCHAR serialnumberW[] = {'S','e','r','i','a','l','N','u','m','b','e','r',0};
290 static const WCHAR smbiosbiosversionW[] = {'S','M','B','I','O','S','B','I','O','S','V','e','r','s','i','o','n',0};
291 static const WCHAR smbiosmajorversionW[] = {'S','M','B','I','O','S','M','a','j','o','r','V','e','r','s','i','o','n',0};
292 static const WCHAR smbiosminorversionW[] = {'S','M','B','I','O','S','M','i','n','o','r','V','e','r','s','i','o','n',0};
293 static const WCHAR versionW[] = {'V','e','r','s','i','o','n',0};
294 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
295 IEnumWbemClassObject *result;
296 IWbemClassObject *obj;
297 CIMTYPE type;
298 ULONG count;
299 VARIANT val;
300 HRESULT hr;
301
302 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
303 ok( hr == S_OK, "IWbemServices_ExecQuery failed %08x\n", hr );
304
305 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
306 ok( hr == S_OK, "IEnumWbemClassObject_Next failed %08x\n", hr );
307
308 type = 0xdeadbeef;
309 VariantInit( &val );
310 hr = IWbemClassObject_Get( obj, descriptionW, 0, &val, &type, NULL );
311 ok( hr == S_OK, "failed to get description %08x\n", hr );
312 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
313 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
314 trace( "description: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
315 VariantClear( &val );
316
317 type = 0xdeadbeef;
318 VariantInit( &val );
319 hr = IWbemClassObject_Get( obj, identificationcodeW, 0, &val, &type, NULL );
320 ok( hr == S_OK, "failed to get identication code %08x\n", hr );
321 ok( V_VT( &val ) == VT_NULL, "unexpected variant type 0x%x\n", V_VT( &val ) );
322 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
323 VariantClear( &val );
324
325 type = 0xdeadbeef;
326 VariantInit( &val );
327 hr = IWbemClassObject_Get( obj, manufacturerW, 0, &val, &type, NULL );
328 ok( hr == S_OK, "failed to get manufacturer %08x\n", hr );
329 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
330 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
331 trace( "manufacturer: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
332 VariantClear( &val );
333
334 type = 0xdeadbeef;
335 VariantInit( &val );
336 hr = IWbemClassObject_Get( obj, nameW, 0, &val, &type, NULL );
337 ok( hr == S_OK, "failed to get name %08x\n", hr );
338 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
339 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
340 trace( "name: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
341 VariantClear( &val );
342
343 type = 0xdeadbeef;
344 VariantInit( &val );
345 hr = IWbemClassObject_Get( obj, releasedateW, 0, &val, &type, NULL );
346 ok( hr == S_OK, "failed to get release date %08x\n", hr );
347 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
348 ok( type == CIM_DATETIME, "unexpected type 0x%x\n", type );
349 trace( "release date: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
350 VariantClear( &val );
351
352 type = 0xdeadbeef;
353 VariantInit( &val );
354 hr = IWbemClassObject_Get( obj, serialnumberW, 0, &val, &type, NULL );
355 ok( hr == S_OK, "failed to get serial number %08x\n", hr );
356 ok( V_VT( &val ) == VT_BSTR || V_VT( &val ) == VT_NULL /* Testbot VMs */,
357 "unexpected variant type 0x%x\n", V_VT( &val ) );
358 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
359 VariantClear( &val );
360
361 type = 0xdeadbeef;
362 VariantInit( &val );
363 hr = IWbemClassObject_Get( obj, smbiosbiosversionW, 0, &val, &type, NULL );
364 ok( hr == S_OK, "failed to get bios version %08x\n", hr );
365 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
366 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
367 trace( "bios version: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
368 VariantClear( &val );
369
370 type = 0xdeadbeef;
371 VariantInit( &val );
372 hr = IWbemClassObject_Get( obj, smbiosmajorversionW, 0, &val, &type, NULL );
373 ok( hr == S_OK, "failed to get bios major version %08x\n", hr );
374 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
375 ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
376 trace( "bios major version: %u\n", V_I4( &val ) );
377
378 type = 0xdeadbeef;
379 VariantInit( &val );
380 hr = IWbemClassObject_Get( obj, smbiosminorversionW, 0, &val, &type, NULL );
381 ok( hr == S_OK, "failed to get bios minor version %08x\n", hr );
382 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
383 ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
384 trace( "bios minor version: %u\n", V_I4( &val ) );
385
386 type = 0xdeadbeef;
387 VariantInit( &val );
388 hr = IWbemClassObject_Get( obj, versionW, 0, &val, &type, NULL );
389 ok( hr == S_OK, "failed to get version %08x\n", hr );
390 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
391 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
392 trace( "version: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
393 VariantClear( &val );
394
395 IWbemClassObject_Release( obj );
396 IEnumWbemClassObject_Release( result );
397 SysFreeString( query );
398 SysFreeString( wql );
399 }
400
401 static void test_Win32_Process( IWbemServices *services, BOOL use_full_path )
402 {
403 static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
404 static const WCHAR getownerW[] = {'G','e','t','O','w','n','e','r',0};
405 static const WCHAR userW[] = {'U','s','e','r',0};
406 static const WCHAR domainW[] = {'D','o','m','a','i','n',0};
407 static const WCHAR processW[] = {'W','i','n','3','2','_','P','r','o','c','e','s','s',0};
408 static const WCHAR idW[] = {'I','D',0};
409 static const WCHAR fmtW[] = {'W','i','n','3','2','_','P','r','o','c','e','s','s','.',
410 'H','a','n','d','l','e','=','"','%','u','"',0};
411 static const WCHAR full_path_fmt[] =
412 {'\\','\\','%','s','\\','R','O','O','T','\\','C','I','M','V','2',':',0};
413 static const LONG expected_flavor = WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE |
414 WBEM_FLAVOR_NOT_OVERRIDABLE |
415 WBEM_FLAVOR_ORIGIN_PROPAGATED;
416 WCHAR full_path[MAX_COMPUTERNAME_LENGTH + ARRAY_SIZE(full_path_fmt)];
417 BSTR class, method;
418 IWbemClassObject *process, *sig_in, *out;
419 IWbemQualifierSet *qualifiers;
420 VARIANT user, domain, retval, val;
421 DWORD full_path_len = 0;
422 LONG flavor;
423 CIMTYPE type;
424 HRESULT hr;
425
426 if (use_full_path)
427 {
428 WCHAR server[MAX_COMPUTERNAME_LENGTH+1];
429
430 full_path_len = ARRAY_SIZE(server);
431 ok( GetComputerNameW(server, &full_path_len), "GetComputerName failed\n" );
432 full_path_len = wsprintfW(full_path, full_path_fmt, server);
433 }
434
435 class = SysAllocStringLen( NULL, full_path_len + ARRAY_SIZE( processW ) );
436 memcpy( class, full_path, full_path_len * sizeof(WCHAR) );
437 memcpy( class + full_path_len, processW, sizeof(processW) );
438 hr = IWbemServices_GetObject( services, class, 0, NULL, &process, NULL );
439 SysFreeString( class );
440 if (hr != S_OK)
441 {
442 win_skip( "Win32_Process not available\n" );
443 return;
444 }
445 sig_in = (void*)0xdeadbeef;
446 hr = IWbemClassObject_GetMethod( process, getownerW, 0, &sig_in, NULL );
447 ok( hr == S_OK, "failed to get GetOwner method %08x\n", hr );
448 ok( !sig_in, "sig_in != NULL\n");
449 IWbemClassObject_Release( process );
450
451 out = NULL;
452 method = SysAllocString( getownerW );
453 class = SysAllocStringLen( NULL, full_path_len + ARRAY_SIZE( fmtW ) + 10 );
454 memcpy( class, full_path, full_path_len * sizeof(WCHAR) );
455 wsprintfW( class + full_path_len, fmtW, GetCurrentProcessId() );
456 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
457 ok( hr == S_OK, "failed to execute method %08x\n", hr );
458 SysFreeString( method );
459 SysFreeString( class );
460
461 type = 0xdeadbeef;
462 VariantInit( &retval );
463 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
464 ok( hr == S_OK, "failed to get return value %08x\n", hr );
465 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
466 ok( !V_I4( &retval ), "unexpected error %u\n", V_I4( &retval ) );
467 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
468
469 type = 0xdeadbeef;
470 VariantInit( &user );
471 hr = IWbemClassObject_Get( out, userW, 0, &user, &type, NULL );
472 ok( hr == S_OK, "failed to get user %08x\n", hr );
473 ok( V_VT( &user ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &user ) );
474 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
475 trace("%s\n", wine_dbgstr_w(V_BSTR(&user)));
476
477 type = 0xdeadbeef;
478 VariantInit( &domain );
479 hr = IWbemClassObject_Get( out, domainW, 0, &domain, &type, NULL );
480 ok( hr == S_OK, "failed to get domain %08x\n", hr );
481 ok( V_VT( &domain ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &domain ) );
482 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
483 trace("%s\n", wine_dbgstr_w(V_BSTR(&domain)));
484
485 hr = IWbemClassObject_GetPropertyQualifierSet( out, userW, &qualifiers );
486 ok( hr == S_OK, "failed to get qualifier set %08x\n", hr );
487
488 flavor = -1;
489 V_I4(&val) = -1;
490 V_VT(&val) = VT_ERROR;
491 hr = IWbemQualifierSet_Get( qualifiers, idW, 0, &val, &flavor );
492 ok( hr == S_OK, "got %08x\n", hr );
493 ok( flavor == expected_flavor, "got %d\n", flavor );
494 ok( V_VT(&val) == VT_I4, "got %u\n", V_VT(&val) );
495 ok( V_I4(&val) == 0, "got %u\n", V_I4(&val) );
496 VariantClear( &val );
497
498 IWbemQualifierSet_Release( qualifiers );
499 hr = IWbemClassObject_GetPropertyQualifierSet( out, domainW, &qualifiers );
500 ok( hr == S_OK, "failed to get qualifier set %08x\n", hr );
501
502 flavor = -1;
503 V_I4(&val) = -1;
504 V_VT(&val) = VT_ERROR;
505 hr = IWbemQualifierSet_Get( qualifiers, idW, 0, &val, &flavor );
506 ok( hr == S_OK, "got %08x\n", hr );
507 ok( flavor == expected_flavor, "got %d\n", flavor );
508 ok( V_VT(&val) == VT_I4, "got %u\n", V_VT(&val) );
509 ok( V_I4(&val) == 1, "got %u\n", V_I4(&val) );
510 VariantClear( &val );
511
512 IWbemQualifierSet_Release( qualifiers );
513 hr = IWbemClassObject_GetPropertyQualifierSet( out, returnvalueW, &qualifiers );
514 ok( hr == S_OK, "failed to get qualifier set %08x\n", hr );
515
516 hr = IWbemQualifierSet_Get( qualifiers, idW, 0, &val, &flavor );
517 ok( hr == WBEM_E_NOT_FOUND, "got %08x\n", hr );
518
519 IWbemQualifierSet_Release( qualifiers );
520 VariantClear( &user );
521 VariantClear( &domain );
522 IWbemClassObject_Release( out );
523 }
524
525 static void test_Win32_ComputerSystem( IWbemServices *services )
526 {
527 static const WCHAR backslashW[] = {'\\',0};
528 static const WCHAR memorytypeW[] = {'M','e','m','o','r','y','T','y','p','e',0};
529 static const WCHAR modelW[] = {'M','o','d','e','l',0};
530 static const WCHAR nameW[] = {'N','a','m','e',0};
531 static const WCHAR usernameW[] = {'U','s','e','r','N','a','m','e',0};
532 static const WCHAR queryW[] =
533 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
534 'C','o','m','p','u','t','e','r','S','y','s','t','e','m',0};
535 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
536 IEnumWbemClassObject *result;
537 IWbemClassObject *service;
538 VARIANT value;
539 CIMTYPE type;
540 HRESULT hr;
541 WCHAR compname[MAX_COMPUTERNAME_LENGTH + 1];
542 WCHAR username[128];
543 DWORD len, count;
544
545 len = ARRAY_SIZE( compname );
546 if (!GetComputerNameW( compname, &len ))
547 compname[0] = 0;
548
549 lstrcpyW( username, compname );
550 lstrcatW( username, backslashW );
551 len = ARRAY_SIZE( username ) - lstrlenW( username );
552 if (!GetUserNameW( username + lstrlenW( username ), &len ))
553 username[0] = 0;
554
555 if (!compname[0] || !username[0])
556 {
557 skip( "Failed to get user or computer name\n" );
558 goto out;
559 }
560
561 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
562 if (hr != S_OK)
563 {
564 win_skip( "Win32_ComputerSystem not available\n" );
565 goto out;
566 }
567
568 hr = IEnumWbemClassObject_Next( result, 10000, 1, &service, &count );
569 ok( hr == S_OK, "got %08x\n", hr );
570
571 type = 0xdeadbeef;
572 VariantInit( &value );
573 hr = IWbemClassObject_Get( service, memorytypeW, 0, &value, &type, NULL );
574 ok( hr == WBEM_E_NOT_FOUND, "got %08x\n", hr );
575
576 type = 0xdeadbeef;
577 VariantInit( &value );
578 hr = IWbemClassObject_Get( service, modelW, 0, &value, &type, NULL );
579 ok( hr == S_OK, "failed to get model %08x\n", hr );
580 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
581 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
582 trace( "model: %s\n", wine_dbgstr_w(V_BSTR( &value )) );
583 VariantClear( &value );
584
585 type = 0xdeadbeef;
586 VariantInit( &value );
587 hr = IWbemClassObject_Get( service, nameW, 0, &value, &type, NULL );
588 ok( hr == S_OK, "failed to get computer name %08x\n", hr );
589 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
590 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
591 ok( !lstrcmpiW( V_BSTR( &value ), compname ), "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value)), wine_dbgstr_w(compname) );
592 VariantClear( &value );
593
594 type = 0xdeadbeef;
595 VariantInit( &value );
596 hr = IWbemClassObject_Get( service, usernameW, 0, &value, &type, NULL );
597 ok( hr == S_OK, "failed to get computer name %08x\n", hr );
598 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
599 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
600 ok( !lstrcmpiW( V_BSTR( &value ), username ), "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value)), wine_dbgstr_w(username) );
601 VariantClear( &value );
602
603 IWbemClassObject_Release( service );
604 IEnumWbemClassObject_Release( result );
605 out:
606 SysFreeString( query );
607 SysFreeString( wql );
608 }
609
610 static void test_Win32_SystemEnclosure( IWbemServices *services )
611 {
612 static const WCHAR queryW[] =
613 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
614 'S','y','s','t','e','m','E','n','c','l','o','s','u','r','e',0};
615 static const WCHAR captionW[] = {'C','a','p','t','i','o','n',0};
616 static const WCHAR chassistypesW[] = {'C','h','a','s','s','i','s','T','y','p','e','s',0};
617 static const WCHAR descriptionW[] = {'D','e','s','c','r','i','p','t','i','o','n',0};
618 static const WCHAR lockpresentW[] = {'L','o','c','k','P','r','e','s','e','n','t',0};
619 static const WCHAR manufacturerW[] = {'M','a','n','u','f','a','c','t','u','r','e','r',0};
620 static const WCHAR nameW[] = {'N','a','m','e',0};
621 static const WCHAR tagW[] = {'T','a','g',0};
622 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
623 IEnumWbemClassObject *result;
624 IWbemClassObject *obj;
625 CIMTYPE type;
626 ULONG count;
627 VARIANT val;
628 DWORD *data;
629 HRESULT hr;
630
631 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
632 ok( hr == S_OK, "IWbemServices_ExecQuery failed %08x\n", hr );
633
634 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
635 ok( hr == S_OK, "IEnumWbemClassObject_Next failed %08x\n", hr );
636
637 type = 0xdeadbeef;
638 VariantInit( &val );
639 hr = IWbemClassObject_Get( obj, captionW, 0, &val, &type, NULL );
640 ok( hr == S_OK, "failed to get caption %08x\n", hr );
641 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
642 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
643 trace( "caption: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
644 VariantClear( &val );
645
646 type = 0xdeadbeef;
647 VariantInit( &val );
648 hr = IWbemClassObject_Get( obj, chassistypesW, 0, &val, &type, NULL );
649 ok( hr == S_OK, "failed to get chassis types %08x\n", hr );
650 ok( V_VT( &val ) == (VT_I4|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &val ) );
651 ok( type == (CIM_UINT16|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
652 hr = SafeArrayAccessData( V_ARRAY( &val ), (void **)&data );
653 ok( hr == S_OK, "SafeArrayAccessData failed %x\n", hr );
654 if (SUCCEEDED(hr))
655 {
656 LONG i, lower, upper;
657
658 hr = SafeArrayGetLBound( V_ARRAY( &val ), 1, &lower );
659 ok( hr == S_OK, "SafeArrayGetLBound failed %x\n", hr );
660 hr = SafeArrayGetUBound( V_ARRAY( &val ), 1, &upper );
661 ok( hr == S_OK, "SafeArrayGetUBound failed %x\n", hr );
662 if (V_VT( &val ) == (VT_I4|VT_ARRAY))
663 {
664 for (i = 0; i < upper - lower + 1; i++)
665 trace( "chassis type: %u\n", data[i] );
666 }
667 hr = SafeArrayUnaccessData( V_ARRAY( &val ) );
668 ok( hr == S_OK, "SafeArrayUnaccessData failed %x\n", hr );
669 }
670 VariantClear( &val );
671
672 type = 0xdeadbeef;
673 VariantInit( &val );
674 hr = IWbemClassObject_Get( obj, descriptionW, 0, &val, &type, NULL );
675 ok( hr == S_OK, "failed to get description %08x\n", hr );
676 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
677 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
678 trace( "description: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
679 VariantClear( &val );
680
681 type = 0xdeadbeef;
682 VariantInit( &val );
683 hr = IWbemClassObject_Get( obj, lockpresentW, 0, &val, &type, NULL );
684 ok( hr == S_OK, "failed to get lockpresent %08x\n", hr );
685 ok( V_VT( &val ) == VT_BOOL, "unexpected variant type 0x%x\n", V_VT( &val ) );
686 ok( type == CIM_BOOLEAN, "unexpected type 0x%x\n", type );
687 trace( "lockpresent: %u\n", V_BOOL( &val ) );
688 VariantClear( &val );
689
690 type = 0xdeadbeef;
691 VariantInit( &val );
692 hr = IWbemClassObject_Get( obj, manufacturerW, 0, &val, &type, NULL );
693 ok( hr == S_OK, "failed to get manufacturer %08x\n", hr );
694 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
695 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
696 trace( "manufacturer: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
697 VariantClear( &val );
698
699 type = 0xdeadbeef;
700 VariantInit( &val );
701 hr = IWbemClassObject_Get( obj, nameW, 0, &val, &type, NULL );
702 ok( hr == S_OK, "failed to get name %08x\n", hr );
703 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
704 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
705 trace( "name: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
706 VariantClear( &val );
707
708 type = 0xdeadbeef;
709 VariantInit( &val );
710 hr = IWbemClassObject_Get( obj, tagW, 0, &val, &type, NULL );
711 ok( hr == S_OK, "failed to get tag %08x\n", hr );
712 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
713 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
714 trace( "tag: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
715 VariantClear( &val );
716
717 IWbemClassObject_Release( obj );
718 IEnumWbemClassObject_Release( result );
719 SysFreeString( query );
720 SysFreeString( wql );
721 }
722
723 static void test_StdRegProv( IWbemServices *services )
724 {
725 static const WCHAR createkeyW[] = {'C','r','e','a','t','e','K','e','y',0};
726 static const WCHAR enumkeyW[] = {'E','n','u','m','K','e','y',0};
727 static const WCHAR enumvaluesW[] = {'E','n','u','m','V','a','l','u','e','s',0};
728 static const WCHAR getstringvalueW[] = {'G','e','t','S','t','r','i','n','g','V','a','l','u','e',0};
729 static const WCHAR stdregprovW[] = {'S','t','d','R','e','g','P','r','o','v',0};
730 static const WCHAR defkeyW[] = {'h','D','e','f','K','e','y',0};
731 static const WCHAR subkeynameW[] = {'s','S','u','b','K','e','y','N','a','m','e',0};
732 static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
733 static const WCHAR namesW[] = {'s','N','a','m','e','s',0};
734 static const WCHAR typesW[] = {'T','y','p','e','s',0};
735 static const WCHAR valueW[] = {'s','V','a','l','u','e',0};
736 static const WCHAR valuenameW[] = {'s','V','a','l','u','e','N','a','m','e',0};
737 static const WCHAR programfilesW[] = {'P','r','o','g','r','a','m','F','i','l','e','s','D','i','r',0};
738 static const WCHAR windowsW[] =
739 {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
740 'W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n',0};
741 static const WCHAR regtestW[] =
742 {'S','o','f','t','w','a','r','e','\\','S','t','d','R','e','g','P','r','o','v','T','e','s','t',0};
743 BSTR class = SysAllocString( stdregprovW ), method, name;
744 IWbemClassObject *reg, *sig_in, *sig_out, *in, *out;
745 VARIANT defkey, subkey, retval, names, types, value, valuename;
746 CIMTYPE type;
747 HRESULT hr;
748 LONG res;
749
750 hr = IWbemServices_GetObject( services, class, 0, NULL, &reg, NULL );
751 if (hr != S_OK)
752 {
753 win_skip( "StdRegProv not available\n" );
754 return;
755 }
756
757 hr = IWbemClassObject_BeginMethodEnumeration( reg, 0 );
758 ok( hr == S_OK, "got %08x\n", hr );
759
760 while (IWbemClassObject_NextMethod( reg, 0, &name, &sig_in, &sig_out ) == S_OK)
761 {
762 SysFreeString( name );
763 IWbemClassObject_Release( sig_in );
764 IWbemClassObject_Release( sig_out );
765 }
766
767 hr = IWbemClassObject_EndMethodEnumeration( reg );
768 ok( hr == S_OK, "got %08x\n", hr );
769
770 hr = IWbemClassObject_BeginEnumeration( reg, 0 );
771 ok( hr == S_OK, "got %08x\n", hr );
772
773 while (IWbemClassObject_Next( reg, 0, &name, NULL, NULL, NULL ) == S_OK)
774 SysFreeString( name );
775
776 hr = IWbemClassObject_EndEnumeration( reg );
777 ok( hr == S_OK, "got %08x\n", hr );
778
779 hr = IWbemClassObject_GetMethod( reg, createkeyW, 0, &sig_in, NULL );
780 ok( hr == S_OK, "failed to get CreateKey method %08x\n", hr );
781
782 hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in );
783 ok( hr == S_OK, "failed to spawn instance %08x\n", hr );
784
785 V_VT( &defkey ) = VT_I4;
786 V_I4( &defkey ) = 0x80000001;
787 hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 );
788 ok( hr == S_OK, "failed to set root %08x\n", hr );
789
790 V_VT( &subkey ) = VT_BSTR;
791 V_BSTR( &subkey ) = SysAllocString( regtestW );
792 hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 );
793 ok( hr == S_OK, "failed to set subkey %08x\n", hr );
794
795 out = NULL;
796 method = SysAllocString( createkeyW );
797 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL );
798 ok( hr == S_OK, "failed to execute method %08x\n", hr );
799 SysFreeString( method );
800
801 type = 0xdeadbeef;
802 VariantInit( &retval );
803 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
804 ok( hr == S_OK, "failed to get return value %08x\n", hr );
805 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
806 ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
807 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
808
809 res = RegDeleteKeyW( HKEY_CURRENT_USER, regtestW );
810 ok( !res, "got %d\n", res );
811
812 VariantClear( &subkey );
813 IWbemClassObject_Release( in );
814 IWbemClassObject_Release( out );
815 IWbemClassObject_Release( sig_in );
816
817 hr = IWbemClassObject_GetMethod( reg, enumkeyW, 0, &sig_in, NULL );
818 ok( hr == S_OK, "failed to get EnumKey method %08x\n", hr );
819
820 hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in );
821 ok( hr == S_OK, "failed to spawn instance %08x\n", hr );
822
823 V_VT( &defkey ) = VT_I4;
824 V_I4( &defkey ) = 0x80000002;
825 hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 );
826 ok( hr == S_OK, "failed to set root %08x\n", hr );
827
828 V_VT( &subkey ) = VT_BSTR;
829 V_BSTR( &subkey ) = SysAllocString( windowsW );
830 hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 );
831 ok( hr == S_OK, "failed to set subkey %08x\n", hr );
832
833 out = NULL;
834 method = SysAllocString( enumkeyW );
835 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL );
836 ok( hr == S_OK, "failed to execute method %08x\n", hr );
837 SysFreeString( method );
838
839 type = 0xdeadbeef;
840 VariantInit( &retval );
841 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
842 ok( hr == S_OK, "failed to get return value %08x\n", hr );
843 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
844 ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
845 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
846
847 type = 0xdeadbeef;
848 VariantInit( &names );
849 hr = IWbemClassObject_Get( out, namesW, 0, &names, &type, NULL );
850 ok( hr == S_OK, "failed to get names %08x\n", hr );
851 ok( V_VT( &names ) == (VT_BSTR|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &names ) );
852 ok( type == (CIM_STRING|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
853
854 VariantClear( &names );
855 VariantClear( &subkey );
856 IWbemClassObject_Release( in );
857 IWbemClassObject_Release( out );
858 IWbemClassObject_Release( sig_in );
859
860 hr = IWbemClassObject_GetMethod( reg, enumvaluesW, 0, &sig_in, NULL );
861 ok( hr == S_OK, "failed to get EnumValues method %08x\n", hr );
862
863 hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in );
864 ok( hr == S_OK, "failed to spawn instance %08x\n", hr );
865
866 V_VT( &defkey ) = VT_I4;
867 V_I4( &defkey ) = 0x80000002;
868 hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 );
869 ok( hr == S_OK, "failed to set root %08x\n", hr );
870
871 V_VT( &subkey ) = VT_BSTR;
872 V_BSTR( &subkey ) = SysAllocString( windowsW );
873 hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 );
874 ok( hr == S_OK, "failed to set subkey %08x\n", hr );
875
876 out = NULL;
877 method = SysAllocString( enumvaluesW );
878 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL );
879 ok( hr == S_OK, "failed to execute method %08x\n", hr );
880 SysFreeString( method );
881
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_I4( &retval ) );
888 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
889
890 type = 0xdeadbeef;
891 VariantInit( &names );
892 hr = IWbemClassObject_Get( out, namesW, 0, &names, &type, NULL );
893 ok( hr == S_OK, "failed to get names %08x\n", hr );
894 ok( V_VT( &names ) == (VT_BSTR|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &names ) );
895 ok( type == (CIM_STRING|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
896
897 type = 0xdeadbeef;
898 VariantInit( &types );
899 hr = IWbemClassObject_Get( out, typesW, 0, &types, &type, NULL );
900 ok( hr == S_OK, "failed to get names %08x\n", hr );
901 ok( V_VT( &types ) == (VT_I4|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &types ) );
902 ok( type == (CIM_SINT32|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
903
904 VariantClear( &types );
905 VariantClear( &names );
906 VariantClear( &subkey );
907 IWbemClassObject_Release( in );
908 IWbemClassObject_Release( out );
909 IWbemClassObject_Release( sig_in );
910
911 hr = IWbemClassObject_GetMethod( reg, getstringvalueW, 0, &sig_in, NULL );
912 ok( hr == S_OK, "failed to get GetStringValue method %08x\n", hr );
913
914 hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in );
915 ok( hr == S_OK, "failed to spawn instance %08x\n", hr );
916
917 V_VT( &defkey ) = VT_I4;
918 V_I4( &defkey ) = 0x80000002;
919 hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 );
920 ok( hr == S_OK, "failed to set root %08x\n", hr );
921
922 V_VT( &subkey ) = VT_BSTR;
923 V_BSTR( &subkey ) = SysAllocString( windowsW );
924 hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 );
925 ok( hr == S_OK, "failed to set subkey %08x\n", hr );
926
927 V_VT( &valuename ) = VT_BSTR;
928 V_BSTR( &valuename ) = SysAllocString( programfilesW );
929 hr = IWbemClassObject_Put( in, valuenameW, 0, &valuename, 0 );
930 ok( hr == S_OK, "failed to set value name %08x\n", hr );
931
932 out = NULL;
933 method = SysAllocString( getstringvalueW );
934 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL );
935 ok( hr == S_OK, "failed to execute method %08x\n", hr );
936 SysFreeString( method );
937
938 type = 0xdeadbeef;
939 VariantInit( &retval );
940 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
941 ok( hr == S_OK, "failed to get return value %08x\n", hr );
942 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
943 ok( !V_I4( &retval ), "unexpected error %u\n", V_I4( &retval ) );
944 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
945
946 type = 0xdeadbeef;
947 VariantInit( &value );
948 hr = IWbemClassObject_Get( out, valueW, 0, &value, &type, NULL );
949 ok( hr == S_OK, "failed to get value %08x\n", hr );
950 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
951 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
952
953 VariantClear( &value );
954 VariantClear( &valuename );
955 VariantClear( &subkey );
956 IWbemClassObject_Release( in );
957 IWbemClassObject_Release( out );
958 IWbemClassObject_Release( sig_in );
959
960 IWbemClassObject_Release( reg );
961 SysFreeString( class );
962 }
963
964 static HRESULT WINAPI sink_QueryInterface(
965 IWbemObjectSink *iface, REFIID riid, void **ppv )
966 {
967 *ppv = NULL;
968 if (IsEqualGUID( &IID_IUnknown, riid ) || IsEqualGUID( &IID_IWbemObjectSink, riid ))
969 {
970 *ppv = iface;
971 IWbemObjectSink_AddRef( iface );
972 return S_OK;
973 }
974 return E_NOINTERFACE;
975 }
976
977 static ULONG sink_refs;
978
979 static ULONG WINAPI sink_AddRef(
980 IWbemObjectSink *iface )
981 {
982 return ++sink_refs;
983 }
984
985 static ULONG WINAPI sink_Release(
986 IWbemObjectSink *iface )
987 {
988 return --sink_refs;
989 }
990
991 static HRESULT WINAPI sink_Indicate(
992 IWbemObjectSink *iface, LONG count, IWbemClassObject **objects )
993 {
994 trace("Indicate: %d, %p\n", count, objects);
995 return S_OK;
996 }
997
998 static HRESULT WINAPI sink_SetStatus(
999 IWbemObjectSink *iface, LONG flags, HRESULT hresult, BSTR str_param, IWbemClassObject *obj_param )
1000 {
1001 trace("SetStatus: %08x, %08x, %s, %p\n", flags, hresult, wine_dbgstr_w(str_param), obj_param);
1002 return S_OK;
1003 }
1004
1005 static IWbemObjectSinkVtbl sink_vtbl =
1006 {
1007 sink_QueryInterface,
1008 sink_AddRef,
1009 sink_Release,
1010 sink_Indicate,
1011 sink_SetStatus
1012 };
1013
1014 static IWbemObjectSink sink = { &sink_vtbl };
1015
1016 static void test_notification_query_async( IWbemServices *services )
1017 {
1018 static const WCHAR queryW[] =
1019 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1020 'D','e','v','i','c','e','C','h','a','n','g','e','E','v','e','n','t',0};
1021 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1022 ULONG prev_sink_refs;
1023 HRESULT hr;
1024
1025 hr = IWbemServices_ExecNotificationQueryAsync( services, wql, query, 0, NULL, NULL );
1026 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
1027
1028 prev_sink_refs = sink_refs;
1029 hr = IWbemServices_ExecNotificationQueryAsync( services, wql, query, 0, NULL, &sink );
1030 ok( hr == S_OK || broken(hr == WBEM_E_NOT_FOUND), "got %08x\n", hr );
1031 ok( sink_refs > prev_sink_refs || broken(!sink_refs), "got %u refs\n", sink_refs );
1032
1033 hr = IWbemServices_CancelAsyncCall( services, &sink );
1034 ok( hr == S_OK || broken(hr == WBEM_E_NOT_FOUND), "got %08x\n", hr );
1035
1036 SysFreeString( wql );
1037 SysFreeString( query );
1038 }
1039
1040 static void test_query_async( IWbemServices *services )
1041 {
1042 static const WCHAR queryW[] =
1043 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1044 'P','r','o','c','e','s','s',0};
1045 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1046 HRESULT hr;
1047
1048 hr = IWbemServices_ExecQueryAsync( services, wql, query, 0, NULL, NULL );
1049 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
1050
1051 hr = IWbemServices_ExecQueryAsync( services, wql, query, 0, NULL, &sink );
1052 ok( hr == S_OK || broken(hr == WBEM_E_NOT_FOUND), "got %08x\n", hr );
1053
1054 hr = IWbemServices_CancelAsyncCall( services, NULL );
1055 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
1056
1057 hr = IWbemServices_CancelAsyncCall( services, &sink );
1058 ok( hr == S_OK, "got %08x\n", hr );
1059
1060 SysFreeString( wql );
1061 SysFreeString( query );
1062 }
1063
1064 static void test_GetNames( IWbemServices *services )
1065 {
1066 static const WCHAR queryW[] =
1067 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1068 'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
1069 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1070 IEnumWbemClassObject *result;
1071 HRESULT hr;
1072
1073 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1074 ok( hr == S_OK, "got %08x\n", hr );
1075
1076 for (;;)
1077 {
1078 IWbemClassObject *obj;
1079 SAFEARRAY *names;
1080 ULONG count;
1081 VARIANT val;
1082
1083 IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1084 if (!count) break;
1085
1086 VariantInit( &val );
1087 hr = IWbemClassObject_GetNames( obj, NULL, WBEM_FLAG_NONSYSTEM_ONLY, &val, &names );
1088 ok( hr == S_OK, "got %08x\n", hr );
1089
1090 SafeArrayDestroy( names );
1091 IWbemClassObject_Release( obj );
1092 }
1093 IEnumWbemClassObject_Release( result );
1094 SysFreeString( query );
1095 SysFreeString( wql );
1096 }
1097
1098 static void test_SystemSecurity( IWbemServices *services )
1099 {
1100 static const WCHAR systemsecurityW[] = {'_','_','S','y','s','t','e','m','S','e','c','u','r','i','t','y',0};
1101 static const WCHAR getsdW[] = {'G','e','t','S','D',0};
1102 static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
1103 static const WCHAR sdW[] = {'S','D',0};
1104 BSTR class = SysAllocString( systemsecurityW ), method;
1105 IWbemClassObject *reg, *out;
1106 VARIANT retval, var_sd;
1107 void *data;
1108 SECURITY_DESCRIPTOR_RELATIVE *sd;
1109 CIMTYPE type;
1110 HRESULT hr;
1111 BYTE sid_admin_buffer[SECURITY_MAX_SID_SIZE];
1112 SID *sid_admin = (SID*)sid_admin_buffer;
1113 DWORD sid_size;
1114 BOOL ret;
1115
1116 hr = IWbemServices_GetObject( services, class, 0, NULL, &reg, NULL );
1117 if (hr != S_OK)
1118 {
1119 win_skip( "__SystemSecurity not available\n" );
1120 return;
1121 }
1122 IWbemClassObject_Release( reg );
1123
1124 sid_size = sizeof(sid_admin_buffer);
1125 ret = CreateWellKnownSid( WinBuiltinAdministratorsSid, NULL, sid_admin, &sid_size );
1126 ok( ret, "CreateWellKnownSid failed\n" );
1127
1128 out = NULL;
1129 method = SysAllocString( getsdW );
1130 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
1131 ok( hr == S_OK || hr == WBEM_E_ACCESS_DENIED, "failed to execute method %08x\n", hr );
1132 SysFreeString( method );
1133
1134 if (SUCCEEDED(hr))
1135 {
1136 type = 0xdeadbeef;
1137 VariantInit( &retval );
1138 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
1139 ok( hr == S_OK, "failed to get return value %08x\n", hr );
1140 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
1141 ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
1142 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
1143
1144 type = 0xdeadbeef;
1145 VariantInit( &var_sd );
1146 hr = IWbemClassObject_Get( out, sdW, 0, &var_sd, &type, NULL );
1147 ok( hr == S_OK, "failed to get names %08x\n", hr );
1148 ok( V_VT( &var_sd ) == (VT_UI1|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &var_sd ) );
1149 ok( type == (CIM_UINT8|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
1150
1151 hr = SafeArrayAccessData( V_ARRAY( &var_sd ), &data );
1152 ok( hr == S_OK, "SafeArrayAccessData failed %x\n", hr );
1153 if (SUCCEEDED(hr))
1154 {
1155 sd = data;
1156
1157 ok( (sd->Control & SE_SELF_RELATIVE) == SE_SELF_RELATIVE, "relative flag unset\n" );
1158 ok( sd->Owner != 0, "no owner SID\n");
1159 ok( sd->Group != 0, "no owner SID\n");
1160 ok( EqualSid( (PSID)((LPBYTE)sd + sd->Owner), sid_admin ), "unexpected owner SID\n" );
1161 ok( EqualSid( (PSID)((LPBYTE)sd + sd->Group), sid_admin ), "unexpected group SID\n" );
1162
1163 hr = SafeArrayUnaccessData( V_ARRAY( &var_sd ) );
1164 ok( hr == S_OK, "SafeArrayUnaccessData failed %x\n", hr );
1165 }
1166
1167 VariantClear( &var_sd );
1168 IWbemClassObject_Release( out );
1169 }
1170 else if (hr == WBEM_E_ACCESS_DENIED)
1171 win_skip( "insufficient privs to test __SystemSecurity\n" );
1172
1173 SysFreeString( class );
1174 }
1175
1176 static void test_Win32_OperatingSystem( IWbemServices *services )
1177 {
1178 static const WCHAR queryW[] =
1179 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1180 'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
1181 static const WCHAR buildnumberW[] = {'B','u','i','l','d','N','u','m','b','e','r',0};
1182 static const WCHAR captionW[] = {'C','a','p','t','i','o','n',0};
1183 static const WCHAR csdversionW[] = {'C','S','D','V','e','r','s','i','o','n',0};
1184 static const WCHAR freephysicalmemoryW[] = {'F','r','e','e','P','h','y','s','i','c','a','l','M','e','m','o','r','y',0};
1185 static const WCHAR nameW[] = {'N','a','m','e',0};
1186 static const WCHAR osproductsuiteW[] = {'O','S','P','r','o','d','u','c','t','S','u','i','t','e',0};
1187 static const WCHAR ostypeW[] = {'O','S','T','y','p','e',0};
1188 static const WCHAR suitemaskW[] = {'S','u','i','t','e','M','a','s','k',0};
1189 static const WCHAR versionW[] = {'V','e','r','s','i','o','n',0};
1190 static const WCHAR servicepackmajorW[] =
1191 {'S','e','r','v','i','c','e','P','a','c','k','M','a','j','o','r','V','e','r','s','i','o','n',0};
1192 static const WCHAR servicepackminorW[] =
1193 {'S','e','r','v','i','c','e','P','a','c','k','M','i','n','o','r','V','e','r','s','i','o','n',0};
1194 static const WCHAR totalvisiblememorysizeW[] =
1195 {'T','o','t','a','l','V','i','s','i','b','l','e','M','e','m','o','r','y','S','i','z','e',0};
1196 static const WCHAR totalvirtualmemorysizeW[] =
1197 {'T','o','t','a','l','V','i','r','t','u','a','l','M','e','m','o','r','y','S','i','z','e',0};
1198 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1199 IEnumWbemClassObject *result;
1200 IWbemClassObject *obj;
1201 CIMTYPE type;
1202 ULONG count;
1203 VARIANT val;
1204 HRESULT hr;
1205
1206 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1207 ok( hr == S_OK, "IWbemServices_ExecQuery failed %08x\n", hr );
1208
1209 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1210 ok( hr == S_OK, "IEnumWbemClassObject_Next failed %08x\n", hr );
1211
1212 hr = IWbemClassObject_BeginEnumeration( obj, 0 );
1213 ok( hr == S_OK, "got %08x\n", hr );
1214
1215 while (IWbemClassObject_Next( obj, 0, NULL, NULL, NULL, NULL ) == S_OK) {}
1216
1217 hr = IWbemClassObject_EndEnumeration( obj );
1218 ok( hr == S_OK, "got %08x\n", hr );
1219
1220 type = 0xdeadbeef;
1221 VariantInit( &val );
1222 hr = IWbemClassObject_Get( obj, buildnumberW, 0, &val, &type, NULL );
1223 ok( hr == S_OK, "failed to get buildnumber %08x\n", hr );
1224 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1225 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1226 trace( "buildnumber: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1227 VariantClear( &val );
1228
1229 type = 0xdeadbeef;
1230 VariantInit( &val );
1231 hr = IWbemClassObject_Get( obj, captionW, 0, &val, &type, NULL );
1232 ok( hr == S_OK, "failed to get caption %08x\n", hr );
1233 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1234 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1235 trace( "caption: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1236 VariantClear( &val );
1237
1238 type = 0xdeadbeef;
1239 VariantInit( &val );
1240 hr = IWbemClassObject_Get( obj, csdversionW, 0, &val, &type, NULL );
1241 ok( hr == S_OK, "failed to get csdversion %08x\n", hr );
1242 ok( V_VT( &val ) == VT_BSTR || V_VT( &val ) == VT_NULL, "unexpected variant type 0x%x\n", V_VT( &val ) );
1243 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1244 trace( "csdversion: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1245 VariantClear( &val );
1246
1247 type = 0xdeadbeef;
1248 VariantInit( &val );
1249 hr = IWbemClassObject_Get( obj, freephysicalmemoryW, 0, &val, &type, NULL );
1250 ok( hr == S_OK, "failed to get free physical memory size %08x\n", hr );
1251 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1252 ok( type == CIM_UINT64, "unexpected type 0x%x\n", type );
1253 trace( "freephysicalmemory %s\n", wine_dbgstr_w(V_BSTR(&val)) );
1254 VariantClear( &val );
1255
1256 type = 0xdeadbeef;
1257 VariantInit( &val );
1258 hr = IWbemClassObject_Get( obj, nameW, 0, &val, &type, NULL );
1259 ok( hr == S_OK, "failed to get name %08x\n", hr );
1260 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1261 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1262 trace( "name: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1263 VariantClear( &val );
1264
1265 type = 0xdeadbeef;
1266 VariantInit( &val );
1267 hr = IWbemClassObject_Get( obj, osproductsuiteW, 0, &val, &type, NULL );
1268 ok( hr == S_OK, "failed to get osproductsuite %08x\n", hr );
1269 ok( V_VT( &val ) == VT_I4 || broken(V_VT( &val ) == VT_NULL) /* winxp */, "unexpected variant type 0x%x\n", V_VT( &val ) );
1270 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
1271 trace( "osproductsuite: %d (%08x)\n", V_I4( &val ), V_I4( &val ) );
1272 VariantClear( &val );
1273
1274 type = 0xdeadbeef;
1275 VariantInit( &val );
1276 hr = IWbemClassObject_Get( obj, ostypeW, 0, &val, &type, NULL );
1277 ok( hr == S_OK, "failed to get ostype %08x\n", hr );
1278 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1279 ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1280 trace( "ostype: %d\n", V_I4( &val ) );
1281 VariantClear( &val );
1282
1283 type = 0xdeadbeef;
1284 VariantInit( &val );
1285 hr = IWbemClassObject_Get( obj, servicepackmajorW, 0, &val, &type, NULL );
1286 ok( hr == S_OK, "failed to get servicepackmajor %08x\n", hr );
1287 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1288 ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1289 trace( "servicepackmajor: %d\n", V_I4( &val ) );
1290 VariantClear( &val );
1291
1292 type = 0xdeadbeef;
1293 VariantInit( &val );
1294 hr = IWbemClassObject_Get( obj, servicepackminorW, 0, &val, &type, NULL );
1295 ok( hr == S_OK, "failed to get servicepackminor %08x\n", hr );
1296 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1297 ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1298 trace( "servicepackminor: %d\n", V_I4( &val ) );
1299 VariantClear( &val );
1300
1301 type = 0xdeadbeef;
1302 VariantInit( &val );
1303 hr = IWbemClassObject_Get( obj, suitemaskW, 0, &val, &type, NULL );
1304 ok( hr == S_OK, "failed to get suitemask %08x\n", hr );
1305 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1306 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
1307 trace( "suitemask: %d (%08x)\n", V_I4( &val ), V_I4( &val ) );
1308 VariantClear( &val );
1309
1310 type = 0xdeadbeef;
1311 VariantInit( &val );
1312 hr = IWbemClassObject_Get( obj, versionW, 0, &val, &type, NULL );
1313 ok( hr == S_OK, "failed to get version %08x\n", hr );
1314 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1315 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1316 trace( "version: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1317 VariantClear( &val );
1318
1319 type = 0xdeadbeef;
1320 VariantInit( &val );
1321 hr = IWbemClassObject_Get( obj, totalvisiblememorysizeW, 0, &val, &type, NULL );
1322 ok( hr == S_OK, "failed to get visible memory size %08x\n", hr );
1323 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1324 ok( type == CIM_UINT64, "unexpected type 0x%x\n", type );
1325 trace( "totalvisiblememorysize %s\n", wine_dbgstr_w(V_BSTR(&val)) );
1326 VariantClear( &val );
1327
1328 type = 0xdeadbeef;
1329 VariantInit( &val );
1330 hr = IWbemClassObject_Get( obj, totalvirtualmemorysizeW, 0, &val, &type, NULL );
1331 ok( hr == S_OK, "failed to get virtual memory size %08x\n", hr );
1332 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1333 ok( type == CIM_UINT64, "unexpected type 0x%x\n", type );
1334 trace( "totalvirtualmemorysize %s\n", wine_dbgstr_w(V_BSTR(&val)) );
1335 VariantClear( &val );
1336
1337 IWbemClassObject_Release( obj );
1338 IEnumWbemClassObject_Release( result );
1339 SysFreeString( query );
1340 SysFreeString( wql );
1341 }
1342
1343 static void test_Win32_ComputerSystemProduct( IWbemServices *services )
1344 {
1345 static const WCHAR identifyingnumberW[] =
1346 {'I','d','e','n','t','i','f','y','i','n','g','N','u','m','b','e','r',0};
1347 static const WCHAR nameW[] =
1348 {'N','a','m','e',0};
1349 static const WCHAR skunumberW[] =
1350 {'S','K','U','N','u','m','b','e','r',0};
1351 static const WCHAR uuidW[] =
1352 {'U','U','I','D',0};
1353 static const WCHAR vendorW[] =
1354 {'V','e','n','d','o','r',0};
1355 static const WCHAR versionW[] =
1356 {'V','e','r','s','i','o','n',0};
1357 static const WCHAR queryW[] =
1358 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1359 'C','o','m','p','u','t','e','r','S','y','s','t','e','m','P','r','o','d','u','c','t',0};
1360 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1361 IEnumWbemClassObject *result;
1362 IWbemClassObject *obj;
1363 VARIANT value;
1364 CIMTYPE type;
1365 HRESULT hr;
1366 DWORD count;
1367
1368 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1369 if (hr != S_OK)
1370 {
1371 win_skip( "Win32_ComputerSystemProduct not available\n" );
1372 return;
1373 }
1374
1375 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1376 ok( hr == S_OK, "got %08x\n", hr );
1377
1378 type = 0xdeadbeef;
1379 VariantInit( &value );
1380 hr = IWbemClassObject_Get( obj, identifyingnumberW, 0, &value, &type, NULL );
1381 ok( hr == S_OK, "got %08x\n", hr );
1382 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
1383 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1384 trace( "identifyingnumber %s\n", wine_dbgstr_w(V_BSTR(&value)) );
1385 VariantClear( &value );
1386
1387 type = 0xdeadbeef;
1388 VariantInit( &value );
1389 hr = IWbemClassObject_Get( obj, nameW, 0, &value, &type, NULL );
1390 ok( hr == S_OK, "got %08x\n", hr );
1391 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
1392 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1393 trace( "name %s\n", wine_dbgstr_w(V_BSTR(&value)) );
1394 VariantClear( &value );
1395
1396 type = 0xdeadbeef;
1397 VariantInit( &value );
1398 hr = IWbemClassObject_Get( obj, skunumberW, 0, &value, &type, NULL );
1399 ok( hr == S_OK, "got %08x\n", hr );
1400 ok( V_VT( &value ) == VT_NULL, "unexpected variant type 0x%x\n", V_VT( &value ) );
1401 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1402 VariantClear( &value );
1403
1404 type = 0xdeadbeef;
1405 VariantInit( &value );
1406 hr = IWbemClassObject_Get( obj, uuidW, 0, &value, &type, NULL );
1407 ok( hr == S_OK, "got %08x\n", hr );
1408 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
1409 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1410 trace( "uuid %s\n", wine_dbgstr_w(V_BSTR(&value)) );
1411 VariantClear( &value );
1412
1413 type = 0xdeadbeef;
1414 VariantInit( &value );
1415 hr = IWbemClassObject_Get( obj, vendorW, 0, &value, &type, NULL );
1416 ok( hr == S_OK, "got %08x\n", hr );
1417 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
1418 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1419 trace( "vendor %s\n", wine_dbgstr_w(V_BSTR(&value)) );
1420 VariantClear( &value );
1421
1422 type = 0xdeadbeef;
1423 VariantInit( &value );
1424 hr = IWbemClassObject_Get( obj, versionW, 0, &value, &type, NULL );
1425 ok( hr == S_OK, "got %08x\n", hr );
1426 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
1427 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1428 trace( "version %s\n", wine_dbgstr_w(V_BSTR(&value)) );
1429 VariantClear( &value );
1430
1431 IWbemClassObject_Release( obj );
1432 IEnumWbemClassObject_Release( result );
1433 SysFreeString( query );
1434 SysFreeString( wql );
1435 }
1436
1437 static void test_Win32_PhysicalMemory( IWbemServices *services )
1438 {
1439 static const WCHAR capacityW[] = {'C','a','p','a','c','i','t','y',0};
1440 static const WCHAR memorytypeW[] = {'M','e','m','o','r','y','T','y','p','e',0};
1441 static const WCHAR queryW[] =
1442 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1443 'P','h','y','s','i','c','a','l','M','e','m','o','r','y',0};
1444 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1445 IEnumWbemClassObject *result;
1446 IWbemClassObject *obj;
1447 VARIANT val;
1448 CIMTYPE type;
1449 HRESULT hr;
1450 DWORD count;
1451
1452 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1453 if (hr != S_OK)
1454 {
1455 win_skip( "Win32_PhysicalMemory not available\n" );
1456 return;
1457 }
1458
1459 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1460 ok( hr == S_OK, "got %08x\n", hr );
1461
1462 if (count > 0)
1463 {
1464 type = 0xdeadbeef;
1465 VariantInit( &val );
1466 hr = IWbemClassObject_Get( obj, capacityW, 0, &val, &type, NULL );
1467 ok( hr == S_OK, "failed to get capacity %08x\n", hr );
1468 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1469 ok( type == CIM_UINT64, "unexpected type 0x%x\n", type );
1470 trace( "capacity %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1471 VariantClear( &val );
1472
1473 type = 0xdeadbeef;
1474 VariantInit( &val );
1475 hr = IWbemClassObject_Get( obj, memorytypeW, 0, &val, &type, NULL );
1476 ok( hr == S_OK, "failed to get memory type %08x\n", hr );
1477 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1478 ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1479 trace( "memorytype %u\n", V_I4( &val ) );
1480 VariantClear( &val );
1481
1482 IWbemClassObject_Release( obj );
1483 }
1484 IEnumWbemClassObject_Release( result );
1485 SysFreeString( query );
1486 SysFreeString( wql );
1487 }
1488
1489 static void test_Win32_IP4RouteTable( IWbemServices *services )
1490 {
1491 static const WCHAR destinationW[] = {'D','e','s','t','i','n','a','t','i','o','n',0};
1492 static const WCHAR interfaceindexW[] = {'I','n','t','e','r','f','a','c','e','I','n','d','e','x',0};
1493 static const WCHAR nexthopW[] = {'N','e','x','t','H','o','p',0};
1494 static const WCHAR queryW[] =
1495 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1496 'I','P','4','R','o','u','t','e','T','a','b','l','e',0};
1497 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1498 IEnumWbemClassObject *result;
1499 IWbemClassObject *obj;
1500 VARIANT val;
1501 CIMTYPE type;
1502 HRESULT hr;
1503 DWORD count;
1504
1505 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1506 if (hr != S_OK)
1507 {
1508 win_skip( "Win32_IP4RouteTable not available\n" );
1509 return;
1510 }
1511
1512 for (;;)
1513 {
1514 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1515 if (hr != S_OK) break;
1516
1517 type = 0xdeadbeef;
1518 VariantInit( &val );
1519 hr = IWbemClassObject_Get( obj, destinationW, 0, &val, &type, NULL );
1520 ok( hr == S_OK, "failed to get destination %08x\n", hr );
1521 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1522 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1523 trace( "destination %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1524 VariantClear( &val );
1525
1526 type = 0xdeadbeef;
1527 VariantInit( &val );
1528 hr = IWbemClassObject_Get( obj, interfaceindexW, 0, &val, &type, NULL );
1529 ok( hr == S_OK, "failed to get interface index %08x\n", hr );
1530 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1531 ok( type == CIM_SINT32, "unexpected type 0x%x\n", type );
1532 trace( "interfaceindex %d\n", V_I4( &val ) );
1533 VariantClear( &val );
1534
1535 type = 0xdeadbeef;
1536 VariantInit( &val );
1537 hr = IWbemClassObject_Get( obj, nexthopW, 0, &val, &type, NULL );
1538 ok( hr == S_OK, "failed to get nexthop %08x\n", hr );
1539 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1540 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1541 trace( "nexthop %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1542 VariantClear( &val );
1543
1544 IWbemClassObject_Release( obj );
1545 }
1546
1547 IEnumWbemClassObject_Release( result );
1548 SysFreeString( query );
1549 SysFreeString( wql );
1550 }
1551
1552 static void test_Win32_Processor( IWbemServices *services )
1553 {
1554 static const WCHAR architectureW[] =
1555 {'A','r','c','h','i','t','e','c','t','u','r','e',0};
1556 static const WCHAR familyW[] =
1557 {'F','a','m','i','l','y',0};
1558 static const WCHAR levelW[] =
1559 {'L','e','v','e','l',0};
1560 static const WCHAR manufacturerW[] =
1561 {'M','a','n','u','f','a','c','t','u','r','e','r',0};
1562 static const WCHAR nameW[] =
1563 {'N','a','m','e',0};
1564 static const WCHAR processoridW[] =
1565 {'P','r','o','c','e','s','s','o','r','I','d',0};
1566 static const WCHAR revisionW[] =
1567 {'R','e','v','i','s','i','o','n',0};
1568 static const WCHAR versionW[] =
1569 {'V','e','r','s','i','o','n',0};
1570 static const WCHAR queryW[] =
1571 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1572 'P','r','o','c','e','s','s','o','r',0};
1573 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1574 IEnumWbemClassObject *result;
1575 IWbemClassObject *obj;
1576 VARIANT val;
1577 CIMTYPE type;
1578 HRESULT hr;
1579 DWORD count;
1580
1581 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1582 ok( hr == S_OK, "got %08x\n", hr );
1583
1584 for (;;)
1585 {
1586 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1587 if (hr != S_OK) break;
1588
1589 type = 0xdeadbeef;
1590 VariantInit( &val );
1591 hr = IWbemClassObject_Get( obj, architectureW, 0, &val, &type, NULL );
1592 ok( hr == S_OK, "got %08x\n", hr );
1593 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1594 ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1595 trace( "architecture %u\n", V_I4( &val ) );
1596
1597 type = 0xdeadbeef;
1598 VariantInit( &val );
1599 hr = IWbemClassObject_Get( obj, familyW, 0, &val, &type, NULL );
1600 ok( hr == S_OK, "got %08x\n", hr );
1601 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1602 ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1603 trace( "family %u\n", V_I4( &val ) );
1604
1605 type = 0xdeadbeef;
1606 VariantInit( &val );
1607 hr = IWbemClassObject_Get( obj, levelW, 0, &val, &type, NULL );
1608 ok( hr == S_OK, "got %08x\n", hr );
1609 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1610 ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1611 trace( "level %u\n", V_I4( &val ) );
1612
1613 type = 0xdeadbeef;
1614 VariantInit( &val );
1615 hr = IWbemClassObject_Get( obj, manufacturerW, 0, &val, &type, NULL );
1616 ok( hr == S_OK, "got %08x\n", hr );
1617 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1618 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1619 trace( "manufacturer %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1620 VariantClear( &val );
1621
1622 type = 0xdeadbeef;
1623 VariantInit( &val );
1624 hr = IWbemClassObject_Get( obj, nameW, 0, &val, &type, NULL );
1625 ok( hr == S_OK, "got %08x\n", hr );
1626 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1627 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1628 trace( "name %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1629 VariantClear( &val );
1630
1631 type = 0xdeadbeef;
1632 VariantInit( &val );
1633 hr = IWbemClassObject_Get( obj, processoridW, 0, &val, &type, NULL );
1634 ok( hr == S_OK, "got %08x\n", hr );
1635 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1636 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1637 trace( "processorid %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1638 VariantClear( &val );
1639
1640 type = 0xdeadbeef;
1641 VariantInit( &val );
1642 hr = IWbemClassObject_Get( obj, revisionW, 0, &val, &type, NULL );
1643 ok( hr == S_OK, "got %08x\n", hr );
1644 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1645 ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1646 trace( "revision %u\n", V_I4( &val ) );
1647
1648 type = 0xdeadbeef;
1649 VariantInit( &val );
1650 hr = IWbemClassObject_Get( obj, versionW, 0, &val, &type, NULL );
1651 ok( hr == S_OK, "got %08x\n", hr );
1652 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1653 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1654 trace( "version %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1655 VariantClear( &val );
1656
1657 IWbemClassObject_Release( obj );
1658 }
1659
1660 IEnumWbemClassObject_Release( result );
1661 SysFreeString( query );
1662 SysFreeString( wql );
1663 }
1664
1665 static void test_Win32_VideoController( IWbemServices *services )
1666 {
1667 static const WCHAR configmanagererrorcodeW[] =
1668 {'C','o','n','f','i','g','M','a','n','a','g','e','r','E','r','r','o','r','C','o','d','e',0};
1669 static const WCHAR driverdateW[] =
1670 {'D','r','i','v','e','r','D','a','t','e',0};
1671 static const WCHAR installeddisplaydriversW[]=
1672 {'I','n','s','t','a','l','l','e','d','D','i','s','p','l','a','y','D','r','i','v','e','r','s',0};
1673 static const WCHAR statusW[] =
1674 {'S','t','a','t','u','s',0};
1675 static const WCHAR queryW[] =
1676 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1677 'V','i','d','e','o','C','o','n','t','r','o','l','l','e','r',0};
1678 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1679 IEnumWbemClassObject *result;
1680 IWbemClassObject *obj;
1681 VARIANT val;
1682 CIMTYPE type;
1683 HRESULT hr;
1684 DWORD count;
1685
1686 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1687 if (hr != S_OK)
1688 {
1689 win_skip( "Win32_VideoController not available\n" );
1690 return;
1691 }
1692
1693 for (;;)
1694 {
1695 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1696 if (hr != S_OK) break;
1697
1698 type = 0xdeadbeef;
1699 VariantInit( &val );
1700 hr = IWbemClassObject_Get( obj, configmanagererrorcodeW, 0, &val, &type, NULL );
1701 ok( hr == S_OK, "got %08x\n", hr );
1702 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1703 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
1704 trace( "configmanagererrorcode %d\n", V_I4( &val ) );
1705
1706 type = 0xdeadbeef;
1707 VariantInit( &val );
1708 hr = IWbemClassObject_Get( obj, driverdateW, 0, &val, &type, NULL );
1709 ok( hr == S_OK, "got %08x\n", hr );
1710 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1711 ok( type == CIM_DATETIME, "unexpected type 0x%x\n", type );
1712 trace( "driverdate %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1713 VariantClear( &val );
1714
1715 type = 0xdeadbeef;
1716 VariantInit( &val );
1717 hr = IWbemClassObject_Get( obj, installeddisplaydriversW, 0, &val, &type, NULL );
1718 ok( hr == S_OK, "got %08x\n", hr );
1719 ok( V_VT( &val ) == VT_BSTR || V_VT( &val ) == VT_NULL, "unexpected variant type 0x%x\n", V_VT( &val ) );
1720 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1721 trace( "installeddisplaydrivers %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1722 VariantClear( &val );
1723
1724 type = 0xdeadbeef;
1725 VariantInit( &val );
1726 hr = IWbemClassObject_Get( obj, statusW, 0, &val, &type, NULL );
1727 ok( hr == S_OK, "got %08x\n", hr );
1728 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1729 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1730 trace( "status %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1731 VariantClear( &val );
1732
1733 IWbemClassObject_Release( obj );
1734 }
1735
1736 IEnumWbemClassObject_Release( result );
1737 SysFreeString( query );
1738 SysFreeString( wql );
1739 }
1740
1741 static void test_Win32_Printer( IWbemServices *services )
1742 {
1743 static const WCHAR deviceidW[] =
1744 {'D','e','v','i','c','e','I','d',0};
1745 static const WCHAR locationW[] =
1746 {'L','o','c','a','t','i','o','n',0};
1747 static const WCHAR portnameW[] =
1748 {'P','o','r','t','N','a','m','e',0};
1749 static const WCHAR queryW[] =
1750 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1751 'P','r','i','n','t','e','r',0};
1752 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1753 IEnumWbemClassObject *result;
1754 IWbemClassObject *obj;
1755 VARIANT val;
1756 CIMTYPE type;
1757 HRESULT hr;
1758 DWORD count;
1759
1760 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1761 if (hr != S_OK)
1762 {
1763 win_skip( "Win32_Printer not available\n" );
1764 return;
1765 }
1766
1767 for (;;)
1768 {
1769 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1770 if (hr != S_OK) break;
1771
1772 type = 0xdeadbeef;
1773 memset( &val, 0, sizeof(val) );
1774 hr = IWbemClassObject_Get( obj, deviceidW, 0, &val, &type, NULL );
1775 ok( hr == S_OK, "got %08x\n", hr );
1776 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1777 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1778 trace( "deviceid %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1779 VariantClear( &val );
1780
1781 type = 0xdeadbeef;
1782 memset( &val, 0, sizeof(val) );
1783 hr = IWbemClassObject_Get( obj, locationW, 0, &val, &type, NULL );
1784 ok( hr == S_OK, "got %08x\n", hr );
1785 ok( V_VT( &val ) == VT_BSTR || V_VT( &val ) == VT_NULL, "unexpected variant type 0x%x\n", V_VT( &val ) );
1786 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1787 trace( "location %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1788 VariantClear( &val );
1789
1790 type = 0xdeadbeef;
1791 memset( &val, 0, sizeof(val) );
1792 hr = IWbemClassObject_Get( obj, portnameW, 0, &val, &type, NULL );
1793 ok( hr == S_OK, "got %08x\n", hr );
1794 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1795 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1796 trace( "portname %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1797 VariantClear( &val );
1798
1799 IWbemClassObject_Release( obj );
1800 }
1801
1802 IEnumWbemClassObject_Release( result );
1803 SysFreeString( query );
1804 SysFreeString( wql );
1805 }
1806
1807 static void test_Win32_PnPEntity( IWbemServices *services )
1808 {
1809 HRESULT hr;
1810 IEnumWbemClassObject *enm;
1811 IWbemClassObject *obj;
1812 VARIANT val;
1813 CIMTYPE type;
1814 ULONG count, i;
1815 BSTR bstr;
1816
1817 static WCHAR win32_pnpentityW[] = {'W','i','n','3','2','_','P','n','P','E','n','t','i','t','y',0};
1818 static const WCHAR deviceidW[] = {'D','e','v','i','c','e','I','d',0};
1819
1820 bstr = SysAllocString( win32_pnpentityW );
1821
1822 hr = IWbemServices_CreateInstanceEnum( services, bstr, 0, NULL, &enm );
1823 ok( hr == S_OK, "got %08x\n", hr );
1824
1825 SysFreeString( bstr );
1826 bstr = SysAllocString( deviceidW );
1827
1828 while (1)
1829 {
1830 hr = IEnumWbemClassObject_Next( enm, 1000, 1, &obj, &count );
1831 ok( (count == 1 && (hr == WBEM_S_FALSE || hr == WBEM_S_NO_ERROR)) ||
1832 (count == 0 && (hr == WBEM_S_FALSE || hr == WBEM_S_TIMEDOUT)),
1833 "got %08x with %u objects returned\n", hr, count );
1834
1835 if (count == 0)
1836 break;
1837
1838 for (i = 0; i < count; ++i)
1839 {
1840 hr = IWbemClassObject_Get( obj, bstr, 0, &val, &type, NULL );
1841 ok( hr == S_OK, "got %08x\n", hr );
1842
1843 if (SUCCEEDED( hr ))
1844 {
1845 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1846 ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1847 VariantClear( &val );
1848 }
1849 }
1850 }
1851
1852 SysFreeString( bstr );
1853
1854 IEnumWbemClassObject_Release( enm );
1855 }
1856
1857 START_TEST(query)
1858 {
1859 static const WCHAR cimv2W[] = {'R','O','O','T','\\','C','I','M','V','2',0};
1860 BSTR path = SysAllocString( cimv2W );
1861 IWbemLocator *locator;
1862 IWbemServices *services;
1863 HRESULT hr;
1864
1865 CoInitialize( NULL );
1866 CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
1867 RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL );
1868 hr = CoCreateInstance( &CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, &IID_IWbemLocator,
1869 (void **)&locator );
1870 if (hr != S_OK)
1871 {
1872 win_skip("can't create instance of WbemLocator\n");
1873 return;
1874 }
1875 hr = IWbemLocator_ConnectServer( locator, path, NULL, NULL, NULL, 0, NULL, NULL, &services );
1876 ok( hr == S_OK, "failed to get IWbemServices interface %08x\n", hr );
1877
1878 hr = CoSetProxyBlanket( (IUnknown *)services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL,
1879 RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE );
1880 ok( hr == S_OK, "failed to set proxy blanket %08x\n", hr );
1881
1882 test_select( services );
1883 test_associators( services );
1884 test_Win32_Bios( services );
1885 test_Win32_Process( services, FALSE );
1886 test_Win32_Process( services, TRUE );
1887 test_Win32_Service( services );
1888 test_Win32_ComputerSystem( services );
1889 test_Win32_SystemEnclosure( services );
1890 test_StdRegProv( services );
1891 test_notification_query_async( services );
1892 test_query_async( services );
1893 test_GetNames( services );
1894 test_SystemSecurity( services );
1895 test_Win32_OperatingSystem( services );
1896 test_Win32_ComputerSystemProduct( services );
1897 test_Win32_PhysicalMemory( services );
1898 test_Win32_IP4RouteTable( services );
1899 test_Win32_Processor( services );
1900 test_Win32_VideoController( services );
1901 test_Win32_Printer( services );
1902 test_Win32_PnPEntity( services );
1903
1904 SysFreeString( path );
1905 IWbemServices_Release( services );
1906 IWbemLocator_Release( locator );
1907 CoUninitialize();
1908 }