2 * Copyright 2013 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
19 #include "wbemdisp_private.h"
23 static HRESULT
EnumVARIANT_create( IEnumWbemClassObject
*, IEnumVARIANT
** );
24 static HRESULT
ISWbemSecurity_create( ISWbemSecurity
** );
32 ISWbemPropertySet_tid
,
38 static ITypeLib
*wbemdisp_typelib
;
39 static ITypeInfo
*wbemdisp_typeinfo
[last_tid
];
41 static REFIID wbemdisp_tid_id
[] =
47 &IID_ISWbemPropertySet
,
52 static HRESULT
get_typeinfo( enum type_id tid
, ITypeInfo
**ret
)
56 if (!wbemdisp_typelib
)
60 hr
= LoadRegTypeLib( &LIBID_WbemScripting
, 1, 2, LOCALE_SYSTEM_DEFAULT
, &typelib
);
63 ERR( "LoadRegTypeLib failed: %08x\n", hr
);
66 if (InterlockedCompareExchangePointer( (void **)&wbemdisp_typelib
, typelib
, NULL
))
67 ITypeLib_Release( typelib
);
69 if (!wbemdisp_typeinfo
[tid
])
73 hr
= ITypeLib_GetTypeInfoOfGuid( wbemdisp_typelib
, wbemdisp_tid_id
[tid
], &typeinfo
);
76 ERR( "GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(wbemdisp_tid_id
[tid
]), hr
);
79 if (InterlockedCompareExchangePointer( (void **)(wbemdisp_typeinfo
+ tid
), typeinfo
, NULL
))
80 ITypeInfo_Release( typeinfo
);
82 *ret
= wbemdisp_typeinfo
[tid
];
83 ITypeInfo_AddRef( *ret
);
89 ISWbemProperty ISWbemProperty_iface
;
91 IWbemClassObject
*object
;
95 static inline struct property
*impl_from_ISWbemProperty( ISWbemProperty
*iface
)
97 return CONTAINING_RECORD( iface
, struct property
, ISWbemProperty_iface
);
100 static ULONG WINAPI
property_AddRef( ISWbemProperty
*iface
)
102 struct property
*property
= impl_from_ISWbemProperty( iface
);
103 return InterlockedIncrement( &property
->refs
);
106 static ULONG WINAPI
property_Release( ISWbemProperty
*iface
)
108 struct property
*property
= impl_from_ISWbemProperty( iface
);
109 LONG refs
= InterlockedDecrement( &property
->refs
);
112 TRACE( "destroying %p\n", property
);
113 IWbemClassObject_Release( property
->object
);
114 SysFreeString( property
->name
);
115 heap_free( property
);
120 static HRESULT WINAPI
property_QueryInterface( ISWbemProperty
*iface
, REFIID riid
, void **obj
)
122 struct property
*property
= impl_from_ISWbemProperty( iface
);
124 TRACE( "%p %s %p\n", property
, debugstr_guid(riid
), obj
);
126 if (IsEqualGUID( riid
, &IID_ISWbemProperty
) ||
127 IsEqualGUID( riid
, &IID_IDispatch
) ||
128 IsEqualGUID( riid
, &IID_IUnknown
))
134 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
135 return E_NOINTERFACE
;
137 ISWbemProperty_AddRef( iface
);
141 static HRESULT WINAPI
property_GetTypeInfoCount( ISWbemProperty
*iface
, UINT
*count
)
143 struct property
*property
= impl_from_ISWbemProperty( iface
);
144 TRACE( "%p, %p\n", property
, count
);
149 static HRESULT WINAPI
property_GetTypeInfo( ISWbemProperty
*iface
, UINT index
,
150 LCID lcid
, ITypeInfo
**info
)
152 struct property
*property
= impl_from_ISWbemProperty( iface
);
153 TRACE( "%p, %u, %u, %p\n", property
, index
, lcid
, info
);
155 return get_typeinfo( ISWbemProperty_tid
, info
);
158 static HRESULT WINAPI
property_GetIDsOfNames( ISWbemProperty
*iface
, REFIID riid
, LPOLESTR
*names
,
159 UINT count
, LCID lcid
, DISPID
*dispid
)
161 struct property
*property
= impl_from_ISWbemProperty( iface
);
165 TRACE( "%p, %s, %p, %u, %u, %p\n", property
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
167 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
169 hr
= get_typeinfo( ISWbemProperty_tid
, &typeinfo
);
172 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
173 ITypeInfo_Release( typeinfo
);
178 static HRESULT WINAPI
property_Invoke( ISWbemProperty
*iface
, DISPID member
, REFIID riid
,
179 LCID lcid
, WORD flags
, DISPPARAMS
*params
,
180 VARIANT
*result
, EXCEPINFO
*excep_info
, UINT
*arg_err
)
182 struct property
*property
= impl_from_ISWbemProperty( iface
);
186 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", property
, member
, debugstr_guid(riid
),
187 lcid
, flags
, params
, result
, excep_info
, arg_err
);
189 hr
= get_typeinfo( ISWbemProperty_tid
, &typeinfo
);
192 hr
= ITypeInfo_Invoke( typeinfo
, &property
->ISWbemProperty_iface
, member
, flags
,
193 params
, result
, excep_info
, arg_err
);
194 ITypeInfo_Release( typeinfo
);
199 static HRESULT WINAPI
property_get_Value( ISWbemProperty
*iface
, VARIANT
*value
)
201 struct property
*property
= impl_from_ISWbemProperty( iface
);
203 TRACE( "%p %p\n", property
, value
);
205 return IWbemClassObject_Get( property
->object
, property
->name
, 0, value
, NULL
, NULL
);
208 static HRESULT WINAPI
property_put_Value( ISWbemProperty
*iface
, VARIANT
*varValue
)
214 static HRESULT WINAPI
property_get_Name( ISWbemProperty
*iface
, BSTR
*strName
)
220 static HRESULT WINAPI
property_get_IsLocal( ISWbemProperty
*iface
, VARIANT_BOOL
*bIsLocal
)
226 static HRESULT WINAPI
property_get_Origin( ISWbemProperty
*iface
, BSTR
*strOrigin
)
232 static HRESULT WINAPI
property_get_CIMType( ISWbemProperty
*iface
, WbemCimtypeEnum
*iCimType
)
238 static HRESULT WINAPI
property_get_Qualifiers_( ISWbemProperty
*iface
, ISWbemQualifierSet
**objWbemQualifierSet
)
244 static HRESULT WINAPI
property_get_IsArray( ISWbemProperty
*iface
, VARIANT_BOOL
*bIsArray
)
250 static const ISWbemPropertyVtbl property_vtbl
=
252 property_QueryInterface
,
255 property_GetTypeInfoCount
,
256 property_GetTypeInfo
,
257 property_GetIDsOfNames
,
262 property_get_IsLocal
,
264 property_get_CIMType
,
265 property_get_Qualifiers_
,
269 static HRESULT
SWbemProperty_create( IWbemClassObject
*wbem_object
, BSTR name
, ISWbemProperty
**obj
)
271 struct property
*property
;
273 TRACE( "%p, %p\n", obj
, wbem_object
);
275 if (!(property
= heap_alloc( sizeof(*property
) ))) return E_OUTOFMEMORY
;
276 property
->ISWbemProperty_iface
.lpVtbl
= &property_vtbl
;
278 property
->object
= wbem_object
;
279 IWbemClassObject_AddRef( property
->object
);
280 property
->name
= SysAllocStringLen( name
, SysStringLen( name
) );
281 *obj
= &property
->ISWbemProperty_iface
;
282 TRACE( "returning iface %p\n", *obj
);
288 ISWbemPropertySet ISWbemPropertySet_iface
;
290 IWbemClassObject
*object
;
293 static inline struct propertyset
*impl_from_ISWbemPropertySet(
294 ISWbemPropertySet
*iface
)
296 return CONTAINING_RECORD( iface
, struct propertyset
, ISWbemPropertySet_iface
);
299 static ULONG WINAPI
propertyset_AddRef( ISWbemPropertySet
*iface
)
301 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
302 return InterlockedIncrement( &propertyset
->refs
);
305 static ULONG WINAPI
propertyset_Release( ISWbemPropertySet
*iface
)
307 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
308 LONG refs
= InterlockedDecrement( &propertyset
->refs
);
311 TRACE( "destroying %p\n", propertyset
);
312 IWbemClassObject_Release( propertyset
->object
);
313 heap_free( propertyset
);
318 static HRESULT WINAPI
propertyset_QueryInterface( ISWbemPropertySet
*iface
,
319 REFIID riid
, void **obj
)
321 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
323 TRACE( "%p %s %p\n", propertyset
, debugstr_guid(riid
), obj
);
325 if (IsEqualGUID( riid
, &IID_ISWbemPropertySet
) ||
326 IsEqualGUID( riid
, &IID_IDispatch
) ||
327 IsEqualGUID( riid
, &IID_IUnknown
))
333 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
334 return E_NOINTERFACE
;
336 ISWbemPropertySet_AddRef( iface
);
340 static HRESULT WINAPI
propertyset_GetTypeInfoCount( ISWbemPropertySet
*iface
, UINT
*count
)
342 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
343 TRACE( "%p, %p\n", propertyset
, count
);
348 static HRESULT WINAPI
propertyset_GetTypeInfo( ISWbemPropertySet
*iface
,
349 UINT index
, LCID lcid
, ITypeInfo
**info
)
351 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
352 TRACE( "%p, %u, %u, %p\n", propertyset
, index
, lcid
, info
);
354 return get_typeinfo( ISWbemPropertySet_tid
, info
);
357 static HRESULT WINAPI
propertyset_GetIDsOfNames( ISWbemPropertySet
*iface
, REFIID riid
, LPOLESTR
*names
,
358 UINT count
, LCID lcid
, DISPID
*dispid
)
360 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
364 TRACE( "%p, %s, %p, %u, %u, %p\n", propertyset
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
366 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
368 hr
= get_typeinfo( ISWbemPropertySet_tid
, &typeinfo
);
371 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
372 ITypeInfo_Release( typeinfo
);
377 static HRESULT WINAPI
propertyset_Invoke( ISWbemPropertySet
*iface
, DISPID member
, REFIID riid
,
378 LCID lcid
, WORD flags
, DISPPARAMS
*params
,
379 VARIANT
*result
, EXCEPINFO
*excep_info
, UINT
*arg_err
)
381 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
385 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", propertyset
, member
, debugstr_guid(riid
),
386 lcid
, flags
, params
, result
, excep_info
, arg_err
);
388 hr
= get_typeinfo( ISWbemPropertySet_tid
, &typeinfo
);
391 hr
= ITypeInfo_Invoke( typeinfo
, &propertyset
->ISWbemPropertySet_iface
, member
, flags
,
392 params
, result
, excep_info
, arg_err
);
393 ITypeInfo_Release( typeinfo
);
398 static HRESULT WINAPI
propertyset_get__NewEnum( ISWbemPropertySet
*iface
, IUnknown
**unk
)
404 static HRESULT WINAPI
propertyset_Item( ISWbemPropertySet
*iface
, BSTR name
,
405 LONG flags
, ISWbemProperty
**prop
)
407 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
411 TRACE( "%p, %s, %08x, %p\n", propertyset
, debugstr_w(name
), flags
, prop
);
413 hr
= IWbemClassObject_Get( propertyset
->object
, name
, 0, &var
, NULL
, NULL
);
416 hr
= SWbemProperty_create( propertyset
->object
, name
, prop
);
417 VariantClear( &var
);
422 static HRESULT WINAPI
propertyset_get_Count( ISWbemPropertySet
*iface
, LONG
*count
)
428 static HRESULT WINAPI
propertyset_Add( ISWbemPropertySet
*iface
, BSTR name
, WbemCimtypeEnum type
,
429 VARIANT_BOOL is_array
, LONG flags
, ISWbemProperty
**prop
)
435 static HRESULT WINAPI
propertyset_Remove( ISWbemPropertySet
*iface
, BSTR name
, LONG flags
)
441 static const ISWbemPropertySetVtbl propertyset_vtbl
=
443 propertyset_QueryInterface
,
446 propertyset_GetTypeInfoCount
,
447 propertyset_GetTypeInfo
,
448 propertyset_GetIDsOfNames
,
450 propertyset_get__NewEnum
,
452 propertyset_get_Count
,
457 static HRESULT
SWbemPropertySet_create( IWbemClassObject
*wbem_object
, ISWbemPropertySet
**obj
)
459 struct propertyset
*propertyset
;
461 TRACE( "%p, %p\n", obj
, wbem_object
);
463 if (!(propertyset
= heap_alloc( sizeof(*propertyset
) ))) return E_OUTOFMEMORY
;
464 propertyset
->ISWbemPropertySet_iface
.lpVtbl
= &propertyset_vtbl
;
465 propertyset
->refs
= 1;
466 propertyset
->object
= wbem_object
;
467 IWbemClassObject_AddRef( propertyset
->object
);
468 *obj
= &propertyset
->ISWbemPropertySet_iface
;
470 TRACE( "returning iface %p\n", *obj
);
474 #define DISPID_BASE 0x1800000
484 ISWbemObject ISWbemObject_iface
;
486 IWbemClassObject
*object
;
487 struct member
*members
;
492 static inline struct object
*impl_from_ISWbemObject(
493 ISWbemObject
*iface
)
495 return CONTAINING_RECORD( iface
, struct object
, ISWbemObject_iface
);
498 static ULONG WINAPI
object_AddRef(
499 ISWbemObject
*iface
)
501 struct object
*object
= impl_from_ISWbemObject( iface
);
502 return InterlockedIncrement( &object
->refs
);
505 static ULONG WINAPI
object_Release(
506 ISWbemObject
*iface
)
508 struct object
*object
= impl_from_ISWbemObject( iface
);
509 LONG refs
= InterlockedDecrement( &object
->refs
);
514 TRACE( "destroying %p\n", object
);
515 IWbemClassObject_Release( object
->object
);
516 for (i
= 0; i
< object
->nb_members
; i
++) SysFreeString( object
->members
[i
].name
);
517 heap_free( object
->members
);
523 static HRESULT WINAPI
object_QueryInterface(
528 struct object
*object
= impl_from_ISWbemObject( iface
);
530 TRACE( "%p %s %p\n", object
, debugstr_guid(riid
), ppvObject
);
532 if (IsEqualGUID( riid
, &IID_ISWbemObject
) ||
533 IsEqualGUID( riid
, &IID_IDispatch
) ||
534 IsEqualGUID( riid
, &IID_IUnknown
))
540 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
541 return E_NOINTERFACE
;
543 ISWbemObject_AddRef( iface
);
547 static HRESULT WINAPI
object_GetTypeInfoCount(
551 struct object
*object
= impl_from_ISWbemObject( iface
);
553 TRACE( "%p, %p\n", object
, count
);
558 static HRESULT WINAPI
object_GetTypeInfo(
564 struct object
*object
= impl_from_ISWbemObject( iface
);
565 FIXME( "%p, %u, %u, %p\n", object
, index
, lcid
, info
);
569 static HRESULT
init_members( struct object
*object
)
575 if (object
->members
) return S_OK
;
577 hr
= IWbemClassObject_GetNames( object
->object
, NULL
, 0, NULL
, &sa
);
578 if (FAILED( hr
)) return hr
;
579 hr
= SafeArrayGetUBound( sa
, 1, &bound
);
582 SafeArrayDestroy( sa
);
585 if (!(object
->members
= heap_alloc( sizeof(struct member
) * (bound
+ 1) )))
587 SafeArrayDestroy( sa
);
588 return E_OUTOFMEMORY
;
590 for (i
= 0; i
<= bound
; i
++)
592 hr
= SafeArrayGetElement( sa
, &i
, &object
->members
[i
].name
);
595 for (i
--; i
>= 0; i
--) SysFreeString( object
->members
[i
].name
);
596 SafeArrayDestroy( sa
);
597 heap_free( object
->members
);
598 object
->members
= NULL
;
599 return E_OUTOFMEMORY
;
601 object
->members
[i
].dispid
= 0;
603 object
->nb_members
= bound
+ 1;
604 SafeArrayDestroy( sa
);
608 static DISPID
get_member_dispid( struct object
*object
, const WCHAR
*name
)
611 for (i
= 0; i
< object
->nb_members
; i
++)
613 if (!strcmpiW( object
->members
[i
].name
, name
))
615 if (!object
->members
[i
].dispid
) object
->members
[i
].dispid
= ++object
->last_dispid
;
616 return object
->members
[i
].dispid
;
619 return DISPID_UNKNOWN
;
622 static HRESULT WINAPI
object_GetIDsOfNames(
630 struct object
*object
= impl_from_ISWbemObject( iface
);
635 TRACE( "%p, %s, %p, %u, %u, %p\n", object
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
637 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
639 hr
= init_members( object
);
640 if (FAILED( hr
)) return hr
;
642 hr
= get_typeinfo( ISWbemObject_tid
, &typeinfo
);
645 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
646 ITypeInfo_Release( typeinfo
);
648 if (SUCCEEDED(hr
)) return hr
;
650 for (i
= 0; i
< count
; i
++)
652 if ((dispid
[i
] = get_member_dispid( object
, names
[i
] )) == DISPID_UNKNOWN
) break;
654 if (i
!= count
) return DISP_E_UNKNOWNNAME
;
658 static BSTR
get_member_name( struct object
*object
, DISPID dispid
)
661 for (i
= 0; i
< object
->nb_members
; i
++)
663 if (object
->members
[i
].dispid
== dispid
) return object
->members
[i
].name
;
668 static HRESULT WINAPI
object_Invoke(
676 EXCEPINFO
*excep_info
,
679 struct object
*object
= impl_from_ISWbemObject( iface
);
684 TRACE( "%p, %x, %s, %u, %x, %p, %p, %p, %p\n", object
, member
, debugstr_guid(riid
),
685 lcid
, flags
, params
, result
, excep_info
, arg_err
);
687 if (member
<= DISPID_BASE
)
689 hr
= get_typeinfo( ISWbemObject_tid
, &typeinfo
);
692 hr
= ITypeInfo_Invoke( typeinfo
, &object
->ISWbemObject_iface
, member
, flags
,
693 params
, result
, excep_info
, arg_err
);
694 ITypeInfo_Release( typeinfo
);
699 if (flags
!= (DISPATCH_METHOD
|DISPATCH_PROPERTYGET
))
701 FIXME( "flags %x not supported\n", flags
);
704 if (!(name
= get_member_name( object
, member
)))
705 return DISP_E_MEMBERNOTFOUND
;
707 memset( params
, 0, sizeof(*params
) );
708 return IWbemClassObject_Get( object
->object
, name
, 0, result
, NULL
, NULL
);
711 static HRESULT WINAPI
object_Put_(
714 IDispatch
*objWbemNamedValueSet
,
715 ISWbemObjectPath
**objWbemObjectPath
)
721 static HRESULT WINAPI
object_PutAsync_(
723 IDispatch
*objWbemSink
,
725 IDispatch
*objWbemNamedValueSet
,
726 IDispatch
*objWbemAsyncContext
)
732 static HRESULT WINAPI
object_Delete_(
735 IDispatch
*objWbemNamedValueSet
)
741 static HRESULT WINAPI
object_DeleteAsync_(
743 IDispatch
*objWbemSink
,
745 IDispatch
*objWbemNamedValueSet
,
746 IDispatch
*objWbemAsyncContext
)
752 static HRESULT WINAPI
object_Instances_(
755 IDispatch
*objWbemNamedValueSet
,
756 ISWbemObjectSet
**objWbemObjectSet
)
762 static HRESULT WINAPI
object_InstancesAsync_(
764 IDispatch
*objWbemSink
,
766 IDispatch
*objWbemNamedValueSet
,
767 IDispatch
*objWbemAsyncContext
)
773 static HRESULT WINAPI
object_Subclasses_(
776 IDispatch
*objWbemNamedValueSet
,
777 ISWbemObjectSet
**objWbemObjectSet
)
783 static HRESULT WINAPI
object_SubclassesAsync_(
785 IDispatch
*objWbemSink
,
787 IDispatch
*objWbemNamedValueSet
,
788 IDispatch
*objWbemAsyncContext
)
794 static HRESULT WINAPI
object_Associators_(
800 VARIANT_BOOL bClassesOnly
,
801 VARIANT_BOOL bSchemaOnly
,
802 BSTR strRequiredAssocQualifier
,
803 BSTR strRequiredQualifier
,
805 IDispatch
*objWbemNamedValueSet
,
806 ISWbemObjectSet
**objWbemObjectSet
)
812 static HRESULT WINAPI
object_AssociatorsAsync_(
814 IDispatch
*objWbemSink
,
819 VARIANT_BOOL bClassesOnly
,
820 VARIANT_BOOL bSchemaOnly
,
821 BSTR strRequiredAssocQualifier
,
822 BSTR strRequiredQualifier
,
824 IDispatch
*objWbemNamedValueSet
,
825 IDispatch
*objWbemAsyncContext
)
831 static HRESULT WINAPI
object_References_(
835 VARIANT_BOOL bClassesOnly
,
836 VARIANT_BOOL bSchemaOnly
,
837 BSTR strRequiredQualifier
,
839 IDispatch
*objWbemNamedValueSet
,
840 ISWbemObjectSet
**objWbemObjectSet
)
846 static HRESULT WINAPI
object_ReferencesAsync_(
848 IDispatch
*objWbemSink
,
851 VARIANT_BOOL bClassesOnly
,
852 VARIANT_BOOL bSchemaOnly
,
853 BSTR strRequiredQualifier
,
855 IDispatch
*objWbemNamedValueSet
,
856 IDispatch
*objWbemAsyncContext
)
862 static HRESULT WINAPI
object_ExecMethod_(
865 IDispatch
*objWbemInParameters
,
867 IDispatch
*objWbemNamedValueSet
,
868 ISWbemObject
**objWbemOutParameters
)
874 static HRESULT WINAPI
object_ExecMethodAsync_(
876 IDispatch
*objWbemSink
,
878 IDispatch
*objWbemInParameters
,
880 IDispatch
*objWbemNamedValueSet
,
881 IDispatch
*objWbemAsyncContext
)
887 static HRESULT WINAPI
object_Clone_(
889 ISWbemObject
**objWbemObject
)
895 static HRESULT WINAPI
object_GetObjectText_(
898 BSTR
*strObjectText
)
904 static HRESULT WINAPI
object_SpawnDerivedClass_(
907 ISWbemObject
**objWbemObject
)
913 static HRESULT WINAPI
object_SpawnInstance_(
916 ISWbemObject
**objWbemObject
)
922 static HRESULT WINAPI
object_CompareTo_(
924 IDispatch
*objWbemObject
,
926 VARIANT_BOOL
*bResult
)
932 static HRESULT WINAPI
object_get_Qualifiers_(
934 ISWbemQualifierSet
**objWbemQualifierSet
)
940 static HRESULT WINAPI
object_get_Properties_( ISWbemObject
*iface
, ISWbemPropertySet
**prop_set
)
942 struct object
*object
= impl_from_ISWbemObject( iface
);
944 TRACE( "%p, %p\n", object
, prop_set
);
945 return SWbemPropertySet_create( object
->object
, prop_set
);
948 static HRESULT WINAPI
object_get_Methods_(
950 ISWbemMethodSet
**objWbemMethodSet
)
956 static HRESULT WINAPI
object_get_Derivation_(
958 VARIANT
*strClassNameArray
)
964 static HRESULT WINAPI
object_get_Path_(
966 ISWbemObjectPath
**objWbemObjectPath
)
972 static HRESULT WINAPI
object_get_Security_(
974 ISWbemSecurity
**objWbemSecurity
)
980 static const ISWbemObjectVtbl object_vtbl
=
982 object_QueryInterface
,
985 object_GetTypeInfoCount
,
987 object_GetIDsOfNames
,
994 object_InstancesAsync_
,
996 object_SubclassesAsync_
,
998 object_AssociatorsAsync_
,
1000 object_ReferencesAsync_
,
1002 object_ExecMethodAsync_
,
1004 object_GetObjectText_
,
1005 object_SpawnDerivedClass_
,
1006 object_SpawnInstance_
,
1008 object_get_Qualifiers_
,
1009 object_get_Properties_
,
1010 object_get_Methods_
,
1011 object_get_Derivation_
,
1013 object_get_Security_
1016 static HRESULT
SWbemObject_create( IWbemClassObject
*wbem_object
, ISWbemObject
**obj
)
1018 struct object
*object
;
1020 TRACE( "%p, %p\n", obj
, wbem_object
);
1022 if (!(object
= heap_alloc( sizeof(*object
) ))) return E_OUTOFMEMORY
;
1023 object
->ISWbemObject_iface
.lpVtbl
= &object_vtbl
;
1025 object
->object
= wbem_object
;
1026 IWbemClassObject_AddRef( object
->object
);
1027 object
->members
= NULL
;
1028 object
->nb_members
= 0;
1029 object
->last_dispid
= DISPID_BASE
;
1031 *obj
= &object
->ISWbemObject_iface
;
1032 TRACE( "returning iface %p\n", *obj
);
1038 ISWbemObjectSet ISWbemObjectSet_iface
;
1040 IEnumWbemClassObject
*objectenum
;
1044 static inline struct objectset
*impl_from_ISWbemObjectSet(
1045 ISWbemObjectSet
*iface
)
1047 return CONTAINING_RECORD( iface
, struct objectset
, ISWbemObjectSet_iface
);
1050 static ULONG WINAPI
objectset_AddRef(
1051 ISWbemObjectSet
*iface
)
1053 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1054 return InterlockedIncrement( &objectset
->refs
);
1057 static ULONG WINAPI
objectset_Release(
1058 ISWbemObjectSet
*iface
)
1060 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1061 LONG refs
= InterlockedDecrement( &objectset
->refs
);
1064 TRACE( "destroying %p\n", objectset
);
1065 IEnumWbemClassObject_Release( objectset
->objectenum
);
1066 heap_free( objectset
);
1071 static HRESULT WINAPI
objectset_QueryInterface(
1072 ISWbemObjectSet
*iface
,
1076 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1078 TRACE( "%p %s %p\n", objectset
, debugstr_guid(riid
), ppvObject
);
1080 if (IsEqualGUID( riid
, &IID_ISWbemObjectSet
) ||
1081 IsEqualGUID( riid
, &IID_IDispatch
) ||
1082 IsEqualGUID( riid
, &IID_IUnknown
))
1088 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1089 return E_NOINTERFACE
;
1091 ISWbemObjectSet_AddRef( iface
);
1095 static HRESULT WINAPI
objectset_GetTypeInfoCount(
1096 ISWbemObjectSet
*iface
,
1099 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1100 TRACE( "%p, %p\n", objectset
, count
);
1105 static HRESULT WINAPI
objectset_GetTypeInfo(
1106 ISWbemObjectSet
*iface
,
1111 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1112 TRACE( "%p, %u, %u, %p\n", objectset
, index
, lcid
, info
);
1114 return get_typeinfo( ISWbemObjectSet_tid
, info
);
1117 static HRESULT WINAPI
objectset_GetIDsOfNames(
1118 ISWbemObjectSet
*iface
,
1125 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1126 ITypeInfo
*typeinfo
;
1129 TRACE( "%p, %s, %p, %u, %u, %p\n", objectset
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1131 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
1133 hr
= get_typeinfo( ISWbemObjectSet_tid
, &typeinfo
);
1136 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
1137 ITypeInfo_Release( typeinfo
);
1142 static HRESULT WINAPI
objectset_Invoke(
1143 ISWbemObjectSet
*iface
,
1150 EXCEPINFO
*excep_info
,
1153 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1154 ITypeInfo
*typeinfo
;
1157 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", objectset
, member
, debugstr_guid(riid
),
1158 lcid
, flags
, params
, result
, excep_info
, arg_err
);
1160 hr
= get_typeinfo( ISWbemObjectSet_tid
, &typeinfo
);
1163 hr
= ITypeInfo_Invoke( typeinfo
, &objectset
->ISWbemObjectSet_iface
, member
, flags
,
1164 params
, result
, excep_info
, arg_err
);
1165 ITypeInfo_Release( typeinfo
);
1170 static HRESULT WINAPI
objectset_get__NewEnum(
1171 ISWbemObjectSet
*iface
,
1174 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1175 IEnumWbemClassObject
*objectenum
;
1178 TRACE( "%p, %p\n", objectset
, pUnk
);
1180 hr
= IEnumWbemClassObject_Clone( objectset
->objectenum
, &objectenum
);
1181 if (FAILED( hr
)) return hr
;
1183 hr
= EnumVARIANT_create( objectenum
, (IEnumVARIANT
**)pUnk
);
1184 IEnumWbemClassObject_Release( objectenum
);
1188 static HRESULT WINAPI
objectset_Item(
1189 ISWbemObjectSet
*iface
,
1192 ISWbemObject
**objWbemObject
)
1198 static HRESULT WINAPI
objectset_get_Count(
1199 ISWbemObjectSet
*iface
,
1202 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1204 TRACE( "%p, %p\n", objectset
, iCount
);
1206 *iCount
= objectset
->count
;
1210 static HRESULT WINAPI
objectset_get_Security_(
1211 ISWbemObjectSet
*iface
,
1212 ISWbemSecurity
**objWbemSecurity
)
1218 static HRESULT WINAPI
objectset_ItemIndex(
1219 ISWbemObjectSet
*iface
,
1221 ISWbemObject
**objWbemObject
)
1223 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1226 IEnumVARIANT
*enum_var
;
1229 TRACE( "%p, %d, %p\n", objectset
, lIndex
, objWbemObject
);
1231 *objWbemObject
= NULL
;
1232 hr
= ISWbemObjectSet_get_Count( iface
, &count
);
1233 if (FAILED(hr
)) return hr
;
1235 if (lIndex
>= count
) return WBEM_E_NOT_FOUND
;
1237 hr
= ISWbemObjectSet_get__NewEnum( iface
, (IUnknown
**)&enum_var
);
1238 if (FAILED(hr
)) return hr
;
1240 IEnumVARIANT_Reset( enum_var
);
1241 hr
= IEnumVARIANT_Skip( enum_var
, lIndex
);
1243 hr
= IEnumVARIANT_Next( enum_var
, 1, &var
, NULL
);
1244 IEnumVARIANT_Release( enum_var
);
1248 if (V_VT( &var
) == VT_DISPATCH
)
1249 hr
= IDispatch_QueryInterface( V_DISPATCH( &var
), &IID_ISWbemObject
, (void **)objWbemObject
);
1251 hr
= WBEM_E_NOT_FOUND
;
1252 VariantClear( &var
);
1258 static const ISWbemObjectSetVtbl objectset_vtbl
=
1260 objectset_QueryInterface
,
1263 objectset_GetTypeInfoCount
,
1264 objectset_GetTypeInfo
,
1265 objectset_GetIDsOfNames
,
1267 objectset_get__NewEnum
,
1269 objectset_get_Count
,
1270 objectset_get_Security_
,
1274 static LONG
get_object_count( IEnumWbemClassObject
*iter
)
1277 while (IEnumWbemClassObject_Skip( iter
, WBEM_INFINITE
, 1 ) == S_OK
) count
++;
1278 IEnumWbemClassObject_Reset( iter
);
1282 static HRESULT
SWbemObjectSet_create( IEnumWbemClassObject
*wbem_objectenum
, ISWbemObjectSet
**obj
)
1284 struct objectset
*objectset
;
1286 TRACE( "%p, %p\n", obj
, wbem_objectenum
);
1288 if (!(objectset
= heap_alloc( sizeof(*objectset
) ))) return E_OUTOFMEMORY
;
1289 objectset
->ISWbemObjectSet_iface
.lpVtbl
= &objectset_vtbl
;
1290 objectset
->refs
= 1;
1291 objectset
->objectenum
= wbem_objectenum
;
1292 IEnumWbemClassObject_AddRef( objectset
->objectenum
);
1293 objectset
->count
= get_object_count( objectset
->objectenum
);
1295 *obj
= &objectset
->ISWbemObjectSet_iface
;
1296 TRACE( "returning iface %p\n", *obj
);
1302 IEnumVARIANT IEnumVARIANT_iface
;
1304 IEnumWbemClassObject
*objectenum
;
1307 static inline struct enumvar
*impl_from_IEnumVARIANT(
1308 IEnumVARIANT
*iface
)
1310 return CONTAINING_RECORD( iface
, struct enumvar
, IEnumVARIANT_iface
);
1313 static ULONG WINAPI
enumvar_AddRef(
1314 IEnumVARIANT
*iface
)
1316 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1317 return InterlockedIncrement( &enumvar
->refs
);
1320 static ULONG WINAPI
enumvar_Release(
1321 IEnumVARIANT
*iface
)
1323 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1324 LONG refs
= InterlockedDecrement( &enumvar
->refs
);
1327 TRACE( "destroying %p\n", enumvar
);
1328 IEnumWbemClassObject_Release( enumvar
->objectenum
);
1329 heap_free( enumvar
);
1334 static HRESULT WINAPI
enumvar_QueryInterface(
1335 IEnumVARIANT
*iface
,
1339 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1341 TRACE( "%p %s %p\n", enumvar
, debugstr_guid(riid
), ppvObject
);
1343 if (IsEqualGUID( riid
, &IID_IEnumVARIANT
) ||
1344 IsEqualGUID( riid
, &IID_IUnknown
))
1350 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1351 return E_NOINTERFACE
;
1353 IEnumVARIANT_AddRef( iface
);
1357 static HRESULT WINAPI
enumvar_Next( IEnumVARIANT
*iface
, ULONG celt
, VARIANT
*var
, ULONG
*fetched
)
1359 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1360 IWbemClassObject
*obj
;
1363 TRACE( "%p, %u, %p, %p\n", iface
, celt
, var
, fetched
);
1365 if (celt
) IEnumWbemClassObject_Next( enumvar
->objectenum
, WBEM_INFINITE
, 1, &obj
, &count
);
1371 hr
= SWbemObject_create( obj
, &sobj
);
1372 IWbemClassObject_Release( obj
);
1373 if (FAILED( hr
)) return hr
;
1375 V_VT( var
) = VT_DISPATCH
;
1376 V_DISPATCH( var
) = (IDispatch
*)sobj
;
1378 if (fetched
) *fetched
= count
;
1379 return (count
< celt
) ? S_FALSE
: S_OK
;
1382 static HRESULT WINAPI
enumvar_Skip( IEnumVARIANT
*iface
, ULONG celt
)
1384 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1386 TRACE( "%p, %u\n", iface
, celt
);
1388 return IEnumWbemClassObject_Skip( enumvar
->objectenum
, WBEM_INFINITE
, celt
);
1391 static HRESULT WINAPI
enumvar_Reset( IEnumVARIANT
*iface
)
1393 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1395 TRACE( "%p\n", iface
);
1397 return IEnumWbemClassObject_Reset( enumvar
->objectenum
);
1400 static HRESULT WINAPI
enumvar_Clone( IEnumVARIANT
*iface
, IEnumVARIANT
**penum
)
1402 FIXME( "%p, %p\n", iface
, penum
);
1406 static const struct IEnumVARIANTVtbl enumvar_vtbl
=
1408 enumvar_QueryInterface
,
1417 static HRESULT
EnumVARIANT_create( IEnumWbemClassObject
*objectenum
, IEnumVARIANT
**obj
)
1419 struct enumvar
*enumvar
;
1421 if (!(enumvar
= heap_alloc( sizeof(*enumvar
) ))) return E_OUTOFMEMORY
;
1422 enumvar
->IEnumVARIANT_iface
.lpVtbl
= &enumvar_vtbl
;
1424 enumvar
->objectenum
= objectenum
;
1425 IEnumWbemClassObject_AddRef( enumvar
->objectenum
);
1427 *obj
= &enumvar
->IEnumVARIANT_iface
;
1428 TRACE( "returning iface %p\n", *obj
);
1434 ISWbemServices ISWbemServices_iface
;
1436 IWbemServices
*services
;
1439 static inline struct services
*impl_from_ISWbemServices(
1440 ISWbemServices
*iface
)
1442 return CONTAINING_RECORD( iface
, struct services
, ISWbemServices_iface
);
1445 static ULONG WINAPI
services_AddRef(
1446 ISWbemServices
*iface
)
1448 struct services
*services
= impl_from_ISWbemServices( iface
);
1449 return InterlockedIncrement( &services
->refs
);
1452 static ULONG WINAPI
services_Release(
1453 ISWbemServices
*iface
)
1455 struct services
*services
= impl_from_ISWbemServices( iface
);
1456 LONG refs
= InterlockedDecrement( &services
->refs
);
1459 TRACE( "destroying %p\n", services
);
1460 IWbemServices_Release( services
->services
);
1461 heap_free( services
);
1466 static HRESULT WINAPI
services_QueryInterface(
1467 ISWbemServices
*iface
,
1471 struct services
*services
= impl_from_ISWbemServices( iface
);
1473 TRACE( "%p %s %p\n", services
, debugstr_guid(riid
), ppvObject
);
1475 if (IsEqualGUID( riid
, &IID_ISWbemServices
) ||
1476 IsEqualGUID( riid
, &IID_IDispatch
) ||
1477 IsEqualGUID( riid
, &IID_IUnknown
))
1483 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1484 return E_NOINTERFACE
;
1486 ISWbemServices_AddRef( iface
);
1490 static HRESULT WINAPI
services_GetTypeInfoCount(
1491 ISWbemServices
*iface
,
1494 struct services
*services
= impl_from_ISWbemServices( iface
);
1495 TRACE( "%p, %p\n", services
, count
);
1501 static HRESULT WINAPI
services_GetTypeInfo(
1502 ISWbemServices
*iface
,
1507 struct services
*services
= impl_from_ISWbemServices( iface
);
1508 TRACE( "%p, %u, %u, %p\n", services
, index
, lcid
, info
);
1510 return get_typeinfo( ISWbemServices_tid
, info
);
1513 static HRESULT WINAPI
services_GetIDsOfNames(
1514 ISWbemServices
*iface
,
1521 struct services
*services
= impl_from_ISWbemServices( iface
);
1522 ITypeInfo
*typeinfo
;
1525 TRACE( "%p, %s, %p, %u, %u, %p\n", services
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1527 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
1529 hr
= get_typeinfo( ISWbemServices_tid
, &typeinfo
);
1532 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
1533 ITypeInfo_Release( typeinfo
);
1538 static HRESULT WINAPI
services_Invoke(
1539 ISWbemServices
*iface
,
1546 EXCEPINFO
*excep_info
,
1549 struct services
*services
= impl_from_ISWbemServices( iface
);
1550 ITypeInfo
*typeinfo
;
1553 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", services
, member
, debugstr_guid(riid
),
1554 lcid
, flags
, params
, result
, excep_info
, arg_err
);
1556 hr
= get_typeinfo( ISWbemServices_tid
, &typeinfo
);
1559 hr
= ITypeInfo_Invoke( typeinfo
, &services
->ISWbemServices_iface
, member
, flags
,
1560 params
, result
, excep_info
, arg_err
);
1561 ITypeInfo_Release( typeinfo
);
1566 static HRESULT WINAPI
services_Get(
1567 ISWbemServices
*iface
,
1570 IDispatch
*objWbemNamedValueSet
,
1571 ISWbemObject
**objWbemObject
)
1573 struct services
*services
= impl_from_ISWbemServices( iface
);
1574 IWbemClassObject
*obj
;
1577 TRACE( "%p, %s, %d, %p, %p\n", iface
, debugstr_w(strObjectPath
), iFlags
, objWbemNamedValueSet
,
1580 if (objWbemNamedValueSet
) FIXME( "ignoring context\n" );
1582 hr
= IWbemServices_GetObject( services
->services
, strObjectPath
, iFlags
, NULL
, &obj
, NULL
);
1583 if (hr
!= S_OK
) return hr
;
1585 hr
= SWbemObject_create( obj
, objWbemObject
);
1586 IWbemClassObject_Release( obj
);
1590 static HRESULT WINAPI
services_GetAsync(
1591 ISWbemServices
*iface
,
1592 IDispatch
*objWbemSink
,
1595 IDispatch
*objWbemNamedValueSet
,
1596 IDispatch
*objWbemAsyncContext
)
1602 static HRESULT WINAPI
services_Delete(
1603 ISWbemServices
*iface
,
1606 IDispatch
*objWbemNamedValueSet
)
1612 static HRESULT WINAPI
services_DeleteAsync(
1613 ISWbemServices
* This
,
1614 IDispatch
*objWbemSink
,
1617 IDispatch
*objWbemNamedValueSet
,
1618 IDispatch
*objWbemAsyncContext
)
1624 static BSTR
build_query_string( const WCHAR
*class )
1626 static const WCHAR selectW
[] = {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',0};
1627 UINT len
= strlenW(class) + sizeof(selectW
) / sizeof(selectW
[0]);
1630 if (!(ret
= SysAllocStringLen( NULL
, len
))) return NULL
;
1631 strcpyW( ret
, selectW
);
1632 strcatW( ret
, class );
1636 static HRESULT WINAPI
services_InstancesOf(
1637 ISWbemServices
*iface
,
1640 IDispatch
*objWbemNamedValueSet
,
1641 ISWbemObjectSet
**objWbemObjectSet
)
1643 static const WCHAR wqlW
[] = {'W','Q','L',0};
1644 BSTR query
, wql
= SysAllocString( wqlW
);
1647 TRACE( "%p, %s, %x, %p, %p\n", iface
, debugstr_w(strClass
), iFlags
, objWbemNamedValueSet
,
1650 if (!(query
= build_query_string( strClass
)))
1652 SysFreeString( wql
);
1653 return E_OUTOFMEMORY
;
1655 hr
= ISWbemServices_ExecQuery( iface
, query
, wql
, iFlags
, objWbemNamedValueSet
, objWbemObjectSet
);
1656 SysFreeString( wql
);
1657 SysFreeString( query
);
1661 static HRESULT WINAPI
services_InstancesOfAsync(
1662 ISWbemServices
*iface
,
1663 IDispatch
*objWbemSink
,
1666 IDispatch
*objWbemNamedValueSet
,
1667 IDispatch
*objWbemAsyncContext
)
1673 static HRESULT WINAPI
services_SubclassesOf(
1674 ISWbemServices
*iface
,
1677 IDispatch
*objWbemNamedValueSet
,
1678 ISWbemObjectSet
**objWbemObjectSet
)
1684 static HRESULT WINAPI
services_SubclassesOfAsync(
1685 ISWbemServices
*iface
,
1686 IDispatch
*objWbemSink
,
1689 IDispatch
*objWbemNamedValueSet
,
1690 IDispatch
*objWbemAsyncContext
)
1696 static HRESULT WINAPI
services_ExecQuery(
1697 ISWbemServices
*iface
,
1699 BSTR strQueryLanguage
,
1701 IDispatch
*objWbemNamedValueSet
,
1702 ISWbemObjectSet
**objWbemObjectSet
)
1704 struct services
*services
= impl_from_ISWbemServices( iface
);
1705 IEnumWbemClassObject
*iter
;
1708 TRACE( "%p, %s, %s, %x, %p, %p\n", iface
, debugstr_w(strQuery
), debugstr_w(strQueryLanguage
),
1709 iFlags
, objWbemNamedValueSet
, objWbemObjectSet
);
1711 if (objWbemNamedValueSet
) FIXME( "ignoring context\n" );
1713 hr
= IWbemServices_ExecQuery( services
->services
, strQueryLanguage
, strQuery
, iFlags
, NULL
, &iter
);
1714 if (hr
!= S_OK
) return hr
;
1716 hr
= SWbemObjectSet_create( iter
, objWbemObjectSet
);
1717 IEnumWbemClassObject_Release( iter
);
1721 static HRESULT WINAPI
services_ExecQueryAsync(
1722 ISWbemServices
*iface
,
1723 IDispatch
*objWbemSink
,
1725 BSTR strQueryLanguage
,
1727 IDispatch
*objWbemNamedValueSet
,
1728 IDispatch
*objWbemAsyncContext
)
1734 static HRESULT WINAPI
services_AssociatorsOf(
1735 ISWbemServices
*iface
,
1738 BSTR strResultClass
,
1741 VARIANT_BOOL bClassesOnly
,
1742 VARIANT_BOOL bSchemaOnly
,
1743 BSTR strRequiredAssocQualifier
,
1744 BSTR strRequiredQualifier
,
1746 IDispatch
*objWbemNamedValueSet
,
1747 ISWbemObjectSet
**objWbemObjectSet
)
1753 static HRESULT WINAPI
services_AssociatorsOfAsync(
1754 ISWbemServices
*iface
,
1755 IDispatch
*objWbemSink
,
1758 BSTR strResultClass
,
1761 VARIANT_BOOL bClassesOnly
,
1762 VARIANT_BOOL bSchemaOnly
,
1763 BSTR strRequiredAssocQualifier
,
1764 BSTR strRequiredQualifier
,
1766 IDispatch
*objWbemNamedValueSet
,
1767 IDispatch
*objWbemAsyncContext
)
1773 static HRESULT WINAPI
services_ReferencesTo(
1774 ISWbemServices
*iface
,
1776 BSTR strResultClass
,
1778 VARIANT_BOOL bClassesOnly
,
1779 VARIANT_BOOL bSchemaOnly
,
1780 BSTR strRequiredQualifier
,
1782 IDispatch
*objWbemNamedValueSet
,
1783 ISWbemObjectSet
**objWbemObjectSet
)
1789 static HRESULT WINAPI
services_ReferencesToAsync(
1790 ISWbemServices
*iface
,
1791 IDispatch
*objWbemSink
,
1793 BSTR strResultClass
,
1795 VARIANT_BOOL bClassesOnly
,
1796 VARIANT_BOOL bSchemaOnly
,
1797 BSTR strRequiredQualifier
,
1799 IDispatch
*objWbemNamedValueSet
,
1800 IDispatch
*objWbemAsyncContext
)
1806 static HRESULT WINAPI
services_ExecNotificationQuery(
1807 ISWbemServices
*iface
,
1809 BSTR strQueryLanguage
,
1811 IDispatch
*objWbemNamedValueSet
,
1812 ISWbemEventSource
**objWbemEventSource
)
1818 static HRESULT WINAPI
services_ExecNotificationQueryAsync(
1819 ISWbemServices
*iface
,
1820 IDispatch
*objWbemSink
,
1822 BSTR strQueryLanguage
,
1824 IDispatch
*objWbemNamedValueSet
,
1825 IDispatch
*objWbemAsyncContext
)
1831 static HRESULT WINAPI
services_ExecMethod(
1832 ISWbemServices
*iface
,
1835 IDispatch
*objWbemInParameters
,
1837 IDispatch
*objWbemNamedValueSet
,
1838 ISWbemObject
**objWbemOutParameters
)
1844 static HRESULT WINAPI
services_ExecMethodAsync(
1845 ISWbemServices
*iface
,
1846 IDispatch
*objWbemSink
,
1849 IDispatch
*objWbemInParameters
,
1851 IDispatch
*objWbemNamedValueSet
,
1852 IDispatch
*objWbemAsyncContext
)
1858 static HRESULT WINAPI
services_get_Security_(
1859 ISWbemServices
*iface
,
1860 ISWbemSecurity
**objWbemSecurity
)
1862 TRACE( "%p, %p\n", iface
, objWbemSecurity
);
1864 if (!objWbemSecurity
)
1865 return E_INVALIDARG
;
1867 return ISWbemSecurity_create( objWbemSecurity
);
1870 static const ISWbemServicesVtbl services_vtbl
=
1872 services_QueryInterface
,
1875 services_GetTypeInfoCount
,
1876 services_GetTypeInfo
,
1877 services_GetIDsOfNames
,
1882 services_DeleteAsync
,
1883 services_InstancesOf
,
1884 services_InstancesOfAsync
,
1885 services_SubclassesOf
,
1886 services_SubclassesOfAsync
,
1888 services_ExecQueryAsync
,
1889 services_AssociatorsOf
,
1890 services_AssociatorsOfAsync
,
1891 services_ReferencesTo
,
1892 services_ReferencesToAsync
,
1893 services_ExecNotificationQuery
,
1894 services_ExecNotificationQueryAsync
,
1895 services_ExecMethod
,
1896 services_ExecMethodAsync
,
1897 services_get_Security_
1900 static HRESULT
SWbemServices_create( IWbemServices
*wbem_services
, ISWbemServices
**obj
)
1902 struct services
*services
;
1904 TRACE( "%p, %p\n", obj
, wbem_services
);
1906 if (!(services
= heap_alloc( sizeof(*services
) ))) return E_OUTOFMEMORY
;
1907 services
->ISWbemServices_iface
.lpVtbl
= &services_vtbl
;
1909 services
->services
= wbem_services
;
1910 IWbemServices_AddRef( services
->services
);
1912 *obj
= &services
->ISWbemServices_iface
;
1913 TRACE( "returning iface %p\n", *obj
);
1919 ISWbemLocator ISWbemLocator_iface
;
1921 IWbemLocator
*locator
;
1924 static inline struct locator
*impl_from_ISWbemLocator( ISWbemLocator
*iface
)
1926 return CONTAINING_RECORD( iface
, struct locator
, ISWbemLocator_iface
);
1929 static ULONG WINAPI
locator_AddRef(
1930 ISWbemLocator
*iface
)
1932 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1933 return InterlockedIncrement( &locator
->refs
);
1936 static ULONG WINAPI
locator_Release(
1937 ISWbemLocator
*iface
)
1939 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1940 LONG refs
= InterlockedDecrement( &locator
->refs
);
1943 TRACE( "destroying %p\n", locator
);
1944 if (locator
->locator
)
1945 IWbemLocator_Release( locator
->locator
);
1946 heap_free( locator
);
1951 static HRESULT WINAPI
locator_QueryInterface(
1952 ISWbemLocator
*iface
,
1956 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1958 TRACE( "%p, %s, %p\n", locator
, debugstr_guid( riid
), ppvObject
);
1960 if (IsEqualGUID( riid
, &IID_ISWbemLocator
) ||
1961 IsEqualGUID( riid
, &IID_IDispatch
) ||
1962 IsEqualGUID( riid
, &IID_IUnknown
))
1968 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1969 return E_NOINTERFACE
;
1971 ISWbemLocator_AddRef( iface
);
1975 static HRESULT WINAPI
locator_GetTypeInfoCount(
1976 ISWbemLocator
*iface
,
1979 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1981 TRACE( "%p, %p\n", locator
, count
);
1986 static HRESULT WINAPI
locator_GetTypeInfo(
1987 ISWbemLocator
*iface
,
1992 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1993 TRACE( "%p, %u, %u, %p\n", locator
, index
, lcid
, info
);
1995 return get_typeinfo( ISWbemLocator_tid
, info
);
1998 static HRESULT WINAPI
locator_GetIDsOfNames(
1999 ISWbemLocator
*iface
,
2006 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
2007 ITypeInfo
*typeinfo
;
2010 TRACE( "%p, %s, %p, %u, %u, %p\n", locator
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
2012 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
2014 hr
= get_typeinfo( ISWbemLocator_tid
, &typeinfo
);
2017 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
2018 ITypeInfo_Release( typeinfo
);
2023 static HRESULT WINAPI
locator_Invoke(
2024 ISWbemLocator
*iface
,
2031 EXCEPINFO
*excep_info
,
2034 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
2035 ITypeInfo
*typeinfo
;
2038 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", locator
, member
, debugstr_guid(riid
),
2039 lcid
, flags
, params
, result
, excep_info
, arg_err
);
2041 hr
= get_typeinfo( ISWbemLocator_tid
, &typeinfo
);
2044 hr
= ITypeInfo_Invoke( typeinfo
, &locator
->ISWbemLocator_iface
, member
, flags
,
2045 params
, result
, excep_info
, arg_err
);
2046 ITypeInfo_Release( typeinfo
);
2051 static BSTR
build_resource_string( BSTR server
, BSTR
namespace )
2053 static const WCHAR defaultW
[] = {'r','o','o','t','\\','d','e','f','a','u','l','t',0};
2054 ULONG len
, len_server
= 0, len_namespace
= 0;
2057 if (server
&& *server
) len_server
= strlenW( server
);
2058 else len_server
= 1;
2059 if (namespace && *namespace) len_namespace
= strlenW( namespace );
2060 else len_namespace
= sizeof(defaultW
) / sizeof(defaultW
[0]) - 1;
2062 if (!(ret
= SysAllocStringLen( NULL
, 2 + len_server
+ 1 + len_namespace
))) return NULL
;
2064 ret
[0] = ret
[1] = '\\';
2065 if (server
&& *server
) strcpyW( ret
+ 2, server
);
2068 len
= len_server
+ 2;
2071 if (namespace && *namespace) strcpyW( ret
+ len
, namespace );
2072 else strcpyW( ret
+ len
, defaultW
);
2076 static HRESULT WINAPI
locator_ConnectServer(
2077 ISWbemLocator
*iface
,
2084 LONG iSecurityFlags
,
2085 IDispatch
*objWbemNamedValueSet
,
2086 ISWbemServices
**objWbemServices
)
2088 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
2089 IWbemServices
*services
;
2093 TRACE( "%p, %s, %s, %s, %p, %s, %s, 0x%08x, %p, %p\n", iface
, debugstr_w(strServer
),
2094 debugstr_w(strNamespace
), debugstr_w(strUser
), strPassword
, debugstr_w(strLocale
),
2095 debugstr_w(strAuthority
), iSecurityFlags
, objWbemNamedValueSet
, objWbemServices
);
2097 if (objWbemNamedValueSet
) FIXME( "context not supported\n" );
2099 if (!locator
->locator
)
2101 hr
= CoCreateInstance( &CLSID_WbemLocator
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IWbemLocator
,
2102 (void **)&locator
->locator
);
2103 if (hr
!= S_OK
) return hr
;
2106 if (!(resource
= build_resource_string( strServer
, strNamespace
))) return E_OUTOFMEMORY
;
2107 hr
= IWbemLocator_ConnectServer( locator
->locator
, resource
, strUser
, strPassword
, strLocale
,
2108 iSecurityFlags
, strAuthority
, NULL
, &services
);
2109 SysFreeString( resource
);
2110 if (hr
!= S_OK
) return hr
;
2112 hr
= SWbemServices_create( services
, objWbemServices
);
2113 IWbemServices_Release( services
);
2117 static HRESULT WINAPI
locator_get_Security_(
2118 ISWbemLocator
*iface
,
2119 ISWbemSecurity
**objWbemSecurity
)
2121 TRACE( "%p, %p\n", iface
, objWbemSecurity
);
2123 if (!objWbemSecurity
)
2124 return E_INVALIDARG
;
2126 return ISWbemSecurity_create( objWbemSecurity
);
2129 static const ISWbemLocatorVtbl locator_vtbl
=
2131 locator_QueryInterface
,
2134 locator_GetTypeInfoCount
,
2135 locator_GetTypeInfo
,
2136 locator_GetIDsOfNames
,
2138 locator_ConnectServer
,
2139 locator_get_Security_
2142 HRESULT
SWbemLocator_create( void **obj
)
2144 struct locator
*locator
;
2146 TRACE( "%p\n", obj
);
2148 if (!(locator
= heap_alloc( sizeof(*locator
) ))) return E_OUTOFMEMORY
;
2149 locator
->ISWbemLocator_iface
.lpVtbl
= &locator_vtbl
;
2151 locator
->locator
= NULL
;
2153 *obj
= &locator
->ISWbemLocator_iface
;
2154 TRACE( "returning iface %p\n", *obj
);
2160 ISWbemSecurity ISWbemSecurity_iface
;
2162 WbemImpersonationLevelEnum implevel
;
2163 WbemAuthenticationLevelEnum authlevel
;
2166 static inline struct security
*impl_from_ISWbemSecurity( ISWbemSecurity
*iface
)
2168 return CONTAINING_RECORD( iface
, struct security
, ISWbemSecurity_iface
);
2171 static ULONG WINAPI
security_AddRef(
2172 ISWbemSecurity
*iface
)
2174 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2175 return InterlockedIncrement( &security
->refs
);
2178 static ULONG WINAPI
security_Release(
2179 ISWbemSecurity
*iface
)
2181 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2182 LONG refs
= InterlockedDecrement( &security
->refs
);
2185 TRACE( "destroying %p\n", security
);
2186 heap_free( security
);
2191 static HRESULT WINAPI
security_QueryInterface(
2192 ISWbemSecurity
*iface
,
2196 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2197 TRACE( "%p, %s, %p\n", security
, debugstr_guid( riid
), ppvObject
);
2199 if (IsEqualGUID( riid
, &IID_ISWbemSecurity
) ||
2200 IsEqualGUID( riid
, &IID_IDispatch
) ||
2201 IsEqualGUID( riid
, &IID_IUnknown
))
2207 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
2208 return E_NOINTERFACE
;
2210 ISWbemSecurity_AddRef( iface
);
2214 static HRESULT WINAPI
security_GetTypeInfoCount(
2215 ISWbemSecurity
*iface
,
2218 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2219 TRACE( "%p, %p\n", security
, count
);
2225 static HRESULT WINAPI
security_GetTypeInfo(
2226 ISWbemSecurity
*iface
,
2231 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2232 TRACE( "%p, %u, %u, %p\n", security
, index
, lcid
, info
);
2234 return get_typeinfo( ISWbemSecurity_tid
, info
);
2237 static HRESULT WINAPI
security_GetIDsOfNames(
2238 ISWbemSecurity
*iface
,
2245 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2246 ITypeInfo
*typeinfo
;
2249 TRACE( "%p, %s, %p, %u, %u, %p\n", security
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
2251 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
2253 hr
= get_typeinfo( ISWbemSecurity_tid
, &typeinfo
);
2256 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
2257 ITypeInfo_Release( typeinfo
);
2262 static HRESULT WINAPI
security_Invoke(
2263 ISWbemSecurity
*iface
,
2270 EXCEPINFO
*excep_info
,
2273 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2274 ITypeInfo
*typeinfo
;
2277 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", security
, member
, debugstr_guid(riid
),
2278 lcid
, flags
, params
, result
, excep_info
, arg_err
);
2280 hr
= get_typeinfo( ISWbemSecurity_tid
, &typeinfo
);
2283 hr
= ITypeInfo_Invoke( typeinfo
, &security
->ISWbemSecurity_iface
, member
, flags
,
2284 params
, result
, excep_info
, arg_err
);
2285 ITypeInfo_Release( typeinfo
);
2290 static HRESULT WINAPI
security_get_ImpersonationLevel_(
2291 ISWbemSecurity
*iface
,
2292 WbemImpersonationLevelEnum
*impersonation_level
)
2294 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2295 FIXME( "%p, %p: stub\n", security
, impersonation_level
);
2297 if (!impersonation_level
)
2298 return E_INVALIDARG
;
2300 *impersonation_level
= security
->implevel
;
2304 static HRESULT WINAPI
security_put_ImpersonationLevel_(
2305 ISWbemSecurity
*iface
,
2306 WbemImpersonationLevelEnum impersonation_level
)
2308 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2309 FIXME( "%p, %d: stub\n", security
, impersonation_level
);
2311 security
->implevel
= impersonation_level
;
2315 static HRESULT WINAPI
security_get_AuthenticationLevel_(
2316 ISWbemSecurity
*iface
,
2317 WbemAuthenticationLevelEnum
*authentication_level
)
2319 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2320 FIXME( "%p, %p: stub\n", security
, authentication_level
);
2322 if (!authentication_level
)
2323 return E_INVALIDARG
;
2325 *authentication_level
= security
->authlevel
;
2329 static HRESULT WINAPI
security_put_AuthenticationLevel_(
2330 ISWbemSecurity
*iface
,
2331 WbemAuthenticationLevelEnum authentication_level
)
2333 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2334 FIXME( "%p, %d: stub\n", security
, authentication_level
);
2336 security
->authlevel
= authentication_level
;
2340 static HRESULT WINAPI
security_get_Privileges_(
2341 ISWbemSecurity
*iface
,
2342 ISWbemPrivilegeSet
**privilege_set
)
2344 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2345 FIXME( "%p, %p: stub\n", security
, privilege_set
);
2348 return E_INVALIDARG
;
2353 static const ISWbemSecurityVtbl security_vtbl
=
2355 security_QueryInterface
,
2358 security_GetTypeInfoCount
,
2359 security_GetTypeInfo
,
2360 security_GetIDsOfNames
,
2362 security_get_ImpersonationLevel_
,
2363 security_put_ImpersonationLevel_
,
2364 security_get_AuthenticationLevel_
,
2365 security_put_AuthenticationLevel_
,
2366 security_get_Privileges_
2369 static HRESULT
ISWbemSecurity_create( ISWbemSecurity
**obj
)
2371 struct security
*security
;
2373 TRACE( "%p\n", obj
);
2375 if (!(security
= heap_alloc( sizeof(*security
) ))) return E_OUTOFMEMORY
;
2376 security
->ISWbemSecurity_iface
.lpVtbl
= &security_vtbl
;
2378 security
->implevel
= wbemImpersonationLevelAnonymous
;
2379 security
->authlevel
= wbemAuthenticationLevelDefault
;
2381 *obj
= &security
->ISWbemSecurity_iface
;
2382 TRACE( "returning iface %p\n", *obj
);