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 < sizeof(test)/sizeof(test[0]); 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 < sizeof(test)/sizeof(test[0]); 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 versionW[] = {'V','e','r','s','i','o','n',0}; 292 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW ); 293 IEnumWbemClassObject *result; 294 IWbemClassObject *obj; 295 CIMTYPE type; 296 ULONG count; 297 VARIANT val; 298 HRESULT hr; 299 300 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result ); 301 ok( hr == S_OK, "IWbemServices_ExecQuery failed %08x\n", hr ); 302 303 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count ); 304 ok( hr == S_OK, "IEnumWbemClassObject_Next failed %08x\n", hr ); 305 306 type = 0xdeadbeef; 307 VariantInit( &val ); 308 hr = IWbemClassObject_Get( obj, descriptionW, 0, &val, &type, NULL ); 309 ok( hr == S_OK, "failed to get description %08x\n", hr ); 310 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 311 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 312 trace( "description: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 313 VariantClear( &val ); 314 315 type = 0xdeadbeef; 316 VariantInit( &val ); 317 hr = IWbemClassObject_Get( obj, identificationcodeW, 0, &val, &type, NULL ); 318 ok( hr == S_OK, "failed to get identication code %08x\n", hr ); 319 ok( V_VT( &val ) == VT_NULL, "unexpected variant type 0x%x\n", V_VT( &val ) ); 320 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 321 VariantClear( &val ); 322 323 type = 0xdeadbeef; 324 VariantInit( &val ); 325 hr = IWbemClassObject_Get( obj, manufacturerW, 0, &val, &type, NULL ); 326 ok( hr == S_OK, "failed to get manufacturer %08x\n", hr ); 327 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 328 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 329 trace( "manufacturer: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 330 VariantClear( &val ); 331 332 type = 0xdeadbeef; 333 VariantInit( &val ); 334 hr = IWbemClassObject_Get( obj, nameW, 0, &val, &type, NULL ); 335 ok( hr == S_OK, "failed to get name %08x\n", hr ); 336 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 337 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 338 trace( "name: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 339 VariantClear( &val ); 340 341 type = 0xdeadbeef; 342 VariantInit( &val ); 343 hr = IWbemClassObject_Get( obj, releasedateW, 0, &val, &type, NULL ); 344 ok( hr == S_OK, "failed to get release date %08x\n", hr ); 345 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 346 ok( type == CIM_DATETIME, "unexpected type 0x%x\n", type ); 347 trace( "release date: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 348 VariantClear( &val ); 349 350 type = 0xdeadbeef; 351 VariantInit( &val ); 352 hr = IWbemClassObject_Get( obj, serialnumberW, 0, &val, &type, NULL ); 353 ok( hr == S_OK, "failed to get serial number %08x\n", hr ); 354 ok( V_VT( &val ) == VT_BSTR || V_VT( &val ) == VT_NULL /* Testbot VMs */, 355 "unexpected variant type 0x%x\n", V_VT( &val ) ); 356 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 357 VariantClear( &val ); 358 359 type = 0xdeadbeef; 360 VariantInit( &val ); 361 hr = IWbemClassObject_Get( obj, smbiosbiosversionW, 0, &val, &type, NULL ); 362 ok( hr == S_OK, "failed to get bios version %08x\n", hr ); 363 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 364 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 365 trace( "bios version: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 366 VariantClear( &val ); 367 368 type = 0xdeadbeef; 369 VariantInit( &val ); 370 hr = IWbemClassObject_Get( obj, versionW, 0, &val, &type, NULL ); 371 ok( hr == S_OK, "failed to get version %08x\n", hr ); 372 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 373 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 374 trace( "version: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 375 VariantClear( &val ); 376 377 IWbemClassObject_Release( obj ); 378 IEnumWbemClassObject_Release( result ); 379 SysFreeString( query ); 380 SysFreeString( wql ); 381 } 382 383 static void test_Win32_Process( IWbemServices *services ) 384 { 385 static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0}; 386 static const WCHAR getownerW[] = {'G','e','t','O','w','n','e','r',0}; 387 static const WCHAR userW[] = {'U','s','e','r',0}; 388 static const WCHAR domainW[] = {'D','o','m','a','i','n',0}; 389 static const WCHAR processW[] = {'W','i','n','3','2','_','P','r','o','c','e','s','s',0}; 390 static const WCHAR idW[] = {'I','D',0}; 391 static const WCHAR fmtW[] = {'W','i','n','3','2','_','P','r','o','c','e','s','s','.', 392 'H','a','n','d','l','e','=','"','%','u','"',0}; 393 static const LONG expected_flavor = WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE | 394 WBEM_FLAVOR_NOT_OVERRIDABLE | 395 WBEM_FLAVOR_ORIGIN_PROPAGATED; 396 BSTR class, method; 397 IWbemClassObject *process, *out; 398 IWbemQualifierSet *qualifiers; 399 VARIANT user, domain, retval, val; 400 LONG flavor; 401 CIMTYPE type; 402 HRESULT hr; 403 404 class = SysAllocString( processW ); 405 hr = IWbemServices_GetObject( services, class, 0, NULL, &process, NULL ); 406 SysFreeString( class ); 407 if (hr != S_OK) 408 { 409 win_skip( "Win32_Process not available\n" ); 410 return; 411 } 412 hr = IWbemClassObject_GetMethod( process, getownerW, 0, NULL, NULL ); 413 ok( hr == S_OK, "failed to get GetOwner method %08x\n", hr ); 414 IWbemClassObject_Release( process ); 415 416 out = NULL; 417 method = SysAllocString( getownerW ); 418 class = SysAllocStringLen( NULL, sizeof(fmtW)/sizeof(fmtW[0]) + 10 ); 419 wsprintfW( class, fmtW, GetCurrentProcessId() ); 420 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL ); 421 ok( hr == S_OK, "failed to execute method %08x\n", hr ); 422 SysFreeString( method ); 423 SysFreeString( class ); 424 425 type = 0xdeadbeef; 426 VariantInit( &retval ); 427 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL ); 428 ok( hr == S_OK, "failed to get return value %08x\n", hr ); 429 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) ); 430 ok( !V_I4( &retval ), "unexpected error %u\n", V_I4( &retval ) ); 431 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type ); 432 433 type = 0xdeadbeef; 434 VariantInit( &user ); 435 hr = IWbemClassObject_Get( out, userW, 0, &user, &type, NULL ); 436 ok( hr == S_OK, "failed to get user %08x\n", hr ); 437 ok( V_VT( &user ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &user ) ); 438 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 439 trace("%s\n", wine_dbgstr_w(V_BSTR(&user))); 440 441 type = 0xdeadbeef; 442 VariantInit( &domain ); 443 hr = IWbemClassObject_Get( out, domainW, 0, &domain, &type, NULL ); 444 ok( hr == S_OK, "failed to get domain %08x\n", hr ); 445 ok( V_VT( &domain ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &domain ) ); 446 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 447 trace("%s\n", wine_dbgstr_w(V_BSTR(&domain))); 448 449 hr = IWbemClassObject_GetPropertyQualifierSet( out, userW, &qualifiers ); 450 ok( hr == S_OK, "failed to get qualifier set %08x\n", hr ); 451 452 flavor = -1; 453 V_I4(&val) = -1; 454 V_VT(&val) = VT_ERROR; 455 hr = IWbemQualifierSet_Get( qualifiers, idW, 0, &val, &flavor ); 456 ok( hr == S_OK, "got %08x\n", hr ); 457 ok( flavor == expected_flavor, "got %d\n", flavor ); 458 ok( V_VT(&val) == VT_I4, "got %u\n", V_VT(&val) ); 459 ok( V_I4(&val) == 0, "got %u\n", V_I4(&val) ); 460 VariantClear( &val ); 461 462 IWbemQualifierSet_Release( qualifiers ); 463 hr = IWbemClassObject_GetPropertyQualifierSet( out, domainW, &qualifiers ); 464 ok( hr == S_OK, "failed to get qualifier set %08x\n", hr ); 465 466 flavor = -1; 467 V_I4(&val) = -1; 468 V_VT(&val) = VT_ERROR; 469 hr = IWbemQualifierSet_Get( qualifiers, idW, 0, &val, &flavor ); 470 ok( hr == S_OK, "got %08x\n", hr ); 471 ok( flavor == expected_flavor, "got %d\n", flavor ); 472 ok( V_VT(&val) == VT_I4, "got %u\n", V_VT(&val) ); 473 ok( V_I4(&val) == 1, "got %u\n", V_I4(&val) ); 474 VariantClear( &val ); 475 476 IWbemQualifierSet_Release( qualifiers ); 477 hr = IWbemClassObject_GetPropertyQualifierSet( out, returnvalueW, &qualifiers ); 478 ok( hr == S_OK, "failed to get qualifier set %08x\n", hr ); 479 480 hr = IWbemQualifierSet_Get( qualifiers, idW, 0, &val, &flavor ); 481 ok( hr == WBEM_E_NOT_FOUND, "got %08x\n", hr ); 482 483 IWbemQualifierSet_Release( qualifiers ); 484 VariantClear( &user ); 485 VariantClear( &domain ); 486 IWbemClassObject_Release( out ); 487 } 488 489 static void test_Win32_ComputerSystem( IWbemServices *services ) 490 { 491 static const WCHAR backslashW[] = {'\\',0}; 492 static const WCHAR memorytypeW[] = {'M','e','m','o','r','y','T','y','p','e',0}; 493 static const WCHAR modelW[] = {'M','o','d','e','l',0}; 494 static const WCHAR nameW[] = {'N','a','m','e',0}; 495 static const WCHAR usernameW[] = {'U','s','e','r','N','a','m','e',0}; 496 static const WCHAR queryW[] = 497 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_', 498 'C','o','m','p','u','t','e','r','S','y','s','t','e','m',0}; 499 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW ); 500 IEnumWbemClassObject *result; 501 IWbemClassObject *service; 502 VARIANT value; 503 CIMTYPE type; 504 HRESULT hr; 505 WCHAR compname[MAX_COMPUTERNAME_LENGTH + 1]; 506 WCHAR username[128]; 507 DWORD len, count; 508 509 len = sizeof(compname) / sizeof(compname[0]); 510 if (!GetComputerNameW( compname, &len )) 511 compname[0] = 0; 512 513 lstrcpyW( username, compname ); 514 lstrcatW( username, backslashW ); 515 len = sizeof(username) / sizeof(username[0]) - lstrlenW( username ); 516 if (!GetUserNameW( username + lstrlenW( username ), &len )) 517 username[0] = 0; 518 519 if (!compname[0] || !username[0]) 520 { 521 skip( "Failed to get user or computer name\n" ); 522 goto out; 523 } 524 525 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result ); 526 if (hr != S_OK) 527 { 528 win_skip( "Win32_ComputerSystem not available\n" ); 529 goto out; 530 } 531 532 hr = IEnumWbemClassObject_Next( result, 10000, 1, &service, &count ); 533 ok( hr == S_OK, "got %08x\n", hr ); 534 535 type = 0xdeadbeef; 536 VariantInit( &value ); 537 hr = IWbemClassObject_Get( service, memorytypeW, 0, &value, &type, NULL ); 538 ok( hr == WBEM_E_NOT_FOUND, "got %08x\n", hr ); 539 540 type = 0xdeadbeef; 541 VariantInit( &value ); 542 hr = IWbemClassObject_Get( service, modelW, 0, &value, &type, NULL ); 543 ok( hr == S_OK, "failed to get model %08x\n", hr ); 544 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) ); 545 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 546 trace( "model: %s\n", wine_dbgstr_w(V_BSTR( &value )) ); 547 VariantClear( &value ); 548 549 type = 0xdeadbeef; 550 VariantInit( &value ); 551 hr = IWbemClassObject_Get( service, nameW, 0, &value, &type, NULL ); 552 ok( hr == S_OK, "failed to get computer name %08x\n", hr ); 553 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) ); 554 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 555 ok( !lstrcmpiW( V_BSTR( &value ), compname ), "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value)), wine_dbgstr_w(compname) ); 556 VariantClear( &value ); 557 558 type = 0xdeadbeef; 559 VariantInit( &value ); 560 hr = IWbemClassObject_Get( service, usernameW, 0, &value, &type, NULL ); 561 ok( hr == S_OK, "failed to get computer name %08x\n", hr ); 562 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) ); 563 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 564 ok( !lstrcmpiW( V_BSTR( &value ), username ), "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value)), wine_dbgstr_w(username) ); 565 VariantClear( &value ); 566 567 IWbemClassObject_Release( service ); 568 IEnumWbemClassObject_Release( result ); 569 out: 570 SysFreeString( query ); 571 SysFreeString( wql ); 572 } 573 574 static void test_Win32_SystemEnclosure( IWbemServices *services ) 575 { 576 static const WCHAR queryW[] = 577 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_', 578 'S','y','s','t','e','m','E','n','c','l','o','s','u','r','e',0}; 579 static const WCHAR captionW[] = {'C','a','p','t','i','o','n',0}; 580 static const WCHAR chassistypesW[] = {'C','h','a','s','s','i','s','T','y','p','e','s',0}; 581 static const WCHAR descriptionW[] = {'D','e','s','c','r','i','p','t','i','o','n',0}; 582 static const WCHAR lockpresentW[] = {'L','o','c','k','P','r','e','s','e','n','t',0}; 583 static const WCHAR manufacturerW[] = {'M','a','n','u','f','a','c','t','u','r','e','r',0}; 584 static const WCHAR nameW[] = {'N','a','m','e',0}; 585 static const WCHAR tagW[] = {'T','a','g',0}; 586 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW ); 587 IEnumWbemClassObject *result; 588 IWbemClassObject *obj; 589 CIMTYPE type; 590 ULONG count; 591 VARIANT val; 592 DWORD *data; 593 HRESULT hr; 594 595 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result ); 596 ok( hr == S_OK, "IWbemServices_ExecQuery failed %08x\n", hr ); 597 598 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count ); 599 ok( hr == S_OK, "IEnumWbemClassObject_Next failed %08x\n", hr ); 600 601 type = 0xdeadbeef; 602 VariantInit( &val ); 603 hr = IWbemClassObject_Get( obj, captionW, 0, &val, &type, NULL ); 604 ok( hr == S_OK, "failed to get caption %08x\n", hr ); 605 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 606 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 607 trace( "caption: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 608 VariantClear( &val ); 609 610 type = 0xdeadbeef; 611 VariantInit( &val ); 612 hr = IWbemClassObject_Get( obj, chassistypesW, 0, &val, &type, NULL ); 613 ok( hr == S_OK, "failed to get chassis types %08x\n", hr ); 614 ok( V_VT( &val ) == (VT_I4|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &val ) ); 615 ok( type == (CIM_UINT16|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type ); 616 hr = SafeArrayAccessData( V_ARRAY( &val ), (void **)&data ); 617 ok( hr == S_OK, "SafeArrayAccessData failed %x\n", hr ); 618 if (SUCCEEDED(hr)) 619 { 620 LONG i, lower, upper; 621 622 hr = SafeArrayGetLBound( V_ARRAY( &val ), 1, &lower ); 623 ok( hr == S_OK, "SafeArrayGetLBound failed %x\n", hr ); 624 hr = SafeArrayGetUBound( V_ARRAY( &val ), 1, &upper ); 625 ok( hr == S_OK, "SafeArrayGetUBound failed %x\n", hr ); 626 if (V_VT( &val ) == (VT_I4|VT_ARRAY)) 627 { 628 for (i = 0; i < upper - lower + 1; i++) 629 trace( "chassis type: %u\n", data[i] ); 630 } 631 hr = SafeArrayUnaccessData( V_ARRAY( &val ) ); 632 ok( hr == S_OK, "SafeArrayUnaccessData failed %x\n", hr ); 633 } 634 VariantClear( &val ); 635 636 type = 0xdeadbeef; 637 VariantInit( &val ); 638 hr = IWbemClassObject_Get( obj, descriptionW, 0, &val, &type, NULL ); 639 ok( hr == S_OK, "failed to get description %08x\n", hr ); 640 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 641 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 642 trace( "description: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 643 VariantClear( &val ); 644 645 type = 0xdeadbeef; 646 VariantInit( &val ); 647 hr = IWbemClassObject_Get( obj, lockpresentW, 0, &val, &type, NULL ); 648 ok( hr == S_OK, "failed to get lockpresent %08x\n", hr ); 649 ok( V_VT( &val ) == VT_BOOL, "unexpected variant type 0x%x\n", V_VT( &val ) ); 650 ok( type == CIM_BOOLEAN, "unexpected type 0x%x\n", type ); 651 trace( "lockpresent: %u\n", V_BOOL( &val ) ); 652 VariantClear( &val ); 653 654 type = 0xdeadbeef; 655 VariantInit( &val ); 656 hr = IWbemClassObject_Get( obj, manufacturerW, 0, &val, &type, NULL ); 657 ok( hr == S_OK, "failed to get manufacturer %08x\n", hr ); 658 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 659 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 660 trace( "manufacturer: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 661 VariantClear( &val ); 662 663 type = 0xdeadbeef; 664 VariantInit( &val ); 665 hr = IWbemClassObject_Get( obj, nameW, 0, &val, &type, NULL ); 666 ok( hr == S_OK, "failed to get name %08x\n", hr ); 667 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 668 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 669 trace( "name: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 670 VariantClear( &val ); 671 672 type = 0xdeadbeef; 673 VariantInit( &val ); 674 hr = IWbemClassObject_Get( obj, tagW, 0, &val, &type, NULL ); 675 ok( hr == S_OK, "failed to get tag %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( "tag: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 679 VariantClear( &val ); 680 681 IWbemClassObject_Release( obj ); 682 IEnumWbemClassObject_Release( result ); 683 SysFreeString( query ); 684 SysFreeString( wql ); 685 } 686 687 static void test_StdRegProv( IWbemServices *services ) 688 { 689 static const WCHAR enumkeyW[] = {'E','n','u','m','K','e','y',0}; 690 static const WCHAR enumvaluesW[] = {'E','n','u','m','V','a','l','u','e','s',0}; 691 static const WCHAR getstringvalueW[] = {'G','e','t','S','t','r','i','n','g','V','a','l','u','e',0}; 692 static const WCHAR stdregprovW[] = {'S','t','d','R','e','g','P','r','o','v',0}; 693 static const WCHAR defkeyW[] = {'h','D','e','f','K','e','y',0}; 694 static const WCHAR subkeynameW[] = {'s','S','u','b','K','e','y','N','a','m','e',0}; 695 static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0}; 696 static const WCHAR namesW[] = {'s','N','a','m','e','s',0}; 697 static const WCHAR typesW[] = {'T','y','p','e','s',0}; 698 static const WCHAR valueW[] = {'s','V','a','l','u','e',0}; 699 static const WCHAR valuenameW[] = {'s','V','a','l','u','e','N','a','m','e',0}; 700 static const WCHAR programfilesW[] = {'P','r','o','g','r','a','m','F','i','l','e','s','D','i','r',0}; 701 static const WCHAR windowsW[] = 702 {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', 703 'W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n',0}; 704 BSTR class = SysAllocString( stdregprovW ), method; 705 IWbemClassObject *reg, *sig_in, *in, *out; 706 VARIANT defkey, subkey, retval, names, types, value, valuename; 707 CIMTYPE type; 708 HRESULT hr; 709 710 hr = IWbemServices_GetObject( services, class, 0, NULL, ®, NULL ); 711 if (hr != S_OK) 712 { 713 win_skip( "StdRegProv not available\n" ); 714 return; 715 } 716 hr = IWbemClassObject_GetMethod( reg, enumkeyW, 0, &sig_in, NULL ); 717 ok( hr == S_OK, "failed to get EnumKey method %08x\n", hr ); 718 719 hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in ); 720 ok( hr == S_OK, "failed to spawn instance %08x\n", hr ); 721 722 V_VT( &defkey ) = VT_I4; 723 V_I4( &defkey ) = 0x80000002; 724 hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 ); 725 ok( hr == S_OK, "failed to set root %08x\n", hr ); 726 727 V_VT( &subkey ) = VT_BSTR; 728 V_BSTR( &subkey ) = SysAllocString( windowsW ); 729 hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 ); 730 ok( hr == S_OK, "failed to set subkey %08x\n", hr ); 731 732 out = NULL; 733 method = SysAllocString( enumkeyW ); 734 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL ); 735 ok( hr == S_OK, "failed to execute method %08x\n", hr ); 736 SysFreeString( method ); 737 738 type = 0xdeadbeef; 739 VariantInit( &retval ); 740 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL ); 741 ok( hr == S_OK, "failed to get return value %08x\n", hr ); 742 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) ); 743 ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) ); 744 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type ); 745 746 type = 0xdeadbeef; 747 VariantInit( &names ); 748 hr = IWbemClassObject_Get( out, namesW, 0, &names, &type, NULL ); 749 ok( hr == S_OK, "failed to get names %08x\n", hr ); 750 ok( V_VT( &names ) == (VT_BSTR|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &names ) ); 751 ok( type == (CIM_STRING|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type ); 752 753 VariantClear( &names ); 754 VariantClear( &subkey ); 755 IWbemClassObject_Release( in ); 756 IWbemClassObject_Release( out ); 757 IWbemClassObject_Release( sig_in ); 758 759 hr = IWbemClassObject_GetMethod( reg, enumvaluesW, 0, &sig_in, NULL ); 760 ok( hr == S_OK, "failed to get EnumValues method %08x\n", hr ); 761 762 hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in ); 763 ok( hr == S_OK, "failed to spawn instance %08x\n", hr ); 764 765 V_VT( &defkey ) = VT_I4; 766 V_I4( &defkey ) = 0x80000002; 767 hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 ); 768 ok( hr == S_OK, "failed to set root %08x\n", hr ); 769 770 V_VT( &subkey ) = VT_BSTR; 771 V_BSTR( &subkey ) = SysAllocString( windowsW ); 772 hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 ); 773 ok( hr == S_OK, "failed to set subkey %08x\n", hr ); 774 775 out = NULL; 776 method = SysAllocString( enumvaluesW ); 777 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL ); 778 ok( hr == S_OK, "failed to execute method %08x\n", hr ); 779 SysFreeString( method ); 780 781 type = 0xdeadbeef; 782 VariantInit( &retval ); 783 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL ); 784 ok( hr == S_OK, "failed to get return value %08x\n", hr ); 785 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) ); 786 ok( !V_I4( &retval ), "unexpected error %u\n", V_I4( &retval ) ); 787 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type ); 788 789 type = 0xdeadbeef; 790 VariantInit( &names ); 791 hr = IWbemClassObject_Get( out, namesW, 0, &names, &type, NULL ); 792 ok( hr == S_OK, "failed to get names %08x\n", hr ); 793 ok( V_VT( &names ) == (VT_BSTR|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &names ) ); 794 ok( type == (CIM_STRING|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type ); 795 796 type = 0xdeadbeef; 797 VariantInit( &types ); 798 hr = IWbemClassObject_Get( out, typesW, 0, &types, &type, NULL ); 799 ok( hr == S_OK, "failed to get names %08x\n", hr ); 800 ok( V_VT( &types ) == (VT_I4|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &types ) ); 801 ok( type == (CIM_SINT32|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type ); 802 803 VariantClear( &types ); 804 VariantClear( &names ); 805 VariantClear( &subkey ); 806 IWbemClassObject_Release( in ); 807 IWbemClassObject_Release( out ); 808 IWbemClassObject_Release( sig_in ); 809 810 hr = IWbemClassObject_GetMethod( reg, getstringvalueW, 0, &sig_in, NULL ); 811 ok( hr == S_OK, "failed to get GetStringValue method %08x\n", hr ); 812 813 hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in ); 814 ok( hr == S_OK, "failed to spawn instance %08x\n", hr ); 815 816 V_VT( &defkey ) = VT_I4; 817 V_I4( &defkey ) = 0x80000002; 818 hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 ); 819 ok( hr == S_OK, "failed to set root %08x\n", hr ); 820 821 V_VT( &subkey ) = VT_BSTR; 822 V_BSTR( &subkey ) = SysAllocString( windowsW ); 823 hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 ); 824 ok( hr == S_OK, "failed to set subkey %08x\n", hr ); 825 826 V_VT( &valuename ) = VT_BSTR; 827 V_BSTR( &valuename ) = SysAllocString( programfilesW ); 828 hr = IWbemClassObject_Put( in, valuenameW, 0, &valuename, 0 ); 829 ok( hr == S_OK, "failed to set value name %08x\n", hr ); 830 831 out = NULL; 832 method = SysAllocString( getstringvalueW ); 833 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL ); 834 ok( hr == S_OK, "failed to execute method %08x\n", hr ); 835 SysFreeString( method ); 836 837 type = 0xdeadbeef; 838 VariantInit( &retval ); 839 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL ); 840 ok( hr == S_OK, "failed to get return value %08x\n", hr ); 841 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) ); 842 ok( !V_I4( &retval ), "unexpected error %u\n", V_I4( &retval ) ); 843 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type ); 844 845 type = 0xdeadbeef; 846 VariantInit( &value ); 847 hr = IWbemClassObject_Get( out, valueW, 0, &value, &type, NULL ); 848 ok( hr == S_OK, "failed to get value %08x\n", hr ); 849 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) ); 850 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 851 852 VariantClear( &value ); 853 VariantClear( &valuename ); 854 VariantClear( &subkey ); 855 IWbemClassObject_Release( in ); 856 IWbemClassObject_Release( out ); 857 IWbemClassObject_Release( sig_in ); 858 859 IWbemClassObject_Release( reg ); 860 SysFreeString( class ); 861 } 862 863 static HRESULT WINAPI sink_QueryInterface( 864 IWbemObjectSink *iface, REFIID riid, void **ppv ) 865 { 866 *ppv = NULL; 867 if (IsEqualGUID( &IID_IUnknown, riid ) || IsEqualGUID( &IID_IWbemObjectSink, riid )) 868 { 869 *ppv = iface; 870 IWbemObjectSink_AddRef( iface ); 871 return S_OK; 872 } 873 return E_NOINTERFACE; 874 } 875 876 static ULONG sink_refs; 877 878 static ULONG WINAPI sink_AddRef( 879 IWbemObjectSink *iface ) 880 { 881 return ++sink_refs; 882 } 883 884 static ULONG WINAPI sink_Release( 885 IWbemObjectSink *iface ) 886 { 887 return --sink_refs; 888 } 889 890 static HRESULT WINAPI sink_Indicate( 891 IWbemObjectSink *iface, LONG count, IWbemClassObject **objects ) 892 { 893 trace("Indicate: %d, %p\n", count, objects); 894 return S_OK; 895 } 896 897 static HRESULT WINAPI sink_SetStatus( 898 IWbemObjectSink *iface, LONG flags, HRESULT hresult, BSTR str_param, IWbemClassObject *obj_param ) 899 { 900 trace("SetStatus: %08x, %08x, %s, %p\n", flags, hresult, wine_dbgstr_w(str_param), obj_param); 901 return S_OK; 902 } 903 904 static IWbemObjectSinkVtbl sink_vtbl = 905 { 906 sink_QueryInterface, 907 sink_AddRef, 908 sink_Release, 909 sink_Indicate, 910 sink_SetStatus 911 }; 912 913 static IWbemObjectSink sink = { &sink_vtbl }; 914 915 static void test_notification_query_async( IWbemServices *services ) 916 { 917 static const WCHAR queryW[] = 918 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_', 919 'D','e','v','i','c','e','C','h','a','n','g','e','E','v','e','n','t',0}; 920 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW ); 921 ULONG prev_sink_refs; 922 HRESULT hr; 923 924 hr = IWbemServices_ExecNotificationQueryAsync( services, wql, query, 0, NULL, NULL ); 925 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr ); 926 927 prev_sink_refs = sink_refs; 928 hr = IWbemServices_ExecNotificationQueryAsync( services, wql, query, 0, NULL, &sink ); 929 ok( hr == S_OK || broken(hr == WBEM_E_NOT_FOUND), "got %08x\n", hr ); 930 ok( sink_refs > prev_sink_refs || broken(!sink_refs), "got %u refs\n", sink_refs ); 931 932 hr = IWbemServices_CancelAsyncCall( services, &sink ); 933 ok( hr == S_OK || broken(hr == WBEM_E_NOT_FOUND), "got %08x\n", hr ); 934 935 SysFreeString( wql ); 936 SysFreeString( query ); 937 } 938 939 static void test_query_async( IWbemServices *services ) 940 { 941 static const WCHAR queryW[] = 942 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_', 943 'P','r','o','c','e','s','s',0}; 944 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW ); 945 HRESULT hr; 946 947 hr = IWbemServices_ExecQueryAsync( services, wql, query, 0, NULL, NULL ); 948 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr ); 949 950 hr = IWbemServices_ExecQueryAsync( services, wql, query, 0, NULL, &sink ); 951 ok( hr == S_OK || broken(hr == WBEM_E_NOT_FOUND), "got %08x\n", hr ); 952 953 hr = IWbemServices_CancelAsyncCall( services, NULL ); 954 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr ); 955 956 hr = IWbemServices_CancelAsyncCall( services, &sink ); 957 ok( hr == S_OK, "got %08x\n", hr ); 958 959 SysFreeString( wql ); 960 SysFreeString( query ); 961 } 962 963 static void test_GetNames( IWbemServices *services ) 964 { 965 static const WCHAR queryW[] = 966 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_', 967 'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0}; 968 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW ); 969 IEnumWbemClassObject *result; 970 HRESULT hr; 971 972 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result ); 973 ok( hr == S_OK, "got %08x\n", hr ); 974 975 for (;;) 976 { 977 IWbemClassObject *obj; 978 SAFEARRAY *names; 979 ULONG count; 980 VARIANT val; 981 982 IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count ); 983 if (!count) break; 984 985 VariantInit( &val ); 986 hr = IWbemClassObject_GetNames( obj, NULL, WBEM_FLAG_NONSYSTEM_ONLY, &val, &names ); 987 ok( hr == S_OK, "got %08x\n", hr ); 988 989 SafeArrayDestroy( names ); 990 IWbemClassObject_Release( obj ); 991 } 992 IEnumWbemClassObject_Release( result ); 993 SysFreeString( query ); 994 SysFreeString( wql ); 995 } 996 997 static void test_SystemSecurity( IWbemServices *services ) 998 { 999 static const WCHAR systemsecurityW[] = {'_','_','S','y','s','t','e','m','S','e','c','u','r','i','t','y',0}; 1000 static const WCHAR getsdW[] = {'G','e','t','S','D',0}; 1001 static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0}; 1002 static const WCHAR sdW[] = {'S','D',0}; 1003 BSTR class = SysAllocString( systemsecurityW ), method; 1004 IWbemClassObject *reg, *out; 1005 VARIANT retval, var_sd; 1006 void *data; 1007 SECURITY_DESCRIPTOR_RELATIVE *sd; 1008 CIMTYPE type; 1009 HRESULT hr; 1010 BYTE sid_admin_buffer[SECURITY_MAX_SID_SIZE]; 1011 SID *sid_admin = (SID*)sid_admin_buffer; 1012 DWORD sid_size; 1013 BOOL ret; 1014 1015 hr = IWbemServices_GetObject( services, class, 0, NULL, ®, NULL ); 1016 if (hr != S_OK) 1017 { 1018 win_skip( "__SystemSecurity not available\n" ); 1019 return; 1020 } 1021 IWbemClassObject_Release( reg ); 1022 1023 sid_size = sizeof(sid_admin_buffer); 1024 ret = CreateWellKnownSid( WinBuiltinAdministratorsSid, NULL, sid_admin, &sid_size ); 1025 ok( ret, "CreateWellKnownSid failed\n" ); 1026 1027 out = NULL; 1028 method = SysAllocString( getsdW ); 1029 hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL ); 1030 ok( hr == S_OK || hr == WBEM_E_ACCESS_DENIED, "failed to execute method %08x\n", hr ); 1031 SysFreeString( method ); 1032 1033 if (SUCCEEDED(hr)) 1034 { 1035 type = 0xdeadbeef; 1036 VariantInit( &retval ); 1037 hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL ); 1038 ok( hr == S_OK, "failed to get return value %08x\n", hr ); 1039 ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) ); 1040 ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) ); 1041 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type ); 1042 1043 type = 0xdeadbeef; 1044 VariantInit( &var_sd ); 1045 hr = IWbemClassObject_Get( out, sdW, 0, &var_sd, &type, NULL ); 1046 ok( hr == S_OK, "failed to get names %08x\n", hr ); 1047 ok( V_VT( &var_sd ) == (VT_UI1|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &var_sd ) ); 1048 ok( type == (CIM_UINT8|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type ); 1049 1050 hr = SafeArrayAccessData( V_ARRAY( &var_sd ), &data ); 1051 ok( hr == S_OK, "SafeArrayAccessData failed %x\n", hr ); 1052 if (SUCCEEDED(hr)) 1053 { 1054 sd = data; 1055 1056 ok( (sd->Control & SE_SELF_RELATIVE) == SE_SELF_RELATIVE, "relative flag unset\n" ); 1057 ok( sd->Owner != 0, "no owner SID\n"); 1058 ok( sd->Group != 0, "no owner SID\n"); 1059 ok( EqualSid( (PSID)((LPBYTE)sd + sd->Owner), sid_admin ), "unexpected owner SID\n" ); 1060 ok( EqualSid( (PSID)((LPBYTE)sd + sd->Group), sid_admin ), "unexpected group SID\n" ); 1061 1062 hr = SafeArrayUnaccessData( V_ARRAY( &var_sd ) ); 1063 ok( hr == S_OK, "SafeArrayUnaccessData failed %x\n", hr ); 1064 } 1065 1066 VariantClear( &var_sd ); 1067 IWbemClassObject_Release( out ); 1068 } 1069 else if (hr == WBEM_E_ACCESS_DENIED) 1070 win_skip( "insufficient privs to test __SystemSecurity\n" ); 1071 1072 SysFreeString( class ); 1073 } 1074 1075 static void test_OperatingSystem( IWbemServices *services ) 1076 { 1077 static const WCHAR queryW[] = 1078 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_', 1079 'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0}; 1080 static const WCHAR buildnumberW[] = {'B','u','i','l','d','N','u','m','b','e','r',0}; 1081 static const WCHAR captionW[] = {'C','a','p','t','i','o','n',0}; 1082 static const WCHAR csdversionW[] = {'C','S','D','V','e','r','s','i','o','n',0}; 1083 static const WCHAR nameW[] = {'N','a','m','e',0}; 1084 static const WCHAR osproductsuiteW[] = {'O','S','P','r','o','d','u','c','t','S','u','i','t','e',0}; 1085 static const WCHAR ostypeW[] = {'O','S','T','y','p','e',0}; 1086 static const WCHAR suitemaskW[] = {'S','u','i','t','e','M','a','s','k',0}; 1087 static const WCHAR versionW[] = {'V','e','r','s','i','o','n',0}; 1088 static const WCHAR servicepackmajorW[] = 1089 {'S','e','r','v','i','c','e','P','a','c','k','M','a','j','o','r','V','e','r','s','i','o','n',0}; 1090 static const WCHAR servicepackminorW[] = 1091 {'S','e','r','v','i','c','e','P','a','c','k','M','i','n','o','r','V','e','r','s','i','o','n',0}; 1092 static const WCHAR totalvisiblememorysizeW[] = 1093 {'T','o','t','a','l','V','i','s','i','b','l','e','M','e','m','o','r','y','S','i','z','e',0}; 1094 static const WCHAR totalvirtualmemorysizeW[] = 1095 {'T','o','t','a','l','V','i','r','t','u','a','l','M','e','m','o','r','y','S','i','z','e',0}; 1096 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW ); 1097 IEnumWbemClassObject *result; 1098 IWbemClassObject *obj; 1099 CIMTYPE type; 1100 ULONG count; 1101 VARIANT val; 1102 HRESULT hr; 1103 1104 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result ); 1105 ok( hr == S_OK, "IWbemServices_ExecQuery failed %08x\n", hr ); 1106 1107 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count ); 1108 ok( hr == S_OK, "IEnumWbemClassObject_Next failed %08x\n", hr ); 1109 1110 type = 0xdeadbeef; 1111 VariantInit( &val ); 1112 hr = IWbemClassObject_Get( obj, buildnumberW, 0, &val, &type, NULL ); 1113 ok( hr == S_OK, "failed to get buildnumber %08x\n", hr ); 1114 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1115 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 1116 trace( "buildnumber: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 1117 VariantClear( &val ); 1118 1119 type = 0xdeadbeef; 1120 VariantInit( &val ); 1121 hr = IWbemClassObject_Get( obj, captionW, 0, &val, &type, NULL ); 1122 ok( hr == S_OK, "failed to get caption %08x\n", hr ); 1123 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1124 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 1125 trace( "caption: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 1126 VariantClear( &val ); 1127 1128 type = 0xdeadbeef; 1129 VariantInit( &val ); 1130 hr = IWbemClassObject_Get( obj, csdversionW, 0, &val, &type, NULL ); 1131 ok( hr == S_OK, "failed to get csdversion %08x\n", hr ); 1132 ok( V_VT( &val ) == VT_BSTR || V_VT( &val ) == VT_NULL, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1133 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 1134 trace( "csdversion: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 1135 VariantClear( &val ); 1136 1137 type = 0xdeadbeef; 1138 VariantInit( &val ); 1139 hr = IWbemClassObject_Get( obj, nameW, 0, &val, &type, NULL ); 1140 ok( hr == S_OK, "failed to get name %08x\n", hr ); 1141 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1142 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 1143 trace( "name: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 1144 VariantClear( &val ); 1145 1146 type = 0xdeadbeef; 1147 VariantInit( &val ); 1148 hr = IWbemClassObject_Get( obj, osproductsuiteW, 0, &val, &type, NULL ); 1149 ok( hr == S_OK, "failed to get osproductsuite %08x\n", hr ); 1150 ok( V_VT( &val ) == VT_I4 || broken(V_VT( &val ) == VT_NULL) /* winxp */, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1151 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type ); 1152 trace( "osproductsuite: %d (%08x)\n", V_I4( &val ), V_I4( &val ) ); 1153 VariantClear( &val ); 1154 1155 type = 0xdeadbeef; 1156 VariantInit( &val ); 1157 hr = IWbemClassObject_Get( obj, ostypeW, 0, &val, &type, NULL ); 1158 ok( hr == S_OK, "failed to get ostype %08x\n", hr ); 1159 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1160 ok( type == CIM_UINT16, "unexpected type 0x%x\n", type ); 1161 trace( "ostype: %d\n", V_I4( &val ) ); 1162 VariantClear( &val ); 1163 1164 type = 0xdeadbeef; 1165 VariantInit( &val ); 1166 hr = IWbemClassObject_Get( obj, servicepackmajorW, 0, &val, &type, NULL ); 1167 ok( hr == S_OK, "failed to get servicepackmajor %08x\n", hr ); 1168 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1169 ok( type == CIM_UINT16, "unexpected type 0x%x\n", type ); 1170 trace( "servicepackmajor: %d\n", V_I4( &val ) ); 1171 VariantClear( &val ); 1172 1173 type = 0xdeadbeef; 1174 VariantInit( &val ); 1175 hr = IWbemClassObject_Get( obj, servicepackminorW, 0, &val, &type, NULL ); 1176 ok( hr == S_OK, "failed to get servicepackminor %08x\n", hr ); 1177 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1178 ok( type == CIM_UINT16, "unexpected type 0x%x\n", type ); 1179 trace( "servicepackminor: %d\n", V_I4( &val ) ); 1180 VariantClear( &val ); 1181 1182 type = 0xdeadbeef; 1183 VariantInit( &val ); 1184 hr = IWbemClassObject_Get( obj, suitemaskW, 0, &val, &type, NULL ); 1185 ok( hr == S_OK, "failed to get suitemask %08x\n", hr ); 1186 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1187 ok( type == CIM_UINT32, "unexpected type 0x%x\n", type ); 1188 trace( "suitemask: %d (%08x)\n", V_I4( &val ), V_I4( &val ) ); 1189 VariantClear( &val ); 1190 1191 type = 0xdeadbeef; 1192 VariantInit( &val ); 1193 hr = IWbemClassObject_Get( obj, versionW, 0, &val, &type, NULL ); 1194 ok( hr == S_OK, "failed to get version %08x\n", hr ); 1195 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1196 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 1197 trace( "version: %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 1198 VariantClear( &val ); 1199 1200 type = 0xdeadbeef; 1201 VariantInit( &val ); 1202 hr = IWbemClassObject_Get( obj, totalvisiblememorysizeW, 0, &val, &type, NULL ); 1203 ok( hr == S_OK, "failed to get visible memory size %08x\n", hr ); 1204 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1205 ok( type == CIM_UINT64, "unexpected type 0x%x\n", type ); 1206 trace( "totalvisiblememorysize %s\n", wine_dbgstr_w(V_BSTR(&val)) ); 1207 VariantClear( &val ); 1208 1209 type = 0xdeadbeef; 1210 VariantInit( &val ); 1211 hr = IWbemClassObject_Get( obj, totalvirtualmemorysizeW, 0, &val, &type, NULL ); 1212 ok( hr == S_OK, "failed to get virtual memory size %08x\n", hr ); 1213 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1214 ok( type == CIM_UINT64, "unexpected type 0x%x\n", type ); 1215 trace( "totalvirtualmemorysize %s\n", wine_dbgstr_w(V_BSTR(&val)) ); 1216 VariantClear( &val ); 1217 1218 IWbemClassObject_Release( obj ); 1219 IEnumWbemClassObject_Release( result ); 1220 SysFreeString( query ); 1221 SysFreeString( wql ); 1222 } 1223 1224 static void test_ComputerSystemProduct( IWbemServices *services ) 1225 { 1226 static const WCHAR uuidW[] = {'U','U','I','D',0}; 1227 static const WCHAR queryW[] = 1228 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_', 1229 'C','o','m','p','u','t','e','r','S','y','s','t','e','m','P','r','o','d','u','c','t',0}; 1230 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW ); 1231 IEnumWbemClassObject *result; 1232 IWbemClassObject *obj; 1233 VARIANT value; 1234 CIMTYPE type; 1235 HRESULT hr; 1236 DWORD count; 1237 1238 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result ); 1239 if (hr != S_OK) 1240 { 1241 win_skip( "Win32_ComputerSystemProduct not available\n" ); 1242 return; 1243 } 1244 1245 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count ); 1246 ok( hr == S_OK, "got %08x\n", hr ); 1247 1248 type = 0xdeadbeef; 1249 VariantInit( &value ); 1250 hr = IWbemClassObject_Get( obj, uuidW, 0, &value, &type, NULL ); 1251 ok( hr == S_OK, "failed to get computer name %08x\n", hr ); 1252 ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) ); 1253 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 1254 trace( "uuid %s\n", wine_dbgstr_w(V_BSTR(&value)) ); 1255 VariantClear( &value ); 1256 1257 IWbemClassObject_Release( obj ); 1258 IEnumWbemClassObject_Release( result ); 1259 SysFreeString( query ); 1260 SysFreeString( wql ); 1261 } 1262 1263 static void test_PhysicalMemory( IWbemServices *services ) 1264 { 1265 static const WCHAR capacityW[] = {'C','a','p','a','c','i','t','y',0}; 1266 static const WCHAR memorytypeW[] = {'M','e','m','o','r','y','T','y','p','e',0}; 1267 static const WCHAR queryW[] = 1268 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_', 1269 'P','h','y','s','i','c','a','l','M','e','m','o','r','y',0}; 1270 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW ); 1271 IEnumWbemClassObject *result; 1272 IWbemClassObject *obj; 1273 VARIANT val; 1274 CIMTYPE type; 1275 HRESULT hr; 1276 DWORD count; 1277 1278 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result ); 1279 if (hr != S_OK) 1280 { 1281 win_skip( "Win32_PhysicalMemory not available\n" ); 1282 return; 1283 } 1284 1285 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count ); 1286 ok( hr == S_OK, "got %08x\n", hr ); 1287 1288 type = 0xdeadbeef; 1289 VariantInit( &val ); 1290 hr = IWbemClassObject_Get( obj, capacityW, 0, &val, &type, NULL ); 1291 ok( hr == S_OK, "failed to get capacity %08x\n", hr ); 1292 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1293 ok( type == CIM_UINT64, "unexpected type 0x%x\n", type ); 1294 trace( "capacity %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 1295 VariantClear( &val ); 1296 1297 type = 0xdeadbeef; 1298 VariantInit( &val ); 1299 hr = IWbemClassObject_Get( obj, memorytypeW, 0, &val, &type, NULL ); 1300 ok( hr == S_OK, "failed to get memory type %08x\n", hr ); 1301 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1302 ok( type == CIM_UINT16, "unexpected type 0x%x\n", type ); 1303 trace( "memorytype %u\n", V_I4( &val ) ); 1304 VariantClear( &val ); 1305 1306 IWbemClassObject_Release( obj ); 1307 IEnumWbemClassObject_Release( result ); 1308 SysFreeString( query ); 1309 SysFreeString( wql ); 1310 } 1311 1312 static void test_IP4RouteTable( IWbemServices *services ) 1313 { 1314 static const WCHAR destinationW[] = {'D','e','s','t','i','n','a','t','i','o','n',0}; 1315 static const WCHAR interfaceindexW[] = {'I','n','t','e','r','f','a','c','e','I','n','d','e','x',0}; 1316 static const WCHAR nexthopW[] = {'N','e','x','t','H','o','p',0}; 1317 static const WCHAR queryW[] = 1318 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_', 1319 'I','P','4','R','o','u','t','e','T','a','b','l','e',0}; 1320 BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW ); 1321 IEnumWbemClassObject *result; 1322 IWbemClassObject *obj; 1323 VARIANT val; 1324 CIMTYPE type; 1325 HRESULT hr; 1326 DWORD count; 1327 1328 hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result ); 1329 if (hr != S_OK) 1330 { 1331 win_skip( "Win32_IP4RouteTable not available\n" ); 1332 return; 1333 } 1334 1335 for (;;) 1336 { 1337 hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count ); 1338 if (hr != S_OK) break; 1339 1340 type = 0xdeadbeef; 1341 VariantInit( &val ); 1342 hr = IWbemClassObject_Get( obj, destinationW, 0, &val, &type, NULL ); 1343 ok( hr == S_OK, "failed to get destination %08x\n", hr ); 1344 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1345 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 1346 trace( "destination %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 1347 VariantClear( &val ); 1348 1349 type = 0xdeadbeef; 1350 VariantInit( &val ); 1351 hr = IWbemClassObject_Get( obj, interfaceindexW, 0, &val, &type, NULL ); 1352 ok( hr == S_OK, "failed to get interface index %08x\n", hr ); 1353 ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1354 ok( type == CIM_SINT32, "unexpected type 0x%x\n", type ); 1355 trace( "interfaceindex %d\n", V_I4( &val ) ); 1356 VariantClear( &val ); 1357 1358 type = 0xdeadbeef; 1359 VariantInit( &val ); 1360 hr = IWbemClassObject_Get( obj, nexthopW, 0, &val, &type, NULL ); 1361 ok( hr == S_OK, "failed to get nexthop %08x\n", hr ); 1362 ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) ); 1363 ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); 1364 trace( "nexthop %s\n", wine_dbgstr_w(V_BSTR( &val )) ); 1365 VariantClear( &val ); 1366 1367 IWbemClassObject_Release( obj ); 1368 } 1369 1370 SysFreeString( query ); 1371 SysFreeString( wql ); 1372 } 1373 1374 START_TEST(query) 1375 { 1376 static const WCHAR cimv2W[] = {'R','O','O','T','\\','C','I','M','V','2',0}; 1377 BSTR path = SysAllocString( cimv2W ); 1378 IWbemLocator *locator; 1379 IWbemServices *services; 1380 HRESULT hr; 1381 1382 CoInitialize( NULL ); 1383 CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, 1384 RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL ); 1385 hr = CoCreateInstance( &CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, &IID_IWbemLocator, 1386 (void **)&locator ); 1387 if (hr != S_OK) 1388 { 1389 win_skip("can't create instance of WbemLocator\n"); 1390 return; 1391 } 1392 hr = IWbemLocator_ConnectServer( locator, path, NULL, NULL, NULL, 0, NULL, NULL, &services ); 1393 ok( hr == S_OK, "failed to get IWbemServices interface %08x\n", hr ); 1394 1395 hr = CoSetProxyBlanket( (IUnknown *)services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, 1396 RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE ); 1397 ok( hr == S_OK, "failed to set proxy blanket %08x\n", hr ); 1398 1399 test_select( services ); 1400 test_associators( services ); 1401 test_Win32_Bios( services ); 1402 test_Win32_Process( services ); 1403 test_Win32_Service( services ); 1404 test_Win32_ComputerSystem( services ); 1405 test_Win32_SystemEnclosure( services ); 1406 test_StdRegProv( services ); 1407 test_notification_query_async( services ); 1408 test_query_async( services ); 1409 test_GetNames( services ); 1410 test_SystemSecurity( services ); 1411 test_OperatingSystem( services ); 1412 test_ComputerSystemProduct( services ); 1413 test_PhysicalMemory( services ); 1414 test_IP4RouteTable( services ); 1415 1416 SysFreeString( path ); 1417 IWbemServices_Release( services ); 1418 IWbemLocator_Release( locator ); 1419 CoUninitialize(); 1420 } 1421