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
32 #include "wine/debug.h"
33 #include "wine/heap.h"
34 #include "wine/unicode.h"
35 #include "wbemdisp_private.h"
36 #include "wbemdisp_classes.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(wbemdisp
);
40 static HRESULT
EnumVARIANT_create( IEnumWbemClassObject
*, IEnumVARIANT
** );
41 static HRESULT
ISWbemSecurity_create( ISWbemSecurity
** );
49 ISWbemPropertySet_tid
,
55 static ITypeLib
*wbemdisp_typelib
;
56 static ITypeInfo
*wbemdisp_typeinfo
[last_tid
];
58 static REFIID wbemdisp_tid_id
[] =
64 &IID_ISWbemPropertySet
,
69 static HRESULT
get_typeinfo( enum type_id tid
, ITypeInfo
**ret
)
73 if (!wbemdisp_typelib
)
77 hr
= LoadRegTypeLib( &LIBID_WbemScripting
, 1, 2, LOCALE_SYSTEM_DEFAULT
, &typelib
);
80 ERR( "LoadRegTypeLib failed: %08x\n", hr
);
83 if (InterlockedCompareExchangePointer( (void **)&wbemdisp_typelib
, typelib
, NULL
))
84 ITypeLib_Release( typelib
);
86 if (!wbemdisp_typeinfo
[tid
])
90 hr
= ITypeLib_GetTypeInfoOfGuid( wbemdisp_typelib
, wbemdisp_tid_id
[tid
], &typeinfo
);
93 ERR( "GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(wbemdisp_tid_id
[tid
]), hr
);
96 if (InterlockedCompareExchangePointer( (void **)(wbemdisp_typeinfo
+ tid
), typeinfo
, NULL
))
97 ITypeInfo_Release( typeinfo
);
99 *ret
= wbemdisp_typeinfo
[tid
];
100 ITypeInfo_AddRef( *ret
);
106 ISWbemProperty ISWbemProperty_iface
;
108 IWbemClassObject
*object
;
112 static inline struct property
*impl_from_ISWbemProperty( ISWbemProperty
*iface
)
114 return CONTAINING_RECORD( iface
, struct property
, ISWbemProperty_iface
);
117 static ULONG WINAPI
property_AddRef( ISWbemProperty
*iface
)
119 struct property
*property
= impl_from_ISWbemProperty( iface
);
120 return InterlockedIncrement( &property
->refs
);
123 static ULONG WINAPI
property_Release( ISWbemProperty
*iface
)
125 struct property
*property
= impl_from_ISWbemProperty( iface
);
126 LONG refs
= InterlockedDecrement( &property
->refs
);
129 TRACE( "destroying %p\n", property
);
130 IWbemClassObject_Release( property
->object
);
131 SysFreeString( property
->name
);
132 heap_free( property
);
137 static HRESULT WINAPI
property_QueryInterface( ISWbemProperty
*iface
, REFIID riid
, void **obj
)
139 struct property
*property
= impl_from_ISWbemProperty( iface
);
141 TRACE( "%p %s %p\n", property
, debugstr_guid(riid
), obj
);
143 if (IsEqualGUID( riid
, &IID_ISWbemProperty
) ||
144 IsEqualGUID( riid
, &IID_IDispatch
) ||
145 IsEqualGUID( riid
, &IID_IUnknown
))
151 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
152 return E_NOINTERFACE
;
154 ISWbemProperty_AddRef( iface
);
158 static HRESULT WINAPI
property_GetTypeInfoCount( ISWbemProperty
*iface
, UINT
*count
)
160 struct property
*property
= impl_from_ISWbemProperty( iface
);
161 TRACE( "%p, %p\n", property
, count
);
166 static HRESULT WINAPI
property_GetTypeInfo( ISWbemProperty
*iface
, UINT index
,
167 LCID lcid
, ITypeInfo
**info
)
169 struct property
*property
= impl_from_ISWbemProperty( iface
);
170 TRACE( "%p, %u, %u, %p\n", property
, index
, lcid
, info
);
172 return get_typeinfo( ISWbemProperty_tid
, info
);
175 static HRESULT WINAPI
property_GetIDsOfNames( ISWbemProperty
*iface
, REFIID riid
, LPOLESTR
*names
,
176 UINT count
, LCID lcid
, DISPID
*dispid
)
178 struct property
*property
= impl_from_ISWbemProperty( iface
);
182 TRACE( "%p, %s, %p, %u, %u, %p\n", property
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
184 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
186 hr
= get_typeinfo( ISWbemProperty_tid
, &typeinfo
);
189 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
190 ITypeInfo_Release( typeinfo
);
195 static HRESULT WINAPI
property_Invoke( ISWbemProperty
*iface
, DISPID member
, REFIID riid
,
196 LCID lcid
, WORD flags
, DISPPARAMS
*params
,
197 VARIANT
*result
, EXCEPINFO
*excep_info
, UINT
*arg_err
)
199 struct property
*property
= impl_from_ISWbemProperty( iface
);
203 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", property
, member
, debugstr_guid(riid
),
204 lcid
, flags
, params
, result
, excep_info
, arg_err
);
206 hr
= get_typeinfo( ISWbemProperty_tid
, &typeinfo
);
209 hr
= ITypeInfo_Invoke( typeinfo
, &property
->ISWbemProperty_iface
, member
, flags
,
210 params
, result
, excep_info
, arg_err
);
211 ITypeInfo_Release( typeinfo
);
216 static HRESULT WINAPI
property_get_Value( ISWbemProperty
*iface
, VARIANT
*value
)
218 struct property
*property
= impl_from_ISWbemProperty( iface
);
220 TRACE( "%p %p\n", property
, value
);
222 return IWbemClassObject_Get( property
->object
, property
->name
, 0, value
, NULL
, NULL
);
225 static HRESULT WINAPI
property_put_Value( ISWbemProperty
*iface
, VARIANT
*varValue
)
231 static HRESULT WINAPI
property_get_Name( ISWbemProperty
*iface
, BSTR
*strName
)
237 static HRESULT WINAPI
property_get_IsLocal( ISWbemProperty
*iface
, VARIANT_BOOL
*bIsLocal
)
243 static HRESULT WINAPI
property_get_Origin( ISWbemProperty
*iface
, BSTR
*strOrigin
)
249 static HRESULT WINAPI
property_get_CIMType( ISWbemProperty
*iface
, WbemCimtypeEnum
*iCimType
)
255 static HRESULT WINAPI
property_get_Qualifiers_( ISWbemProperty
*iface
, ISWbemQualifierSet
**objWbemQualifierSet
)
261 static HRESULT WINAPI
property_get_IsArray( ISWbemProperty
*iface
, VARIANT_BOOL
*bIsArray
)
267 static const ISWbemPropertyVtbl property_vtbl
=
269 property_QueryInterface
,
272 property_GetTypeInfoCount
,
273 property_GetTypeInfo
,
274 property_GetIDsOfNames
,
279 property_get_IsLocal
,
281 property_get_CIMType
,
282 property_get_Qualifiers_
,
286 static HRESULT
SWbemProperty_create( IWbemClassObject
*wbem_object
, BSTR name
, ISWbemProperty
**obj
)
288 struct property
*property
;
290 TRACE( "%p, %p\n", obj
, wbem_object
);
292 if (!(property
= heap_alloc( sizeof(*property
) ))) return E_OUTOFMEMORY
;
293 property
->ISWbemProperty_iface
.lpVtbl
= &property_vtbl
;
295 property
->object
= wbem_object
;
296 IWbemClassObject_AddRef( property
->object
);
297 property
->name
= SysAllocStringLen( name
, SysStringLen( name
) );
298 *obj
= &property
->ISWbemProperty_iface
;
299 TRACE( "returning iface %p\n", *obj
);
305 ISWbemPropertySet ISWbemPropertySet_iface
;
307 IWbemClassObject
*object
;
310 static inline struct propertyset
*impl_from_ISWbemPropertySet(
311 ISWbemPropertySet
*iface
)
313 return CONTAINING_RECORD( iface
, struct propertyset
, ISWbemPropertySet_iface
);
316 static ULONG WINAPI
propertyset_AddRef( ISWbemPropertySet
*iface
)
318 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
319 return InterlockedIncrement( &propertyset
->refs
);
322 static ULONG WINAPI
propertyset_Release( ISWbemPropertySet
*iface
)
324 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
325 LONG refs
= InterlockedDecrement( &propertyset
->refs
);
328 TRACE( "destroying %p\n", propertyset
);
329 IWbemClassObject_Release( propertyset
->object
);
330 heap_free( propertyset
);
335 static HRESULT WINAPI
propertyset_QueryInterface( ISWbemPropertySet
*iface
,
336 REFIID riid
, void **obj
)
338 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
340 TRACE( "%p %s %p\n", propertyset
, debugstr_guid(riid
), obj
);
342 if (IsEqualGUID( riid
, &IID_ISWbemPropertySet
) ||
343 IsEqualGUID( riid
, &IID_IDispatch
) ||
344 IsEqualGUID( riid
, &IID_IUnknown
))
350 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
351 return E_NOINTERFACE
;
353 ISWbemPropertySet_AddRef( iface
);
357 static HRESULT WINAPI
propertyset_GetTypeInfoCount( ISWbemPropertySet
*iface
, UINT
*count
)
359 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
360 TRACE( "%p, %p\n", propertyset
, count
);
365 static HRESULT WINAPI
propertyset_GetTypeInfo( ISWbemPropertySet
*iface
,
366 UINT index
, LCID lcid
, ITypeInfo
**info
)
368 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
369 TRACE( "%p, %u, %u, %p\n", propertyset
, index
, lcid
, info
);
371 return get_typeinfo( ISWbemPropertySet_tid
, info
);
374 static HRESULT WINAPI
propertyset_GetIDsOfNames( ISWbemPropertySet
*iface
, REFIID riid
, LPOLESTR
*names
,
375 UINT count
, LCID lcid
, DISPID
*dispid
)
377 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
381 TRACE( "%p, %s, %p, %u, %u, %p\n", propertyset
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
383 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
385 hr
= get_typeinfo( ISWbemPropertySet_tid
, &typeinfo
);
388 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
389 ITypeInfo_Release( typeinfo
);
394 static HRESULT WINAPI
propertyset_Invoke( ISWbemPropertySet
*iface
, DISPID member
, REFIID riid
,
395 LCID lcid
, WORD flags
, DISPPARAMS
*params
,
396 VARIANT
*result
, EXCEPINFO
*excep_info
, UINT
*arg_err
)
398 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
402 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", propertyset
, member
, debugstr_guid(riid
),
403 lcid
, flags
, params
, result
, excep_info
, arg_err
);
405 hr
= get_typeinfo( ISWbemPropertySet_tid
, &typeinfo
);
408 hr
= ITypeInfo_Invoke( typeinfo
, &propertyset
->ISWbemPropertySet_iface
, member
, flags
,
409 params
, result
, excep_info
, arg_err
);
410 ITypeInfo_Release( typeinfo
);
415 static HRESULT WINAPI
propertyset_get__NewEnum( ISWbemPropertySet
*iface
, IUnknown
**unk
)
421 static HRESULT WINAPI
propertyset_Item( ISWbemPropertySet
*iface
, BSTR name
,
422 LONG flags
, ISWbemProperty
**prop
)
424 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
428 TRACE( "%p, %s, %08x, %p\n", propertyset
, debugstr_w(name
), flags
, prop
);
430 hr
= IWbemClassObject_Get( propertyset
->object
, name
, 0, &var
, NULL
, NULL
);
433 hr
= SWbemProperty_create( propertyset
->object
, name
, prop
);
434 VariantClear( &var
);
439 static HRESULT WINAPI
propertyset_get_Count( ISWbemPropertySet
*iface
, LONG
*count
)
445 static HRESULT WINAPI
propertyset_Add( ISWbemPropertySet
*iface
, BSTR name
, WbemCimtypeEnum type
,
446 VARIANT_BOOL is_array
, LONG flags
, ISWbemProperty
**prop
)
452 static HRESULT WINAPI
propertyset_Remove( ISWbemPropertySet
*iface
, BSTR name
, LONG flags
)
458 static const ISWbemPropertySetVtbl propertyset_vtbl
=
460 propertyset_QueryInterface
,
463 propertyset_GetTypeInfoCount
,
464 propertyset_GetTypeInfo
,
465 propertyset_GetIDsOfNames
,
467 propertyset_get__NewEnum
,
469 propertyset_get_Count
,
474 static HRESULT
SWbemPropertySet_create( IWbemClassObject
*wbem_object
, ISWbemPropertySet
**obj
)
476 struct propertyset
*propertyset
;
478 TRACE( "%p, %p\n", obj
, wbem_object
);
480 if (!(propertyset
= heap_alloc( sizeof(*propertyset
) ))) return E_OUTOFMEMORY
;
481 propertyset
->ISWbemPropertySet_iface
.lpVtbl
= &propertyset_vtbl
;
482 propertyset
->refs
= 1;
483 propertyset
->object
= wbem_object
;
484 IWbemClassObject_AddRef( propertyset
->object
);
485 *obj
= &propertyset
->ISWbemPropertySet_iface
;
487 TRACE( "returning iface %p\n", *obj
);
491 #define DISPID_BASE 0x1800000
501 ISWbemObject ISWbemObject_iface
;
503 IWbemClassObject
*object
;
504 struct member
*members
;
509 static inline struct object
*impl_from_ISWbemObject(
510 ISWbemObject
*iface
)
512 return CONTAINING_RECORD( iface
, struct object
, ISWbemObject_iface
);
515 static ULONG WINAPI
object_AddRef(
516 ISWbemObject
*iface
)
518 struct object
*object
= impl_from_ISWbemObject( iface
);
519 return InterlockedIncrement( &object
->refs
);
522 static ULONG WINAPI
object_Release(
523 ISWbemObject
*iface
)
525 struct object
*object
= impl_from_ISWbemObject( iface
);
526 LONG refs
= InterlockedDecrement( &object
->refs
);
531 TRACE( "destroying %p\n", object
);
532 IWbemClassObject_Release( object
->object
);
533 for (i
= 0; i
< object
->nb_members
; i
++) SysFreeString( object
->members
[i
].name
);
534 heap_free( object
->members
);
540 static HRESULT WINAPI
object_QueryInterface(
545 struct object
*object
= impl_from_ISWbemObject( iface
);
547 TRACE( "%p %s %p\n", object
, debugstr_guid(riid
), ppvObject
);
549 if (IsEqualGUID( riid
, &IID_ISWbemObject
) ||
550 IsEqualGUID( riid
, &IID_IDispatch
) ||
551 IsEqualGUID( riid
, &IID_IUnknown
))
557 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
558 return E_NOINTERFACE
;
560 ISWbemObject_AddRef( iface
);
564 static HRESULT WINAPI
object_GetTypeInfoCount(
568 struct object
*object
= impl_from_ISWbemObject( iface
);
570 TRACE( "%p, %p\n", object
, count
);
575 static HRESULT WINAPI
object_GetTypeInfo(
581 struct object
*object
= impl_from_ISWbemObject( iface
);
582 FIXME( "%p, %u, %u, %p\n", object
, index
, lcid
, info
);
586 static HRESULT
init_members( struct object
*object
)
592 if (object
->members
) return S_OK
;
594 hr
= IWbemClassObject_GetNames( object
->object
, NULL
, 0, NULL
, &sa
);
595 if (FAILED( hr
)) return hr
;
596 hr
= SafeArrayGetUBound( sa
, 1, &bound
);
599 SafeArrayDestroy( sa
);
602 if (!(object
->members
= heap_alloc( sizeof(struct member
) * (bound
+ 1) )))
604 SafeArrayDestroy( sa
);
605 return E_OUTOFMEMORY
;
607 for (i
= 0; i
<= bound
; i
++)
609 hr
= SafeArrayGetElement( sa
, &i
, &object
->members
[i
].name
);
612 for (i
--; i
>= 0; i
--) SysFreeString( object
->members
[i
].name
);
613 SafeArrayDestroy( sa
);
614 heap_free( object
->members
);
615 object
->members
= NULL
;
616 return E_OUTOFMEMORY
;
618 object
->members
[i
].dispid
= 0;
620 object
->nb_members
= bound
+ 1;
621 SafeArrayDestroy( sa
);
625 static DISPID
get_member_dispid( struct object
*object
, const WCHAR
*name
)
628 for (i
= 0; i
< object
->nb_members
; i
++)
630 if (!strcmpiW( object
->members
[i
].name
, name
))
632 if (!object
->members
[i
].dispid
) object
->members
[i
].dispid
= ++object
->last_dispid
;
633 return object
->members
[i
].dispid
;
636 return DISPID_UNKNOWN
;
639 static HRESULT WINAPI
object_GetIDsOfNames(
647 struct object
*object
= impl_from_ISWbemObject( iface
);
652 TRACE( "%p, %s, %p, %u, %u, %p\n", object
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
654 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
656 hr
= init_members( object
);
657 if (FAILED( hr
)) return hr
;
659 hr
= get_typeinfo( ISWbemObject_tid
, &typeinfo
);
662 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
663 ITypeInfo_Release( typeinfo
);
665 if (SUCCEEDED(hr
)) return hr
;
667 for (i
= 0; i
< count
; i
++)
669 if ((dispid
[i
] = get_member_dispid( object
, names
[i
] )) == DISPID_UNKNOWN
) break;
671 if (i
!= count
) return DISP_E_UNKNOWNNAME
;
675 static BSTR
get_member_name( struct object
*object
, DISPID dispid
)
678 for (i
= 0; i
< object
->nb_members
; i
++)
680 if (object
->members
[i
].dispid
== dispid
) return object
->members
[i
].name
;
685 static HRESULT WINAPI
object_Invoke(
693 EXCEPINFO
*excep_info
,
696 struct object
*object
= impl_from_ISWbemObject( iface
);
701 TRACE( "%p, %x, %s, %u, %x, %p, %p, %p, %p\n", object
, member
, debugstr_guid(riid
),
702 lcid
, flags
, params
, result
, excep_info
, arg_err
);
704 if (member
<= DISPID_BASE
)
706 hr
= get_typeinfo( ISWbemObject_tid
, &typeinfo
);
709 hr
= ITypeInfo_Invoke( typeinfo
, &object
->ISWbemObject_iface
, member
, flags
,
710 params
, result
, excep_info
, arg_err
);
711 ITypeInfo_Release( typeinfo
);
716 if (flags
!= (DISPATCH_METHOD
|DISPATCH_PROPERTYGET
))
718 FIXME( "flags %x not supported\n", flags
);
721 if (!(name
= get_member_name( object
, member
)))
722 return DISP_E_MEMBERNOTFOUND
;
724 memset( params
, 0, sizeof(*params
) );
725 return IWbemClassObject_Get( object
->object
, name
, 0, result
, NULL
, NULL
);
728 static HRESULT WINAPI
object_Put_(
731 IDispatch
*objWbemNamedValueSet
,
732 ISWbemObjectPath
**objWbemObjectPath
)
738 static HRESULT WINAPI
object_PutAsync_(
740 IDispatch
*objWbemSink
,
742 IDispatch
*objWbemNamedValueSet
,
743 IDispatch
*objWbemAsyncContext
)
749 static HRESULT WINAPI
object_Delete_(
752 IDispatch
*objWbemNamedValueSet
)
758 static HRESULT WINAPI
object_DeleteAsync_(
760 IDispatch
*objWbemSink
,
762 IDispatch
*objWbemNamedValueSet
,
763 IDispatch
*objWbemAsyncContext
)
769 static HRESULT WINAPI
object_Instances_(
772 IDispatch
*objWbemNamedValueSet
,
773 ISWbemObjectSet
**objWbemObjectSet
)
779 static HRESULT WINAPI
object_InstancesAsync_(
781 IDispatch
*objWbemSink
,
783 IDispatch
*objWbemNamedValueSet
,
784 IDispatch
*objWbemAsyncContext
)
790 static HRESULT WINAPI
object_Subclasses_(
793 IDispatch
*objWbemNamedValueSet
,
794 ISWbemObjectSet
**objWbemObjectSet
)
800 static HRESULT WINAPI
object_SubclassesAsync_(
802 IDispatch
*objWbemSink
,
804 IDispatch
*objWbemNamedValueSet
,
805 IDispatch
*objWbemAsyncContext
)
811 static HRESULT WINAPI
object_Associators_(
817 VARIANT_BOOL bClassesOnly
,
818 VARIANT_BOOL bSchemaOnly
,
819 BSTR strRequiredAssocQualifier
,
820 BSTR strRequiredQualifier
,
822 IDispatch
*objWbemNamedValueSet
,
823 ISWbemObjectSet
**objWbemObjectSet
)
829 static HRESULT WINAPI
object_AssociatorsAsync_(
831 IDispatch
*objWbemSink
,
836 VARIANT_BOOL bClassesOnly
,
837 VARIANT_BOOL bSchemaOnly
,
838 BSTR strRequiredAssocQualifier
,
839 BSTR strRequiredQualifier
,
841 IDispatch
*objWbemNamedValueSet
,
842 IDispatch
*objWbemAsyncContext
)
848 static HRESULT WINAPI
object_References_(
852 VARIANT_BOOL bClassesOnly
,
853 VARIANT_BOOL bSchemaOnly
,
854 BSTR strRequiredQualifier
,
856 IDispatch
*objWbemNamedValueSet
,
857 ISWbemObjectSet
**objWbemObjectSet
)
863 static HRESULT WINAPI
object_ReferencesAsync_(
865 IDispatch
*objWbemSink
,
868 VARIANT_BOOL bClassesOnly
,
869 VARIANT_BOOL bSchemaOnly
,
870 BSTR strRequiredQualifier
,
872 IDispatch
*objWbemNamedValueSet
,
873 IDispatch
*objWbemAsyncContext
)
879 static HRESULT WINAPI
object_ExecMethod_(
882 IDispatch
*objWbemInParameters
,
884 IDispatch
*objWbemNamedValueSet
,
885 ISWbemObject
**objWbemOutParameters
)
891 static HRESULT WINAPI
object_ExecMethodAsync_(
893 IDispatch
*objWbemSink
,
895 IDispatch
*objWbemInParameters
,
897 IDispatch
*objWbemNamedValueSet
,
898 IDispatch
*objWbemAsyncContext
)
904 static HRESULT WINAPI
object_Clone_(
906 ISWbemObject
**objWbemObject
)
912 static HRESULT WINAPI
object_GetObjectText_(
915 BSTR
*strObjectText
)
921 static HRESULT WINAPI
object_SpawnDerivedClass_(
924 ISWbemObject
**objWbemObject
)
930 static HRESULT WINAPI
object_SpawnInstance_(
933 ISWbemObject
**objWbemObject
)
939 static HRESULT WINAPI
object_CompareTo_(
941 IDispatch
*objWbemObject
,
943 VARIANT_BOOL
*bResult
)
949 static HRESULT WINAPI
object_get_Qualifiers_(
951 ISWbemQualifierSet
**objWbemQualifierSet
)
957 static HRESULT WINAPI
object_get_Properties_( ISWbemObject
*iface
, ISWbemPropertySet
**prop_set
)
959 struct object
*object
= impl_from_ISWbemObject( iface
);
961 TRACE( "%p, %p\n", object
, prop_set
);
962 return SWbemPropertySet_create( object
->object
, prop_set
);
965 static HRESULT WINAPI
object_get_Methods_(
967 ISWbemMethodSet
**objWbemMethodSet
)
973 static HRESULT WINAPI
object_get_Derivation_(
975 VARIANT
*strClassNameArray
)
981 static HRESULT WINAPI
object_get_Path_(
983 ISWbemObjectPath
**objWbemObjectPath
)
989 static HRESULT WINAPI
object_get_Security_(
991 ISWbemSecurity
**objWbemSecurity
)
997 static const ISWbemObjectVtbl object_vtbl
=
999 object_QueryInterface
,
1002 object_GetTypeInfoCount
,
1004 object_GetIDsOfNames
,
1009 object_DeleteAsync_
,
1011 object_InstancesAsync_
,
1013 object_SubclassesAsync_
,
1014 object_Associators_
,
1015 object_AssociatorsAsync_
,
1017 object_ReferencesAsync_
,
1019 object_ExecMethodAsync_
,
1021 object_GetObjectText_
,
1022 object_SpawnDerivedClass_
,
1023 object_SpawnInstance_
,
1025 object_get_Qualifiers_
,
1026 object_get_Properties_
,
1027 object_get_Methods_
,
1028 object_get_Derivation_
,
1030 object_get_Security_
1033 static HRESULT
SWbemObject_create( IWbemClassObject
*wbem_object
, ISWbemObject
**obj
)
1035 struct object
*object
;
1037 TRACE( "%p, %p\n", obj
, wbem_object
);
1039 if (!(object
= heap_alloc( sizeof(*object
) ))) return E_OUTOFMEMORY
;
1040 object
->ISWbemObject_iface
.lpVtbl
= &object_vtbl
;
1042 object
->object
= wbem_object
;
1043 IWbemClassObject_AddRef( object
->object
);
1044 object
->members
= NULL
;
1045 object
->nb_members
= 0;
1046 object
->last_dispid
= DISPID_BASE
;
1048 *obj
= &object
->ISWbemObject_iface
;
1049 TRACE( "returning iface %p\n", *obj
);
1055 ISWbemObjectSet ISWbemObjectSet_iface
;
1057 IEnumWbemClassObject
*objectenum
;
1061 static inline struct objectset
*impl_from_ISWbemObjectSet(
1062 ISWbemObjectSet
*iface
)
1064 return CONTAINING_RECORD( iface
, struct objectset
, ISWbemObjectSet_iface
);
1067 static ULONG WINAPI
objectset_AddRef(
1068 ISWbemObjectSet
*iface
)
1070 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1071 return InterlockedIncrement( &objectset
->refs
);
1074 static ULONG WINAPI
objectset_Release(
1075 ISWbemObjectSet
*iface
)
1077 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1078 LONG refs
= InterlockedDecrement( &objectset
->refs
);
1081 TRACE( "destroying %p\n", objectset
);
1082 IEnumWbemClassObject_Release( objectset
->objectenum
);
1083 heap_free( objectset
);
1088 static HRESULT WINAPI
objectset_QueryInterface(
1089 ISWbemObjectSet
*iface
,
1093 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1095 TRACE( "%p %s %p\n", objectset
, debugstr_guid(riid
), ppvObject
);
1097 if (IsEqualGUID( riid
, &IID_ISWbemObjectSet
) ||
1098 IsEqualGUID( riid
, &IID_IDispatch
) ||
1099 IsEqualGUID( riid
, &IID_IUnknown
))
1105 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1106 return E_NOINTERFACE
;
1108 ISWbemObjectSet_AddRef( iface
);
1112 static HRESULT WINAPI
objectset_GetTypeInfoCount(
1113 ISWbemObjectSet
*iface
,
1116 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1117 TRACE( "%p, %p\n", objectset
, count
);
1122 static HRESULT WINAPI
objectset_GetTypeInfo(
1123 ISWbemObjectSet
*iface
,
1128 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1129 TRACE( "%p, %u, %u, %p\n", objectset
, index
, lcid
, info
);
1131 return get_typeinfo( ISWbemObjectSet_tid
, info
);
1134 static HRESULT WINAPI
objectset_GetIDsOfNames(
1135 ISWbemObjectSet
*iface
,
1142 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1143 ITypeInfo
*typeinfo
;
1146 TRACE( "%p, %s, %p, %u, %u, %p\n", objectset
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1148 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
1150 hr
= get_typeinfo( ISWbemObjectSet_tid
, &typeinfo
);
1153 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
1154 ITypeInfo_Release( typeinfo
);
1159 static HRESULT WINAPI
objectset_Invoke(
1160 ISWbemObjectSet
*iface
,
1167 EXCEPINFO
*excep_info
,
1170 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1171 ITypeInfo
*typeinfo
;
1174 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", objectset
, member
, debugstr_guid(riid
),
1175 lcid
, flags
, params
, result
, excep_info
, arg_err
);
1177 hr
= get_typeinfo( ISWbemObjectSet_tid
, &typeinfo
);
1180 hr
= ITypeInfo_Invoke( typeinfo
, &objectset
->ISWbemObjectSet_iface
, member
, flags
,
1181 params
, result
, excep_info
, arg_err
);
1182 ITypeInfo_Release( typeinfo
);
1187 static HRESULT WINAPI
objectset_get__NewEnum(
1188 ISWbemObjectSet
*iface
,
1191 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1192 IEnumWbemClassObject
*objectenum
;
1195 TRACE( "%p, %p\n", objectset
, pUnk
);
1197 hr
= IEnumWbemClassObject_Clone( objectset
->objectenum
, &objectenum
);
1198 if (FAILED( hr
)) return hr
;
1200 hr
= EnumVARIANT_create( objectenum
, (IEnumVARIANT
**)pUnk
);
1201 IEnumWbemClassObject_Release( objectenum
);
1205 static HRESULT WINAPI
objectset_Item(
1206 ISWbemObjectSet
*iface
,
1209 ISWbemObject
**objWbemObject
)
1215 static HRESULT WINAPI
objectset_get_Count(
1216 ISWbemObjectSet
*iface
,
1219 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1221 TRACE( "%p, %p\n", objectset
, iCount
);
1223 *iCount
= objectset
->count
;
1227 static HRESULT WINAPI
objectset_get_Security_(
1228 ISWbemObjectSet
*iface
,
1229 ISWbemSecurity
**objWbemSecurity
)
1235 static HRESULT WINAPI
objectset_ItemIndex(
1236 ISWbemObjectSet
*iface
,
1238 ISWbemObject
**objWbemObject
)
1240 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1243 IEnumVARIANT
*enum_var
;
1246 TRACE( "%p, %d, %p\n", objectset
, lIndex
, objWbemObject
);
1248 *objWbemObject
= NULL
;
1249 hr
= ISWbemObjectSet_get_Count( iface
, &count
);
1250 if (FAILED(hr
)) return hr
;
1252 if (lIndex
>= count
) return WBEM_E_NOT_FOUND
;
1254 hr
= ISWbemObjectSet_get__NewEnum( iface
, (IUnknown
**)&enum_var
);
1255 if (FAILED(hr
)) return hr
;
1257 IEnumVARIANT_Reset( enum_var
);
1258 hr
= IEnumVARIANT_Skip( enum_var
, lIndex
);
1260 hr
= IEnumVARIANT_Next( enum_var
, 1, &var
, NULL
);
1261 IEnumVARIANT_Release( enum_var
);
1265 if (V_VT( &var
) == VT_DISPATCH
)
1266 hr
= IDispatch_QueryInterface( V_DISPATCH( &var
), &IID_ISWbemObject
, (void **)objWbemObject
);
1268 hr
= WBEM_E_NOT_FOUND
;
1269 VariantClear( &var
);
1275 static const ISWbemObjectSetVtbl objectset_vtbl
=
1277 objectset_QueryInterface
,
1280 objectset_GetTypeInfoCount
,
1281 objectset_GetTypeInfo
,
1282 objectset_GetIDsOfNames
,
1284 objectset_get__NewEnum
,
1286 objectset_get_Count
,
1287 objectset_get_Security_
,
1291 static LONG
get_object_count( IEnumWbemClassObject
*iter
)
1294 while (IEnumWbemClassObject_Skip( iter
, WBEM_INFINITE
, 1 ) == S_OK
) count
++;
1295 IEnumWbemClassObject_Reset( iter
);
1299 static HRESULT
SWbemObjectSet_create( IEnumWbemClassObject
*wbem_objectenum
, ISWbemObjectSet
**obj
)
1301 struct objectset
*objectset
;
1303 TRACE( "%p, %p\n", obj
, wbem_objectenum
);
1305 if (!(objectset
= heap_alloc( sizeof(*objectset
) ))) return E_OUTOFMEMORY
;
1306 objectset
->ISWbemObjectSet_iface
.lpVtbl
= &objectset_vtbl
;
1307 objectset
->refs
= 1;
1308 objectset
->objectenum
= wbem_objectenum
;
1309 IEnumWbemClassObject_AddRef( objectset
->objectenum
);
1310 objectset
->count
= get_object_count( objectset
->objectenum
);
1312 *obj
= &objectset
->ISWbemObjectSet_iface
;
1313 TRACE( "returning iface %p\n", *obj
);
1319 IEnumVARIANT IEnumVARIANT_iface
;
1321 IEnumWbemClassObject
*objectenum
;
1324 static inline struct enumvar
*impl_from_IEnumVARIANT(
1325 IEnumVARIANT
*iface
)
1327 return CONTAINING_RECORD( iface
, struct enumvar
, IEnumVARIANT_iface
);
1330 static ULONG WINAPI
enumvar_AddRef(
1331 IEnumVARIANT
*iface
)
1333 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1334 return InterlockedIncrement( &enumvar
->refs
);
1337 static ULONG WINAPI
enumvar_Release(
1338 IEnumVARIANT
*iface
)
1340 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1341 LONG refs
= InterlockedDecrement( &enumvar
->refs
);
1344 TRACE( "destroying %p\n", enumvar
);
1345 IEnumWbemClassObject_Release( enumvar
->objectenum
);
1346 heap_free( enumvar
);
1351 static HRESULT WINAPI
enumvar_QueryInterface(
1352 IEnumVARIANT
*iface
,
1356 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1358 TRACE( "%p %s %p\n", enumvar
, debugstr_guid(riid
), ppvObject
);
1360 if (IsEqualGUID( riid
, &IID_IEnumVARIANT
) ||
1361 IsEqualGUID( riid
, &IID_IUnknown
))
1367 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1368 return E_NOINTERFACE
;
1370 IEnumVARIANT_AddRef( iface
);
1374 static HRESULT WINAPI
enumvar_Next( IEnumVARIANT
*iface
, ULONG celt
, VARIANT
*var
, ULONG
*fetched
)
1376 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1377 IWbemClassObject
*obj
;
1380 TRACE( "%p, %u, %p, %p\n", iface
, celt
, var
, fetched
);
1382 if (celt
) IEnumWbemClassObject_Next( enumvar
->objectenum
, WBEM_INFINITE
, 1, &obj
, &count
);
1388 hr
= SWbemObject_create( obj
, &sobj
);
1389 IWbemClassObject_Release( obj
);
1390 if (FAILED( hr
)) return hr
;
1392 V_VT( var
) = VT_DISPATCH
;
1393 V_DISPATCH( var
) = (IDispatch
*)sobj
;
1395 if (fetched
) *fetched
= count
;
1396 return (count
< celt
) ? S_FALSE
: S_OK
;
1399 static HRESULT WINAPI
enumvar_Skip( IEnumVARIANT
*iface
, ULONG celt
)
1401 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1403 TRACE( "%p, %u\n", iface
, celt
);
1405 return IEnumWbemClassObject_Skip( enumvar
->objectenum
, WBEM_INFINITE
, celt
);
1408 static HRESULT WINAPI
enumvar_Reset( IEnumVARIANT
*iface
)
1410 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1412 TRACE( "%p\n", iface
);
1414 return IEnumWbemClassObject_Reset( enumvar
->objectenum
);
1417 static HRESULT WINAPI
enumvar_Clone( IEnumVARIANT
*iface
, IEnumVARIANT
**penum
)
1419 FIXME( "%p, %p\n", iface
, penum
);
1423 static const struct IEnumVARIANTVtbl enumvar_vtbl
=
1425 enumvar_QueryInterface
,
1434 static HRESULT
EnumVARIANT_create( IEnumWbemClassObject
*objectenum
, IEnumVARIANT
**obj
)
1436 struct enumvar
*enumvar
;
1438 if (!(enumvar
= heap_alloc( sizeof(*enumvar
) ))) return E_OUTOFMEMORY
;
1439 enumvar
->IEnumVARIANT_iface
.lpVtbl
= &enumvar_vtbl
;
1441 enumvar
->objectenum
= objectenum
;
1442 IEnumWbemClassObject_AddRef( enumvar
->objectenum
);
1444 *obj
= &enumvar
->IEnumVARIANT_iface
;
1445 TRACE( "returning iface %p\n", *obj
);
1451 ISWbemServices ISWbemServices_iface
;
1453 IWbemServices
*services
;
1456 static inline struct services
*impl_from_ISWbemServices(
1457 ISWbemServices
*iface
)
1459 return CONTAINING_RECORD( iface
, struct services
, ISWbemServices_iface
);
1462 static ULONG WINAPI
services_AddRef(
1463 ISWbemServices
*iface
)
1465 struct services
*services
= impl_from_ISWbemServices( iface
);
1466 return InterlockedIncrement( &services
->refs
);
1469 static ULONG WINAPI
services_Release(
1470 ISWbemServices
*iface
)
1472 struct services
*services
= impl_from_ISWbemServices( iface
);
1473 LONG refs
= InterlockedDecrement( &services
->refs
);
1476 TRACE( "destroying %p\n", services
);
1477 IWbemServices_Release( services
->services
);
1478 heap_free( services
);
1483 static HRESULT WINAPI
services_QueryInterface(
1484 ISWbemServices
*iface
,
1488 struct services
*services
= impl_from_ISWbemServices( iface
);
1490 TRACE( "%p %s %p\n", services
, debugstr_guid(riid
), ppvObject
);
1492 if (IsEqualGUID( riid
, &IID_ISWbemServices
) ||
1493 IsEqualGUID( riid
, &IID_IDispatch
) ||
1494 IsEqualGUID( riid
, &IID_IUnknown
))
1500 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1501 return E_NOINTERFACE
;
1503 ISWbemServices_AddRef( iface
);
1507 static HRESULT WINAPI
services_GetTypeInfoCount(
1508 ISWbemServices
*iface
,
1511 struct services
*services
= impl_from_ISWbemServices( iface
);
1512 TRACE( "%p, %p\n", services
, count
);
1518 static HRESULT WINAPI
services_GetTypeInfo(
1519 ISWbemServices
*iface
,
1524 struct services
*services
= impl_from_ISWbemServices( iface
);
1525 TRACE( "%p, %u, %u, %p\n", services
, index
, lcid
, info
);
1527 return get_typeinfo( ISWbemServices_tid
, info
);
1530 static HRESULT WINAPI
services_GetIDsOfNames(
1531 ISWbemServices
*iface
,
1538 struct services
*services
= impl_from_ISWbemServices( iface
);
1539 ITypeInfo
*typeinfo
;
1542 TRACE( "%p, %s, %p, %u, %u, %p\n", services
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1544 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
1546 hr
= get_typeinfo( ISWbemServices_tid
, &typeinfo
);
1549 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
1550 ITypeInfo_Release( typeinfo
);
1555 static HRESULT WINAPI
services_Invoke(
1556 ISWbemServices
*iface
,
1563 EXCEPINFO
*excep_info
,
1566 struct services
*services
= impl_from_ISWbemServices( iface
);
1567 ITypeInfo
*typeinfo
;
1570 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", services
, member
, debugstr_guid(riid
),
1571 lcid
, flags
, params
, result
, excep_info
, arg_err
);
1573 hr
= get_typeinfo( ISWbemServices_tid
, &typeinfo
);
1576 hr
= ITypeInfo_Invoke( typeinfo
, &services
->ISWbemServices_iface
, member
, flags
,
1577 params
, result
, excep_info
, arg_err
);
1578 ITypeInfo_Release( typeinfo
);
1583 static HRESULT WINAPI
services_Get(
1584 ISWbemServices
*iface
,
1587 IDispatch
*objWbemNamedValueSet
,
1588 ISWbemObject
**objWbemObject
)
1590 struct services
*services
= impl_from_ISWbemServices( iface
);
1591 IWbemClassObject
*obj
;
1594 TRACE( "%p, %s, %d, %p, %p\n", iface
, debugstr_w(strObjectPath
), iFlags
, objWbemNamedValueSet
,
1597 if (objWbemNamedValueSet
) FIXME( "ignoring context\n" );
1599 hr
= IWbemServices_GetObject( services
->services
, strObjectPath
, iFlags
, NULL
, &obj
, NULL
);
1600 if (hr
!= S_OK
) return hr
;
1602 hr
= SWbemObject_create( obj
, objWbemObject
);
1603 IWbemClassObject_Release( obj
);
1607 static HRESULT WINAPI
services_GetAsync(
1608 ISWbemServices
*iface
,
1609 IDispatch
*objWbemSink
,
1612 IDispatch
*objWbemNamedValueSet
,
1613 IDispatch
*objWbemAsyncContext
)
1619 static HRESULT WINAPI
services_Delete(
1620 ISWbemServices
*iface
,
1623 IDispatch
*objWbemNamedValueSet
)
1629 static HRESULT WINAPI
services_DeleteAsync(
1630 ISWbemServices
* This
,
1631 IDispatch
*objWbemSink
,
1634 IDispatch
*objWbemNamedValueSet
,
1635 IDispatch
*objWbemAsyncContext
)
1641 static BSTR
build_query_string( const WCHAR
*class )
1643 static const WCHAR selectW
[] = {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',0};
1644 UINT len
= strlenW(class) + sizeof(selectW
) / sizeof(selectW
[0]);
1647 if (!(ret
= SysAllocStringLen( NULL
, len
))) return NULL
;
1648 strcpyW( ret
, selectW
);
1649 strcatW( ret
, class );
1653 static HRESULT WINAPI
services_InstancesOf(
1654 ISWbemServices
*iface
,
1657 IDispatch
*objWbemNamedValueSet
,
1658 ISWbemObjectSet
**objWbemObjectSet
)
1660 static const WCHAR wqlW
[] = {'W','Q','L',0};
1661 BSTR query
, wql
= SysAllocString( wqlW
);
1664 TRACE( "%p, %s, %x, %p, %p\n", iface
, debugstr_w(strClass
), iFlags
, objWbemNamedValueSet
,
1667 if (!(query
= build_query_string( strClass
)))
1669 SysFreeString( wql
);
1670 return E_OUTOFMEMORY
;
1672 hr
= ISWbemServices_ExecQuery( iface
, query
, wql
, iFlags
, objWbemNamedValueSet
, objWbemObjectSet
);
1673 SysFreeString( wql
);
1674 SysFreeString( query
);
1678 static HRESULT WINAPI
services_InstancesOfAsync(
1679 ISWbemServices
*iface
,
1680 IDispatch
*objWbemSink
,
1683 IDispatch
*objWbemNamedValueSet
,
1684 IDispatch
*objWbemAsyncContext
)
1690 static HRESULT WINAPI
services_SubclassesOf(
1691 ISWbemServices
*iface
,
1694 IDispatch
*objWbemNamedValueSet
,
1695 ISWbemObjectSet
**objWbemObjectSet
)
1701 static HRESULT WINAPI
services_SubclassesOfAsync(
1702 ISWbemServices
*iface
,
1703 IDispatch
*objWbemSink
,
1706 IDispatch
*objWbemNamedValueSet
,
1707 IDispatch
*objWbemAsyncContext
)
1713 static HRESULT WINAPI
services_ExecQuery(
1714 ISWbemServices
*iface
,
1716 BSTR strQueryLanguage
,
1718 IDispatch
*objWbemNamedValueSet
,
1719 ISWbemObjectSet
**objWbemObjectSet
)
1721 struct services
*services
= impl_from_ISWbemServices( iface
);
1722 IEnumWbemClassObject
*iter
;
1725 TRACE( "%p, %s, %s, %x, %p, %p\n", iface
, debugstr_w(strQuery
), debugstr_w(strQueryLanguage
),
1726 iFlags
, objWbemNamedValueSet
, objWbemObjectSet
);
1728 if (objWbemNamedValueSet
) FIXME( "ignoring context\n" );
1730 hr
= IWbemServices_ExecQuery( services
->services
, strQueryLanguage
, strQuery
, iFlags
, NULL
, &iter
);
1731 if (hr
!= S_OK
) return hr
;
1733 hr
= SWbemObjectSet_create( iter
, objWbemObjectSet
);
1734 IEnumWbemClassObject_Release( iter
);
1738 static HRESULT WINAPI
services_ExecQueryAsync(
1739 ISWbemServices
*iface
,
1740 IDispatch
*objWbemSink
,
1742 BSTR strQueryLanguage
,
1744 IDispatch
*objWbemNamedValueSet
,
1745 IDispatch
*objWbemAsyncContext
)
1751 static HRESULT WINAPI
services_AssociatorsOf(
1752 ISWbemServices
*iface
,
1755 BSTR strResultClass
,
1758 VARIANT_BOOL bClassesOnly
,
1759 VARIANT_BOOL bSchemaOnly
,
1760 BSTR strRequiredAssocQualifier
,
1761 BSTR strRequiredQualifier
,
1763 IDispatch
*objWbemNamedValueSet
,
1764 ISWbemObjectSet
**objWbemObjectSet
)
1770 static HRESULT WINAPI
services_AssociatorsOfAsync(
1771 ISWbemServices
*iface
,
1772 IDispatch
*objWbemSink
,
1775 BSTR strResultClass
,
1778 VARIANT_BOOL bClassesOnly
,
1779 VARIANT_BOOL bSchemaOnly
,
1780 BSTR strRequiredAssocQualifier
,
1781 BSTR strRequiredQualifier
,
1783 IDispatch
*objWbemNamedValueSet
,
1784 IDispatch
*objWbemAsyncContext
)
1790 static HRESULT WINAPI
services_ReferencesTo(
1791 ISWbemServices
*iface
,
1793 BSTR strResultClass
,
1795 VARIANT_BOOL bClassesOnly
,
1796 VARIANT_BOOL bSchemaOnly
,
1797 BSTR strRequiredQualifier
,
1799 IDispatch
*objWbemNamedValueSet
,
1800 ISWbemObjectSet
**objWbemObjectSet
)
1806 static HRESULT WINAPI
services_ReferencesToAsync(
1807 ISWbemServices
*iface
,
1808 IDispatch
*objWbemSink
,
1810 BSTR strResultClass
,
1812 VARIANT_BOOL bClassesOnly
,
1813 VARIANT_BOOL bSchemaOnly
,
1814 BSTR strRequiredQualifier
,
1816 IDispatch
*objWbemNamedValueSet
,
1817 IDispatch
*objWbemAsyncContext
)
1823 static HRESULT WINAPI
services_ExecNotificationQuery(
1824 ISWbemServices
*iface
,
1826 BSTR strQueryLanguage
,
1828 IDispatch
*objWbemNamedValueSet
,
1829 ISWbemEventSource
**objWbemEventSource
)
1835 static HRESULT WINAPI
services_ExecNotificationQueryAsync(
1836 ISWbemServices
*iface
,
1837 IDispatch
*objWbemSink
,
1839 BSTR strQueryLanguage
,
1841 IDispatch
*objWbemNamedValueSet
,
1842 IDispatch
*objWbemAsyncContext
)
1848 static HRESULT WINAPI
services_ExecMethod(
1849 ISWbemServices
*iface
,
1852 IDispatch
*objWbemInParameters
,
1854 IDispatch
*objWbemNamedValueSet
,
1855 ISWbemObject
**objWbemOutParameters
)
1861 static HRESULT WINAPI
services_ExecMethodAsync(
1862 ISWbemServices
*iface
,
1863 IDispatch
*objWbemSink
,
1866 IDispatch
*objWbemInParameters
,
1868 IDispatch
*objWbemNamedValueSet
,
1869 IDispatch
*objWbemAsyncContext
)
1875 static HRESULT WINAPI
services_get_Security_(
1876 ISWbemServices
*iface
,
1877 ISWbemSecurity
**objWbemSecurity
)
1879 TRACE( "%p, %p\n", iface
, objWbemSecurity
);
1881 if (!objWbemSecurity
)
1882 return E_INVALIDARG
;
1884 return ISWbemSecurity_create( objWbemSecurity
);
1887 static const ISWbemServicesVtbl services_vtbl
=
1889 services_QueryInterface
,
1892 services_GetTypeInfoCount
,
1893 services_GetTypeInfo
,
1894 services_GetIDsOfNames
,
1899 services_DeleteAsync
,
1900 services_InstancesOf
,
1901 services_InstancesOfAsync
,
1902 services_SubclassesOf
,
1903 services_SubclassesOfAsync
,
1905 services_ExecQueryAsync
,
1906 services_AssociatorsOf
,
1907 services_AssociatorsOfAsync
,
1908 services_ReferencesTo
,
1909 services_ReferencesToAsync
,
1910 services_ExecNotificationQuery
,
1911 services_ExecNotificationQueryAsync
,
1912 services_ExecMethod
,
1913 services_ExecMethodAsync
,
1914 services_get_Security_
1917 static HRESULT
SWbemServices_create( IWbemServices
*wbem_services
, ISWbemServices
**obj
)
1919 struct services
*services
;
1921 TRACE( "%p, %p\n", obj
, wbem_services
);
1923 if (!(services
= heap_alloc( sizeof(*services
) ))) return E_OUTOFMEMORY
;
1924 services
->ISWbemServices_iface
.lpVtbl
= &services_vtbl
;
1926 services
->services
= wbem_services
;
1927 IWbemServices_AddRef( services
->services
);
1929 *obj
= &services
->ISWbemServices_iface
;
1930 TRACE( "returning iface %p\n", *obj
);
1936 ISWbemLocator ISWbemLocator_iface
;
1938 IWbemLocator
*locator
;
1941 static inline struct locator
*impl_from_ISWbemLocator( ISWbemLocator
*iface
)
1943 return CONTAINING_RECORD( iface
, struct locator
, ISWbemLocator_iface
);
1946 static ULONG WINAPI
locator_AddRef(
1947 ISWbemLocator
*iface
)
1949 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1950 return InterlockedIncrement( &locator
->refs
);
1953 static ULONG WINAPI
locator_Release(
1954 ISWbemLocator
*iface
)
1956 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1957 LONG refs
= InterlockedDecrement( &locator
->refs
);
1960 TRACE( "destroying %p\n", locator
);
1961 if (locator
->locator
)
1962 IWbemLocator_Release( locator
->locator
);
1963 heap_free( locator
);
1968 static HRESULT WINAPI
locator_QueryInterface(
1969 ISWbemLocator
*iface
,
1973 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1975 TRACE( "%p, %s, %p\n", locator
, debugstr_guid( riid
), ppvObject
);
1977 if (IsEqualGUID( riid
, &IID_ISWbemLocator
) ||
1978 IsEqualGUID( riid
, &IID_IDispatch
) ||
1979 IsEqualGUID( riid
, &IID_IUnknown
))
1985 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1986 return E_NOINTERFACE
;
1988 ISWbemLocator_AddRef( iface
);
1992 static HRESULT WINAPI
locator_GetTypeInfoCount(
1993 ISWbemLocator
*iface
,
1996 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1998 TRACE( "%p, %p\n", locator
, count
);
2003 static HRESULT WINAPI
locator_GetTypeInfo(
2004 ISWbemLocator
*iface
,
2009 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
2010 TRACE( "%p, %u, %u, %p\n", locator
, index
, lcid
, info
);
2012 return get_typeinfo( ISWbemLocator_tid
, info
);
2015 static HRESULT WINAPI
locator_GetIDsOfNames(
2016 ISWbemLocator
*iface
,
2023 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
2024 ITypeInfo
*typeinfo
;
2027 TRACE( "%p, %s, %p, %u, %u, %p\n", locator
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
2029 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
2031 hr
= get_typeinfo( ISWbemLocator_tid
, &typeinfo
);
2034 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
2035 ITypeInfo_Release( typeinfo
);
2040 static HRESULT WINAPI
locator_Invoke(
2041 ISWbemLocator
*iface
,
2048 EXCEPINFO
*excep_info
,
2051 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
2052 ITypeInfo
*typeinfo
;
2055 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", locator
, member
, debugstr_guid(riid
),
2056 lcid
, flags
, params
, result
, excep_info
, arg_err
);
2058 hr
= get_typeinfo( ISWbemLocator_tid
, &typeinfo
);
2061 hr
= ITypeInfo_Invoke( typeinfo
, &locator
->ISWbemLocator_iface
, member
, flags
,
2062 params
, result
, excep_info
, arg_err
);
2063 ITypeInfo_Release( typeinfo
);
2068 static BSTR
build_resource_string( BSTR server
, BSTR
namespace )
2070 static const WCHAR defaultW
[] = {'r','o','o','t','\\','d','e','f','a','u','l','t',0};
2071 ULONG len
, len_server
= 0, len_namespace
= 0;
2074 if (server
&& *server
) len_server
= strlenW( server
);
2075 else len_server
= 1;
2076 if (namespace && *namespace) len_namespace
= strlenW( namespace );
2077 else len_namespace
= sizeof(defaultW
) / sizeof(defaultW
[0]) - 1;
2079 if (!(ret
= SysAllocStringLen( NULL
, 2 + len_server
+ 1 + len_namespace
))) return NULL
;
2081 ret
[0] = ret
[1] = '\\';
2082 if (server
&& *server
) strcpyW( ret
+ 2, server
);
2085 len
= len_server
+ 2;
2088 if (namespace && *namespace) strcpyW( ret
+ len
, namespace );
2089 else strcpyW( ret
+ len
, defaultW
);
2093 static HRESULT WINAPI
locator_ConnectServer(
2094 ISWbemLocator
*iface
,
2101 LONG iSecurityFlags
,
2102 IDispatch
*objWbemNamedValueSet
,
2103 ISWbemServices
**objWbemServices
)
2105 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
2106 IWbemServices
*services
;
2110 TRACE( "%p, %s, %s, %s, %p, %s, %s, 0x%08x, %p, %p\n", iface
, debugstr_w(strServer
),
2111 debugstr_w(strNamespace
), debugstr_w(strUser
), strPassword
, debugstr_w(strLocale
),
2112 debugstr_w(strAuthority
), iSecurityFlags
, objWbemNamedValueSet
, objWbemServices
);
2114 if (objWbemNamedValueSet
) FIXME( "context not supported\n" );
2116 if (!locator
->locator
)
2118 hr
= CoCreateInstance( &CLSID_WbemLocator
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IWbemLocator
,
2119 (void **)&locator
->locator
);
2120 if (hr
!= S_OK
) return hr
;
2123 if (!(resource
= build_resource_string( strServer
, strNamespace
))) return E_OUTOFMEMORY
;
2124 hr
= IWbemLocator_ConnectServer( locator
->locator
, resource
, strUser
, strPassword
, strLocale
,
2125 iSecurityFlags
, strAuthority
, NULL
, &services
);
2126 SysFreeString( resource
);
2127 if (hr
!= S_OK
) return hr
;
2129 hr
= SWbemServices_create( services
, objWbemServices
);
2130 IWbemServices_Release( services
);
2134 static HRESULT WINAPI
locator_get_Security_(
2135 ISWbemLocator
*iface
,
2136 ISWbemSecurity
**objWbemSecurity
)
2138 TRACE( "%p, %p\n", iface
, objWbemSecurity
);
2140 if (!objWbemSecurity
)
2141 return E_INVALIDARG
;
2143 return ISWbemSecurity_create( objWbemSecurity
);
2146 static const ISWbemLocatorVtbl locator_vtbl
=
2148 locator_QueryInterface
,
2151 locator_GetTypeInfoCount
,
2152 locator_GetTypeInfo
,
2153 locator_GetIDsOfNames
,
2155 locator_ConnectServer
,
2156 locator_get_Security_
2159 HRESULT
SWbemLocator_create( void **obj
)
2161 struct locator
*locator
;
2163 TRACE( "%p\n", obj
);
2165 if (!(locator
= heap_alloc( sizeof(*locator
) ))) return E_OUTOFMEMORY
;
2166 locator
->ISWbemLocator_iface
.lpVtbl
= &locator_vtbl
;
2168 locator
->locator
= NULL
;
2170 *obj
= &locator
->ISWbemLocator_iface
;
2171 TRACE( "returning iface %p\n", *obj
);
2177 ISWbemSecurity ISWbemSecurity_iface
;
2179 WbemImpersonationLevelEnum implevel
;
2180 WbemAuthenticationLevelEnum authlevel
;
2183 static inline struct security
*impl_from_ISWbemSecurity( ISWbemSecurity
*iface
)
2185 return CONTAINING_RECORD( iface
, struct security
, ISWbemSecurity_iface
);
2188 static ULONG WINAPI
security_AddRef(
2189 ISWbemSecurity
*iface
)
2191 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2192 return InterlockedIncrement( &security
->refs
);
2195 static ULONG WINAPI
security_Release(
2196 ISWbemSecurity
*iface
)
2198 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2199 LONG refs
= InterlockedDecrement( &security
->refs
);
2202 TRACE( "destroying %p\n", security
);
2203 heap_free( security
);
2208 static HRESULT WINAPI
security_QueryInterface(
2209 ISWbemSecurity
*iface
,
2213 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2214 TRACE( "%p, %s, %p\n", security
, debugstr_guid( riid
), ppvObject
);
2216 if (IsEqualGUID( riid
, &IID_ISWbemSecurity
) ||
2217 IsEqualGUID( riid
, &IID_IDispatch
) ||
2218 IsEqualGUID( riid
, &IID_IUnknown
))
2224 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
2225 return E_NOINTERFACE
;
2227 ISWbemSecurity_AddRef( iface
);
2231 static HRESULT WINAPI
security_GetTypeInfoCount(
2232 ISWbemSecurity
*iface
,
2235 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2236 TRACE( "%p, %p\n", security
, count
);
2242 static HRESULT WINAPI
security_GetTypeInfo(
2243 ISWbemSecurity
*iface
,
2248 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2249 TRACE( "%p, %u, %u, %p\n", security
, index
, lcid
, info
);
2251 return get_typeinfo( ISWbemSecurity_tid
, info
);
2254 static HRESULT WINAPI
security_GetIDsOfNames(
2255 ISWbemSecurity
*iface
,
2262 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2263 ITypeInfo
*typeinfo
;
2266 TRACE( "%p, %s, %p, %u, %u, %p\n", security
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
2268 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
2270 hr
= get_typeinfo( ISWbemSecurity_tid
, &typeinfo
);
2273 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
2274 ITypeInfo_Release( typeinfo
);
2279 static HRESULT WINAPI
security_Invoke(
2280 ISWbemSecurity
*iface
,
2287 EXCEPINFO
*excep_info
,
2290 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2291 ITypeInfo
*typeinfo
;
2294 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", security
, member
, debugstr_guid(riid
),
2295 lcid
, flags
, params
, result
, excep_info
, arg_err
);
2297 hr
= get_typeinfo( ISWbemSecurity_tid
, &typeinfo
);
2300 hr
= ITypeInfo_Invoke( typeinfo
, &security
->ISWbemSecurity_iface
, member
, flags
,
2301 params
, result
, excep_info
, arg_err
);
2302 ITypeInfo_Release( typeinfo
);
2307 static HRESULT WINAPI
security_get_ImpersonationLevel(
2308 ISWbemSecurity
*iface
,
2309 WbemImpersonationLevelEnum
*impersonation_level
)
2311 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2312 FIXME( "%p, %p: stub\n", security
, impersonation_level
);
2314 if (!impersonation_level
)
2315 return E_INVALIDARG
;
2317 *impersonation_level
= security
->implevel
;
2321 static HRESULT WINAPI
security_put_ImpersonationLevel(
2322 ISWbemSecurity
*iface
,
2323 WbemImpersonationLevelEnum impersonation_level
)
2325 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2326 FIXME( "%p, %d: stub\n", security
, impersonation_level
);
2328 security
->implevel
= impersonation_level
;
2332 static HRESULT WINAPI
security_get_AuthenticationLevel(
2333 ISWbemSecurity
*iface
,
2334 WbemAuthenticationLevelEnum
*authentication_level
)
2336 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2337 FIXME( "%p, %p: stub\n", security
, authentication_level
);
2339 if (!authentication_level
)
2340 return E_INVALIDARG
;
2342 *authentication_level
= security
->authlevel
;
2346 static HRESULT WINAPI
security_put_AuthenticationLevel(
2347 ISWbemSecurity
*iface
,
2348 WbemAuthenticationLevelEnum authentication_level
)
2350 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2351 FIXME( "%p, %d: stub\n", security
, authentication_level
);
2353 security
->authlevel
= authentication_level
;
2357 static HRESULT WINAPI
security_get_Privileges(
2358 ISWbemSecurity
*iface
,
2359 ISWbemPrivilegeSet
**privilege_set
)
2361 struct security
*security
= impl_from_ISWbemSecurity( iface
);
2362 FIXME( "%p, %p: stub\n", security
, privilege_set
);
2365 return E_INVALIDARG
;
2370 static const ISWbemSecurityVtbl security_vtbl
=
2372 security_QueryInterface
,
2375 security_GetTypeInfoCount
,
2376 security_GetTypeInfo
,
2377 security_GetIDsOfNames
,
2379 security_get_ImpersonationLevel
,
2380 security_put_ImpersonationLevel
,
2381 security_get_AuthenticationLevel
,
2382 security_put_AuthenticationLevel
,
2383 security_get_Privileges
2386 static HRESULT
ISWbemSecurity_create( ISWbemSecurity
**obj
)
2388 struct security
*security
;
2390 TRACE( "%p\n", obj
);
2392 if (!(security
= heap_alloc( sizeof(*security
) ))) return E_OUTOFMEMORY
;
2393 security
->ISWbemSecurity_iface
.lpVtbl
= &security_vtbl
;
2395 security
->implevel
= wbemImpersonationLevelImpersonate
;
2396 security
->authlevel
= wbemAuthenticationLevelPktPrivacy
;
2398 *obj
= &security
->ISWbemSecurity_iface
;
2399 TRACE( "returning iface %p\n", *obj
);