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
** );
31 ISWbemPropertySet_tid
,
36 static ITypeLib
*wbemdisp_typelib
;
37 static ITypeInfo
*wbemdisp_typeinfo
[last_tid
];
39 static REFIID wbemdisp_tid_id
[] =
45 &IID_ISWbemPropertySet
,
49 static HRESULT
get_typeinfo( enum type_id tid
, ITypeInfo
**ret
)
53 if (!wbemdisp_typelib
)
57 hr
= LoadRegTypeLib( &LIBID_WbemScripting
, 1, 2, LOCALE_SYSTEM_DEFAULT
, &typelib
);
60 ERR( "LoadRegTypeLib failed: %08x\n", hr
);
63 if (InterlockedCompareExchangePointer( (void **)&wbemdisp_typelib
, typelib
, NULL
))
64 ITypeLib_Release( typelib
);
66 if (!wbemdisp_typeinfo
[tid
])
70 hr
= ITypeLib_GetTypeInfoOfGuid( wbemdisp_typelib
, wbemdisp_tid_id
[tid
], &typeinfo
);
73 ERR( "GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(wbemdisp_tid_id
[tid
]), hr
);
76 if (InterlockedCompareExchangePointer( (void **)(wbemdisp_typeinfo
+ tid
), typeinfo
, NULL
))
77 ITypeInfo_Release( typeinfo
);
79 *ret
= wbemdisp_typeinfo
[tid
];
80 ITypeInfo_AddRef( *ret
);
86 ISWbemProperty ISWbemProperty_iface
;
88 IWbemClassObject
*object
;
92 static inline struct property
*impl_from_ISWbemProperty( ISWbemProperty
*iface
)
94 return CONTAINING_RECORD( iface
, struct property
, ISWbemProperty_iface
);
97 static ULONG WINAPI
property_AddRef( ISWbemProperty
*iface
)
99 struct property
*property
= impl_from_ISWbemProperty( iface
);
100 return InterlockedIncrement( &property
->refs
);
103 static ULONG WINAPI
property_Release( ISWbemProperty
*iface
)
105 struct property
*property
= impl_from_ISWbemProperty( iface
);
106 LONG refs
= InterlockedDecrement( &property
->refs
);
109 TRACE( "destroying %p\n", property
);
110 IWbemClassObject_Release( property
->object
);
111 SysFreeString( property
->name
);
112 heap_free( property
);
117 static HRESULT WINAPI
property_QueryInterface( ISWbemProperty
*iface
, REFIID riid
, void **obj
)
119 struct property
*property
= impl_from_ISWbemProperty( iface
);
121 TRACE( "%p %s %p\n", property
, debugstr_guid(riid
), obj
);
123 if (IsEqualGUID( riid
, &IID_ISWbemProperty
) ||
124 IsEqualGUID( riid
, &IID_IDispatch
) ||
125 IsEqualGUID( riid
, &IID_IUnknown
))
131 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
132 return E_NOINTERFACE
;
134 ISWbemProperty_AddRef( iface
);
138 static HRESULT WINAPI
property_GetTypeInfoCount( ISWbemProperty
*iface
, UINT
*count
)
140 struct property
*property
= impl_from_ISWbemProperty( iface
);
141 TRACE( "%p, %p\n", property
, count
);
146 static HRESULT WINAPI
property_GetTypeInfo( ISWbemProperty
*iface
, UINT index
,
147 LCID lcid
, ITypeInfo
**info
)
149 struct property
*property
= impl_from_ISWbemProperty( iface
);
150 TRACE( "%p, %u, %u, %p\n", property
, index
, lcid
, info
);
152 return get_typeinfo( ISWbemProperty_tid
, info
);
155 static HRESULT WINAPI
property_GetIDsOfNames( ISWbemProperty
*iface
, REFIID riid
, LPOLESTR
*names
,
156 UINT count
, LCID lcid
, DISPID
*dispid
)
158 struct property
*property
= impl_from_ISWbemProperty( iface
);
162 TRACE( "%p, %s, %p, %u, %u, %p\n", property
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
164 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
166 hr
= get_typeinfo( ISWbemProperty_tid
, &typeinfo
);
169 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
170 ITypeInfo_Release( typeinfo
);
175 static HRESULT WINAPI
property_Invoke( ISWbemProperty
*iface
, DISPID member
, REFIID riid
,
176 LCID lcid
, WORD flags
, DISPPARAMS
*params
,
177 VARIANT
*result
, EXCEPINFO
*excep_info
, UINT
*arg_err
)
179 struct property
*property
= impl_from_ISWbemProperty( iface
);
183 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", property
, member
, debugstr_guid(riid
),
184 lcid
, flags
, params
, result
, excep_info
, arg_err
);
186 hr
= get_typeinfo( ISWbemProperty_tid
, &typeinfo
);
189 hr
= ITypeInfo_Invoke( typeinfo
, &property
->ISWbemProperty_iface
, member
, flags
,
190 params
, result
, excep_info
, arg_err
);
191 ITypeInfo_Release( typeinfo
);
196 static HRESULT WINAPI
property_get_Value( ISWbemProperty
*iface
, VARIANT
*value
)
198 struct property
*property
= impl_from_ISWbemProperty( iface
);
200 TRACE( "%p %p\n", property
, value
);
202 return IWbemClassObject_Get( property
->object
, property
->name
, 0, value
, NULL
, NULL
);
205 static HRESULT WINAPI
property_put_Value( ISWbemProperty
*iface
, VARIANT
*varValue
)
211 static HRESULT WINAPI
property_get_Name( ISWbemProperty
*iface
, BSTR
*strName
)
217 static HRESULT WINAPI
property_get_IsLocal( ISWbemProperty
*iface
, VARIANT_BOOL
*bIsLocal
)
223 static HRESULT WINAPI
property_get_Origin( ISWbemProperty
*iface
, BSTR
*strOrigin
)
229 static HRESULT WINAPI
property_get_CIMType( ISWbemProperty
*iface
, WbemCimtypeEnum
*iCimType
)
235 static HRESULT WINAPI
property_get_Qualifiers_( ISWbemProperty
*iface
, ISWbemQualifierSet
**objWbemQualifierSet
)
241 static HRESULT WINAPI
property_get_IsArray( ISWbemProperty
*iface
, VARIANT_BOOL
*bIsArray
)
247 static const ISWbemPropertyVtbl property_vtbl
=
249 property_QueryInterface
,
252 property_GetTypeInfoCount
,
253 property_GetTypeInfo
,
254 property_GetIDsOfNames
,
259 property_get_IsLocal
,
261 property_get_CIMType
,
262 property_get_Qualifiers_
,
266 static HRESULT
SWbemProperty_create( IWbemClassObject
*wbem_object
, BSTR name
, ISWbemProperty
**obj
)
268 struct property
*property
;
270 TRACE( "%p, %p\n", obj
, wbem_object
);
272 if (!(property
= heap_alloc( sizeof(*property
) ))) return E_OUTOFMEMORY
;
273 property
->ISWbemProperty_iface
.lpVtbl
= &property_vtbl
;
275 property
->object
= wbem_object
;
276 IWbemClassObject_AddRef( property
->object
);
277 property
->name
= SysAllocStringLen( name
, SysStringLen( name
) );
278 *obj
= &property
->ISWbemProperty_iface
;
279 TRACE( "returning iface %p\n", *obj
);
285 ISWbemPropertySet ISWbemPropertySet_iface
;
287 IWbemClassObject
*object
;
290 static inline struct propertyset
*impl_from_ISWbemPropertySet(
291 ISWbemPropertySet
*iface
)
293 return CONTAINING_RECORD( iface
, struct propertyset
, ISWbemPropertySet_iface
);
296 static ULONG WINAPI
propertyset_AddRef( ISWbemPropertySet
*iface
)
298 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
299 return InterlockedIncrement( &propertyset
->refs
);
302 static ULONG WINAPI
propertyset_Release( ISWbemPropertySet
*iface
)
304 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
305 LONG refs
= InterlockedDecrement( &propertyset
->refs
);
308 TRACE( "destroying %p\n", propertyset
);
309 IWbemClassObject_Release( propertyset
->object
);
310 heap_free( propertyset
);
315 static HRESULT WINAPI
propertyset_QueryInterface( ISWbemPropertySet
*iface
,
316 REFIID riid
, void **obj
)
318 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
320 TRACE( "%p %s %p\n", propertyset
, debugstr_guid(riid
), obj
);
322 if (IsEqualGUID( riid
, &IID_ISWbemPropertySet
) ||
323 IsEqualGUID( riid
, &IID_IDispatch
) ||
324 IsEqualGUID( riid
, &IID_IUnknown
))
330 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
331 return E_NOINTERFACE
;
333 ISWbemPropertySet_AddRef( iface
);
337 static HRESULT WINAPI
propertyset_GetTypeInfoCount( ISWbemPropertySet
*iface
, UINT
*count
)
339 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
340 TRACE( "%p, %p\n", propertyset
, count
);
345 static HRESULT WINAPI
propertyset_GetTypeInfo( ISWbemPropertySet
*iface
,
346 UINT index
, LCID lcid
, ITypeInfo
**info
)
348 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
349 TRACE( "%p, %u, %u, %p\n", propertyset
, index
, lcid
, info
);
351 return get_typeinfo( ISWbemPropertySet_tid
, info
);
354 static HRESULT WINAPI
propertyset_GetIDsOfNames( ISWbemPropertySet
*iface
, REFIID riid
, LPOLESTR
*names
,
355 UINT count
, LCID lcid
, DISPID
*dispid
)
357 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
361 TRACE( "%p, %s, %p, %u, %u, %p\n", propertyset
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
363 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
365 hr
= get_typeinfo( ISWbemPropertySet_tid
, &typeinfo
);
368 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
369 ITypeInfo_Release( typeinfo
);
374 static HRESULT WINAPI
propertyset_Invoke( ISWbemPropertySet
*iface
, DISPID member
, REFIID riid
,
375 LCID lcid
, WORD flags
, DISPPARAMS
*params
,
376 VARIANT
*result
, EXCEPINFO
*excep_info
, UINT
*arg_err
)
378 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
382 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", propertyset
, member
, debugstr_guid(riid
),
383 lcid
, flags
, params
, result
, excep_info
, arg_err
);
385 hr
= get_typeinfo( ISWbemPropertySet_tid
, &typeinfo
);
388 hr
= ITypeInfo_Invoke( typeinfo
, &propertyset
->ISWbemPropertySet_iface
, member
, flags
,
389 params
, result
, excep_info
, arg_err
);
390 ITypeInfo_Release( typeinfo
);
395 static HRESULT WINAPI
propertyset_get__NewEnum( ISWbemPropertySet
*iface
, IUnknown
**unk
)
401 static HRESULT WINAPI
propertyset_Item( ISWbemPropertySet
*iface
, BSTR name
,
402 LONG flags
, ISWbemProperty
**prop
)
404 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
408 TRACE( "%p, %s, %08x, %p\n", propertyset
, debugstr_w(name
), flags
, prop
);
410 hr
= IWbemClassObject_Get( propertyset
->object
, name
, 0, &var
, NULL
, NULL
);
413 hr
= SWbemProperty_create( propertyset
->object
, name
, prop
);
414 VariantClear( &var
);
419 static HRESULT WINAPI
propertyset_get_Count( ISWbemPropertySet
*iface
, LONG
*count
)
425 static HRESULT WINAPI
propertyset_Add( ISWbemPropertySet
*iface
, BSTR name
, WbemCimtypeEnum type
,
426 VARIANT_BOOL is_array
, LONG flags
, ISWbemProperty
**prop
)
432 static HRESULT WINAPI
propertyset_Remove( ISWbemPropertySet
*iface
, BSTR name
, LONG flags
)
438 static const ISWbemPropertySetVtbl propertyset_vtbl
=
440 propertyset_QueryInterface
,
443 propertyset_GetTypeInfoCount
,
444 propertyset_GetTypeInfo
,
445 propertyset_GetIDsOfNames
,
447 propertyset_get__NewEnum
,
449 propertyset_get_Count
,
454 static HRESULT
SWbemPropertySet_create( IWbemClassObject
*wbem_object
, ISWbemPropertySet
**obj
)
456 struct propertyset
*propertyset
;
458 TRACE( "%p, %p\n", obj
, wbem_object
);
460 if (!(propertyset
= heap_alloc( sizeof(*propertyset
) ))) return E_OUTOFMEMORY
;
461 propertyset
->ISWbemPropertySet_iface
.lpVtbl
= &propertyset_vtbl
;
462 propertyset
->refs
= 1;
463 propertyset
->object
= wbem_object
;
464 IWbemClassObject_AddRef( propertyset
->object
);
465 *obj
= &propertyset
->ISWbemPropertySet_iface
;
467 TRACE( "returning iface %p\n", *obj
);
471 #define DISPID_BASE 0x1800000
481 ISWbemObject ISWbemObject_iface
;
483 IWbemClassObject
*object
;
484 struct member
*members
;
489 static inline struct object
*impl_from_ISWbemObject(
490 ISWbemObject
*iface
)
492 return CONTAINING_RECORD( iface
, struct object
, ISWbemObject_iface
);
495 static ULONG WINAPI
object_AddRef(
496 ISWbemObject
*iface
)
498 struct object
*object
= impl_from_ISWbemObject( iface
);
499 return InterlockedIncrement( &object
->refs
);
502 static ULONG WINAPI
object_Release(
503 ISWbemObject
*iface
)
505 struct object
*object
= impl_from_ISWbemObject( iface
);
506 LONG refs
= InterlockedDecrement( &object
->refs
);
511 TRACE( "destroying %p\n", object
);
512 IWbemClassObject_Release( object
->object
);
513 for (i
= 0; i
< object
->nb_members
; i
++) SysFreeString( object
->members
[i
].name
);
514 heap_free( object
->members
);
520 static HRESULT WINAPI
object_QueryInterface(
525 struct object
*object
= impl_from_ISWbemObject( iface
);
527 TRACE( "%p %s %p\n", object
, debugstr_guid(riid
), ppvObject
);
529 if (IsEqualGUID( riid
, &IID_ISWbemObject
) ||
530 IsEqualGUID( riid
, &IID_IDispatch
) ||
531 IsEqualGUID( riid
, &IID_IUnknown
))
537 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
538 return E_NOINTERFACE
;
540 ISWbemObject_AddRef( iface
);
544 static HRESULT WINAPI
object_GetTypeInfoCount(
548 struct object
*object
= impl_from_ISWbemObject( iface
);
550 TRACE( "%p, %p\n", object
, count
);
555 static HRESULT WINAPI
object_GetTypeInfo(
561 struct object
*object
= impl_from_ISWbemObject( iface
);
562 FIXME( "%p, %u, %u, %p\n", object
, index
, lcid
, info
);
566 static HRESULT
init_members( struct object
*object
)
572 if (object
->members
) return S_OK
;
574 hr
= IWbemClassObject_GetNames( object
->object
, NULL
, 0, NULL
, &sa
);
575 if (FAILED( hr
)) return hr
;
576 hr
= SafeArrayGetUBound( sa
, 1, &bound
);
579 SafeArrayDestroy( sa
);
582 if (!(object
->members
= heap_alloc( sizeof(struct member
) * (bound
+ 1) )))
584 SafeArrayDestroy( sa
);
585 return E_OUTOFMEMORY
;
587 for (i
= 0; i
<= bound
; i
++)
589 hr
= SafeArrayGetElement( sa
, &i
, &object
->members
[i
].name
);
592 for (i
--; i
>= 0; i
--) SysFreeString( object
->members
[i
].name
);
593 SafeArrayDestroy( sa
);
594 heap_free( object
->members
);
595 object
->members
= NULL
;
596 return E_OUTOFMEMORY
;
598 object
->members
[i
].dispid
= 0;
600 object
->nb_members
= bound
+ 1;
601 SafeArrayDestroy( sa
);
605 static DISPID
get_member_dispid( struct object
*object
, const WCHAR
*name
)
608 for (i
= 0; i
< object
->nb_members
; i
++)
610 if (!strcmpiW( object
->members
[i
].name
, name
))
612 if (!object
->members
[i
].dispid
) object
->members
[i
].dispid
= ++object
->last_dispid
;
613 return object
->members
[i
].dispid
;
616 return DISPID_UNKNOWN
;
619 static HRESULT WINAPI
object_GetIDsOfNames(
627 struct object
*object
= impl_from_ISWbemObject( iface
);
632 TRACE( "%p, %s, %p, %u, %u, %p\n", object
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
634 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
636 hr
= init_members( object
);
637 if (FAILED( hr
)) return hr
;
639 hr
= get_typeinfo( ISWbemObject_tid
, &typeinfo
);
642 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
643 ITypeInfo_Release( typeinfo
);
645 if (SUCCEEDED(hr
)) return hr
;
647 for (i
= 0; i
< count
; i
++)
649 if ((dispid
[i
] = get_member_dispid( object
, names
[i
] )) == DISPID_UNKNOWN
) break;
651 if (i
!= count
) return DISP_E_UNKNOWNNAME
;
655 static BSTR
get_member_name( struct object
*object
, DISPID dispid
)
658 for (i
= 0; i
< object
->nb_members
; i
++)
660 if (object
->members
[i
].dispid
== dispid
) return object
->members
[i
].name
;
665 static HRESULT WINAPI
object_Invoke(
673 EXCEPINFO
*excep_info
,
676 struct object
*object
= impl_from_ISWbemObject( iface
);
681 TRACE( "%p, %x, %s, %u, %x, %p, %p, %p, %p\n", object
, member
, debugstr_guid(riid
),
682 lcid
, flags
, params
, result
, excep_info
, arg_err
);
684 if (member
<= DISPID_BASE
)
686 hr
= get_typeinfo( ISWbemObject_tid
, &typeinfo
);
689 hr
= ITypeInfo_Invoke( typeinfo
, &object
->ISWbemObject_iface
, member
, flags
,
690 params
, result
, excep_info
, arg_err
);
691 ITypeInfo_Release( typeinfo
);
696 if (flags
!= (DISPATCH_METHOD
|DISPATCH_PROPERTYGET
))
698 FIXME( "flags %x not supported\n", flags
);
701 if (!(name
= get_member_name( object
, member
)))
702 return DISP_E_MEMBERNOTFOUND
;
704 memset( params
, 0, sizeof(*params
) );
705 return IWbemClassObject_Get( object
->object
, name
, 0, result
, NULL
, NULL
);
708 static HRESULT WINAPI
object_Put_(
711 IDispatch
*objWbemNamedValueSet
,
712 ISWbemObjectPath
**objWbemObjectPath
)
718 static HRESULT WINAPI
object_PutAsync_(
720 IDispatch
*objWbemSink
,
722 IDispatch
*objWbemNamedValueSet
,
723 IDispatch
*objWbemAsyncContext
)
729 static HRESULT WINAPI
object_Delete_(
732 IDispatch
*objWbemNamedValueSet
)
738 static HRESULT WINAPI
object_DeleteAsync_(
740 IDispatch
*objWbemSink
,
742 IDispatch
*objWbemNamedValueSet
,
743 IDispatch
*objWbemAsyncContext
)
749 static HRESULT WINAPI
object_Instances_(
752 IDispatch
*objWbemNamedValueSet
,
753 ISWbemObjectSet
**objWbemObjectSet
)
759 static HRESULT WINAPI
object_InstancesAsync_(
761 IDispatch
*objWbemSink
,
763 IDispatch
*objWbemNamedValueSet
,
764 IDispatch
*objWbemAsyncContext
)
770 static HRESULT WINAPI
object_Subclasses_(
773 IDispatch
*objWbemNamedValueSet
,
774 ISWbemObjectSet
**objWbemObjectSet
)
780 static HRESULT WINAPI
object_SubclassesAsync_(
782 IDispatch
*objWbemSink
,
784 IDispatch
*objWbemNamedValueSet
,
785 IDispatch
*objWbemAsyncContext
)
791 static HRESULT WINAPI
object_Associators_(
797 VARIANT_BOOL bClassesOnly
,
798 VARIANT_BOOL bSchemaOnly
,
799 BSTR strRequiredAssocQualifier
,
800 BSTR strRequiredQualifier
,
802 IDispatch
*objWbemNamedValueSet
,
803 ISWbemObjectSet
**objWbemObjectSet
)
809 static HRESULT WINAPI
object_AssociatorsAsync_(
811 IDispatch
*objWbemSink
,
816 VARIANT_BOOL bClassesOnly
,
817 VARIANT_BOOL bSchemaOnly
,
818 BSTR strRequiredAssocQualifier
,
819 BSTR strRequiredQualifier
,
821 IDispatch
*objWbemNamedValueSet
,
822 IDispatch
*objWbemAsyncContext
)
828 static HRESULT WINAPI
object_References_(
832 VARIANT_BOOL bClassesOnly
,
833 VARIANT_BOOL bSchemaOnly
,
834 BSTR strRequiredQualifier
,
836 IDispatch
*objWbemNamedValueSet
,
837 ISWbemObjectSet
**objWbemObjectSet
)
843 static HRESULT WINAPI
object_ReferencesAsync_(
845 IDispatch
*objWbemSink
,
848 VARIANT_BOOL bClassesOnly
,
849 VARIANT_BOOL bSchemaOnly
,
850 BSTR strRequiredQualifier
,
852 IDispatch
*objWbemNamedValueSet
,
853 IDispatch
*objWbemAsyncContext
)
859 static HRESULT WINAPI
object_ExecMethod_(
862 IDispatch
*objWbemInParameters
,
864 IDispatch
*objWbemNamedValueSet
,
865 ISWbemObject
**objWbemOutParameters
)
871 static HRESULT WINAPI
object_ExecMethodAsync_(
873 IDispatch
*objWbemSink
,
875 IDispatch
*objWbemInParameters
,
877 IDispatch
*objWbemNamedValueSet
,
878 IDispatch
*objWbemAsyncContext
)
884 static HRESULT WINAPI
object_Clone_(
886 ISWbemObject
**objWbemObject
)
892 static HRESULT WINAPI
object_GetObjectText_(
895 BSTR
*strObjectText
)
901 static HRESULT WINAPI
object_SpawnDerivedClass_(
904 ISWbemObject
**objWbemObject
)
910 static HRESULT WINAPI
object_SpawnInstance_(
913 ISWbemObject
**objWbemObject
)
919 static HRESULT WINAPI
object_CompareTo_(
921 IDispatch
*objWbemObject
,
923 VARIANT_BOOL
*bResult
)
929 static HRESULT WINAPI
object_get_Qualifiers_(
931 ISWbemQualifierSet
**objWbemQualifierSet
)
937 static HRESULT WINAPI
object_get_Properties_( ISWbemObject
*iface
, ISWbemPropertySet
**prop_set
)
939 struct object
*object
= impl_from_ISWbemObject( iface
);
941 TRACE( "%p, %p\n", object
, prop_set
);
942 return SWbemPropertySet_create( object
->object
, prop_set
);
945 static HRESULT WINAPI
object_get_Methods_(
947 ISWbemMethodSet
**objWbemMethodSet
)
953 static HRESULT WINAPI
object_get_Derivation_(
955 VARIANT
*strClassNameArray
)
961 static HRESULT WINAPI
object_get_Path_(
963 ISWbemObjectPath
**objWbemObjectPath
)
969 static HRESULT WINAPI
object_get_Security_(
971 ISWbemSecurity
**objWbemSecurity
)
977 static const ISWbemObjectVtbl object_vtbl
=
979 object_QueryInterface
,
982 object_GetTypeInfoCount
,
984 object_GetIDsOfNames
,
991 object_InstancesAsync_
,
993 object_SubclassesAsync_
,
995 object_AssociatorsAsync_
,
997 object_ReferencesAsync_
,
999 object_ExecMethodAsync_
,
1001 object_GetObjectText_
,
1002 object_SpawnDerivedClass_
,
1003 object_SpawnInstance_
,
1005 object_get_Qualifiers_
,
1006 object_get_Properties_
,
1007 object_get_Methods_
,
1008 object_get_Derivation_
,
1010 object_get_Security_
1013 static HRESULT
SWbemObject_create( IWbemClassObject
*wbem_object
, ISWbemObject
**obj
)
1015 struct object
*object
;
1017 TRACE( "%p, %p\n", obj
, wbem_object
);
1019 if (!(object
= heap_alloc( sizeof(*object
) ))) return E_OUTOFMEMORY
;
1020 object
->ISWbemObject_iface
.lpVtbl
= &object_vtbl
;
1022 object
->object
= wbem_object
;
1023 IWbemClassObject_AddRef( object
->object
);
1024 object
->members
= NULL
;
1025 object
->nb_members
= 0;
1026 object
->last_dispid
= DISPID_BASE
;
1028 *obj
= &object
->ISWbemObject_iface
;
1029 TRACE( "returning iface %p\n", *obj
);
1035 ISWbemObjectSet ISWbemObjectSet_iface
;
1037 IEnumWbemClassObject
*objectenum
;
1041 static inline struct objectset
*impl_from_ISWbemObjectSet(
1042 ISWbemObjectSet
*iface
)
1044 return CONTAINING_RECORD( iface
, struct objectset
, ISWbemObjectSet_iface
);
1047 static ULONG WINAPI
objectset_AddRef(
1048 ISWbemObjectSet
*iface
)
1050 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1051 return InterlockedIncrement( &objectset
->refs
);
1054 static ULONG WINAPI
objectset_Release(
1055 ISWbemObjectSet
*iface
)
1057 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1058 LONG refs
= InterlockedDecrement( &objectset
->refs
);
1061 TRACE( "destroying %p\n", objectset
);
1062 IEnumWbemClassObject_Release( objectset
->objectenum
);
1063 heap_free( objectset
);
1068 static HRESULT WINAPI
objectset_QueryInterface(
1069 ISWbemObjectSet
*iface
,
1073 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1075 TRACE( "%p %s %p\n", objectset
, debugstr_guid(riid
), ppvObject
);
1077 if (IsEqualGUID( riid
, &IID_ISWbemObjectSet
) ||
1078 IsEqualGUID( riid
, &IID_IDispatch
) ||
1079 IsEqualGUID( riid
, &IID_IUnknown
))
1085 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1086 return E_NOINTERFACE
;
1088 ISWbemObjectSet_AddRef( iface
);
1092 static HRESULT WINAPI
objectset_GetTypeInfoCount(
1093 ISWbemObjectSet
*iface
,
1096 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1097 TRACE( "%p, %p\n", objectset
, count
);
1102 static HRESULT WINAPI
objectset_GetTypeInfo(
1103 ISWbemObjectSet
*iface
,
1108 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1109 TRACE( "%p, %u, %u, %p\n", objectset
, index
, lcid
, info
);
1111 return get_typeinfo( ISWbemObjectSet_tid
, info
);
1114 static HRESULT WINAPI
objectset_GetIDsOfNames(
1115 ISWbemObjectSet
*iface
,
1122 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1123 ITypeInfo
*typeinfo
;
1126 TRACE( "%p, %s, %p, %u, %u, %p\n", objectset
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1128 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
1130 hr
= get_typeinfo( ISWbemObjectSet_tid
, &typeinfo
);
1133 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
1134 ITypeInfo_Release( typeinfo
);
1139 static HRESULT WINAPI
objectset_Invoke(
1140 ISWbemObjectSet
*iface
,
1147 EXCEPINFO
*excep_info
,
1150 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1151 ITypeInfo
*typeinfo
;
1154 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", objectset
, member
, debugstr_guid(riid
),
1155 lcid
, flags
, params
, result
, excep_info
, arg_err
);
1157 hr
= get_typeinfo( ISWbemObjectSet_tid
, &typeinfo
);
1160 hr
= ITypeInfo_Invoke( typeinfo
, &objectset
->ISWbemObjectSet_iface
, member
, flags
,
1161 params
, result
, excep_info
, arg_err
);
1162 ITypeInfo_Release( typeinfo
);
1167 static HRESULT WINAPI
objectset_get__NewEnum(
1168 ISWbemObjectSet
*iface
,
1171 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1172 IEnumWbemClassObject
*objectenum
;
1175 TRACE( "%p, %p\n", objectset
, pUnk
);
1177 hr
= IEnumWbemClassObject_Clone( objectset
->objectenum
, &objectenum
);
1178 if (FAILED( hr
)) return hr
;
1180 hr
= EnumVARIANT_create( objectenum
, (IEnumVARIANT
**)pUnk
);
1181 IEnumWbemClassObject_Release( objectenum
);
1185 static HRESULT WINAPI
objectset_Item(
1186 ISWbemObjectSet
*iface
,
1189 ISWbemObject
**objWbemObject
)
1195 static HRESULT WINAPI
objectset_get_Count(
1196 ISWbemObjectSet
*iface
,
1199 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1201 TRACE( "%p, %p\n", objectset
, iCount
);
1203 *iCount
= objectset
->count
;
1207 static HRESULT WINAPI
objectset_get_Security_(
1208 ISWbemObjectSet
*iface
,
1209 ISWbemSecurity
**objWbemSecurity
)
1215 static HRESULT WINAPI
objectset_ItemIndex(
1216 ISWbemObjectSet
*iface
,
1218 ISWbemObject
**objWbemObject
)
1220 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1223 IEnumVARIANT
*enum_var
;
1226 TRACE( "%p, %d, %p\n", objectset
, lIndex
, objWbemObject
);
1228 *objWbemObject
= NULL
;
1229 hr
= ISWbemObjectSet_get_Count( iface
, &count
);
1230 if (FAILED(hr
)) return hr
;
1232 if (lIndex
>= count
) return WBEM_E_NOT_FOUND
;
1234 hr
= ISWbemObjectSet_get__NewEnum( iface
, (IUnknown
**)&enum_var
);
1235 if (FAILED(hr
)) return hr
;
1237 IEnumVARIANT_Reset( enum_var
);
1238 hr
= IEnumVARIANT_Skip( enum_var
, lIndex
);
1240 hr
= IEnumVARIANT_Next( enum_var
, 1, &var
, NULL
);
1241 IEnumVARIANT_Release( enum_var
);
1245 if (V_VT( &var
) == VT_DISPATCH
)
1246 hr
= IDispatch_QueryInterface( V_DISPATCH( &var
), &IID_ISWbemObject
, (void **)objWbemObject
);
1248 hr
= WBEM_E_NOT_FOUND
;
1249 VariantClear( &var
);
1255 static const ISWbemObjectSetVtbl objectset_vtbl
=
1257 objectset_QueryInterface
,
1260 objectset_GetTypeInfoCount
,
1261 objectset_GetTypeInfo
,
1262 objectset_GetIDsOfNames
,
1264 objectset_get__NewEnum
,
1266 objectset_get_Count
,
1267 objectset_get_Security_
,
1271 static LONG
get_object_count( IEnumWbemClassObject
*iter
)
1274 while (IEnumWbemClassObject_Skip( iter
, WBEM_INFINITE
, 1 ) == S_OK
) count
++;
1275 IEnumWbemClassObject_Reset( iter
);
1279 static HRESULT
SWbemObjectSet_create( IEnumWbemClassObject
*wbem_objectenum
, ISWbemObjectSet
**obj
)
1281 struct objectset
*objectset
;
1283 TRACE( "%p, %p\n", obj
, wbem_objectenum
);
1285 if (!(objectset
= heap_alloc( sizeof(*objectset
) ))) return E_OUTOFMEMORY
;
1286 objectset
->ISWbemObjectSet_iface
.lpVtbl
= &objectset_vtbl
;
1287 objectset
->refs
= 1;
1288 objectset
->objectenum
= wbem_objectenum
;
1289 IEnumWbemClassObject_AddRef( objectset
->objectenum
);
1290 objectset
->count
= get_object_count( objectset
->objectenum
);
1292 *obj
= &objectset
->ISWbemObjectSet_iface
;
1293 TRACE( "returning iface %p\n", *obj
);
1299 IEnumVARIANT IEnumVARIANT_iface
;
1301 IEnumWbemClassObject
*objectenum
;
1304 static inline struct enumvar
*impl_from_IEnumVARIANT(
1305 IEnumVARIANT
*iface
)
1307 return CONTAINING_RECORD( iface
, struct enumvar
, IEnumVARIANT_iface
);
1310 static ULONG WINAPI
enumvar_AddRef(
1311 IEnumVARIANT
*iface
)
1313 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1314 return InterlockedIncrement( &enumvar
->refs
);
1317 static ULONG WINAPI
enumvar_Release(
1318 IEnumVARIANT
*iface
)
1320 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1321 LONG refs
= InterlockedDecrement( &enumvar
->refs
);
1324 TRACE( "destroying %p\n", enumvar
);
1325 IEnumWbemClassObject_Release( enumvar
->objectenum
);
1326 heap_free( enumvar
);
1331 static HRESULT WINAPI
enumvar_QueryInterface(
1332 IEnumVARIANT
*iface
,
1336 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1338 TRACE( "%p %s %p\n", enumvar
, debugstr_guid(riid
), ppvObject
);
1340 if (IsEqualGUID( riid
, &IID_IEnumVARIANT
) ||
1341 IsEqualGUID( riid
, &IID_IUnknown
))
1347 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1348 return E_NOINTERFACE
;
1350 IEnumVARIANT_AddRef( iface
);
1354 static HRESULT WINAPI
enumvar_Next( IEnumVARIANT
*iface
, ULONG celt
, VARIANT
*var
, ULONG
*fetched
)
1356 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1357 IWbemClassObject
*obj
;
1360 TRACE( "%p, %u, %p, %p\n", iface
, celt
, var
, fetched
);
1362 if (celt
) IEnumWbemClassObject_Next( enumvar
->objectenum
, WBEM_INFINITE
, 1, &obj
, &count
);
1368 hr
= SWbemObject_create( obj
, &sobj
);
1369 IWbemClassObject_Release( obj
);
1370 if (FAILED( hr
)) return hr
;
1372 V_VT( var
) = VT_DISPATCH
;
1373 V_DISPATCH( var
) = (IDispatch
*)sobj
;
1375 if (fetched
) *fetched
= count
;
1376 return (count
< celt
) ? S_FALSE
: S_OK
;
1379 static HRESULT WINAPI
enumvar_Skip( IEnumVARIANT
*iface
, ULONG celt
)
1381 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1383 TRACE( "%p, %u\n", iface
, celt
);
1385 return IEnumWbemClassObject_Skip( enumvar
->objectenum
, WBEM_INFINITE
, celt
);
1388 static HRESULT WINAPI
enumvar_Reset( IEnumVARIANT
*iface
)
1390 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1392 TRACE( "%p\n", iface
);
1394 return IEnumWbemClassObject_Reset( enumvar
->objectenum
);
1397 static HRESULT WINAPI
enumvar_Clone( IEnumVARIANT
*iface
, IEnumVARIANT
**penum
)
1399 FIXME( "%p, %p\n", iface
, penum
);
1403 static const struct IEnumVARIANTVtbl enumvar_vtbl
=
1405 enumvar_QueryInterface
,
1414 static HRESULT
EnumVARIANT_create( IEnumWbemClassObject
*objectenum
, IEnumVARIANT
**obj
)
1416 struct enumvar
*enumvar
;
1418 if (!(enumvar
= heap_alloc( sizeof(*enumvar
) ))) return E_OUTOFMEMORY
;
1419 enumvar
->IEnumVARIANT_iface
.lpVtbl
= &enumvar_vtbl
;
1421 enumvar
->objectenum
= objectenum
;
1422 IEnumWbemClassObject_AddRef( enumvar
->objectenum
);
1424 *obj
= &enumvar
->IEnumVARIANT_iface
;
1425 TRACE( "returning iface %p\n", *obj
);
1431 ISWbemServices ISWbemServices_iface
;
1433 IWbemServices
*services
;
1436 static inline struct services
*impl_from_ISWbemServices(
1437 ISWbemServices
*iface
)
1439 return CONTAINING_RECORD( iface
, struct services
, ISWbemServices_iface
);
1442 static ULONG WINAPI
services_AddRef(
1443 ISWbemServices
*iface
)
1445 struct services
*services
= impl_from_ISWbemServices( iface
);
1446 return InterlockedIncrement( &services
->refs
);
1449 static ULONG WINAPI
services_Release(
1450 ISWbemServices
*iface
)
1452 struct services
*services
= impl_from_ISWbemServices( iface
);
1453 LONG refs
= InterlockedDecrement( &services
->refs
);
1456 TRACE( "destroying %p\n", services
);
1457 IWbemServices_Release( services
->services
);
1458 heap_free( services
);
1463 static HRESULT WINAPI
services_QueryInterface(
1464 ISWbemServices
*iface
,
1468 struct services
*services
= impl_from_ISWbemServices( iface
);
1470 TRACE( "%p %s %p\n", services
, debugstr_guid(riid
), ppvObject
);
1472 if (IsEqualGUID( riid
, &IID_ISWbemServices
) ||
1473 IsEqualGUID( riid
, &IID_IDispatch
) ||
1474 IsEqualGUID( riid
, &IID_IUnknown
))
1480 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1481 return E_NOINTERFACE
;
1483 ISWbemServices_AddRef( iface
);
1487 static HRESULT WINAPI
services_GetTypeInfoCount(
1488 ISWbemServices
*iface
,
1491 struct services
*services
= impl_from_ISWbemServices( iface
);
1492 TRACE( "%p, %p\n", services
, count
);
1498 static HRESULT WINAPI
services_GetTypeInfo(
1499 ISWbemServices
*iface
,
1504 struct services
*services
= impl_from_ISWbemServices( iface
);
1505 TRACE( "%p, %u, %u, %p\n", services
, index
, lcid
, info
);
1507 return get_typeinfo( ISWbemServices_tid
, info
);
1510 static HRESULT WINAPI
services_GetIDsOfNames(
1511 ISWbemServices
*iface
,
1518 struct services
*services
= impl_from_ISWbemServices( iface
);
1519 ITypeInfo
*typeinfo
;
1522 TRACE( "%p, %s, %p, %u, %u, %p\n", services
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1524 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
1526 hr
= get_typeinfo( ISWbemServices_tid
, &typeinfo
);
1529 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
1530 ITypeInfo_Release( typeinfo
);
1535 static HRESULT WINAPI
services_Invoke(
1536 ISWbemServices
*iface
,
1543 EXCEPINFO
*excep_info
,
1546 struct services
*services
= impl_from_ISWbemServices( iface
);
1547 ITypeInfo
*typeinfo
;
1550 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", services
, member
, debugstr_guid(riid
),
1551 lcid
, flags
, params
, result
, excep_info
, arg_err
);
1553 hr
= get_typeinfo( ISWbemServices_tid
, &typeinfo
);
1556 hr
= ITypeInfo_Invoke( typeinfo
, &services
->ISWbemServices_iface
, member
, flags
,
1557 params
, result
, excep_info
, arg_err
);
1558 ITypeInfo_Release( typeinfo
);
1563 static HRESULT WINAPI
services_Get(
1564 ISWbemServices
*iface
,
1567 IDispatch
*objWbemNamedValueSet
,
1568 ISWbemObject
**objWbemObject
)
1570 struct services
*services
= impl_from_ISWbemServices( iface
);
1571 IWbemClassObject
*obj
;
1574 TRACE( "%p, %s, %d, %p, %p\n", iface
, debugstr_w(strObjectPath
), iFlags
, objWbemNamedValueSet
,
1577 if (objWbemNamedValueSet
) FIXME( "ignoring context\n" );
1579 hr
= IWbemServices_GetObject( services
->services
, strObjectPath
, iFlags
, NULL
, &obj
, NULL
);
1580 if (hr
!= S_OK
) return hr
;
1582 hr
= SWbemObject_create( obj
, objWbemObject
);
1583 IWbemClassObject_Release( obj
);
1587 static HRESULT WINAPI
services_GetAsync(
1588 ISWbemServices
*iface
,
1589 IDispatch
*objWbemSink
,
1592 IDispatch
*objWbemNamedValueSet
,
1593 IDispatch
*objWbemAsyncContext
)
1599 static HRESULT WINAPI
services_Delete(
1600 ISWbemServices
*iface
,
1603 IDispatch
*objWbemNamedValueSet
)
1609 static HRESULT WINAPI
services_DeleteAsync(
1610 ISWbemServices
* This
,
1611 IDispatch
*objWbemSink
,
1614 IDispatch
*objWbemNamedValueSet
,
1615 IDispatch
*objWbemAsyncContext
)
1621 static BSTR
build_query_string( const WCHAR
*class )
1623 static const WCHAR selectW
[] = {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',0};
1624 UINT len
= strlenW(class) + sizeof(selectW
) / sizeof(selectW
[0]);
1627 if (!(ret
= SysAllocStringLen( NULL
, len
))) return NULL
;
1628 strcpyW( ret
, selectW
);
1629 strcatW( ret
, class );
1633 static HRESULT WINAPI
services_InstancesOf(
1634 ISWbemServices
*iface
,
1637 IDispatch
*objWbemNamedValueSet
,
1638 ISWbemObjectSet
**objWbemObjectSet
)
1640 static const WCHAR wqlW
[] = {'W','Q','L',0};
1641 BSTR query
, wql
= SysAllocString( wqlW
);
1644 TRACE( "%p, %s, %x, %p, %p\n", iface
, debugstr_w(strClass
), iFlags
, objWbemNamedValueSet
,
1647 if (!(query
= build_query_string( strClass
)))
1649 SysFreeString( wql
);
1650 return E_OUTOFMEMORY
;
1652 hr
= ISWbemServices_ExecQuery( iface
, query
, wql
, iFlags
, objWbemNamedValueSet
, objWbemObjectSet
);
1653 SysFreeString( wql
);
1654 SysFreeString( query
);
1658 static HRESULT WINAPI
services_InstancesOfAsync(
1659 ISWbemServices
*iface
,
1660 IDispatch
*objWbemSink
,
1663 IDispatch
*objWbemNamedValueSet
,
1664 IDispatch
*objWbemAsyncContext
)
1670 static HRESULT WINAPI
services_SubclassesOf(
1671 ISWbemServices
*iface
,
1674 IDispatch
*objWbemNamedValueSet
,
1675 ISWbemObjectSet
**objWbemObjectSet
)
1681 static HRESULT WINAPI
services_SubclassesOfAsync(
1682 ISWbemServices
*iface
,
1683 IDispatch
*objWbemSink
,
1686 IDispatch
*objWbemNamedValueSet
,
1687 IDispatch
*objWbemAsyncContext
)
1693 static HRESULT WINAPI
services_ExecQuery(
1694 ISWbemServices
*iface
,
1696 BSTR strQueryLanguage
,
1698 IDispatch
*objWbemNamedValueSet
,
1699 ISWbemObjectSet
**objWbemObjectSet
)
1701 struct services
*services
= impl_from_ISWbemServices( iface
);
1702 IEnumWbemClassObject
*iter
;
1705 TRACE( "%p, %s, %s, %x, %p, %p\n", iface
, debugstr_w(strQuery
), debugstr_w(strQueryLanguage
),
1706 iFlags
, objWbemNamedValueSet
, objWbemObjectSet
);
1708 if (objWbemNamedValueSet
) FIXME( "ignoring context\n" );
1710 hr
= IWbemServices_ExecQuery( services
->services
, strQueryLanguage
, strQuery
, iFlags
, NULL
, &iter
);
1711 if (hr
!= S_OK
) return hr
;
1713 hr
= SWbemObjectSet_create( iter
, objWbemObjectSet
);
1714 IEnumWbemClassObject_Release( iter
);
1718 static HRESULT WINAPI
services_ExecQueryAsync(
1719 ISWbemServices
*iface
,
1720 IDispatch
*objWbemSink
,
1722 BSTR strQueryLanguage
,
1724 IDispatch
*objWbemNamedValueSet
,
1725 IDispatch
*objWbemAsyncContext
)
1731 static HRESULT WINAPI
services_AssociatorsOf(
1732 ISWbemServices
*iface
,
1735 BSTR strResultClass
,
1738 VARIANT_BOOL bClassesOnly
,
1739 VARIANT_BOOL bSchemaOnly
,
1740 BSTR strRequiredAssocQualifier
,
1741 BSTR strRequiredQualifier
,
1743 IDispatch
*objWbemNamedValueSet
,
1744 ISWbemObjectSet
**objWbemObjectSet
)
1750 static HRESULT WINAPI
services_AssociatorsOfAsync(
1751 ISWbemServices
*iface
,
1752 IDispatch
*objWbemSink
,
1755 BSTR strResultClass
,
1758 VARIANT_BOOL bClassesOnly
,
1759 VARIANT_BOOL bSchemaOnly
,
1760 BSTR strRequiredAssocQualifier
,
1761 BSTR strRequiredQualifier
,
1763 IDispatch
*objWbemNamedValueSet
,
1764 IDispatch
*objWbemAsyncContext
)
1770 static HRESULT WINAPI
services_ReferencesTo(
1771 ISWbemServices
*iface
,
1773 BSTR strResultClass
,
1775 VARIANT_BOOL bClassesOnly
,
1776 VARIANT_BOOL bSchemaOnly
,
1777 BSTR strRequiredQualifier
,
1779 IDispatch
*objWbemNamedValueSet
,
1780 ISWbemObjectSet
**objWbemObjectSet
)
1786 static HRESULT WINAPI
services_ReferencesToAsync(
1787 ISWbemServices
*iface
,
1788 IDispatch
*objWbemSink
,
1790 BSTR strResultClass
,
1792 VARIANT_BOOL bClassesOnly
,
1793 VARIANT_BOOL bSchemaOnly
,
1794 BSTR strRequiredQualifier
,
1796 IDispatch
*objWbemNamedValueSet
,
1797 IDispatch
*objWbemAsyncContext
)
1803 static HRESULT WINAPI
services_ExecNotificationQuery(
1804 ISWbemServices
*iface
,
1806 BSTR strQueryLanguage
,
1808 IDispatch
*objWbemNamedValueSet
,
1809 ISWbemEventSource
**objWbemEventSource
)
1815 static HRESULT WINAPI
services_ExecNotificationQueryAsync(
1816 ISWbemServices
*iface
,
1817 IDispatch
*objWbemSink
,
1819 BSTR strQueryLanguage
,
1821 IDispatch
*objWbemNamedValueSet
,
1822 IDispatch
*objWbemAsyncContext
)
1828 static HRESULT WINAPI
services_ExecMethod(
1829 ISWbemServices
*iface
,
1832 IDispatch
*objWbemInParameters
,
1834 IDispatch
*objWbemNamedValueSet
,
1835 ISWbemObject
**objWbemOutParameters
)
1841 static HRESULT WINAPI
services_ExecMethodAsync(
1842 ISWbemServices
*iface
,
1843 IDispatch
*objWbemSink
,
1846 IDispatch
*objWbemInParameters
,
1848 IDispatch
*objWbemNamedValueSet
,
1849 IDispatch
*objWbemAsyncContext
)
1855 static HRESULT WINAPI
services_get_Security_(
1856 ISWbemServices
*iface
,
1857 ISWbemSecurity
**objWbemSecurity
)
1863 static const ISWbemServicesVtbl services_vtbl
=
1865 services_QueryInterface
,
1868 services_GetTypeInfoCount
,
1869 services_GetTypeInfo
,
1870 services_GetIDsOfNames
,
1875 services_DeleteAsync
,
1876 services_InstancesOf
,
1877 services_InstancesOfAsync
,
1878 services_SubclassesOf
,
1879 services_SubclassesOfAsync
,
1881 services_ExecQueryAsync
,
1882 services_AssociatorsOf
,
1883 services_AssociatorsOfAsync
,
1884 services_ReferencesTo
,
1885 services_ReferencesToAsync
,
1886 services_ExecNotificationQuery
,
1887 services_ExecNotificationQueryAsync
,
1888 services_ExecMethod
,
1889 services_ExecMethodAsync
,
1890 services_get_Security_
1893 static HRESULT
SWbemServices_create( IWbemServices
*wbem_services
, ISWbemServices
**obj
)
1895 struct services
*services
;
1897 TRACE( "%p, %p\n", obj
, wbem_services
);
1899 if (!(services
= heap_alloc( sizeof(*services
) ))) return E_OUTOFMEMORY
;
1900 services
->ISWbemServices_iface
.lpVtbl
= &services_vtbl
;
1902 services
->services
= wbem_services
;
1903 IWbemServices_AddRef( services
->services
);
1905 *obj
= &services
->ISWbemServices_iface
;
1906 TRACE( "returning iface %p\n", *obj
);
1912 ISWbemLocator ISWbemLocator_iface
;
1914 IWbemLocator
*locator
;
1917 static inline struct locator
*impl_from_ISWbemLocator( ISWbemLocator
*iface
)
1919 return CONTAINING_RECORD( iface
, struct locator
, ISWbemLocator_iface
);
1922 static ULONG WINAPI
locator_AddRef(
1923 ISWbemLocator
*iface
)
1925 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1926 return InterlockedIncrement( &locator
->refs
);
1929 static ULONG WINAPI
locator_Release(
1930 ISWbemLocator
*iface
)
1932 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1933 LONG refs
= InterlockedDecrement( &locator
->refs
);
1936 TRACE( "destroying %p\n", locator
);
1937 if (locator
->locator
)
1938 IWbemLocator_Release( locator
->locator
);
1939 heap_free( locator
);
1944 static HRESULT WINAPI
locator_QueryInterface(
1945 ISWbemLocator
*iface
,
1949 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1951 TRACE( "%p, %s, %p\n", locator
, debugstr_guid( riid
), ppvObject
);
1953 if (IsEqualGUID( riid
, &IID_ISWbemLocator
) ||
1954 IsEqualGUID( riid
, &IID_IDispatch
) ||
1955 IsEqualGUID( riid
, &IID_IUnknown
))
1961 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1962 return E_NOINTERFACE
;
1964 ISWbemLocator_AddRef( iface
);
1968 static HRESULT WINAPI
locator_GetTypeInfoCount(
1969 ISWbemLocator
*iface
,
1972 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1974 TRACE( "%p, %p\n", locator
, count
);
1979 static HRESULT WINAPI
locator_GetTypeInfo(
1980 ISWbemLocator
*iface
,
1985 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1986 TRACE( "%p, %u, %u, %p\n", locator
, index
, lcid
, info
);
1988 return get_typeinfo( ISWbemLocator_tid
, info
);
1991 static HRESULT WINAPI
locator_GetIDsOfNames(
1992 ISWbemLocator
*iface
,
1999 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
2000 ITypeInfo
*typeinfo
;
2003 TRACE( "%p, %s, %p, %u, %u, %p\n", locator
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
2005 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
2007 hr
= get_typeinfo( ISWbemLocator_tid
, &typeinfo
);
2010 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
2011 ITypeInfo_Release( typeinfo
);
2016 static HRESULT WINAPI
locator_Invoke(
2017 ISWbemLocator
*iface
,
2024 EXCEPINFO
*excep_info
,
2027 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
2028 ITypeInfo
*typeinfo
;
2031 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", locator
, member
, debugstr_guid(riid
),
2032 lcid
, flags
, params
, result
, excep_info
, arg_err
);
2034 hr
= get_typeinfo( ISWbemLocator_tid
, &typeinfo
);
2037 hr
= ITypeInfo_Invoke( typeinfo
, &locator
->ISWbemLocator_iface
, member
, flags
,
2038 params
, result
, excep_info
, arg_err
);
2039 ITypeInfo_Release( typeinfo
);
2044 static BSTR
build_resource_string( BSTR server
, BSTR
namespace )
2046 static const WCHAR defaultW
[] = {'r','o','o','t','\\','d','e','f','a','u','l','t',0};
2047 ULONG len
, len_server
= 0, len_namespace
= 0;
2050 if (server
&& *server
) len_server
= strlenW( server
);
2051 else len_server
= 1;
2052 if (namespace && *namespace) len_namespace
= strlenW( namespace );
2053 else len_namespace
= sizeof(defaultW
) / sizeof(defaultW
[0]) - 1;
2055 if (!(ret
= SysAllocStringLen( NULL
, 2 + len_server
+ 1 + len_namespace
))) return NULL
;
2057 ret
[0] = ret
[1] = '\\';
2058 if (server
&& *server
) strcpyW( ret
+ 2, server
);
2061 len
= len_server
+ 2;
2064 if (namespace && *namespace) strcpyW( ret
+ len
, namespace );
2065 else strcpyW( ret
+ len
, defaultW
);
2069 static HRESULT WINAPI
locator_ConnectServer(
2070 ISWbemLocator
*iface
,
2077 LONG iSecurityFlags
,
2078 IDispatch
*objWbemNamedValueSet
,
2079 ISWbemServices
**objWbemServices
)
2081 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
2082 IWbemServices
*services
;
2086 TRACE( "%p, %s, %s, %s, %p, %s, %s, 0x%08x, %p, %p\n", iface
, debugstr_w(strServer
),
2087 debugstr_w(strNamespace
), debugstr_w(strUser
), strPassword
, debugstr_w(strLocale
),
2088 debugstr_w(strAuthority
), iSecurityFlags
, objWbemNamedValueSet
, objWbemServices
);
2090 if (objWbemNamedValueSet
) FIXME( "context not supported\n" );
2092 if (!locator
->locator
)
2094 hr
= CoCreateInstance( &CLSID_WbemLocator
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IWbemLocator
,
2095 (void **)&locator
->locator
);
2096 if (hr
!= S_OK
) return hr
;
2099 if (!(resource
= build_resource_string( strServer
, strNamespace
))) return E_OUTOFMEMORY
;
2100 hr
= IWbemLocator_ConnectServer( locator
->locator
, resource
, strUser
, strPassword
, strLocale
,
2101 iSecurityFlags
, strAuthority
, NULL
, &services
);
2102 SysFreeString( resource
);
2103 if (hr
!= S_OK
) return hr
;
2105 hr
= SWbemServices_create( services
, objWbemServices
);
2106 IWbemServices_Release( services
);
2110 static HRESULT WINAPI
locator_get_Security_(
2111 ISWbemLocator
*iface
,
2112 ISWbemSecurity
**objWbemSecurity
)
2114 FIXME( "%p, %p\n", iface
, objWbemSecurity
);
2118 static const ISWbemLocatorVtbl locator_vtbl
=
2120 locator_QueryInterface
,
2123 locator_GetTypeInfoCount
,
2124 locator_GetTypeInfo
,
2125 locator_GetIDsOfNames
,
2127 locator_ConnectServer
,
2128 locator_get_Security_
2131 HRESULT
SWbemLocator_create( void **obj
)
2133 struct locator
*locator
;
2135 TRACE( "%p\n", obj
);
2137 if (!(locator
= heap_alloc( sizeof(*locator
) ))) return E_OUTOFMEMORY
;
2138 locator
->ISWbemLocator_iface
.lpVtbl
= &locator_vtbl
;
2140 locator
->locator
= NULL
;
2142 *obj
= &locator
->ISWbemLocator_iface
;
2143 TRACE( "returning iface %p\n", *obj
);