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
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};
37 IWbemClassObject
*obj
;
38 BSTR wql
= SysAllocString( wqlW
), query
= SysAllocString( str
);
39 LONG flags
= WBEM_FLAG_RETURN_IMMEDIATELY
| WBEM_FLAG_FORWARD_ONLY
;
42 hr
= IWbemServices_ExecQuery( services
, wql
, query
, flags
, NULL
, result
);
45 trace("%s\n", wine_dbgstr_w(str
));
50 IEnumWbemClassObject_Next( *result
, 10000, 1, &obj
, &count
);
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
)));
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
)));
63 IWbemClassObject_Release( obj
);
67 SysFreeString( query
);
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 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
*test
[] = { query1
, query2
, query3
, query4
, query5
, query6
, query7
, query8
, query9
, query10
,
112 IEnumWbemClassObject
*result
;
113 BSTR wql
= SysAllocString( wqlW
);
114 BSTR sql
= SysAllocString( sqlW
);
115 BSTR query
= SysAllocString( query1
);
118 hr
= IWbemServices_ExecQuery( services
, NULL
, NULL
, 0, NULL
, &result
);
119 ok( hr
== WBEM_E_INVALID_PARAMETER
, "query failed %08x\n", hr
);
121 hr
= IWbemServices_ExecQuery( services
, NULL
, query
, 0, NULL
, &result
);
122 ok( hr
== WBEM_E_INVALID_PARAMETER
, "query failed %08x\n", hr
);
124 hr
= IWbemServices_ExecQuery( services
, wql
, NULL
, 0, NULL
, &result
);
125 ok( hr
== WBEM_E_INVALID_PARAMETER
, "query failed %08x\n", hr
);
127 hr
= IWbemServices_ExecQuery( services
, sql
, query
, 0, NULL
, &result
);
128 ok( hr
== WBEM_E_INVALID_QUERY_TYPE
, "query failed %08x\n", hr
);
130 hr
= IWbemServices_ExecQuery( services
, sql
, NULL
, 0, NULL
, &result
);
131 ok( hr
== WBEM_E_INVALID_PARAMETER
, "query failed %08x\n", hr
);
133 SysFreeString( query
);
134 query
= SysAllocString( emptyW
);
135 hr
= IWbemServices_ExecQuery( services
, wql
, query
, 0, NULL
, &result
);
136 ok( hr
== WBEM_E_INVALID_PARAMETER
, "query failed %08x\n", hr
);
138 for (i
= 0; i
< sizeof(test
)/sizeof(test
[0]); i
++)
140 hr
= exec_query( services
, test
[i
], &result
);
141 ok( hr
== S_OK
, "query %u failed: %08x\n", i
, hr
);
142 if (result
) IEnumWbemClassObject_Release( result
);
145 SysFreeString( wql
);
146 SysFreeString( sql
);
147 SysFreeString( query
);
150 static void test_associators( IWbemServices
*services
)
152 static const WCHAR query1
[] =
153 {'A','S','S','O','C','I','A','T','O','R','S',' ','O','F',' ','{','W','i','n','3','2','_',
154 'L','o','g','i','c','a','l','D','i','s','k','.','D','e','v','i','c','e','I','D','=','"','C',':','"','}',0};
155 static const WCHAR query2
[] =
156 {'A','S','S','O','C','I','A','T','O','R','S',' ','O','F',' ','{','W','i','n','3','2','_',
157 'L','o','g','i','c','a','l','D','i','s','k','.','D','e','v','i','c','e','I','D','=','"','C',':','"','}',' ',
158 'W','H','E','R','E',' ','A','s','s','o','c','C','l','a','s','s',' ','=',' ','W','i','n','3','2','_',
159 'L','o','g','i','c','a','l','D','i','s','k','T','o','P','a','r','t','i','t','i','o','n',0};
160 static const WCHAR
*test
[] = { query1
, query2
};
162 IEnumWbemClassObject
*result
;
165 for (i
= 0; i
< sizeof(test
)/sizeof(test
[0]); i
++)
167 hr
= exec_query( services
, test
[i
], &result
);
168 todo_wine
ok( hr
== S_OK
, "query %u failed: %08x\n", i
, hr
);
169 if (result
) IEnumWbemClassObject_Release( result
);
173 static void test_Win32_Service( IWbemServices
*services
)
175 static const WCHAR returnvalueW
[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
176 static const WCHAR pauseserviceW
[] = {'P','a','u','s','e','S','e','r','v','i','c','e',0};
177 static const WCHAR resumeserviceW
[] = {'R','e','s','u','m','e','S','e','r','v','i','c','e',0};
178 static const WCHAR startserviceW
[] = {'S','t','a','r','t','S','e','r','v','i','c','e',0};
179 static const WCHAR stopserviceW
[] = {'S','t','o','p','S','e','r','v','i','c','e',0};
180 static const WCHAR stateW
[] = {'S','t','a','t','e',0};
181 static const WCHAR stoppedW
[] = {'S','t','o','p','p','e','d',0};
182 static const WCHAR serviceW
[] = {'W','i','n','3','2','_','S','e','r','v','i','c','e','.',
183 'N','a','m','e','=','"','S','p','o','o','l','e','r','"',0};
184 static const WCHAR emptyW
[] = {0};
185 BSTR
class = SysAllocString( serviceW
), empty
= SysAllocString( emptyW
), method
;
186 IWbemClassObject
*service
, *out
;
187 VARIANT state
, retval
;
191 hr
= IWbemServices_GetObject( services
, class, 0, NULL
, &service
, NULL
);
194 win_skip( "Win32_Service not available\n" );
198 VariantInit( &state
);
199 hr
= IWbemClassObject_Get( service
, stateW
, 0, &state
, &type
, NULL
);
200 ok( hr
== S_OK
, "failed to get service state %08x\n", hr
);
201 ok( V_VT( &state
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &state
) );
202 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
204 if (!lstrcmpW( V_BSTR( &state
), stoppedW
))
207 method
= SysAllocString( startserviceW
);
208 hr
= IWbemServices_ExecMethod( services
, class, method
, 0, NULL
, NULL
, &out
, NULL
);
209 ok( hr
== S_OK
, "failed to execute method %08x\n", hr
);
210 SysFreeString( method
);
212 VariantInit( &retval
);
213 hr
= IWbemClassObject_Get( out
, returnvalueW
, 0, &retval
, NULL
, NULL
);
214 ok( hr
== S_OK
, "failed to get return value %08x\n", hr
);
215 ok( !V_I4( &retval
), "unexpected error %u\n", V_UI4( &retval
) );
216 IWbemClassObject_Release( out
);
219 method
= SysAllocString( pauseserviceW
);
220 hr
= IWbemServices_ExecMethod( services
, class, method
, 0, NULL
, NULL
, &out
, NULL
);
221 ok( hr
== S_OK
, "failed to execute method %08x\n", hr
);
222 SysFreeString( method
);
224 VariantInit( &retval
);
225 hr
= IWbemClassObject_Get( out
, returnvalueW
, 0, &retval
, NULL
, NULL
);
226 ok( hr
== S_OK
, "failed to get return value %08x\n", hr
);
227 ok( V_I4( &retval
), "unexpected success\n" );
228 IWbemClassObject_Release( out
);
231 method
= SysAllocString( resumeserviceW
);
232 hr
= IWbemServices_ExecMethod( services
, class, method
, 0, NULL
, NULL
, &out
, NULL
);
233 ok( hr
== S_OK
, "failed to execute method %08x\n", hr
);
234 SysFreeString( method
);
236 VariantInit( &retval
);
237 hr
= IWbemClassObject_Get( out
, returnvalueW
, 0, &retval
, NULL
, NULL
);
238 ok( hr
== S_OK
, "failed to get return value %08x\n", hr
);
239 ok( V_I4( &retval
), "unexpected success\n" );
240 IWbemClassObject_Release( out
);
242 if (!lstrcmpW( V_BSTR( &state
), stoppedW
))
245 method
= SysAllocString( stopserviceW
);
246 hr
= IWbemServices_ExecMethod( services
, class, method
, 0, NULL
, NULL
, &out
, NULL
);
247 ok( hr
== S_OK
, "failed to execute method %08x\n", hr
);
248 SysFreeString( method
);
250 VariantInit( &retval
);
251 hr
= IWbemClassObject_Get( out
, returnvalueW
, 0, &retval
, NULL
, NULL
);
252 ok( hr
== S_OK
, "failed to get return value %08x\n", hr
);
253 ok( !V_I4( &retval
), "unexpected error %u\n", V_UI4( &retval
) );
254 IWbemClassObject_Release( out
);
256 VariantClear( &state
);
257 IWbemClassObject_Release( service
);
260 hr
= IWbemServices_GetObject( services
, NULL
, 0, NULL
, &service
, NULL
);
261 ok( hr
== S_OK
, "got %08x\n", hr
);
262 if (service
) IWbemClassObject_Release( service
);
265 hr
= IWbemServices_GetObject( services
, empty
, 0, NULL
, &service
, NULL
);
266 ok( hr
== S_OK
, "got %08x\n", hr
);
267 if (service
) IWbemClassObject_Release( service
);
270 SysFreeString( empty
);
271 SysFreeString( class );
274 static void test_Win32_Bios( IWbemServices
*services
)
276 static const WCHAR queryW
[] =
277 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_', 'B','i','o','s',0};
278 static const WCHAR descriptionW
[] = {'D','e','s','c','r','i','p','t','i','o','n',0};
279 static const WCHAR identificationcodeW
[] = {'I','d','e','n','t','i','f','i','c','a','t','i','o','n','C','o','d','e',0};
280 static const WCHAR manufacturerW
[] = {'M','a','n','u','f','a','c','t','u','r','e','r',0};
281 static const WCHAR nameW
[] = {'N','a','m','e',0};
282 static const WCHAR releasedateW
[] = {'R','e','l','e','a','s','e','D','a','t','e',0};
283 static const WCHAR serialnumberW
[] = {'S','e','r','i','a','l','N','u','m','b','e','r',0};
284 static const WCHAR smbiosbiosversionW
[] = {'S','M','B','I','O','S','B','I','O','S','V','e','r','s','i','o','n',0};
285 static const WCHAR versionW
[] = {'V','e','r','s','i','o','n',0};
286 BSTR wql
= SysAllocString( wqlW
), query
= SysAllocString( queryW
);
287 IEnumWbemClassObject
*result
;
288 IWbemClassObject
*obj
;
294 hr
= IWbemServices_ExecQuery( services
, wql
, query
, 0, NULL
, &result
);
295 ok( hr
== S_OK
, "IWbemServices_ExecQuery failed %08x\n", hr
);
297 hr
= IEnumWbemClassObject_Next( result
, 10000, 1, &obj
, &count
);
298 ok( hr
== S_OK
, "IEnumWbemClassObject_Next failed %08x\n", hr
);
302 hr
= IWbemClassObject_Get( obj
, descriptionW
, 0, &val
, &type
, NULL
);
303 ok( hr
== S_OK
, "failed to get description %08x\n", hr
);
304 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
305 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
306 trace( "description: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
307 VariantClear( &val
);
311 hr
= IWbemClassObject_Get( obj
, identificationcodeW
, 0, &val
, &type
, NULL
);
312 ok( hr
== S_OK
, "failed to get identication code %08x\n", hr
);
313 ok( V_VT( &val
) == VT_NULL
, "unexpected variant type 0x%x\n", V_VT( &val
) );
314 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
315 VariantClear( &val
);
319 hr
= IWbemClassObject_Get( obj
, manufacturerW
, 0, &val
, &type
, NULL
);
320 ok( hr
== S_OK
, "failed to get manufacturer %08x\n", hr
);
321 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
322 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
323 trace( "manufacturer: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
324 VariantClear( &val
);
328 hr
= IWbemClassObject_Get( obj
, nameW
, 0, &val
, &type
, NULL
);
329 ok( hr
== S_OK
, "failed to get name %08x\n", hr
);
330 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
331 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
332 trace( "name: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
333 VariantClear( &val
);
337 hr
= IWbemClassObject_Get( obj
, releasedateW
, 0, &val
, &type
, NULL
);
338 ok( hr
== S_OK
, "failed to get release date %08x\n", hr
);
339 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
340 ok( type
== CIM_DATETIME
, "unexpected type 0x%x\n", type
);
341 trace( "release date: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
342 VariantClear( &val
);
346 hr
= IWbemClassObject_Get( obj
, serialnumberW
, 0, &val
, &type
, NULL
);
347 ok( hr
== S_OK
, "failed to get serial number %08x\n", hr
);
348 ok( V_VT( &val
) == VT_BSTR
|| V_VT( &val
) == VT_NULL
/* Testbot VMs */,
349 "unexpected variant type 0x%x\n", V_VT( &val
) );
350 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
351 VariantClear( &val
);
355 hr
= IWbemClassObject_Get( obj
, smbiosbiosversionW
, 0, &val
, &type
, NULL
);
356 ok( hr
== S_OK
, "failed to get bios version %08x\n", hr
);
357 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
358 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
359 trace( "bios version: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
360 VariantClear( &val
);
364 hr
= IWbemClassObject_Get( obj
, versionW
, 0, &val
, &type
, NULL
);
365 ok( hr
== S_OK
, "failed to get version %08x\n", hr
);
366 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
367 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
368 trace( "version: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
369 VariantClear( &val
);
371 IWbemClassObject_Release( obj
);
372 IEnumWbemClassObject_Release( result
);
373 SysFreeString( query
);
374 SysFreeString( wql
);
377 static void test_Win32_Process( IWbemServices
*services
)
379 static const WCHAR returnvalueW
[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
380 static const WCHAR getownerW
[] = {'G','e','t','O','w','n','e','r',0};
381 static const WCHAR userW
[] = {'U','s','e','r',0};
382 static const WCHAR domainW
[] = {'D','o','m','a','i','n',0};
383 static const WCHAR processW
[] = {'W','i','n','3','2','_','P','r','o','c','e','s','s',0};
384 static const WCHAR idW
[] = {'I','D',0};
385 static const WCHAR fmtW
[] = {'W','i','n','3','2','_','P','r','o','c','e','s','s','.',
386 'H','a','n','d','l','e','=','"','%','u','"',0};
387 static const LONG expected_flavor
= WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE
|
388 WBEM_FLAVOR_NOT_OVERRIDABLE
|
389 WBEM_FLAVOR_ORIGIN_PROPAGATED
;
391 IWbemClassObject
*process
, *out
;
392 IWbemQualifierSet
*qualifiers
;
393 VARIANT user
, domain
, retval
, val
;
398 class = SysAllocString( processW
);
399 hr
= IWbemServices_GetObject( services
, class, 0, NULL
, &process
, NULL
);
400 SysFreeString( class );
403 win_skip( "Win32_Process not available\n" );
406 hr
= IWbemClassObject_GetMethod( process
, getownerW
, 0, NULL
, NULL
);
407 ok( hr
== S_OK
, "failed to get GetOwner method %08x\n", hr
);
408 IWbemClassObject_Release( process
);
411 method
= SysAllocString( getownerW
);
412 class = SysAllocStringLen( NULL
, sizeof(fmtW
)/sizeof(fmtW
[0]) + 10 );
413 wsprintfW( class, fmtW
, GetCurrentProcessId() );
414 hr
= IWbemServices_ExecMethod( services
, class, method
, 0, NULL
, NULL
, &out
, NULL
);
415 ok( hr
== S_OK
, "failed to execute method %08x\n", hr
);
416 SysFreeString( method
);
417 SysFreeString( class );
420 VariantInit( &retval
);
421 hr
= IWbemClassObject_Get( out
, returnvalueW
, 0, &retval
, &type
, NULL
);
422 ok( hr
== S_OK
, "failed to get return value %08x\n", hr
);
423 ok( V_VT( &retval
) == VT_I4
, "unexpected variant type 0x%x\n", V_VT( &retval
) );
424 ok( !V_I4( &retval
), "unexpected error %u\n", V_I4( &retval
) );
425 ok( type
== CIM_UINT32
, "unexpected type 0x%x\n", type
);
428 VariantInit( &user
);
429 hr
= IWbemClassObject_Get( out
, userW
, 0, &user
, &type
, NULL
);
430 ok( hr
== S_OK
, "failed to get user %08x\n", hr
);
431 ok( V_VT( &user
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &user
) );
432 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
433 trace("%s\n", wine_dbgstr_w(V_BSTR(&user
)));
436 VariantInit( &domain
);
437 hr
= IWbemClassObject_Get( out
, domainW
, 0, &domain
, &type
, NULL
);
438 ok( hr
== S_OK
, "failed to get domain %08x\n", hr
);
439 ok( V_VT( &domain
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &domain
) );
440 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
441 trace("%s\n", wine_dbgstr_w(V_BSTR(&domain
)));
443 hr
= IWbemClassObject_GetPropertyQualifierSet( out
, userW
, &qualifiers
);
444 ok( hr
== S_OK
, "failed to get qualifier set %08x\n", hr
);
448 V_VT(&val
) = VT_ERROR
;
449 hr
= IWbemQualifierSet_Get( qualifiers
, idW
, 0, &val
, &flavor
);
450 ok( hr
== S_OK
, "got %08x\n", hr
);
451 ok( flavor
== expected_flavor
, "got %d\n", flavor
);
452 ok( V_VT(&val
) == VT_I4
, "got %u\n", V_VT(&val
) );
453 ok( V_I4(&val
) == 0, "got %u\n", V_I4(&val
) );
454 VariantClear( &val
);
456 IWbemQualifierSet_Release( qualifiers
);
457 hr
= IWbemClassObject_GetPropertyQualifierSet( out
, domainW
, &qualifiers
);
458 ok( hr
== S_OK
, "failed to get qualifier set %08x\n", hr
);
462 V_VT(&val
) = VT_ERROR
;
463 hr
= IWbemQualifierSet_Get( qualifiers
, idW
, 0, &val
, &flavor
);
464 ok( hr
== S_OK
, "got %08x\n", hr
);
465 ok( flavor
== expected_flavor
, "got %d\n", flavor
);
466 ok( V_VT(&val
) == VT_I4
, "got %u\n", V_VT(&val
) );
467 ok( V_I4(&val
) == 1, "got %u\n", V_I4(&val
) );
468 VariantClear( &val
);
470 IWbemQualifierSet_Release( qualifiers
);
471 hr
= IWbemClassObject_GetPropertyQualifierSet( out
, returnvalueW
, &qualifiers
);
472 ok( hr
== S_OK
, "failed to get qualifier set %08x\n", hr
);
474 hr
= IWbemQualifierSet_Get( qualifiers
, idW
, 0, &val
, &flavor
);
475 ok( hr
== WBEM_E_NOT_FOUND
, "got %08x\n", hr
);
477 IWbemQualifierSet_Release( qualifiers
);
478 VariantClear( &user
);
479 VariantClear( &domain
);
480 IWbemClassObject_Release( out
);
483 static void test_Win32_ComputerSystem( IWbemServices
*services
)
485 static const WCHAR backslashW
[] = {'\\',0};
486 static const WCHAR memorytypeW
[] = {'M','e','m','o','r','y','T','y','p','e',0};
487 static const WCHAR modelW
[] = {'M','o','d','e','l',0};
488 static const WCHAR nameW
[] = {'N','a','m','e',0};
489 static const WCHAR usernameW
[] = {'U','s','e','r','N','a','m','e',0};
490 static const WCHAR queryW
[] =
491 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
492 'C','o','m','p','u','t','e','r','S','y','s','t','e','m',0};
493 BSTR wql
= SysAllocString( wqlW
), query
= SysAllocString( queryW
);
494 IEnumWbemClassObject
*result
;
495 IWbemClassObject
*service
;
499 WCHAR compname
[MAX_COMPUTERNAME_LENGTH
+ 1];
503 len
= sizeof(compname
) / sizeof(compname
[0]);
504 if (!GetComputerNameW( compname
, &len
))
507 lstrcpyW( username
, compname
);
508 lstrcatW( username
, backslashW
);
509 len
= sizeof(username
) / sizeof(username
[0]) - lstrlenW( username
);
510 if (!GetUserNameW( username
+ lstrlenW( username
), &len
))
513 if (!compname
[0] || !username
[0])
515 skip( "Failed to get user or computer name\n" );
519 hr
= IWbemServices_ExecQuery( services
, wql
, query
, 0, NULL
, &result
);
522 win_skip( "Win32_ComputerSystem not available\n" );
526 hr
= IEnumWbemClassObject_Next( result
, 10000, 1, &service
, &count
);
527 ok( hr
== S_OK
, "got %08x\n", hr
);
530 VariantInit( &value
);
531 hr
= IWbemClassObject_Get( service
, memorytypeW
, 0, &value
, &type
, NULL
);
532 ok( hr
== WBEM_E_NOT_FOUND
, "got %08x\n", hr
);
535 VariantInit( &value
);
536 hr
= IWbemClassObject_Get( service
, modelW
, 0, &value
, &type
, NULL
);
537 ok( hr
== S_OK
, "failed to get model %08x\n", hr
);
538 ok( V_VT( &value
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &value
) );
539 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
540 trace( "model: %s\n", wine_dbgstr_w(V_BSTR( &value
)) );
541 VariantClear( &value
);
544 VariantInit( &value
);
545 hr
= IWbemClassObject_Get( service
, nameW
, 0, &value
, &type
, NULL
);
546 ok( hr
== S_OK
, "failed to get computer name %08x\n", hr
);
547 ok( V_VT( &value
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &value
) );
548 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
549 ok( !lstrcmpiW( V_BSTR( &value
), compname
), "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value
)), wine_dbgstr_w(compname
) );
550 VariantClear( &value
);
553 VariantInit( &value
);
554 hr
= IWbemClassObject_Get( service
, usernameW
, 0, &value
, &type
, NULL
);
555 ok( hr
== S_OK
, "failed to get computer name %08x\n", hr
);
556 ok( V_VT( &value
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &value
) );
557 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
558 ok( !lstrcmpiW( V_BSTR( &value
), username
), "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value
)), wine_dbgstr_w(username
) );
559 VariantClear( &value
);
561 IWbemClassObject_Release( service
);
562 IEnumWbemClassObject_Release( result
);
564 SysFreeString( query
);
565 SysFreeString( wql
);
568 static void test_Win32_SystemEnclosure( IWbemServices
*services
)
570 static const WCHAR queryW
[] =
571 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
572 'S','y','s','t','e','m','E','n','c','l','o','s','u','r','e',0};
573 static const WCHAR captionW
[] = {'C','a','p','t','i','o','n',0};
574 static const WCHAR chassistypesW
[] = {'C','h','a','s','s','i','s','T','y','p','e','s',0};
575 static const WCHAR descriptionW
[] = {'D','e','s','c','r','i','p','t','i','o','n',0};
576 static const WCHAR lockpresentW
[] = {'L','o','c','k','P','r','e','s','e','n','t',0};
577 static const WCHAR manufacturerW
[] = {'M','a','n','u','f','a','c','t','u','r','e','r',0};
578 static const WCHAR nameW
[] = {'N','a','m','e',0};
579 static const WCHAR tagW
[] = {'T','a','g',0};
580 BSTR wql
= SysAllocString( wqlW
), query
= SysAllocString( queryW
);
581 IEnumWbemClassObject
*result
;
582 IWbemClassObject
*obj
;
589 hr
= IWbemServices_ExecQuery( services
, wql
, query
, 0, NULL
, &result
);
590 ok( hr
== S_OK
, "IWbemServices_ExecQuery failed %08x\n", hr
);
592 hr
= IEnumWbemClassObject_Next( result
, 10000, 1, &obj
, &count
);
593 ok( hr
== S_OK
, "IEnumWbemClassObject_Next failed %08x\n", hr
);
597 hr
= IWbemClassObject_Get( obj
, captionW
, 0, &val
, &type
, NULL
);
598 ok( hr
== S_OK
, "failed to get caption %08x\n", hr
);
599 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
600 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
601 trace( "caption: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
602 VariantClear( &val
);
606 hr
= IWbemClassObject_Get( obj
, chassistypesW
, 0, &val
, &type
, NULL
);
607 ok( hr
== S_OK
, "failed to get chassis types %08x\n", hr
);
608 ok( V_VT( &val
) == (VT_I4
|VT_ARRAY
), "unexpected variant type 0x%x\n", V_VT( &val
) );
609 ok( type
== (CIM_UINT16
|CIM_FLAG_ARRAY
), "unexpected type 0x%x\n", type
);
610 hr
= SafeArrayAccessData( V_ARRAY( &val
), (void **)&data
);
611 ok( hr
== S_OK
, "SafeArrayAccessData failed %x\n", hr
);
614 LONG i
, lower
, upper
;
616 hr
= SafeArrayGetLBound( V_ARRAY( &val
), 1, &lower
);
617 ok( hr
== S_OK
, "SafeArrayGetLBound failed %x\n", hr
);
618 hr
= SafeArrayGetUBound( V_ARRAY( &val
), 1, &upper
);
619 ok( hr
== S_OK
, "SafeArrayGetUBound failed %x\n", hr
);
620 if (V_VT( &val
) == (VT_I4
|VT_ARRAY
))
622 for (i
= 0; i
< upper
- lower
+ 1; i
++)
623 trace( "chassis type: %u\n", data
[i
] );
625 hr
= SafeArrayUnaccessData( V_ARRAY( &val
) );
626 ok( hr
== S_OK
, "SafeArrayUnaccessData failed %x\n", hr
);
628 VariantClear( &val
);
632 hr
= IWbemClassObject_Get( obj
, descriptionW
, 0, &val
, &type
, NULL
);
633 ok( hr
== S_OK
, "failed to get description %08x\n", hr
);
634 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
635 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
636 trace( "description: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
637 VariantClear( &val
);
641 hr
= IWbemClassObject_Get( obj
, lockpresentW
, 0, &val
, &type
, NULL
);
642 ok( hr
== S_OK
, "failed to get lockpresent %08x\n", hr
);
643 ok( V_VT( &val
) == VT_BOOL
, "unexpected variant type 0x%x\n", V_VT( &val
) );
644 ok( type
== CIM_BOOLEAN
, "unexpected type 0x%x\n", type
);
645 trace( "lockpresent: %u\n", V_BOOL( &val
) );
646 VariantClear( &val
);
650 hr
= IWbemClassObject_Get( obj
, manufacturerW
, 0, &val
, &type
, NULL
);
651 ok( hr
== S_OK
, "failed to get manufacturer %08x\n", hr
);
652 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
653 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
654 trace( "manufacturer: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
655 VariantClear( &val
);
659 hr
= IWbemClassObject_Get( obj
, nameW
, 0, &val
, &type
, NULL
);
660 ok( hr
== S_OK
, "failed to get name %08x\n", hr
);
661 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
662 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
663 trace( "name: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
664 VariantClear( &val
);
668 hr
= IWbemClassObject_Get( obj
, tagW
, 0, &val
, &type
, NULL
);
669 ok( hr
== S_OK
, "failed to get tag %08x\n", hr
);
670 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
671 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
672 trace( "tag: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
673 VariantClear( &val
);
675 IWbemClassObject_Release( obj
);
676 IEnumWbemClassObject_Release( result
);
677 SysFreeString( query
);
678 SysFreeString( wql
);
681 static void test_StdRegProv( IWbemServices
*services
)
683 static const WCHAR enumkeyW
[] = {'E','n','u','m','K','e','y',0};
684 static const WCHAR enumvaluesW
[] = {'E','n','u','m','V','a','l','u','e','s',0};
685 static const WCHAR getstringvalueW
[] = {'G','e','t','S','t','r','i','n','g','V','a','l','u','e',0};
686 static const WCHAR stdregprovW
[] = {'S','t','d','R','e','g','P','r','o','v',0};
687 static const WCHAR defkeyW
[] = {'h','D','e','f','K','e','y',0};
688 static const WCHAR subkeynameW
[] = {'s','S','u','b','K','e','y','N','a','m','e',0};
689 static const WCHAR returnvalueW
[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
690 static const WCHAR namesW
[] = {'s','N','a','m','e','s',0};
691 static const WCHAR typesW
[] = {'T','y','p','e','s',0};
692 static const WCHAR valueW
[] = {'s','V','a','l','u','e',0};
693 static const WCHAR valuenameW
[] = {'s','V','a','l','u','e','N','a','m','e',0};
694 static const WCHAR programfilesW
[] = {'P','r','o','g','r','a','m','F','i','l','e','s','D','i','r',0};
695 static const WCHAR windowsW
[] =
696 {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
697 'W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n',0};
698 BSTR
class = SysAllocString( stdregprovW
), method
;
699 IWbemClassObject
*reg
, *sig_in
, *in
, *out
;
700 VARIANT defkey
, subkey
, retval
, names
, types
, value
, valuename
;
704 hr
= IWbemServices_GetObject( services
, class, 0, NULL
, ®
, NULL
);
707 win_skip( "StdRegProv not available\n" );
710 hr
= IWbemClassObject_GetMethod( reg
, enumkeyW
, 0, &sig_in
, NULL
);
711 ok( hr
== S_OK
, "failed to get EnumKey method %08x\n", hr
);
713 hr
= IWbemClassObject_SpawnInstance( sig_in
, 0, &in
);
714 ok( hr
== S_OK
, "failed to spawn instance %08x\n", hr
);
716 V_VT( &defkey
) = VT_I4
;
717 V_I4( &defkey
) = 0x80000002;
718 hr
= IWbemClassObject_Put( in
, defkeyW
, 0, &defkey
, 0 );
719 ok( hr
== S_OK
, "failed to set root %08x\n", hr
);
721 V_VT( &subkey
) = VT_BSTR
;
722 V_BSTR( &subkey
) = SysAllocString( windowsW
);
723 hr
= IWbemClassObject_Put( in
, subkeynameW
, 0, &subkey
, 0 );
724 ok( hr
== S_OK
, "failed to set subkey %08x\n", hr
);
727 method
= SysAllocString( enumkeyW
);
728 hr
= IWbemServices_ExecMethod( services
, class, method
, 0, NULL
, in
, &out
, NULL
);
729 ok( hr
== S_OK
, "failed to execute method %08x\n", hr
);
730 SysFreeString( method
);
733 VariantInit( &retval
);
734 hr
= IWbemClassObject_Get( out
, returnvalueW
, 0, &retval
, &type
, NULL
);
735 ok( hr
== S_OK
, "failed to get return value %08x\n", hr
);
736 ok( V_VT( &retval
) == VT_I4
, "unexpected variant type 0x%x\n", V_VT( &retval
) );
737 ok( !V_I4( &retval
), "unexpected error %u\n", V_UI4( &retval
) );
738 ok( type
== CIM_UINT32
, "unexpected type 0x%x\n", type
);
741 VariantInit( &names
);
742 hr
= IWbemClassObject_Get( out
, namesW
, 0, &names
, &type
, NULL
);
743 ok( hr
== S_OK
, "failed to get names %08x\n", hr
);
744 ok( V_VT( &names
) == (VT_BSTR
|VT_ARRAY
), "unexpected variant type 0x%x\n", V_VT( &names
) );
745 ok( type
== (CIM_STRING
|CIM_FLAG_ARRAY
), "unexpected type 0x%x\n", type
);
747 VariantClear( &names
);
748 VariantClear( &subkey
);
749 IWbemClassObject_Release( in
);
750 IWbemClassObject_Release( out
);
751 IWbemClassObject_Release( sig_in
);
753 hr
= IWbemClassObject_GetMethod( reg
, enumvaluesW
, 0, &sig_in
, NULL
);
754 ok( hr
== S_OK
, "failed to get EnumValues method %08x\n", hr
);
756 hr
= IWbemClassObject_SpawnInstance( sig_in
, 0, &in
);
757 ok( hr
== S_OK
, "failed to spawn instance %08x\n", hr
);
759 V_VT( &defkey
) = VT_I4
;
760 V_I4( &defkey
) = 0x80000002;
761 hr
= IWbemClassObject_Put( in
, defkeyW
, 0, &defkey
, 0 );
762 ok( hr
== S_OK
, "failed to set root %08x\n", hr
);
764 V_VT( &subkey
) = VT_BSTR
;
765 V_BSTR( &subkey
) = SysAllocString( windowsW
);
766 hr
= IWbemClassObject_Put( in
, subkeynameW
, 0, &subkey
, 0 );
767 ok( hr
== S_OK
, "failed to set subkey %08x\n", hr
);
770 method
= SysAllocString( enumvaluesW
);
771 hr
= IWbemServices_ExecMethod( services
, class, method
, 0, NULL
, in
, &out
, NULL
);
772 ok( hr
== S_OK
, "failed to execute method %08x\n", hr
);
773 SysFreeString( method
);
776 VariantInit( &retval
);
777 hr
= IWbemClassObject_Get( out
, returnvalueW
, 0, &retval
, &type
, NULL
);
778 ok( hr
== S_OK
, "failed to get return value %08x\n", hr
);
779 ok( V_VT( &retval
) == VT_I4
, "unexpected variant type 0x%x\n", V_VT( &retval
) );
780 ok( !V_I4( &retval
), "unexpected error %u\n", V_I4( &retval
) );
781 ok( type
== CIM_UINT32
, "unexpected type 0x%x\n", type
);
784 VariantInit( &names
);
785 hr
= IWbemClassObject_Get( out
, namesW
, 0, &names
, &type
, NULL
);
786 ok( hr
== S_OK
, "failed to get names %08x\n", hr
);
787 ok( V_VT( &names
) == (VT_BSTR
|VT_ARRAY
), "unexpected variant type 0x%x\n", V_VT( &names
) );
788 ok( type
== (CIM_STRING
|CIM_FLAG_ARRAY
), "unexpected type 0x%x\n", type
);
791 VariantInit( &types
);
792 hr
= IWbemClassObject_Get( out
, typesW
, 0, &types
, &type
, NULL
);
793 ok( hr
== S_OK
, "failed to get names %08x\n", hr
);
794 ok( V_VT( &types
) == (VT_I4
|VT_ARRAY
), "unexpected variant type 0x%x\n", V_VT( &types
) );
795 ok( type
== (CIM_SINT32
|CIM_FLAG_ARRAY
), "unexpected type 0x%x\n", type
);
797 VariantClear( &types
);
798 VariantClear( &names
);
799 VariantClear( &subkey
);
800 IWbemClassObject_Release( in
);
801 IWbemClassObject_Release( out
);
802 IWbemClassObject_Release( sig_in
);
804 hr
= IWbemClassObject_GetMethod( reg
, getstringvalueW
, 0, &sig_in
, NULL
);
805 ok( hr
== S_OK
, "failed to get GetStringValue method %08x\n", hr
);
807 hr
= IWbemClassObject_SpawnInstance( sig_in
, 0, &in
);
808 ok( hr
== S_OK
, "failed to spawn instance %08x\n", hr
);
810 V_VT( &defkey
) = VT_I4
;
811 V_I4( &defkey
) = 0x80000002;
812 hr
= IWbemClassObject_Put( in
, defkeyW
, 0, &defkey
, 0 );
813 ok( hr
== S_OK
, "failed to set root %08x\n", hr
);
815 V_VT( &subkey
) = VT_BSTR
;
816 V_BSTR( &subkey
) = SysAllocString( windowsW
);
817 hr
= IWbemClassObject_Put( in
, subkeynameW
, 0, &subkey
, 0 );
818 ok( hr
== S_OK
, "failed to set subkey %08x\n", hr
);
820 V_VT( &valuename
) = VT_BSTR
;
821 V_BSTR( &valuename
) = SysAllocString( programfilesW
);
822 hr
= IWbemClassObject_Put( in
, valuenameW
, 0, &valuename
, 0 );
823 ok( hr
== S_OK
, "failed to set value name %08x\n", hr
);
826 method
= SysAllocString( getstringvalueW
);
827 hr
= IWbemServices_ExecMethod( services
, class, method
, 0, NULL
, in
, &out
, NULL
);
828 ok( hr
== S_OK
, "failed to execute method %08x\n", hr
);
829 SysFreeString( method
);
832 VariantInit( &retval
);
833 hr
= IWbemClassObject_Get( out
, returnvalueW
, 0, &retval
, &type
, NULL
);
834 ok( hr
== S_OK
, "failed to get return value %08x\n", hr
);
835 ok( V_VT( &retval
) == VT_I4
, "unexpected variant type 0x%x\n", V_VT( &retval
) );
836 ok( !V_I4( &retval
), "unexpected error %u\n", V_I4( &retval
) );
837 ok( type
== CIM_UINT32
, "unexpected type 0x%x\n", type
);
840 VariantInit( &value
);
841 hr
= IWbemClassObject_Get( out
, valueW
, 0, &value
, &type
, NULL
);
842 ok( hr
== S_OK
, "failed to get value %08x\n", hr
);
843 ok( V_VT( &value
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &value
) );
844 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
846 VariantClear( &value
);
847 VariantClear( &valuename
);
848 VariantClear( &subkey
);
849 IWbemClassObject_Release( in
);
850 IWbemClassObject_Release( out
);
851 IWbemClassObject_Release( sig_in
);
853 IWbemClassObject_Release( reg
);
854 SysFreeString( class );
857 static HRESULT WINAPI
sink_QueryInterface(
858 IWbemObjectSink
*iface
, REFIID riid
, void **ppv
)
861 if (IsEqualGUID( &IID_IUnknown
, riid
) || IsEqualGUID( &IID_IWbemObjectSink
, riid
))
864 IWbemObjectSink_AddRef( iface
);
867 return E_NOINTERFACE
;
870 static ULONG sink_refs
;
872 static ULONG WINAPI
sink_AddRef(
873 IWbemObjectSink
*iface
)
878 static ULONG WINAPI
sink_Release(
879 IWbemObjectSink
*iface
)
884 static HRESULT WINAPI
sink_Indicate(
885 IWbemObjectSink
*iface
, LONG count
, IWbemClassObject
**objects
)
887 trace("Indicate: %d, %p\n", count
, objects
);
891 static HRESULT WINAPI
sink_SetStatus(
892 IWbemObjectSink
*iface
, LONG flags
, HRESULT hresult
, BSTR str_param
, IWbemClassObject
*obj_param
)
894 trace("SetStatus: %08x, %08x, %s, %p\n", flags
, hresult
, wine_dbgstr_w(str_param
), obj_param
);
898 static IWbemObjectSinkVtbl sink_vtbl
=
907 static IWbemObjectSink sink
= { &sink_vtbl
};
909 static void test_notification_query_async( IWbemServices
*services
)
911 static const WCHAR queryW
[] =
912 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
913 'D','e','v','i','c','e','C','h','a','n','g','e','E','v','e','n','t',0};
914 BSTR wql
= SysAllocString( wqlW
), query
= SysAllocString( queryW
);
915 ULONG prev_sink_refs
;
918 hr
= IWbemServices_ExecNotificationQueryAsync( services
, wql
, query
, 0, NULL
, NULL
);
919 ok( hr
== WBEM_E_INVALID_PARAMETER
, "got %08x\n", hr
);
921 prev_sink_refs
= sink_refs
;
922 hr
= IWbemServices_ExecNotificationQueryAsync( services
, wql
, query
, 0, NULL
, &sink
);
923 ok( hr
== S_OK
|| broken(hr
== WBEM_E_NOT_FOUND
), "got %08x\n", hr
);
924 ok( sink_refs
> prev_sink_refs
|| broken(!sink_refs
), "got %u refs\n", sink_refs
);
926 hr
= IWbemServices_CancelAsyncCall( services
, &sink
);
927 ok( hr
== S_OK
|| broken(hr
== WBEM_E_NOT_FOUND
), "got %08x\n", hr
);
929 SysFreeString( wql
);
930 SysFreeString( query
);
933 static void test_query_async( IWbemServices
*services
)
935 static const WCHAR queryW
[] =
936 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
937 'P','r','o','c','e','s','s',0};
938 BSTR wql
= SysAllocString( wqlW
), query
= SysAllocString( queryW
);
941 hr
= IWbemServices_ExecQueryAsync( services
, wql
, query
, 0, NULL
, NULL
);
942 ok( hr
== WBEM_E_INVALID_PARAMETER
, "got %08x\n", hr
);
944 hr
= IWbemServices_ExecQueryAsync( services
, wql
, query
, 0, NULL
, &sink
);
945 ok( hr
== S_OK
|| broken(hr
== WBEM_E_NOT_FOUND
), "got %08x\n", hr
);
947 hr
= IWbemServices_CancelAsyncCall( services
, NULL
);
948 ok( hr
== WBEM_E_INVALID_PARAMETER
, "got %08x\n", hr
);
950 hr
= IWbemServices_CancelAsyncCall( services
, &sink
);
951 ok( hr
== S_OK
, "got %08x\n", hr
);
953 SysFreeString( wql
);
954 SysFreeString( query
);
957 static void test_GetNames( IWbemServices
*services
)
959 static const WCHAR queryW
[] =
960 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
961 'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
962 BSTR wql
= SysAllocString( wqlW
), query
= SysAllocString( queryW
);
963 IEnumWbemClassObject
*result
;
966 hr
= IWbemServices_ExecQuery( services
, wql
, query
, 0, NULL
, &result
);
967 ok( hr
== S_OK
, "got %08x\n", hr
);
971 IWbemClassObject
*obj
;
976 IEnumWbemClassObject_Next( result
, 10000, 1, &obj
, &count
);
980 hr
= IWbemClassObject_GetNames( obj
, NULL
, WBEM_FLAG_NONSYSTEM_ONLY
, &val
, &names
);
981 ok( hr
== S_OK
, "got %08x\n", hr
);
983 SafeArrayDestroy( names
);
984 IWbemClassObject_Release( obj
);
986 IEnumWbemClassObject_Release( result
);
987 SysFreeString( query
);
988 SysFreeString( wql
);
991 static void test_SystemSecurity( IWbemServices
*services
)
993 static const WCHAR systemsecurityW
[] = {'_','_','S','y','s','t','e','m','S','e','c','u','r','i','t','y',0};
994 static const WCHAR getsdW
[] = {'G','e','t','S','D',0};
995 static const WCHAR returnvalueW
[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
996 static const WCHAR sdW
[] = {'S','D',0};
997 BSTR
class = SysAllocString( systemsecurityW
), method
;
998 IWbemClassObject
*reg
, *out
;
999 VARIANT retval
, var_sd
;
1001 SECURITY_DESCRIPTOR_RELATIVE
*sd
;
1004 BYTE sid_admin_buffer
[SECURITY_MAX_SID_SIZE
];
1005 SID
*sid_admin
= (SID
*)sid_admin_buffer
;
1009 hr
= IWbemServices_GetObject( services
, class, 0, NULL
, ®
, NULL
);
1012 win_skip( "__SystemSecurity not available\n" );
1016 sid_size
= sizeof(sid_admin_buffer
);
1017 ret
= CreateWellKnownSid( WinBuiltinAdministratorsSid
, NULL
, sid_admin
, &sid_size
);
1018 ok( ret
, "CreateWellKnownSid failed\n" );
1021 method
= SysAllocString( getsdW
);
1022 hr
= IWbemServices_ExecMethod( services
, class, method
, 0, NULL
, NULL
, &out
, NULL
);
1023 ok( hr
== S_OK
|| hr
== WBEM_E_ACCESS_DENIED
, "failed to execute method %08x\n", hr
);
1024 SysFreeString( method
);
1029 VariantInit( &retval
);
1030 hr
= IWbemClassObject_Get( out
, returnvalueW
, 0, &retval
, &type
, NULL
);
1031 ok( hr
== S_OK
, "failed to get return value %08x\n", hr
);
1032 ok( V_VT( &retval
) == VT_I4
, "unexpected variant type 0x%x\n", V_VT( &retval
) );
1033 ok( !V_I4( &retval
), "unexpected error %u\n", V_UI4( &retval
) );
1034 ok( type
== CIM_UINT32
, "unexpected type 0x%x\n", type
);
1037 VariantInit( &var_sd
);
1038 hr
= IWbemClassObject_Get( out
, sdW
, 0, &var_sd
, &type
, NULL
);
1039 ok( hr
== S_OK
, "failed to get names %08x\n", hr
);
1040 ok( V_VT( &var_sd
) == (VT_UI1
|VT_ARRAY
), "unexpected variant type 0x%x\n", V_VT( &var_sd
) );
1041 ok( type
== (CIM_UINT8
|CIM_FLAG_ARRAY
), "unexpected type 0x%x\n", type
);
1043 hr
= SafeArrayAccessData( V_ARRAY( &var_sd
), &data
);
1044 ok( hr
== S_OK
, "SafeArrayAccessData failed %x\n", hr
);
1049 ok( (sd
->Control
& SE_SELF_RELATIVE
) == SE_SELF_RELATIVE
, "relative flag unset\n" );
1050 ok( sd
->Owner
!= 0, "no owner SID\n");
1051 ok( sd
->Group
!= 0, "no owner SID\n");
1052 ok( EqualSid( (PSID
)((LPBYTE
)sd
+ sd
->Owner
), sid_admin
), "unexpected owner SID\n" );
1053 ok( EqualSid( (PSID
)((LPBYTE
)sd
+ sd
->Group
), sid_admin
), "unexpected group SID\n" );
1055 hr
= SafeArrayUnaccessData( V_ARRAY( &var_sd
) );
1056 ok( hr
== S_OK
, "SafeArrayUnaccessData failed %x\n", hr
);
1059 VariantClear( &var_sd
);
1060 IWbemClassObject_Release( out
);
1062 else if (hr
== WBEM_E_ACCESS_DENIED
)
1063 win_skip( "insufficient privs to test __SystemSecurity\n" );
1065 SysFreeString( class );
1068 static void test_OperatingSystem( IWbemServices
*services
)
1070 static const WCHAR queryW
[] =
1071 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1072 'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
1073 static const WCHAR buildnumberW
[] = {'B','u','i','l','d','N','u','m','b','e','r',0};
1074 static const WCHAR captionW
[] = {'C','a','p','t','i','o','n',0};
1075 static const WCHAR csdversionW
[] = {'C','S','D','V','e','r','s','i','o','n',0};
1076 static const WCHAR nameW
[] = {'N','a','m','e',0};
1077 static const WCHAR osproductsuiteW
[] = {'O','S','P','r','o','d','u','c','t','S','u','i','t','e',0};
1078 static const WCHAR ostypeW
[] = {'O','S','T','y','p','e',0};
1079 static const WCHAR suitemaskW
[] = {'S','u','i','t','e','M','a','s','k',0};
1080 static const WCHAR versionW
[] = {'V','e','r','s','i','o','n',0};
1081 static const WCHAR servicepackmajorW
[] =
1082 {'S','e','r','v','i','c','e','P','a','c','k','M','a','j','o','r','V','e','r','s','i','o','n',0};
1083 static const WCHAR servicepackminorW
[] =
1084 {'S','e','r','v','i','c','e','P','a','c','k','M','i','n','o','r','V','e','r','s','i','o','n',0};
1085 static const WCHAR totalvisiblememorysizeW
[] =
1086 {'T','o','t','a','l','V','i','s','i','b','l','e','M','e','m','o','r','y','S','i','z','e',0};
1087 static const WCHAR totalvirtualmemorysizeW
[] =
1088 {'T','o','t','a','l','V','i','r','t','u','a','l','M','e','m','o','r','y','S','i','z','e',0};
1089 BSTR wql
= SysAllocString( wqlW
), query
= SysAllocString( queryW
);
1090 IEnumWbemClassObject
*result
;
1091 IWbemClassObject
*obj
;
1097 hr
= IWbemServices_ExecQuery( services
, wql
, query
, 0, NULL
, &result
);
1098 ok( hr
== S_OK
, "IWbemServices_ExecQuery failed %08x\n", hr
);
1100 hr
= IEnumWbemClassObject_Next( result
, 10000, 1, &obj
, &count
);
1101 ok( hr
== S_OK
, "IEnumWbemClassObject_Next failed %08x\n", hr
);
1104 VariantInit( &val
);
1105 hr
= IWbemClassObject_Get( obj
, buildnumberW
, 0, &val
, &type
, NULL
);
1106 ok( hr
== S_OK
, "failed to get buildnumber %08x\n", hr
);
1107 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1108 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
1109 trace( "buildnumber: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
1110 VariantClear( &val
);
1113 VariantInit( &val
);
1114 hr
= IWbemClassObject_Get( obj
, captionW
, 0, &val
, &type
, NULL
);
1115 ok( hr
== S_OK
, "failed to get caption %08x\n", hr
);
1116 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1117 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
1118 trace( "caption: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
1119 VariantClear( &val
);
1122 VariantInit( &val
);
1123 hr
= IWbemClassObject_Get( obj
, csdversionW
, 0, &val
, &type
, NULL
);
1124 ok( hr
== S_OK
, "failed to get csdversion %08x\n", hr
);
1125 ok( V_VT( &val
) == VT_BSTR
|| V_VT( &val
) == VT_NULL
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1126 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
1127 trace( "csdversion: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
1128 VariantClear( &val
);
1131 VariantInit( &val
);
1132 hr
= IWbemClassObject_Get( obj
, nameW
, 0, &val
, &type
, NULL
);
1133 ok( hr
== S_OK
, "failed to get name %08x\n", hr
);
1134 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1135 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
1136 trace( "name: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
1137 VariantClear( &val
);
1140 VariantInit( &val
);
1141 hr
= IWbemClassObject_Get( obj
, osproductsuiteW
, 0, &val
, &type
, NULL
);
1142 ok( hr
== S_OK
, "failed to get osproductsuite %08x\n", hr
);
1143 ok( V_VT( &val
) == VT_I4
|| broken(V_VT( &val
) == VT_NULL
) /* winxp */, "unexpected variant type 0x%x\n", V_VT( &val
) );
1144 ok( type
== CIM_UINT32
, "unexpected type 0x%x\n", type
);
1145 trace( "osproductsuite: %d (%08x)\n", V_I4( &val
), V_I4( &val
) );
1146 VariantClear( &val
);
1149 VariantInit( &val
);
1150 hr
= IWbemClassObject_Get( obj
, ostypeW
, 0, &val
, &type
, NULL
);
1151 ok( hr
== S_OK
, "failed to get ostype %08x\n", hr
);
1152 ok( V_VT( &val
) == VT_I4
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1153 ok( type
== CIM_UINT16
, "unexpected type 0x%x\n", type
);
1154 trace( "ostype: %d\n", V_I4( &val
) );
1155 VariantClear( &val
);
1158 VariantInit( &val
);
1159 hr
= IWbemClassObject_Get( obj
, servicepackmajorW
, 0, &val
, &type
, NULL
);
1160 ok( hr
== S_OK
, "failed to get servicepackmajor %08x\n", hr
);
1161 ok( V_VT( &val
) == VT_I4
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1162 ok( type
== CIM_UINT16
, "unexpected type 0x%x\n", type
);
1163 trace( "servicepackmajor: %d\n", V_I4( &val
) );
1164 VariantClear( &val
);
1167 VariantInit( &val
);
1168 hr
= IWbemClassObject_Get( obj
, servicepackminorW
, 0, &val
, &type
, NULL
);
1169 ok( hr
== S_OK
, "failed to get servicepackminor %08x\n", hr
);
1170 ok( V_VT( &val
) == VT_I4
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1171 ok( type
== CIM_UINT16
, "unexpected type 0x%x\n", type
);
1172 trace( "servicepackminor: %d\n", V_I4( &val
) );
1173 VariantClear( &val
);
1176 VariantInit( &val
);
1177 hr
= IWbemClassObject_Get( obj
, suitemaskW
, 0, &val
, &type
, NULL
);
1178 ok( hr
== S_OK
, "failed to get suitemask %08x\n", hr
);
1179 ok( V_VT( &val
) == VT_I4
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1180 ok( type
== CIM_UINT32
, "unexpected type 0x%x\n", type
);
1181 trace( "suitemask: %d (%08x)\n", V_I4( &val
), V_I4( &val
) );
1182 VariantClear( &val
);
1185 VariantInit( &val
);
1186 hr
= IWbemClassObject_Get( obj
, versionW
, 0, &val
, &type
, NULL
);
1187 ok( hr
== S_OK
, "failed to get version %08x\n", hr
);
1188 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1189 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
1190 trace( "version: %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
1191 VariantClear( &val
);
1194 VariantInit( &val
);
1195 hr
= IWbemClassObject_Get( obj
, totalvisiblememorysizeW
, 0, &val
, &type
, NULL
);
1196 ok( hr
== S_OK
, "failed to get visible memory size %08x\n", hr
);
1197 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1198 ok( type
== CIM_UINT64
, "unexpected type 0x%x\n", type
);
1199 trace( "totalvisiblememorysize %s\n", wine_dbgstr_w(V_BSTR(&val
)) );
1200 VariantClear( &val
);
1203 VariantInit( &val
);
1204 hr
= IWbemClassObject_Get( obj
, totalvirtualmemorysizeW
, 0, &val
, &type
, NULL
);
1205 ok( hr
== S_OK
, "failed to get virtual memory size %08x\n", hr
);
1206 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1207 ok( type
== CIM_UINT64
, "unexpected type 0x%x\n", type
);
1208 trace( "totalvirtualmemorysize %s\n", wine_dbgstr_w(V_BSTR(&val
)) );
1209 VariantClear( &val
);
1211 IWbemClassObject_Release( obj
);
1212 IEnumWbemClassObject_Release( result
);
1213 SysFreeString( query
);
1214 SysFreeString( wql
);
1217 static void test_ComputerSystemProduct( IWbemServices
*services
)
1219 static const WCHAR uuidW
[] = {'U','U','I','D',0};
1220 static const WCHAR queryW
[] =
1221 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1222 'C','o','m','p','u','t','e','r','S','y','s','t','e','m','P','r','o','d','u','c','t',0};
1223 BSTR wql
= SysAllocString( wqlW
), query
= SysAllocString( queryW
);
1224 IEnumWbemClassObject
*result
;
1225 IWbemClassObject
*obj
;
1231 hr
= IWbemServices_ExecQuery( services
, wql
, query
, 0, NULL
, &result
);
1234 win_skip( "Win32_ComputerSystemProduct not available\n" );
1238 hr
= IEnumWbemClassObject_Next( result
, 10000, 1, &obj
, &count
);
1239 ok( hr
== S_OK
, "got %08x\n", hr
);
1242 VariantInit( &value
);
1243 hr
= IWbemClassObject_Get( obj
, uuidW
, 0, &value
, &type
, NULL
);
1244 ok( hr
== S_OK
, "failed to get computer name %08x\n", hr
);
1245 ok( V_VT( &value
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &value
) );
1246 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
1247 trace( "uuid %s\n", wine_dbgstr_w(V_BSTR(&value
)) );
1248 VariantClear( &value
);
1250 IWbemClassObject_Release( obj
);
1251 IEnumWbemClassObject_Release( result
);
1252 SysFreeString( query
);
1253 SysFreeString( wql
);
1256 static void test_PhysicalMemory( IWbemServices
*services
)
1258 static const WCHAR capacityW
[] = {'C','a','p','a','c','i','t','y',0};
1259 static const WCHAR memorytypeW
[] = {'M','e','m','o','r','y','T','y','p','e',0};
1260 static const WCHAR queryW
[] =
1261 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1262 'P','h','y','s','i','c','a','l','M','e','m','o','r','y',0};
1263 BSTR wql
= SysAllocString( wqlW
), query
= SysAllocString( queryW
);
1264 IEnumWbemClassObject
*result
;
1265 IWbemClassObject
*obj
;
1271 hr
= IWbemServices_ExecQuery( services
, wql
, query
, 0, NULL
, &result
);
1274 win_skip( "Win32_PhysicalMemory not available\n" );
1278 hr
= IEnumWbemClassObject_Next( result
, 10000, 1, &obj
, &count
);
1279 ok( hr
== S_OK
, "got %08x\n", hr
);
1282 VariantInit( &val
);
1283 hr
= IWbemClassObject_Get( obj
, capacityW
, 0, &val
, &type
, NULL
);
1284 ok( hr
== S_OK
, "failed to get capacity %08x\n", hr
);
1285 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1286 ok( type
== CIM_UINT64
, "unexpected type 0x%x\n", type
);
1287 trace( "capacity %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
1288 VariantClear( &val
);
1291 VariantInit( &val
);
1292 hr
= IWbemClassObject_Get( obj
, memorytypeW
, 0, &val
, &type
, NULL
);
1293 ok( hr
== S_OK
, "failed to get memory type %08x\n", hr
);
1294 ok( V_VT( &val
) == VT_I4
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1295 ok( type
== CIM_UINT16
, "unexpected type 0x%x\n", type
);
1296 trace( "memorytype %u\n", V_I4( &val
) );
1297 VariantClear( &val
);
1299 IWbemClassObject_Release( obj
);
1300 SysFreeString( query
);
1301 SysFreeString( wql
);
1304 static void test_IP4RouteTable( IWbemServices
*services
)
1306 static const WCHAR destinationW
[] = {'D','e','s','t','i','n','a','t','i','o','n',0};
1307 static const WCHAR interfaceindexW
[] = {'I','n','t','e','r','f','a','c','e','I','n','d','e','x',0};
1308 static const WCHAR nexthopW
[] = {'N','e','x','t','H','o','p',0};
1309 static const WCHAR queryW
[] =
1310 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1311 'I','P','4','R','o','u','t','e','T','a','b','l','e',0};
1312 BSTR wql
= SysAllocString( wqlW
), query
= SysAllocString( queryW
);
1313 IEnumWbemClassObject
*result
;
1314 IWbemClassObject
*obj
;
1320 hr
= IWbemServices_ExecQuery( services
, wql
, query
, 0, NULL
, &result
);
1323 win_skip( "Win32_IP4RouteTable not available\n" );
1329 hr
= IEnumWbemClassObject_Next( result
, 10000, 1, &obj
, &count
);
1330 if (hr
!= S_OK
) break;
1333 VariantInit( &val
);
1334 hr
= IWbemClassObject_Get( obj
, destinationW
, 0, &val
, &type
, NULL
);
1335 ok( hr
== S_OK
, "failed to get destination %08x\n", hr
);
1336 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1337 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
1338 trace( "destination %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
1339 VariantClear( &val
);
1342 VariantInit( &val
);
1343 hr
= IWbemClassObject_Get( obj
, interfaceindexW
, 0, &val
, &type
, NULL
);
1344 ok( hr
== S_OK
, "failed to get interface index %08x\n", hr
);
1345 ok( V_VT( &val
) == VT_I4
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1346 ok( type
== CIM_SINT32
, "unexpected type 0x%x\n", type
);
1347 trace( "interfaceindex %d\n", V_I4( &val
) );
1348 VariantClear( &val
);
1351 VariantInit( &val
);
1352 hr
= IWbemClassObject_Get( obj
, nexthopW
, 0, &val
, &type
, NULL
);
1353 ok( hr
== S_OK
, "failed to get nexthop %08x\n", hr
);
1354 ok( V_VT( &val
) == VT_BSTR
, "unexpected variant type 0x%x\n", V_VT( &val
) );
1355 ok( type
== CIM_STRING
, "unexpected type 0x%x\n", type
);
1356 trace( "nexthop %s\n", wine_dbgstr_w(V_BSTR( &val
)) );
1357 VariantClear( &val
);
1359 IWbemClassObject_Release( obj
);
1362 SysFreeString( query
);
1363 SysFreeString( wql
);
1368 static const WCHAR cimv2W
[] = {'R','O','O','T','\\','C','I','M','V','2',0};
1369 BSTR path
= SysAllocString( cimv2W
);
1370 IWbemLocator
*locator
;
1371 IWbemServices
*services
;
1374 CoInitialize( NULL
);
1375 CoInitializeSecurity( NULL
, -1, NULL
, NULL
, RPC_C_AUTHN_LEVEL_DEFAULT
,
1376 RPC_C_IMP_LEVEL_IMPERSONATE
, NULL
, EOAC_NONE
, NULL
);
1377 hr
= CoCreateInstance( &CLSID_WbemLocator
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IWbemLocator
,
1378 (void **)&locator
);
1381 win_skip("can't create instance of WbemLocator\n");
1384 hr
= IWbemLocator_ConnectServer( locator
, path
, NULL
, NULL
, NULL
, 0, NULL
, NULL
, &services
);
1385 ok( hr
== S_OK
, "failed to get IWbemServices interface %08x\n", hr
);
1387 hr
= CoSetProxyBlanket( (IUnknown
*)services
, RPC_C_AUTHN_WINNT
, RPC_C_AUTHZ_NONE
, NULL
,
1388 RPC_C_AUTHN_LEVEL_CALL
, RPC_C_IMP_LEVEL_IMPERSONATE
, NULL
, EOAC_NONE
);
1389 ok( hr
== S_OK
, "failed to set proxy blanket %08x\n", hr
);
1391 test_select( services
);
1392 test_associators( services
);
1393 test_Win32_Bios( services
);
1394 test_Win32_Process( services
);
1395 test_Win32_Service( services
);
1396 test_Win32_ComputerSystem( services
);
1397 test_Win32_SystemEnclosure( services
);
1398 test_StdRegProv( services
);
1399 test_notification_query_async( services
);
1400 test_query_async( services
);
1401 test_GetNames( services
);
1402 test_SystemSecurity( services
);
1403 test_OperatingSystem( services
);
1404 test_ComputerSystemProduct( services
);
1405 test_PhysicalMemory( services
);
1406 test_IP4RouteTable( services
);
1408 SysFreeString( path
);
1409 IWbemServices_Release( services
);
1410 IWbemLocator_Release( locator
);