2 * Copyright 2015 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
27 #include "wine/test.h"
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 DEFINE_OLEGUID(CLSID_PointerMoniker
,0x306,0,0);
33 static const LCID english
= MAKELCID(MAKELANGID(LANG_ENGLISH
,SUBLANG_ENGLISH_US
),SORT_DEFAULT
);
35 static void test_ParseDisplayName(void)
37 static const WCHAR biosW
[] = {'W','i','n','3','2','_','B','i','o','s',0};
38 static const WCHAR manufacturerW
[] = {'M','a','n','u','f','a','c','t','u','r','e','r',0};
39 static const WCHAR versionW
[] = {'v','e','r','s','i','o','n',0};
40 static const WCHAR nosuchW
[] = {'N','o','S','u','c','h',0};
41 static const WCHAR name1
[] =
42 {'w','i','n','m','g','m','t','s',':',0};
43 static const WCHAR name2
[] =
44 {'w','i','n','m','g','m','t','s',':','\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',0};
45 static const WCHAR name3
[] =
46 {'w','i','n','m','g','m','t','s',':','\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',':',
47 'W','i','n','3','2','_','L','o','g','i','c','a','l','D','i','s','k','.',
48 'D','e','v','i','c','e','I','D','=','\'','C',':','\'',0};
49 static const WCHAR name4
[] =
50 {'w','i','n','m','g','m','t','s',':','\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',':',
51 'W','i','n','3','2','_','S','e','r','v','i','c','e',0};
52 static const WCHAR stdregprovW
[] =
53 {'w','i','n','m','g','m','t','s',':','\\','\\','.','\\','r','o','o','t','\\','d','e','f','a','u','l','t',':',
54 'S','t','d','R','e','g','P','r','o','v',0};
55 static const WCHAR getstringvalueW
[] =
56 {'G','e','t','S','t','r','i','n','g','V','a','l','u','e',0};
65 { name1
, S_OK
, &IID_ISWbemServices
, ARRAY_SIZE( name1
) - 1 },
66 { name2
, S_OK
, &IID_ISWbemServices
, ARRAY_SIZE( name2
) - 1 },
67 { name3
, S_OK
, &IID_ISWbemObject
, ARRAY_SIZE( name3
) - 1 },
68 { name4
, S_OK
, &IID_ISWbemObject
, ARRAY_SIZE( name4
) - 1 }
70 IParseDisplayName
*displayname
;
75 ULONG i
, eaten
, count
;
79 hr
= CoCreateInstance( &CLSID_WINMGMTS
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IParseDisplayName
, (void **)&displayname
);
82 win_skip( "can't create instance of WINMGMTS\n" );
86 hr
= CreateBindCtx( 0, &ctx
);
87 ok( hr
== S_OK
, "got %x\n", hr
);
89 for (i
=0; i
< ARRAY_SIZE( tests
); i
++)
91 str
= SysAllocString( tests
[i
].name
);
94 hr
= IParseDisplayName_ParseDisplayName( displayname
, NULL
, str
, &eaten
, &moniker
);
96 ok( hr
== tests
[i
].hr
, "%u: got %x\n", i
, hr
);
97 ok( eaten
== tests
[i
].eaten
, "%u: got %u\n", i
, eaten
);
100 hr
= IMoniker_GetClassID( moniker
, &clsid
);
101 ok( hr
== S_OK
, "%u: got %x\n", i
, hr
);
102 ok( IsEqualCLSID( &clsid
, &CLSID_PointerMoniker
), "%u: got %s\n", i
, wine_dbgstr_guid( &clsid
) );
105 hr
= IMoniker_BindToObject( moniker
, ctx
, NULL
, tests
[i
].iid
, (void **)&obj
);
106 ok( hr
== S_OK
, "%u: got %x\n", i
, hr
);
107 if (obj
) IUnknown_Release( obj
);
108 IMoniker_Release( moniker
);
112 str
= SysAllocString( name1
);
115 hr
= IParseDisplayName_ParseDisplayName( displayname
, NULL
, str
, &eaten
, &moniker
);
116 SysFreeString( str
);
117 ok( hr
== S_OK
, "got %x\n", hr
);
118 ok( eaten
== lstrlenW(name1
), "got %u\n", eaten
);
121 ISWbemServices
*services
= NULL
;
123 hr
= IMoniker_GetClassID( moniker
, &clsid
);
124 ok( hr
== S_OK
, "%u: got %x\n", i
, hr
);
125 ok( IsEqualCLSID( &clsid
, &CLSID_PointerMoniker
), "got %s\n", wine_dbgstr_guid( &clsid
) );
127 hr
= IMoniker_BindToObject( moniker
, ctx
, NULL
, &IID_IUnknown
, (void **)&services
);
128 ok( hr
== S_OK
, "got %x\n", hr
);
131 ISWbemObjectSet
*objectset
= NULL
;
133 str
= SysAllocString( biosW
);
134 hr
= ISWbemServices_InstancesOf( services
, str
, 0, NULL
, &objectset
);
135 SysFreeString( str
);
136 ok( hr
== S_OK
, "got %x\n", hr
);
139 hr
= ISWbemObjectSet_get__NewEnum( objectset
, &obj
);
140 ok( hr
== S_OK
, "got %x\n", hr
);
143 IEnumVARIANT
*enumvar
= NULL
;
145 hr
= IUnknown_QueryInterface( obj
, &IID_IEnumVARIANT
, (void **)&enumvar
);
146 ok( hr
== S_OK
, "got %x\n", hr
);
152 IDispatch
*dispatch
= NULL
;
157 fetched
= 0xdeadbeef;
158 hr
= IEnumVARIANT_Next( enumvar
, 0, &var
, &fetched
);
159 ok( hr
== S_OK
, "got %x\n", hr
);
160 ok( !fetched
, "got %u\n", fetched
);
162 fetched
= 0xdeadbeef;
163 V_VT( &var
) = VT_ERROR
;
164 V_ERROR( &var
) = 0xdeadbeef;
165 hr
= IEnumVARIANT_Next( enumvar
, 1, &var
, &fetched
);
166 ok( hr
== S_OK
, "got %x\n", hr
);
167 ok( fetched
== 1, "got %u\n", fetched
);
168 ok( V_VT( &var
) == VT_DISPATCH
, "got %u\n", V_VT( &var
) );
169 ok( V_DISPATCH( &var
) != (IDispatch
*)0xdeadbeef, "got %u\n", V_VT( &var
) );
171 dispatch
= V_DISPATCH( &var
);
173 hr
= IDispatch_GetTypeInfoCount( dispatch
, &count
);
174 ok( hr
== S_OK
, "got %x\n", hr
);
175 ok( count
== 1, "got %u\n", count
);
177 str
= SysAllocString( manufacturerW
);
179 hr
= IDispatch_GetIDsOfNames( dispatch
, &IID_NULL
, &str
, 1, english
, &dispid
);
180 SysFreeString( str
);
181 ok( hr
== S_OK
, "got %x\n", hr
);
182 ok( dispid
== 0x1800001 || dispid
== 0x10b /* win2k */, "got %x\n", dispid
);
184 str
= SysAllocString( versionW
);
186 hr
= IDispatch_GetIDsOfNames( dispatch
, &IID_NULL
, &str
, 1, english
, &dispid
);
187 SysFreeString( str
);
188 ok( hr
== S_OK
, "got %x\n", hr
);
189 ok( dispid
== 0x1800002 || dispid
== 0x119 /* win2k */, "got %x\n", dispid
);
191 str
= SysAllocString( nosuchW
);
193 hr
= IDispatch_GetIDsOfNames( dispatch
, &IID_NULL
, &str
, 1, english
, &dispid
);
194 SysFreeString( str
);
195 ok( hr
== DISP_E_UNKNOWNNAME
, "got %x\n", hr
);
196 ok( dispid
== DISPID_UNKNOWN
, "got %x\n", dispid
);
198 str
= SysAllocString( manufacturerW
);
200 hr
= IDispatch_GetIDsOfNames( dispatch
, &IID_NULL
, &str
, 1, english
, &dispid
);
201 SysFreeString( str
);
202 ok( hr
== S_OK
, "got %x\n", hr
);
203 ok( dispid
== 0x1800001 || dispid
== 0x10b /* win2k */, "got %x\n", dispid
);
205 if (dispid
== 0x1800001) /* crashes on win2k */
207 V_VT( &res
) = VT_ERROR
;
208 V_BSTR( &res
) = (BSTR
)0xdeadbeef;
209 params
.rgvarg
= (VARIANTARG
*)0xdeadbeef;
210 params
.rgdispidNamedArgs
= (DISPID
*)0xdeadbeef;
211 params
.cArgs
= params
.cNamedArgs
= 0xdeadbeef;
212 arg_err
= 0xdeadbeef;
213 hr
= IDispatch_Invoke( dispatch
, DISPID_UNKNOWN
, &IID_NULL
, english
,
214 DISPATCH_METHOD
|DISPATCH_PROPERTYGET
,
215 ¶ms
, &res
, NULL
, &arg_err
);
216 ok( hr
== DISP_E_MEMBERNOTFOUND
|| hr
== S_OK
/* winxp */, "got %x\n", hr
);
217 ok( params
.rgvarg
== (VARIANTARG
*)0xdeadbeef, "got %p\n", params
.rgvarg
);
218 ok( params
.rgdispidNamedArgs
== (DISPID
*)0xdeadbeef, "got %p\n", params
.rgdispidNamedArgs
);
219 ok( params
.cArgs
== 0xdeadbeef, "got %u\n", params
.cArgs
);
220 ok( params
.cNamedArgs
== 0xdeadbeef, "got %u\n", params
.cNamedArgs
);
221 ok( V_VT( &res
) == VT_ERROR
, "got %u\n", V_VT( &res
) );
222 ok( V_ERROR( &res
) == 0xdeadbeef, "got %u\n", V_VT( &res
) );
223 ok( arg_err
== 0xdeadbeef, "got %u\n", arg_err
);
224 if (hr
== S_OK
) VariantClear( &res
);
227 V_VT( &res
) = VT_ERROR
;
228 V_BSTR( &res
) = (BSTR
)0xdeadbeef;
229 memset( ¶ms
, 0, sizeof(params
) );
230 hr
= IDispatch_Invoke( dispatch
, dispid
, &IID_NULL
, english
,
231 DISPATCH_METHOD
|DISPATCH_PROPERTYGET
,
232 ¶ms
, &res
, NULL
, NULL
);
233 ok( hr
== S_OK
, "got %x\n", hr
);
234 ok( params
.rgvarg
== NULL
, "got %p\n", params
.rgvarg
);
235 ok( params
.rgdispidNamedArgs
== NULL
, "got %p\n", params
.rgdispidNamedArgs
);
236 ok( !params
.cArgs
, "got %u\n", params
.cArgs
);
237 ok( !params
.cNamedArgs
, "got %u\n", params
.cNamedArgs
);
238 ok( V_VT( &res
) == VT_BSTR
, "got %u\n", V_VT( &res
) );
239 ok( V_BSTR( &res
) != (BSTR
)0xdeadbeef, "got %u\n", V_VT( &res
) );
240 VariantClear( &res
);
241 VariantClear( &var
);
243 fetched
= 0xdeadbeef;
244 hr
= IEnumVARIANT_Next( enumvar
, 1, &var
, &fetched
);
245 ok( hr
== S_FALSE
, "got %x\n", hr
);
246 ok( !fetched
, "got %u\n", fetched
);
248 IEnumVARIANT_Release( enumvar
);
250 IUnknown_Release( obj
);
252 ISWbemObjectSet_Release( objectset
);
254 IUnknown_Release( services
);
256 IMoniker_Release( moniker
);
259 IBindCtx_Release( ctx
);
261 hr
= CreateBindCtx( 0, &ctx
);
262 ok( hr
== S_OK
, "got %x\n", hr
);
264 str
= SysAllocString( stdregprovW
);
265 hr
= IParseDisplayName_ParseDisplayName( displayname
, NULL
, str
, &eaten
, &moniker
);
266 ok( hr
== S_OK
, "got %x\n", hr
);
267 SysFreeString( str
);
271 ISWbemObject
*sobj
= NULL
;
273 hr
= IMoniker_GetClassID( moniker
, &clsid
);
274 ok( hr
== S_OK
, "%u: got %x\n", i
, hr
);
275 ok( IsEqualCLSID( &clsid
, &CLSID_PointerMoniker
), "got %s\n", wine_dbgstr_guid( &clsid
) );
277 hr
= IMoniker_BindToObject( moniker
, ctx
, NULL
, &IID_ISWbemObject
, (void **)&sobj
);
278 ok( hr
== S_OK
, "got %x\n",hr
);
281 DISPID dispid
= 0xdeadbeef;
283 str
= SysAllocString( getstringvalueW
);
284 hr
= ISWbemObject_GetIDsOfNames( sobj
, &IID_NULL
, &str
, 1, english
, &dispid
);
285 ok( hr
== S_OK
, "got %x\n", hr
);
286 ok( dispid
== 0x1000001, "got %x\n", dispid
);
288 ISWbemObject_Release( sobj
);
289 SysFreeString( str
);
291 IMoniker_Release( moniker
);
294 IBindCtx_Release(ctx
);
295 IParseDisplayName_Release( displayname
);
298 static const WCHAR localhost
[] = {'l','o','c','a','l','h','o','s','t',0};
299 static const WCHAR root
[] = {'r','o','o','t','\\','C','I','M','V','2',0};
300 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',
301 ' ','W','i','n','3','2','_','P','r','o','c','e','s','s','o','r',0};
302 static const WCHAR lang
[] = {'W','Q','L',0};
303 static const WCHAR props
[] = {'P','r','o','p','e','r','t','i','e','s','_',0};
304 static const WCHAR procid
[] = {'P','r','o','c','e','s','s','o','r','I','d',0};
306 static void test_locator(void)
310 BSTR host_bstr
, root_bstr
, query_bstr
, lang_bstr
, props_bstr
, procid_bstr
;
311 ISWbemLocator
*locator
;
312 ISWbemServices
*services
;
313 ISWbemObjectSet
*object_set
;
314 IEnumVARIANT
*enum_var
;
315 ISWbemObject
*object
;
316 ISWbemPropertySet
*prop_set
;
317 ISWbemProperty
*prop
;
318 ISWbemSecurity
*security
;
321 WbemImpersonationLevelEnum imp_level
;
322 WbemAuthenticationLevelEnum auth_level
;
324 hr
= CoCreateInstance( &CLSID_SWbemLocator
, NULL
, CLSCTX_INPROC_SERVER
, &IID_ISWbemLocator
, (void **)&locator
);
325 ok( hr
== S_OK
, "got %x\n", hr
);
327 host_bstr
= SysAllocString(localhost
);
328 root_bstr
= SysAllocString(root
);
329 hr
= ISWbemLocator_ConnectServer( locator
, host_bstr
, root_bstr
, NULL
, NULL
, NULL
, NULL
, 0, NULL
, &services
);
330 ok( hr
== S_OK
, "got %x\n", hr
);
331 SysFreeString( root_bstr
);
332 SysFreeString( host_bstr
);
334 query_bstr
= SysAllocString(query
);
335 lang_bstr
= SysAllocString(lang
);
336 hr
= ISWbemServices_ExecQuery( services
, query_bstr
, lang_bstr
, wbemFlagForwardOnly
, NULL
, &object_set
);
337 ok( hr
== S_OK
, "got %x\n", hr
);
338 SysFreeString( lang_bstr
);
339 SysFreeString( query_bstr
);
341 hr
= ISWbemLocator_get_Security_( locator
, &security
);
342 ok( hr
== S_OK
, "got %x\n", hr
);
343 imp_level
= 0xdeadbeef;
344 hr
= ISWbemSecurity_get_ImpersonationLevel( security
, &imp_level
);
345 ok( hr
== S_OK
, "got %x\n", hr
);
346 ok( imp_level
== wbemImpersonationLevelImpersonate
, "got %u\n", imp_level
);
347 hr
= ISWbemSecurity_put_ImpersonationLevel( security
, wbemImpersonationLevelAnonymous
);
348 ok( hr
== S_OK
, "got %x\n", hr
);
349 imp_level
= 0xdeadbeef;
350 hr
= ISWbemSecurity_get_ImpersonationLevel( security
, &imp_level
);
351 ok( hr
== S_OK
, "got %x\n", hr
);
352 ok( imp_level
== wbemImpersonationLevelAnonymous
, "got %u\n", imp_level
);
354 auth_level
= 0xdeadbeef;
355 hr
= ISWbemSecurity_get_AuthenticationLevel( security
, &auth_level
);
357 ok( hr
== WBEM_E_FAILED
, "got %x\n", hr
);
358 ok( auth_level
== 0xdeadbeef, "got %u\n", auth_level
);
360 hr
= ISWbemSecurity_put_AuthenticationLevel( security
, wbemAuthenticationLevelNone
);
361 ok( hr
== S_OK
, "got %x\n", hr
);
362 auth_level
= 0xdeadbeef;
363 hr
= ISWbemSecurity_get_AuthenticationLevel( security
, &auth_level
);
364 ok( hr
== S_OK
, "got %x\n", hr
);
365 ok( auth_level
== wbemAuthenticationLevelNone
, "got %u\n", auth_level
);
366 ISWbemSecurity_Release( security
);
369 hr
= ISWbemObjectSet_get__NewEnum( object_set
, (IUnknown
**)&enum_var
);
370 ok( hr
== S_OK
, "got %x\n", hr
);
373 hr
= IEnumVARIANT_Next( enum_var
, 1, &var
, NULL
);
374 ok( hr
== S_OK
, "got %x\n", hr
);
375 ok( V_VT(&var
) == VT_DISPATCH
, "got %x\n", V_VT(&var
));
377 props_bstr
= SysAllocString( props
);
378 hr
= IDispatch_GetIDsOfNames( V_DISPATCH(&var
), &IID_NULL
, &props_bstr
, 1, english
, &id
);
379 ok( hr
== S_OK
, "got %x\n", hr
);
380 ok( id
== 21, "got %d\n", id
);
382 hr
= IDispatch_QueryInterface( V_DISPATCH(&var
), &IID_ISWbemObject
, (void**)&object
);
383 ok( hr
== S_OK
, "got %x\n", hr
);
384 VariantClear( &var
);
386 hr
= ISWbemObject_get_Properties_( object
, &prop_set
);
387 ok( hr
== S_OK
, "got %x\n", hr
);
389 hr
= ISWbemPropertySet_Item( prop_set
, props_bstr
, 0, &prop
);
390 ok( hr
== WBEM_E_NOT_FOUND
, "got %x\n", hr
);
391 SysFreeString( props_bstr
);
393 procid_bstr
= SysAllocString( procid
);
394 hr
= ISWbemPropertySet_Item( prop_set
, procid_bstr
, 0, &prop
);
395 ok( hr
== S_OK
, "got %x\n", hr
);
396 SysFreeString( procid_bstr
);
399 hr
= ISWbemPropertySet_get_Count( prop_set
, &count
);
400 ok( hr
== S_OK
, "got %x\n", hr
);
401 ok( count
> 0, "got %d\n", count
);
403 hr
= ISWbemProperty_get_Value( prop
, &var
);
404 ok( hr
== S_OK
, "got %x\n", hr
);
405 ok( V_VT(&var
) == VT_BSTR
, "got %x\n", V_VT(&var
) );
406 VariantClear( &var
);
408 hr
= ISWbemServices_get_Security_( services
, &security
);
409 ok( hr
== S_OK
, "got %x\n", hr
);
410 imp_level
= 0xdeadbeef;
411 hr
= ISWbemSecurity_get_ImpersonationLevel( security
, &imp_level
);
412 ok( hr
== S_OK
, "got %x\n", hr
);
413 ok( imp_level
== wbemImpersonationLevelImpersonate
, "got %u\n", imp_level
);
414 auth_level
= 0xdeadbeef;
415 hr
= ISWbemSecurity_get_AuthenticationLevel( security
, &auth_level
);
416 ok( hr
== S_OK
, "got %x\n", hr
);
417 ok( auth_level
== wbemAuthenticationLevelPktPrivacy
, "got %u\n", auth_level
);
419 ISWbemSecurity_Release(security
);
420 ISWbemProperty_Release( prop
);
421 ISWbemPropertySet_Release( prop_set
);
422 ISWbemObject_Release( object
);
423 IEnumVARIANT_Release( enum_var
);
424 ISWbemObjectSet_Release( object_set
);
425 ISWbemServices_Release( services
);
426 ISWbemLocator_Release( locator
);
431 CoInitialize( NULL
);
433 test_ParseDisplayName();