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
** );
34 static ITypeLib
*wbemdisp_typelib
;
35 static ITypeInfo
*wbemdisp_typeinfo
[last_tid
];
37 static REFIID wbemdisp_tid_id
[] =
45 static HRESULT
get_typeinfo( enum type_id tid
, ITypeInfo
**ret
)
49 if (!wbemdisp_typelib
)
53 hr
= LoadRegTypeLib( &LIBID_WbemScripting
, 1, 2, LOCALE_SYSTEM_DEFAULT
, &typelib
);
56 ERR( "LoadRegTypeLib failed: %08x\n", hr
);
59 if (InterlockedCompareExchangePointer( (void **)&wbemdisp_typelib
, typelib
, NULL
))
60 ITypeLib_Release( typelib
);
62 if (!wbemdisp_typeinfo
[tid
])
66 hr
= ITypeLib_GetTypeInfoOfGuid( wbemdisp_typelib
, wbemdisp_tid_id
[tid
], &typeinfo
);
69 ERR( "GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(wbemdisp_tid_id
[tid
]), hr
);
72 if (InterlockedCompareExchangePointer( (void **)(wbemdisp_typeinfo
+ tid
), typeinfo
, NULL
))
73 ITypeInfo_Release( typeinfo
);
75 *ret
= wbemdisp_typeinfo
[tid
];
76 ITypeInfo_AddRef( *ret
);
80 #define DISPID_BASE 0x1800000
90 ISWbemObject ISWbemObject_iface
;
92 IWbemClassObject
*object
;
93 struct member
*members
;
98 static inline struct object
*impl_from_ISWbemObject(
101 return CONTAINING_RECORD( iface
, struct object
, ISWbemObject_iface
);
104 static ULONG WINAPI
object_AddRef(
105 ISWbemObject
*iface
)
107 struct object
*object
= impl_from_ISWbemObject( iface
);
108 return InterlockedIncrement( &object
->refs
);
111 static ULONG WINAPI
object_Release(
112 ISWbemObject
*iface
)
114 struct object
*object
= impl_from_ISWbemObject( iface
);
115 LONG refs
= InterlockedDecrement( &object
->refs
);
120 TRACE( "destroying %p\n", object
);
121 IWbemClassObject_Release( object
->object
);
122 for (i
= 0; i
< object
->nb_members
; i
++) SysFreeString( object
->members
[i
].name
);
123 heap_free( object
->members
);
129 static HRESULT WINAPI
object_QueryInterface(
134 struct object
*object
= impl_from_ISWbemObject( iface
);
136 TRACE( "%p %s %p\n", object
, debugstr_guid(riid
), ppvObject
);
138 if (IsEqualGUID( riid
, &IID_ISWbemObject
) ||
139 IsEqualGUID( riid
, &IID_IDispatch
) ||
140 IsEqualGUID( riid
, &IID_IUnknown
))
146 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
147 return E_NOINTERFACE
;
149 ISWbemObject_AddRef( iface
);
153 static HRESULT WINAPI
object_GetTypeInfoCount(
157 struct object
*object
= impl_from_ISWbemObject( iface
);
159 TRACE( "%p, %p\n", object
, count
);
164 static HRESULT WINAPI
object_GetTypeInfo(
170 struct object
*object
= impl_from_ISWbemObject( iface
);
171 FIXME( "%p, %u, %u, %p\n", object
, index
, lcid
, info
);
175 #define DISPID_BASE 0x1800000
177 static HRESULT
init_members( struct object
*object
)
183 if (object
->members
) return S_OK
;
185 hr
= IWbemClassObject_GetNames( object
->object
, NULL
, 0, NULL
, &sa
);
186 if (FAILED( hr
)) return hr
;
187 hr
= SafeArrayGetUBound( sa
, 1, &bound
);
190 SafeArrayDestroy( sa
);
193 if (!(object
->members
= heap_alloc( sizeof(struct member
) * (bound
+ 1) )))
195 SafeArrayDestroy( sa
);
196 return E_OUTOFMEMORY
;
198 for (i
= 0; i
<= bound
; i
++)
200 hr
= SafeArrayGetElement( sa
, &i
, &object
->members
[i
].name
);
203 for (i
--; i
>= 0; i
--) SysFreeString( object
->members
[i
].name
);
204 SafeArrayDestroy( sa
);
205 heap_free( object
->members
);
206 object
->members
= NULL
;
207 return E_OUTOFMEMORY
;
209 object
->members
[i
].dispid
= 0;
211 object
->nb_members
= bound
+ 1;
212 SafeArrayDestroy( sa
);
216 static DISPID
get_member_dispid( struct object
*object
, const WCHAR
*name
)
219 for (i
= 0; i
< object
->nb_members
; i
++)
221 if (!strcmpiW( object
->members
[i
].name
, name
))
223 if (!object
->members
[i
].dispid
) object
->members
[i
].dispid
= ++object
->last_dispid
;
224 return object
->members
[i
].dispid
;
227 return DISPID_UNKNOWN
;
230 static HRESULT WINAPI
object_GetIDsOfNames(
238 struct object
*object
= impl_from_ISWbemObject( iface
);
242 TRACE( "%p, %s, %p, %u, %u, %p\n", object
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
244 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
246 hr
= init_members( object
);
247 if (FAILED( hr
)) return hr
;
249 for (i
= 0; i
< count
; i
++)
251 if ((dispid
[i
] = get_member_dispid( object
, names
[i
] )) == DISPID_UNKNOWN
) break;
253 if (i
!= count
) return DISP_E_UNKNOWNNAME
;
257 static BSTR
get_member_name( struct object
*object
, DISPID dispid
)
260 for (i
= 0; i
< object
->nb_members
; i
++)
262 if (object
->members
[i
].dispid
== dispid
) return object
->members
[i
].name
;
267 static HRESULT WINAPI
object_Invoke(
275 EXCEPINFO
*excep_info
,
278 struct object
*object
= impl_from_ISWbemObject( iface
);
281 TRACE( "%p, %x, %s, %u, %x, %p, %p, %p, %p\n", object
, member
, debugstr_guid(riid
),
282 lcid
, flags
, params
, result
, excep_info
, arg_err
);
284 if (flags
!= (DISPATCH_METHOD
|DISPATCH_PROPERTYGET
))
286 FIXME( "flags %x not supported\n", flags
);
289 if (!(name
= get_member_name( object
, member
)))
290 return DISP_E_MEMBERNOTFOUND
;
292 memset( params
, 0, sizeof(*params
) );
293 return IWbemClassObject_Get( object
->object
, name
, 0, result
, NULL
, NULL
);
296 static HRESULT WINAPI
object_Put_(
299 IDispatch
*objWbemNamedValueSet
,
300 ISWbemObjectPath
**objWbemObjectPath
)
306 static const ISWbemObjectVtbl object_vtbl
=
308 object_QueryInterface
,
311 object_GetTypeInfoCount
,
313 object_GetIDsOfNames
,
318 static HRESULT
SWbemObject_create( IWbemClassObject
*wbem_object
, ISWbemObject
**obj
)
320 struct object
*object
;
322 TRACE( "%p, %p\n", obj
, wbem_object
);
324 if (!(object
= heap_alloc( sizeof(*object
) ))) return E_OUTOFMEMORY
;
325 object
->ISWbemObject_iface
.lpVtbl
= &object_vtbl
;
327 object
->object
= wbem_object
;
328 IWbemClassObject_AddRef( object
->object
);
329 object
->members
= NULL
;
330 object
->nb_members
= 0;
331 object
->last_dispid
= DISPID_BASE
;
333 *obj
= &object
->ISWbemObject_iface
;
334 TRACE( "returning iface %p\n", *obj
);
340 ISWbemObjectSet ISWbemObjectSet_iface
;
342 IEnumWbemClassObject
*objectenum
;
345 static inline struct objectset
*impl_from_ISWbemObjectSet(
346 ISWbemObjectSet
*iface
)
348 return CONTAINING_RECORD( iface
, struct objectset
, ISWbemObjectSet_iface
);
351 static ULONG WINAPI
objectset_AddRef(
352 ISWbemObjectSet
*iface
)
354 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
355 return InterlockedIncrement( &objectset
->refs
);
358 static ULONG WINAPI
objectset_Release(
359 ISWbemObjectSet
*iface
)
361 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
362 LONG refs
= InterlockedDecrement( &objectset
->refs
);
365 TRACE( "destroying %p\n", objectset
);
366 IEnumWbemClassObject_Release( objectset
->objectenum
);
367 heap_free( objectset
);
372 static HRESULT WINAPI
objectset_QueryInterface(
373 ISWbemObjectSet
*iface
,
377 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
379 TRACE( "%p %s %p\n", objectset
, debugstr_guid(riid
), ppvObject
);
381 if (IsEqualGUID( riid
, &IID_ISWbemObjectSet
) ||
382 IsEqualGUID( riid
, &IID_IDispatch
) ||
383 IsEqualGUID( riid
, &IID_IUnknown
))
385 *ppvObject
= objectset
;
389 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
390 return E_NOINTERFACE
;
392 ISWbemObjectSet_AddRef( iface
);
396 static HRESULT WINAPI
objectset_GetTypeInfoCount(
397 ISWbemObjectSet
*iface
,
400 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
401 TRACE( "%p, %p\n", objectset
, count
);
406 static HRESULT WINAPI
objectset_GetTypeInfo(
407 ISWbemObjectSet
*iface
,
412 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
413 TRACE( "%p, %u, %u, %p\n", objectset
, index
, lcid
, info
);
415 return get_typeinfo( ISWbemObjectSet_tid
, info
);
418 static HRESULT WINAPI
objectset_GetIDsOfNames(
419 ISWbemObjectSet
*iface
,
426 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
430 TRACE( "%p, %s, %p, %u, %u, %p\n", objectset
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
432 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
434 hr
= get_typeinfo( ISWbemObjectSet_tid
, &typeinfo
);
437 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
438 ITypeInfo_Release( typeinfo
);
443 static HRESULT WINAPI
objectset_Invoke(
444 ISWbemObjectSet
*iface
,
451 EXCEPINFO
*excep_info
,
454 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
458 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", objectset
, member
, debugstr_guid(riid
),
459 lcid
, flags
, params
, result
, excep_info
, arg_err
);
461 hr
= get_typeinfo( ISWbemObjectSet_tid
, &typeinfo
);
464 hr
= ITypeInfo_Invoke( typeinfo
, &objectset
->ISWbemObjectSet_iface
, member
, flags
,
465 params
, result
, excep_info
, arg_err
);
466 ITypeInfo_Release( typeinfo
);
471 static HRESULT WINAPI
objectset_get__NewEnum(
472 ISWbemObjectSet
*iface
,
475 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
476 IEnumWbemClassObject
*objectenum
;
479 TRACE( "%p, %p\n", objectset
, pUnk
);
481 hr
= IEnumWbemClassObject_Clone( objectset
->objectenum
, &objectenum
);
482 if (FAILED( hr
)) return hr
;
484 hr
= EnumVARIANT_create( objectenum
, (IEnumVARIANT
**)pUnk
);
485 IEnumWbemClassObject_Release( objectenum
);
489 static HRESULT WINAPI
objectset_Item(
490 ISWbemObjectSet
*iface
,
493 ISWbemObject
**objWbemObject
)
499 static HRESULT WINAPI
objectset_get_Count(
500 ISWbemObjectSet
*iface
,
503 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
504 LONG count
= 0, total
= 0;
506 TRACE( "%p, %p\n", objectset
, iCount
);
508 while (IEnumWbemClassObject_Skip( objectset
->objectenum
, WBEM_INFINITE
, 1 ) == S_OK
) count
++;
510 IEnumWbemClassObject_Reset( objectset
->objectenum
);
511 while (IEnumWbemClassObject_Skip( objectset
->objectenum
, WBEM_INFINITE
, 1 ) == S_OK
) total
++;
513 count
= total
- count
;
514 IEnumWbemClassObject_Reset( objectset
->objectenum
);
515 while (count
--) IEnumWbemClassObject_Skip( objectset
->objectenum
, WBEM_INFINITE
, 1 );
521 static HRESULT WINAPI
objectset_get_Security_(
522 ISWbemObjectSet
*iface
,
523 ISWbemSecurity
**objWbemSecurity
)
529 static HRESULT WINAPI
objectset_ItemIndex(
530 ISWbemObjectSet
*iface
,
532 ISWbemObject
**objWbemObject
)
538 static const ISWbemObjectSetVtbl objectset_vtbl
=
540 objectset_QueryInterface
,
543 objectset_GetTypeInfoCount
,
544 objectset_GetTypeInfo
,
545 objectset_GetIDsOfNames
,
547 objectset_get__NewEnum
,
550 objectset_get_Security_
,
554 static HRESULT
SWbemObjectSet_create( IEnumWbemClassObject
*wbem_objectenum
, ISWbemObjectSet
**obj
)
556 struct objectset
*objectset
;
558 TRACE( "%p, %p\n", obj
, wbem_objectenum
);
560 if (!(objectset
= heap_alloc( sizeof(*objectset
) ))) return E_OUTOFMEMORY
;
561 objectset
->ISWbemObjectSet_iface
.lpVtbl
= &objectset_vtbl
;
563 objectset
->objectenum
= wbem_objectenum
;
564 IEnumWbemClassObject_AddRef( objectset
->objectenum
);
566 *obj
= &objectset
->ISWbemObjectSet_iface
;
567 TRACE( "returning iface %p\n", *obj
);
573 IEnumVARIANT IEnumVARIANT_iface
;
575 IEnumWbemClassObject
*objectenum
;
578 static inline struct enumvar
*impl_from_IEnumVARIANT(
579 IEnumVARIANT
*iface
)
581 return CONTAINING_RECORD( iface
, struct enumvar
, IEnumVARIANT_iface
);
584 static ULONG WINAPI
enumvar_AddRef(
585 IEnumVARIANT
*iface
)
587 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
588 return InterlockedIncrement( &enumvar
->refs
);
591 static ULONG WINAPI
enumvar_Release(
592 IEnumVARIANT
*iface
)
594 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
595 LONG refs
= InterlockedDecrement( &enumvar
->refs
);
598 TRACE( "destroying %p\n", enumvar
);
599 IEnumWbemClassObject_Release( enumvar
->objectenum
);
600 heap_free( enumvar
);
605 static HRESULT WINAPI
enumvar_QueryInterface(
610 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
612 TRACE( "%p %s %p\n", enumvar
, debugstr_guid(riid
), ppvObject
);
614 if (IsEqualGUID( riid
, &IID_IEnumVARIANT
) ||
615 IsEqualGUID( riid
, &IID_IUnknown
))
617 *ppvObject
= enumvar
;
621 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
622 return E_NOINTERFACE
;
624 IEnumVARIANT_AddRef( iface
);
628 static HRESULT WINAPI
enumvar_Next( IEnumVARIANT
*iface
, ULONG celt
, VARIANT
*var
, ULONG
*fetched
)
630 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
631 IWbemClassObject
*obj
;
634 TRACE( "%p, %u, %p, %p\n", iface
, celt
, var
, fetched
);
636 if (celt
) IEnumWbemClassObject_Next( enumvar
->objectenum
, WBEM_INFINITE
, 1, &obj
, &count
);
642 hr
= SWbemObject_create( obj
, &sobj
);
643 IWbemClassObject_Release( obj
);
644 if (FAILED( hr
)) return hr
;
646 V_VT( var
) = VT_DISPATCH
;
647 V_DISPATCH( var
) = (IDispatch
*)sobj
;
649 if (fetched
) *fetched
= count
;
650 return (count
< celt
) ? S_FALSE
: S_OK
;
653 static HRESULT WINAPI
enumvar_Skip( IEnumVARIANT
*iface
, ULONG celt
)
655 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
657 TRACE( "%p, %u\n", iface
, celt
);
659 return IEnumWbemClassObject_Skip( enumvar
->objectenum
, WBEM_INFINITE
, celt
);
662 static HRESULT WINAPI
enumvar_Reset( IEnumVARIANT
*iface
)
664 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
666 TRACE( "%p\n", iface
);
668 return IEnumWbemClassObject_Reset( enumvar
->objectenum
);
671 static HRESULT WINAPI
enumvar_Clone( IEnumVARIANT
*iface
, IEnumVARIANT
**penum
)
673 FIXME( "%p, %p\n", iface
, penum
);
677 static const struct IEnumVARIANTVtbl enumvar_vtbl
=
679 enumvar_QueryInterface
,
688 static HRESULT
EnumVARIANT_create( IEnumWbemClassObject
*objectenum
, IEnumVARIANT
**obj
)
690 struct enumvar
*enumvar
;
692 if (!(enumvar
= heap_alloc( sizeof(*enumvar
) ))) return E_OUTOFMEMORY
;
693 enumvar
->IEnumVARIANT_iface
.lpVtbl
= &enumvar_vtbl
;
695 enumvar
->objectenum
= objectenum
;
696 IEnumWbemClassObject_AddRef( enumvar
->objectenum
);
698 *obj
= &enumvar
->IEnumVARIANT_iface
;
699 TRACE( "returning iface %p\n", *obj
);
705 ISWbemServices ISWbemServices_iface
;
707 IWbemServices
*services
;
710 static inline struct services
*impl_from_ISWbemServices(
711 ISWbemServices
*iface
)
713 return CONTAINING_RECORD( iface
, struct services
, ISWbemServices_iface
);
716 static ULONG WINAPI
services_AddRef(
717 ISWbemServices
*iface
)
719 struct services
*services
= impl_from_ISWbemServices( iface
);
720 return InterlockedIncrement( &services
->refs
);
723 static ULONG WINAPI
services_Release(
724 ISWbemServices
*iface
)
726 struct services
*services
= impl_from_ISWbemServices( iface
);
727 LONG refs
= InterlockedDecrement( &services
->refs
);
730 TRACE( "destroying %p\n", services
);
731 IWbemServices_Release( services
->services
);
732 heap_free( services
);
737 static HRESULT WINAPI
services_QueryInterface(
738 ISWbemServices
*iface
,
742 struct services
*services
= impl_from_ISWbemServices( iface
);
744 TRACE( "%p %s %p\n", services
, debugstr_guid(riid
), ppvObject
);
746 if (IsEqualGUID( riid
, &IID_ISWbemServices
) ||
747 IsEqualGUID( riid
, &IID_IDispatch
) ||
748 IsEqualGUID( riid
, &IID_IUnknown
))
750 *ppvObject
= services
;
754 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
755 return E_NOINTERFACE
;
757 ISWbemServices_AddRef( iface
);
761 static HRESULT WINAPI
services_GetTypeInfoCount(
762 ISWbemServices
*iface
,
765 struct services
*services
= impl_from_ISWbemServices( iface
);
766 TRACE( "%p, %p\n", services
, count
);
772 static HRESULT WINAPI
services_GetTypeInfo(
773 ISWbemServices
*iface
,
778 struct services
*services
= impl_from_ISWbemServices( iface
);
779 TRACE( "%p, %u, %u, %p\n", services
, index
, lcid
, info
);
781 return get_typeinfo( ISWbemServices_tid
, info
);
784 static HRESULT WINAPI
services_GetIDsOfNames(
785 ISWbemServices
*iface
,
792 struct services
*services
= impl_from_ISWbemServices( iface
);
796 TRACE( "%p, %s, %p, %u, %u, %p\n", services
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
798 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
800 hr
= get_typeinfo( ISWbemServices_tid
, &typeinfo
);
803 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
804 ITypeInfo_Release( typeinfo
);
809 static HRESULT WINAPI
services_Invoke(
810 ISWbemServices
*iface
,
817 EXCEPINFO
*excep_info
,
820 struct services
*services
= impl_from_ISWbemServices( iface
);
824 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", services
, member
, debugstr_guid(riid
),
825 lcid
, flags
, params
, result
, excep_info
, arg_err
);
827 hr
= get_typeinfo( ISWbemServices_tid
, &typeinfo
);
830 hr
= ITypeInfo_Invoke( typeinfo
, &services
->ISWbemServices_iface
, member
, flags
,
831 params
, result
, excep_info
, arg_err
);
832 ITypeInfo_Release( typeinfo
);
837 static HRESULT WINAPI
services_Get(
838 ISWbemServices
*iface
,
841 IDispatch
*objWbemNamedValueSet
,
842 ISWbemObject
**objWbemObject
)
844 struct services
*services
= impl_from_ISWbemServices( iface
);
845 IWbemClassObject
*obj
;
848 TRACE( "%p, %s, %d, %p, %p\n", iface
, debugstr_w(strObjectPath
), iFlags
, objWbemNamedValueSet
,
851 if (objWbemNamedValueSet
) FIXME( "ignoring context\n" );
853 hr
= IWbemServices_GetObject( services
->services
, strObjectPath
, iFlags
, NULL
, &obj
, NULL
);
854 if (hr
!= S_OK
) return hr
;
856 hr
= SWbemObject_create( obj
, objWbemObject
);
857 IWbemClassObject_Release( obj
);
861 static HRESULT WINAPI
services_GetAsync(
862 ISWbemServices
*iface
,
863 IDispatch
*objWbemSink
,
866 IDispatch
*objWbemNamedValueSet
,
867 IDispatch
*objWbemAsyncContext
)
873 static HRESULT WINAPI
services_Delete(
874 ISWbemServices
*iface
,
877 IDispatch
*objWbemNamedValueSet
)
883 static HRESULT WINAPI
services_DeleteAsync(
884 ISWbemServices
* This
,
885 IDispatch
*objWbemSink
,
888 IDispatch
*objWbemNamedValueSet
,
889 IDispatch
*objWbemAsyncContext
)
895 static BSTR
build_query_string( const WCHAR
*class )
897 static const WCHAR selectW
[] = {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',0};
898 UINT len
= strlenW(class) + sizeof(selectW
) / sizeof(selectW
[0]);
901 if (!(ret
= SysAllocStringLen( NULL
, len
))) return NULL
;
902 strcpyW( ret
, selectW
);
903 strcatW( ret
, class );
907 static HRESULT WINAPI
services_InstancesOf(
908 ISWbemServices
*iface
,
911 IDispatch
*objWbemNamedValueSet
,
912 ISWbemObjectSet
**objWbemObjectSet
)
914 static const WCHAR wqlW
[] = {'W','Q','L',0};
915 BSTR query
, wql
= SysAllocString( wqlW
);
918 TRACE( "%p, %s, %x, %p, %p\n", iface
, debugstr_w(strClass
), iFlags
, objWbemNamedValueSet
,
921 if (!(query
= build_query_string( strClass
)))
923 SysFreeString( wql
);
924 return E_OUTOFMEMORY
;
926 hr
= ISWbemServices_ExecQuery( iface
, query
, wql
, iFlags
, objWbemNamedValueSet
, objWbemObjectSet
);
927 SysFreeString( wql
);
928 SysFreeString( query
);
932 static HRESULT WINAPI
services_InstancesOfAsync(
933 ISWbemServices
*iface
,
934 IDispatch
*objWbemSink
,
937 IDispatch
*objWbemNamedValueSet
,
938 IDispatch
*objWbemAsyncContext
)
944 static HRESULT WINAPI
services_SubclassesOf(
945 ISWbemServices
*iface
,
948 IDispatch
*objWbemNamedValueSet
,
949 ISWbemObjectSet
**objWbemObjectSet
)
955 static HRESULT WINAPI
services_SubclassesOfAsync(
956 ISWbemServices
*iface
,
957 IDispatch
*objWbemSink
,
960 IDispatch
*objWbemNamedValueSet
,
961 IDispatch
*objWbemAsyncContext
)
967 static HRESULT WINAPI
services_ExecQuery(
968 ISWbemServices
*iface
,
970 BSTR strQueryLanguage
,
972 IDispatch
*objWbemNamedValueSet
,
973 ISWbemObjectSet
**objWbemObjectSet
)
975 struct services
*services
= impl_from_ISWbemServices( iface
);
976 IEnumWbemClassObject
*iter
;
979 TRACE( "%p, %s, %s, %x, %p, %p\n", iface
, debugstr_w(strQuery
), debugstr_w(strQueryLanguage
),
980 iFlags
, objWbemNamedValueSet
, objWbemObjectSet
);
982 if (objWbemNamedValueSet
) FIXME( "ignoring context\n" );
984 hr
= IWbemServices_ExecQuery( services
->services
, strQueryLanguage
, strQuery
, iFlags
, NULL
, &iter
);
985 if (hr
!= S_OK
) return hr
;
987 hr
= SWbemObjectSet_create( iter
, objWbemObjectSet
);
988 IEnumWbemClassObject_Release( iter
);
992 static HRESULT WINAPI
services_ExecQueryAsync(
993 ISWbemServices
*iface
,
994 IDispatch
*objWbemSink
,
996 BSTR strQueryLanguage
,
998 IDispatch
*objWbemNamedValueSet
,
999 IDispatch
*objWbemAsyncContext
)
1005 static HRESULT WINAPI
services_AssociatorsOf(
1006 ISWbemServices
*iface
,
1009 BSTR strResultClass
,
1012 VARIANT_BOOL bClassesOnly
,
1013 VARIANT_BOOL bSchemaOnly
,
1014 BSTR strRequiredAssocQualifier
,
1015 BSTR strRequiredQualifier
,
1017 IDispatch
*objWbemNamedValueSet
,
1018 ISWbemObjectSet
**objWbemObjectSet
)
1024 static HRESULT WINAPI
services_AssociatorsOfAsync(
1025 ISWbemServices
*iface
,
1026 IDispatch
*objWbemSink
,
1029 BSTR strResultClass
,
1032 VARIANT_BOOL bClassesOnly
,
1033 VARIANT_BOOL bSchemaOnly
,
1034 BSTR strRequiredAssocQualifier
,
1035 BSTR strRequiredQualifier
,
1037 IDispatch
*objWbemNamedValueSet
,
1038 IDispatch
*objWbemAsyncContext
)
1044 static HRESULT WINAPI
services_ReferencesTo(
1045 ISWbemServices
*iface
,
1047 BSTR strResultClass
,
1049 VARIANT_BOOL bClassesOnly
,
1050 VARIANT_BOOL bSchemaOnly
,
1051 BSTR strRequiredQualifier
,
1053 IDispatch
*objWbemNamedValueSet
,
1054 ISWbemObjectSet
**objWbemObjectSet
)
1060 static HRESULT WINAPI
services_ReferencesToAsync(
1061 ISWbemServices
*iface
,
1062 IDispatch
*objWbemSink
,
1064 BSTR strResultClass
,
1066 VARIANT_BOOL bClassesOnly
,
1067 VARIANT_BOOL bSchemaOnly
,
1068 BSTR strRequiredQualifier
,
1070 IDispatch
*objWbemNamedValueSet
,
1071 IDispatch
*objWbemAsyncContext
)
1077 static HRESULT WINAPI
services_ExecNotificationQuery(
1078 ISWbemServices
*iface
,
1080 BSTR strQueryLanguage
,
1082 IDispatch
*objWbemNamedValueSet
,
1083 ISWbemEventSource
**objWbemEventSource
)
1089 static HRESULT WINAPI
services_ExecNotificationQueryAsync(
1090 ISWbemServices
*iface
,
1091 IDispatch
*objWbemSink
,
1093 BSTR strQueryLanguage
,
1095 IDispatch
*objWbemNamedValueSet
,
1096 IDispatch
*objWbemAsyncContext
)
1102 static HRESULT WINAPI
services_ExecMethod(
1103 ISWbemServices
*iface
,
1106 IDispatch
*objWbemInParameters
,
1108 IDispatch
*objWbemNamedValueSet
,
1109 ISWbemObject
**objWbemOutParameters
)
1115 static HRESULT WINAPI
services_ExecMethodAsync(
1116 ISWbemServices
*iface
,
1117 IDispatch
*objWbemSink
,
1120 IDispatch
*objWbemInParameters
,
1122 IDispatch
*objWbemNamedValueSet
,
1123 IDispatch
*objWbemAsyncContext
)
1129 static HRESULT WINAPI
services_get_Security_(
1130 ISWbemServices
*iface
,
1131 ISWbemSecurity
**objWbemSecurity
)
1137 static const ISWbemServicesVtbl services_vtbl
=
1139 services_QueryInterface
,
1142 services_GetTypeInfoCount
,
1143 services_GetTypeInfo
,
1144 services_GetIDsOfNames
,
1149 services_DeleteAsync
,
1150 services_InstancesOf
,
1151 services_InstancesOfAsync
,
1152 services_SubclassesOf
,
1153 services_SubclassesOfAsync
,
1155 services_ExecQueryAsync
,
1156 services_AssociatorsOf
,
1157 services_AssociatorsOfAsync
,
1158 services_ReferencesTo
,
1159 services_ReferencesToAsync
,
1160 services_ExecNotificationQuery
,
1161 services_ExecNotificationQueryAsync
,
1162 services_ExecMethod
,
1163 services_ExecMethodAsync
,
1164 services_get_Security_
1167 static HRESULT
SWbemServices_create( IWbemServices
*wbem_services
, ISWbemServices
**obj
)
1169 struct services
*services
;
1171 TRACE( "%p, %p\n", obj
, wbem_services
);
1173 if (!(services
= heap_alloc( sizeof(*services
) ))) return E_OUTOFMEMORY
;
1174 services
->ISWbemServices_iface
.lpVtbl
= &services_vtbl
;
1176 services
->services
= wbem_services
;
1177 IWbemServices_AddRef( services
->services
);
1179 *obj
= &services
->ISWbemServices_iface
;
1180 TRACE( "returning iface %p\n", *obj
);
1186 ISWbemLocator ISWbemLocator_iface
;
1188 IWbemLocator
*locator
;
1191 static inline struct locator
*impl_from_ISWbemLocator( ISWbemLocator
*iface
)
1193 return CONTAINING_RECORD( iface
, struct locator
, ISWbemLocator_iface
);
1196 static ULONG WINAPI
locator_AddRef(
1197 ISWbemLocator
*iface
)
1199 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1200 return InterlockedIncrement( &locator
->refs
);
1203 static ULONG WINAPI
locator_Release(
1204 ISWbemLocator
*iface
)
1206 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1207 LONG refs
= InterlockedDecrement( &locator
->refs
);
1210 TRACE( "destroying %p\n", locator
);
1211 IWbemLocator_Release( locator
->locator
);
1212 heap_free( locator
);
1217 static HRESULT WINAPI
locator_QueryInterface(
1218 ISWbemLocator
*iface
,
1222 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1224 TRACE( "%p, %s, %p\n", locator
, debugstr_guid( riid
), ppvObject
);
1226 if (IsEqualGUID( riid
, &IID_ISWbemLocator
) ||
1227 IsEqualGUID( riid
, &IID_IDispatch
) ||
1228 IsEqualGUID( riid
, &IID_IUnknown
))
1234 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1235 return E_NOINTERFACE
;
1237 ISWbemLocator_AddRef( iface
);
1241 static HRESULT WINAPI
locator_GetTypeInfoCount(
1242 ISWbemLocator
*iface
,
1245 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1247 TRACE( "%p, %p\n", locator
, count
);
1252 static HRESULT WINAPI
locator_GetTypeInfo(
1253 ISWbemLocator
*iface
,
1258 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1259 TRACE( "%p, %u, %u, %p\n", locator
, index
, lcid
, info
);
1261 return get_typeinfo( ISWbemLocator_tid
, info
);
1264 static HRESULT WINAPI
locator_GetIDsOfNames(
1265 ISWbemLocator
*iface
,
1272 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1273 ITypeInfo
*typeinfo
;
1276 TRACE( "%p, %s, %p, %u, %u, %p\n", locator
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1278 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
1280 hr
= get_typeinfo( ISWbemLocator_tid
, &typeinfo
);
1283 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
1284 ITypeInfo_Release( typeinfo
);
1289 static HRESULT WINAPI
locator_Invoke(
1290 ISWbemLocator
*iface
,
1297 EXCEPINFO
*excep_info
,
1300 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1301 ITypeInfo
*typeinfo
;
1304 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", locator
, member
, debugstr_guid(riid
),
1305 lcid
, flags
, params
, result
, excep_info
, arg_err
);
1307 hr
= get_typeinfo( ISWbemLocator_tid
, &typeinfo
);
1310 hr
= ITypeInfo_Invoke( typeinfo
, &locator
->ISWbemLocator_iface
, member
, flags
,
1311 params
, result
, excep_info
, arg_err
);
1312 ITypeInfo_Release( typeinfo
);
1317 static BSTR
build_resource_string( BSTR server
, BSTR
namespace )
1319 static const WCHAR defaultW
[] = {'r','o','o','t','\\','d','e','f','a','u','l','t',0};
1320 ULONG len
, len_server
= 0, len_namespace
= 0;
1323 if (server
&& *server
) len_server
= strlenW( server
);
1324 else len_server
= 1;
1325 if (namespace && *namespace) len_namespace
= strlenW( namespace );
1326 else len_namespace
= sizeof(defaultW
) / sizeof(defaultW
[0]) - 1;
1328 if (!(ret
= SysAllocStringLen( NULL
, 2 + len_server
+ 1 + len_namespace
))) return NULL
;
1330 ret
[0] = ret
[1] = '\\';
1331 if (server
&& *server
) strcpyW( ret
+ 2, server
);
1334 len
= len_server
+ 2;
1337 if (namespace && *namespace) strcpyW( ret
+ len
, namespace );
1338 else strcpyW( ret
+ len
, defaultW
);
1342 static HRESULT WINAPI
locator_ConnectServer(
1343 ISWbemLocator
*iface
,
1350 LONG iSecurityFlags
,
1351 IDispatch
*objWbemNamedValueSet
,
1352 ISWbemServices
**objWbemServices
)
1354 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1355 IWbemServices
*services
;
1359 TRACE( "%p, %s, %s, %s, %p, %s, %s, 0x%08x, %p, %p\n", iface
, debugstr_w(strServer
),
1360 debugstr_w(strNamespace
), debugstr_w(strUser
), strPassword
, debugstr_w(strLocale
),
1361 debugstr_w(strAuthority
), iSecurityFlags
, objWbemNamedValueSet
, objWbemServices
);
1363 if (objWbemNamedValueSet
) FIXME( "context not supported\n" );
1365 if (!locator
->locator
)
1367 hr
= CoCreateInstance( &CLSID_WbemLocator
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IWbemLocator
,
1368 (void **)&locator
->locator
);
1369 if (hr
!= S_OK
) return hr
;
1372 if (!(resource
= build_resource_string( strServer
, strNamespace
))) return E_OUTOFMEMORY
;
1373 hr
= IWbemLocator_ConnectServer( locator
->locator
, resource
, strUser
, strPassword
, strLocale
,
1374 iSecurityFlags
, strAuthority
, NULL
, &services
);
1375 SysFreeString( resource
);
1376 if (hr
!= S_OK
) return hr
;
1378 hr
= SWbemServices_create( services
, objWbemServices
);
1379 IWbemServices_Release( services
);
1383 static HRESULT WINAPI
locator_get_Security_(
1384 ISWbemLocator
*iface
,
1385 ISWbemSecurity
**objWbemSecurity
)
1387 FIXME( "%p, %p\n", iface
, objWbemSecurity
);
1391 static const ISWbemLocatorVtbl locator_vtbl
=
1393 locator_QueryInterface
,
1396 locator_GetTypeInfoCount
,
1397 locator_GetTypeInfo
,
1398 locator_GetIDsOfNames
,
1400 locator_ConnectServer
,
1401 locator_get_Security_
1404 HRESULT
SWbemLocator_create( void **obj
)
1406 struct locator
*locator
;
1408 TRACE( "%p\n", obj
);
1410 if (!(locator
= heap_alloc( sizeof(*locator
) ))) return E_OUTOFMEMORY
;
1411 locator
->ISWbemLocator_iface
.lpVtbl
= &locator_vtbl
;
1413 locator
->locator
= NULL
;
1415 *obj
= &locator
->ISWbemLocator_iface
;
1416 TRACE( "returning iface %p\n", *obj
);