1 /* 2 * Copyright 2015 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 "initguid.h" 24 #include "objidl.h" 25 #include "wbemdisp.h" 26 #include "wbemcli.h" 27 #include "wine/test.h" 28 29 DEFINE_GUID(CLSID_WINMGMTS,0x172bddf8,0xceea,0x11d1,0x8b,0x05,0x00,0x60,0x08,0x06,0xd9,0xb6); 30 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); 31 32 static const LCID english = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT); 33 34 static void test_ParseDisplayName(void) 35 { 36 static const WCHAR biosW[] = {'W','i','n','3','2','_','B','i','o','s',0}; 37 static const WCHAR manufacturerW[] = {'M','a','n','u','f','a','c','t','u','r','e','r',0}; 38 static const WCHAR versionW[] = {'v','e','r','s','i','o','n',0}; 39 static const WCHAR nosuchW[] = {'N','o','S','u','c','h',0}; 40 static const WCHAR name1[] = 41 {'w','i','n','m','g','m','t','s',':',0}; 42 static const WCHAR name2[] = 43 {'w','i','n','m','g','m','t','s',':','\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',0}; 44 static const WCHAR name3[] = 45 {'w','i','n','m','g','m','t','s',':','\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',':', 46 'W','i','n','3','2','_','L','o','g','i','c','a','l','D','i','s','k','.', 47 'D','e','v','i','c','e','I','D','=','\'','C',':','\'',0}; 48 static const WCHAR name4[] = 49 {'w','i','n','m','g','m','t','s',':','\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',':', 50 'W','i','n','3','2','_','S','e','r','v','i','c','e',0}; 51 static const WCHAR stdregprovW[] = 52 {'w','i','n','m','g','m','t','s',':','\\','\\','.','\\','r','o','o','t','\\','d','e','f','a','u','l','t',':', 53 'S','t','d','R','e','g','P','r','o','v',0}; 54 static const WCHAR getstringvalueW[] = 55 {'G','e','t','S','t','r','i','n','g','V','a','l','u','e',0}; 56 static const struct 57 { 58 const WCHAR *name; 59 HRESULT hr; 60 REFIID iid; 61 ULONG eaten; 62 } tests[] = 63 { 64 { name1, S_OK, &IID_ISWbemServices, ARRAY_SIZE( name1 ) - 1 }, 65 { name2, S_OK, &IID_ISWbemServices, ARRAY_SIZE( name2 ) - 1 }, 66 { name3, S_OK, &IID_ISWbemObject, ARRAY_SIZE( name3 ) - 1 }, 67 { name4, S_OK, &IID_ISWbemObject, ARRAY_SIZE( name4 ) - 1 } 68 }; 69 IParseDisplayName *displayname; 70 IBindCtx *ctx; 71 IMoniker *moniker; 72 IUnknown *obj; 73 BSTR str; 74 ULONG i, eaten, count; 75 HRESULT hr; 76 77 hr = CoCreateInstance( &CLSID_WINMGMTS, NULL, CLSCTX_INPROC_SERVER, &IID_IParseDisplayName, (void **)&displayname ); 78 if (hr != S_OK) 79 { 80 win_skip( "can't create instance of WINMGMTS\n" ); 81 return; 82 } 83 84 hr = CreateBindCtx( 0, &ctx ); 85 ok( hr == S_OK, "got %x\n", hr ); 86 87 for (i =0; i < ARRAY_SIZE( tests ); i++) 88 { 89 str = SysAllocString( tests[i].name ); 90 eaten = 0xdeadbeef; 91 moniker = NULL; 92 hr = IParseDisplayName_ParseDisplayName( displayname, NULL, str, &eaten, &moniker ); 93 SysFreeString( str ); 94 ok( hr == tests[i].hr, "%u: got %x\n", i, hr ); 95 ok( eaten == tests[i].eaten, "%u: got %u\n", i, eaten ); 96 if (moniker) 97 { 98 obj = NULL; 99 hr = IMoniker_BindToObject( moniker, ctx, NULL, tests[i].iid, (void **)&obj ); 100 ok( hr == S_OK, "%u: got %x\n", i, hr ); 101 if (obj) IUnknown_Release( obj ); 102 IMoniker_Release( moniker ); 103 } 104 } 105 106 str = SysAllocString( name1 ); 107 eaten = 0xdeadbeef; 108 moniker = NULL; 109 hr = IParseDisplayName_ParseDisplayName( displayname, NULL, str, &eaten, &moniker ); 110 SysFreeString( str ); 111 ok( hr == S_OK, "got %x\n", hr ); 112 ok( eaten == lstrlenW(name1), "got %u\n", eaten ); 113 if (moniker) 114 { 115 ISWbemServices *services = NULL; 116 117 hr = IMoniker_BindToObject( moniker, ctx, NULL, &IID_IUnknown, (void **)&services ); 118 ok( hr == S_OK, "got %x\n", hr ); 119 if (services) 120 { 121 ISWbemObjectSet *objectset = NULL; 122 123 str = SysAllocString( biosW ); 124 hr = ISWbemServices_InstancesOf( services, str, 0, NULL, &objectset ); 125 SysFreeString( str ); 126 ok( hr == S_OK, "got %x\n", hr ); 127 if (objectset) 128 { 129 hr = ISWbemObjectSet_get__NewEnum( objectset, &obj ); 130 ok( hr == S_OK, "got %x\n", hr ); 131 if (obj) 132 { 133 IEnumVARIANT *enumvar = NULL; 134 135 hr = IUnknown_QueryInterface( obj, &IID_IEnumVARIANT, (void **)&enumvar ); 136 ok( hr == S_OK, "got %x\n", hr ); 137 138 if (enumvar) 139 { 140 VARIANT var, res; 141 ULONG fetched; 142 IDispatch *dispatch = NULL; 143 DISPID dispid; 144 DISPPARAMS params; 145 UINT arg_err; 146 147 fetched = 0xdeadbeef; 148 hr = IEnumVARIANT_Next( enumvar, 0, &var, &fetched ); 149 ok( hr == S_OK, "got %x\n", hr ); 150 ok( !fetched, "got %u\n", fetched ); 151 152 fetched = 0xdeadbeef; 153 V_VT( &var ) = VT_ERROR; 154 V_ERROR( &var ) = 0xdeadbeef; 155 hr = IEnumVARIANT_Next( enumvar, 1, &var, &fetched ); 156 ok( hr == S_OK, "got %x\n", hr ); 157 ok( fetched == 1, "got %u\n", fetched ); 158 ok( V_VT( &var ) == VT_DISPATCH, "got %u\n", V_VT( &var ) ); 159 ok( V_DISPATCH( &var ) != (IDispatch *)0xdeadbeef, "got %u\n", V_VT( &var ) ); 160 161 dispatch = V_DISPATCH( &var ); 162 count = 0; 163 hr = IDispatch_GetTypeInfoCount( dispatch, &count ); 164 ok( hr == S_OK, "got %x\n", hr ); 165 ok( count == 1, "got %u\n", count ); 166 167 str = SysAllocString( manufacturerW ); 168 dispid = 0xdeadbeef; 169 hr = IDispatch_GetIDsOfNames( dispatch, &IID_NULL, &str, 1, english, &dispid ); 170 SysFreeString( str ); 171 ok( hr == S_OK, "got %x\n", hr ); 172 ok( dispid == 0x1800001 || dispid == 0x10b /* win2k */, "got %x\n", dispid ); 173 174 str = SysAllocString( versionW ); 175 dispid = 0xdeadbeef; 176 hr = IDispatch_GetIDsOfNames( dispatch, &IID_NULL, &str, 1, english, &dispid ); 177 SysFreeString( str ); 178 ok( hr == S_OK, "got %x\n", hr ); 179 ok( dispid == 0x1800002 || dispid == 0x119 /* win2k */, "got %x\n", dispid ); 180 181 str = SysAllocString( nosuchW ); 182 dispid = 0xdeadbeef; 183 hr = IDispatch_GetIDsOfNames( dispatch, &IID_NULL, &str, 1, english, &dispid ); 184 SysFreeString( str ); 185 ok( hr == DISP_E_UNKNOWNNAME, "got %x\n", hr ); 186 ok( dispid == DISPID_UNKNOWN, "got %x\n", dispid ); 187 188 str = SysAllocString( manufacturerW ); 189 dispid = 0xdeadbeef; 190 hr = IDispatch_GetIDsOfNames( dispatch, &IID_NULL, &str, 1, english, &dispid ); 191 SysFreeString( str ); 192 ok( hr == S_OK, "got %x\n", hr ); 193 ok( dispid == 0x1800001 || dispid == 0x10b /* win2k */, "got %x\n", dispid ); 194 195 if (dispid == 0x1800001) /* crashes on win2k */ 196 { 197 V_VT( &res ) = VT_ERROR; 198 V_BSTR( &res ) = (BSTR)0xdeadbeef; 199 params.rgvarg = (VARIANTARG *)0xdeadbeef; 200 params.rgdispidNamedArgs = (DISPID *)0xdeadbeef; 201 params.cArgs = params.cNamedArgs = 0xdeadbeef; 202 arg_err = 0xdeadbeef; 203 hr = IDispatch_Invoke( dispatch, DISPID_UNKNOWN, &IID_NULL, english, 204 DISPATCH_METHOD|DISPATCH_PROPERTYGET, 205 ¶ms, &res, NULL, &arg_err ); 206 ok( hr == DISP_E_MEMBERNOTFOUND || hr == S_OK /* winxp */, "got %x\n", hr ); 207 ok( params.rgvarg == (VARIANTARG *)0xdeadbeef, "got %p\n", params.rgvarg ); 208 ok( params.rgdispidNamedArgs == (DISPID *)0xdeadbeef, "got %p\n", params.rgdispidNamedArgs ); 209 ok( params.cArgs == 0xdeadbeef, "got %u\n", params.cArgs ); 210 ok( params.cNamedArgs == 0xdeadbeef, "got %u\n", params.cNamedArgs ); 211 ok( V_VT( &res ) == VT_ERROR, "got %u\n", V_VT( &res ) ); 212 ok( V_ERROR( &res ) == 0xdeadbeef, "got %u\n", V_VT( &res ) ); 213 ok( arg_err == 0xdeadbeef, "got %u\n", arg_err ); 214 if (hr == S_OK) VariantClear( &res ); 215 } 216 217 V_VT( &res ) = VT_ERROR; 218 V_BSTR( &res ) = (BSTR)0xdeadbeef; 219 memset( ¶ms, 0, sizeof(params) ); 220 hr = IDispatch_Invoke( dispatch, dispid, &IID_NULL, english, 221 DISPATCH_METHOD|DISPATCH_PROPERTYGET, 222 ¶ms, &res, NULL, NULL ); 223 ok( hr == S_OK, "got %x\n", hr ); 224 ok( params.rgvarg == NULL, "got %p\n", params.rgvarg ); 225 ok( params.rgdispidNamedArgs == NULL, "got %p\n", params.rgdispidNamedArgs ); 226 ok( !params.cArgs, "got %u\n", params.cArgs ); 227 ok( !params.cNamedArgs, "got %u\n", params.cNamedArgs ); 228 ok( V_VT( &res ) == VT_BSTR, "got %u\n", V_VT( &res ) ); 229 ok( V_BSTR( &res ) != (BSTR)0xdeadbeef, "got %u\n", V_VT( &res ) ); 230 VariantClear( &res ); 231 VariantClear( &var ); 232 233 fetched = 0xdeadbeef; 234 hr = IEnumVARIANT_Next( enumvar, 1, &var, &fetched ); 235 ok( hr == S_FALSE, "got %x\n", hr ); 236 ok( !fetched, "got %u\n", fetched ); 237 238 IEnumVARIANT_Release( enumvar ); 239 } 240 IUnknown_Release( obj ); 241 } 242 ISWbemObjectSet_Release( objectset ); 243 } 244 IUnknown_Release( services ); 245 } 246 IMoniker_Release( moniker ); 247 } 248 249 IBindCtx_Release( ctx ); 250 251 hr = CreateBindCtx( 0, &ctx ); 252 ok( hr == S_OK, "got %x\n", hr ); 253 254 str = SysAllocString( stdregprovW ); 255 hr = IParseDisplayName_ParseDisplayName( displayname, NULL, str, &eaten, &moniker ); 256 ok( hr == S_OK, "got %x\n", hr ); 257 SysFreeString( str ); 258 259 if (moniker) 260 { 261 ISWbemObject *sobj = NULL; 262 hr = IMoniker_BindToObject( moniker, ctx, NULL, &IID_ISWbemObject, (void **)&sobj ); 263 ok( hr == S_OK, "got %x\n",hr ); 264 if (sobj) 265 { 266 DISPID dispid = 0xdeadbeef; 267 268 str = SysAllocString( getstringvalueW ); 269 hr = ISWbemObject_GetIDsOfNames( sobj, &IID_NULL, &str, 1, english, &dispid ); 270 ok( hr == S_OK, "got %x\n", hr ); 271 ok( dispid == 0x1000001, "got %x\n", dispid ); 272 273 ISWbemObject_Release( sobj ); 274 SysFreeString( str ); 275 } 276 IMoniker_Release( moniker ); 277 } 278 279 IBindCtx_Release(ctx); 280 IParseDisplayName_Release( displayname ); 281 } 282 283 static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0}; 284 static const WCHAR root[] = {'r','o','o','t','\\','C','I','M','V','2',0}; 285 static const WCHAR query[] = {'S','e','l','e','c','t',' ','P','r','o','c','e','s','s','o','r','I','d',' ','f','r','o','m', 286 ' ','W','i','n','3','2','_','P','r','o','c','e','s','s','o','r',0}; 287 static const WCHAR lang[] = {'W','Q','L',0}; 288 static const WCHAR props[] = {'P','r','o','p','e','r','t','i','e','s','_',0}; 289 static const WCHAR procid[] = {'P','r','o','c','e','s','s','o','r','I','d',0}; 290 291 static void test_locator(void) 292 { 293 HRESULT hr; 294 DISPID id; 295 BSTR host_bstr, root_bstr, query_bstr, lang_bstr, props_bstr, procid_bstr; 296 ISWbemLocator *locator; 297 ISWbemServices *services; 298 ISWbemObjectSet *object_set; 299 IEnumVARIANT *enum_var; 300 ISWbemObject *object; 301 ISWbemPropertySet *prop_set; 302 ISWbemProperty *prop; 303 ISWbemSecurity *security; 304 VARIANT var; 305 LONG count; 306 WbemImpersonationLevelEnum imp_level; 307 WbemAuthenticationLevelEnum auth_level; 308 309 hr = CoCreateInstance( &CLSID_SWbemLocator, NULL, CLSCTX_INPROC_SERVER, &IID_ISWbemLocator, (void **)&locator ); 310 ok( hr == S_OK, "got %x\n", hr ); 311 312 host_bstr = SysAllocString(localhost); 313 root_bstr = SysAllocString(root); 314 hr = ISWbemLocator_ConnectServer( locator, host_bstr, root_bstr, NULL, NULL, NULL, NULL, 0, NULL, &services); 315 ok( hr == S_OK, "got %x\n", hr ); 316 SysFreeString( root_bstr ); 317 SysFreeString( host_bstr ); 318 319 query_bstr = SysAllocString(query); 320 lang_bstr = SysAllocString(lang); 321 hr = ISWbemServices_ExecQuery( services, query_bstr, lang_bstr, wbemFlagForwardOnly, NULL, &object_set); 322 ok( hr == S_OK, "got %x\n", hr ); 323 SysFreeString( lang_bstr ); 324 SysFreeString( query_bstr ); 325 326 hr = ISWbemLocator_get_Security_( locator, &security ); 327 ok( hr == S_OK, "got %x\n", hr ); 328 imp_level = 0xdeadbeef; 329 hr = ISWbemSecurity_get_ImpersonationLevel( security, &imp_level ); 330 ok( hr == S_OK, "got %x\n", hr ); 331 ok( imp_level == wbemImpersonationLevelImpersonate, "got %u\n", imp_level ); 332 hr = ISWbemSecurity_put_ImpersonationLevel( security, wbemImpersonationLevelAnonymous ); 333 ok( hr == S_OK, "got %x\n", hr ); 334 imp_level = 0xdeadbeef; 335 hr = ISWbemSecurity_get_ImpersonationLevel( security, &imp_level ); 336 ok( hr == S_OK, "got %x\n", hr ); 337 ok( imp_level == wbemImpersonationLevelAnonymous, "got %u\n", imp_level ); 338 339 auth_level = 0xdeadbeef; 340 hr = ISWbemSecurity_get_AuthenticationLevel( security, &auth_level ); 341 todo_wine { 342 ok( hr == WBEM_E_FAILED, "got %x\n", hr ); 343 ok( auth_level == 0xdeadbeef, "got %u\n", auth_level ); 344 } 345 hr = ISWbemSecurity_put_AuthenticationLevel( security, wbemAuthenticationLevelNone ); 346 ok( hr == S_OK, "got %x\n", hr ); 347 auth_level = 0xdeadbeef; 348 hr = ISWbemSecurity_get_AuthenticationLevel( security, &auth_level ); 349 ok( hr == S_OK, "got %x\n", hr ); 350 ok( auth_level == wbemAuthenticationLevelNone, "got %u\n", auth_level ); 351 ISWbemSecurity_Release( security ); 352 security = NULL; 353 354 hr = ISWbemObjectSet_get__NewEnum( object_set, (IUnknown**)&enum_var ); 355 ok( hr == S_OK, "got %x\n", hr ); 356 357 VariantInit( &var ); 358 hr = IEnumVARIANT_Next( enum_var, 1, &var, NULL ); 359 ok( hr == S_OK, "got %x\n", hr ); 360 ok( V_VT(&var) == VT_DISPATCH, "got %x\n", V_VT(&var)); 361 362 props_bstr = SysAllocString( props ); 363 hr = IDispatch_GetIDsOfNames( V_DISPATCH(&var), &IID_NULL, &props_bstr, 1, english, &id ); 364 ok( hr == S_OK, "got %x\n", hr ); 365 ok( id == 21, "got %d\n", id ); 366 367 hr = IDispatch_QueryInterface( V_DISPATCH(&var), &IID_ISWbemObject, (void**)&object ); 368 ok( hr == S_OK, "got %x\n", hr ); 369 VariantClear( &var ); 370 371 hr = ISWbemObject_get_Properties_( object, &prop_set ); 372 ok( hr == S_OK, "got %x\n", hr ); 373 374 hr = ISWbemPropertySet_Item( prop_set, props_bstr, 0, &prop ); 375 ok( hr == WBEM_E_NOT_FOUND, "got %x\n", hr ); 376 SysFreeString( props_bstr ); 377 378 procid_bstr = SysAllocString( procid ); 379 hr = ISWbemPropertySet_Item( prop_set, procid_bstr, 0, &prop ); 380 ok( hr == S_OK, "got %x\n", hr ); 381 SysFreeString( procid_bstr ); 382 383 count = 0; 384 hr = ISWbemPropertySet_get_Count( prop_set, &count ); 385 ok( hr == S_OK, "got %x\n", hr ); 386 ok( count > 0, "got %d\n", count ); 387 388 hr = ISWbemProperty_get_Value( prop, &var ); 389 ok( hr == S_OK, "got %x\n", hr ); 390 ok( V_VT(&var) == VT_BSTR, "got %x\n", V_VT(&var) ); 391 VariantClear( &var ); 392 393 hr = ISWbemServices_get_Security_( services, &security ); 394 ok( hr == S_OK, "got %x\n", hr ); 395 imp_level = 0xdeadbeef; 396 hr = ISWbemSecurity_get_ImpersonationLevel( security, &imp_level ); 397 ok( hr == S_OK, "got %x\n", hr ); 398 ok( imp_level == wbemImpersonationLevelImpersonate, "got %u\n", imp_level ); 399 auth_level = 0xdeadbeef; 400 hr = ISWbemSecurity_get_AuthenticationLevel( security, &auth_level ); 401 ok( hr == S_OK, "got %x\n", hr ); 402 ok( auth_level == wbemAuthenticationLevelPktPrivacy, "got %u\n", auth_level ); 403 404 ISWbemSecurity_Release(security); 405 ISWbemProperty_Release( prop ); 406 ISWbemPropertySet_Release( prop_set ); 407 ISWbemObject_Release( object ); 408 IEnumVARIANT_Release( enum_var ); 409 ISWbemObjectSet_Release( object_set ); 410 ISWbemServices_Release( services ); 411 ISWbemLocator_Release( locator ); 412 } 413 414 START_TEST(wbemdisp) 415 { 416 CoInitialize( NULL ); 417 418 test_ParseDisplayName(); 419 test_locator(); 420 421 CoUninitialize(); 422 } 423