2 * Copyright 2013 Hans Leidekker for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include "wbemdisp_private.h"
23 static HRESULT
EnumVARIANT_create( IEnumWbemClassObject
*, IEnumVARIANT
** );
24 static HRESULT
ISWbemSecurity_create( ISWbemSecurity
** );
36 static ITypeLib
*wbemdisp_typelib
;
37 static ITypeInfo
*wbemdisp_typeinfo
[last_tid
];
39 static REFIID wbemdisp_tid_id
[] =
48 static HRESULT
get_typeinfo( enum type_id tid
, ITypeInfo
**ret
)
52 if (!wbemdisp_typelib
)
56 hr
= LoadRegTypeLib( &LIBID_WbemScripting
, 1, 2, LOCALE_SYSTEM_DEFAULT
, &typelib
);
59 ERR( "LoadRegTypeLib failed: %08x\n", hr
);
62 if (InterlockedCompareExchangePointer( (void **)&wbemdisp_typelib
, typelib
, NULL
))
63 ITypeLib_Release( typelib
);
65 if (!wbemdisp_typeinfo
[tid
])
69 hr
= ITypeLib_GetTypeInfoOfGuid( wbemdisp_typelib
, wbemdisp_tid_id
[tid
], &typeinfo
);
72 ERR( "GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(wbemdisp_tid_id
[tid
]), hr
);
75 if (InterlockedCompareExchangePointer( (void **)(wbemdisp_typeinfo
+ tid
), typeinfo
, NULL
))
76 ITypeInfo_Release( typeinfo
);
78 *ret
= wbemdisp_typeinfo
[tid
];
79 ITypeInfo_AddRef( *ret
);
83 #define DISPID_BASE 0x1800000
93 ISWbemObject ISWbemObject_iface
;
95 IWbemClassObject
*object
;
96 struct member
*members
;
101 static inline struct object
*impl_from_ISWbemObject(
102 ISWbemObject
*iface
)
104 return CONTAINING_RECORD( iface
, struct object
, ISWbemObject_iface
);
107 static ULONG WINAPI
object_AddRef(
108 ISWbemObject
*iface
)
110 struct object
*object
= impl_from_ISWbemObject( iface
);
111 return InterlockedIncrement( &object
->refs
);
114 static ULONG WINAPI
object_Release(
115 ISWbemObject
*iface
)
117 struct object
*object
= impl_from_ISWbemObject( iface
);
118 LONG refs
= InterlockedDecrement( &object
->refs
);
123 TRACE( "destroying %p\n", object
);
124 IWbemClassObject_Release( object
->object
);
125 for (i
= 0; i
< object
->nb_members
; i
++) SysFreeString( object
->members
[i
].name
);
126 heap_free( object
->members
);
132 static HRESULT WINAPI
object_QueryInterface(
137 struct object
*object
= impl_from_ISWbemObject( iface
);
139 TRACE( "%p %s %p\n", object
, debugstr_guid(riid
), ppvObject
);
141 if (IsEqualGUID( riid
, &IID_ISWbemObject
) ||
142 IsEqualGUID( riid
, &IID_IDispatch
) ||
143 IsEqualGUID( riid
, &IID_IUnknown
))
149 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
150 return E_NOINTERFACE
;
152 ISWbemObject_AddRef( iface
);
156 static HRESULT WINAPI
object_GetTypeInfoCount(
160 struct object
*object
= impl_from_ISWbemObject( iface
);
162 TRACE( "%p, %p\n", object
, count
);
167 static HRESULT WINAPI
object_GetTypeInfo(
173 struct object
*object
= impl_from_ISWbemObject( iface
);
174 FIXME( "%p, %u, %u, %p\n", object
, index
, lcid
, info
);
178 #define DISPID_BASE 0x1800000
180 static HRESULT
init_members( struct object
*object
)
186 if (object
->members
) return S_OK
;
188 hr
= IWbemClassObject_GetNames( object
->object
, NULL
, 0, NULL
, &sa
);
189 if (FAILED( hr
)) return hr
;
190 hr
= SafeArrayGetUBound( sa
, 1, &bound
);
193 SafeArrayDestroy( sa
);
196 if (!(object
->members
= heap_alloc( sizeof(struct member
) * (bound
+ 1) )))
198 SafeArrayDestroy( sa
);
199 return E_OUTOFMEMORY
;
201 for (i
= 0; i
<= bound
; i
++)
203 hr
= SafeArrayGetElement( sa
, &i
, &object
->members
[i
].name
);
206 for (i
--; i
>= 0; i
--) SysFreeString( object
->members
[i
].name
);
207 SafeArrayDestroy( sa
);
208 heap_free( object
->members
);
209 object
->members
= NULL
;
210 return E_OUTOFMEMORY
;
212 object
->members
[i
].dispid
= 0;
214 object
->nb_members
= bound
+ 1;
215 SafeArrayDestroy( sa
);
219 static DISPID
get_member_dispid( struct object
*object
, const WCHAR
*name
)
222 for (i
= 0; i
< object
->nb_members
; i
++)
224 if (!strcmpiW( object
->members
[i
].name
, name
))
226 if (!object
->members
[i
].dispid
) object
->members
[i
].dispid
= ++object
->last_dispid
;
227 return object
->members
[i
].dispid
;
230 return DISPID_UNKNOWN
;
233 static HRESULT WINAPI
object_GetIDsOfNames(
241 struct object
*object
= impl_from_ISWbemObject( iface
);
245 TRACE( "%p, %s, %p, %u, %u, %p\n", object
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
247 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
249 hr
= init_members( object
);
250 if (FAILED( hr
)) return hr
;
252 for (i
= 0; i
< count
; i
++)
254 if ((dispid
[i
] = get_member_dispid( object
, names
[i
] )) == DISPID_UNKNOWN
) break;
256 if (i
!= count
) return DISP_E_UNKNOWNNAME
;
260 static BSTR
get_member_name( struct object
*object
, DISPID dispid
)
263 for (i
= 0; i
< object
->nb_members
; i
++)
265 if (object
->members
[i
].dispid
== dispid
) return object
->members
[i
].name
;
270 static HRESULT WINAPI
object_Invoke(
278 EXCEPINFO
*excep_info
,
281 struct object
*object
= impl_from_ISWbemObject( iface
);
284 TRACE( "%p, %x, %s, %u, %x, %p, %p, %p, %p\n", object
, member
, debugstr_guid(riid
),
285 lcid
, flags
, params
, result
, excep_info
, arg_err
);
287 if (flags
!= (DISPATCH_METHOD
|DISPATCH_PROPERTYGET
))
289 FIXME( "flags %x not supported\n", flags
);
292 if (!(name
= get_member_name( object
, member
)))
293 return DISP_E_MEMBERNOTFOUND
;
295 memset( params
, 0, sizeof(*params
) );
296 return IWbemClassObject_Get( object
->object
, name
, 0, result
, NULL
, NULL
);
299 static HRESULT WINAPI
object_Put_(
302 IDispatch
*objWbemNamedValueSet
,
303 ISWbemObjectPath
**objWbemObjectPath
)
309 static const ISWbemObjectVtbl object_vtbl
=
311 object_QueryInterface
,
314 object_GetTypeInfoCount
,
316 object_GetIDsOfNames
,
321 static HRESULT
SWbemObject_create( IWbemClassObject
*wbem_object
, ISWbemObject
**obj
)
323 struct object
*object
;
325 TRACE( "%p, %p\n", obj
, wbem_object
);
327 if (!(object
= heap_alloc( sizeof(*object
) ))) return E_OUTOFMEMORY
;
328 object
->ISWbemObject_iface
.lpVtbl
= &object_vtbl
;
330 object
->object
= wbem_object
;
331 IWbemClassObject_AddRef( object
->object
);
332 object
->members
= NULL
;
333 object
->nb_members
= 0;
334 object
->last_dispid
= DISPID_BASE
;
336 *obj
= &object
->ISWbemObject_iface
;
337 TRACE( "returning iface %p\n", *obj
);
343 ISWbemObjectSet ISWbemObjectSet_iface
;
345 IEnumWbemClassObject
*objectenum
;
349 static inline struct objectset
*impl_from_ISWbemObjectSet(
350 ISWbemObjectSet
*iface
)
352 return CONTAINING_RECORD( iface
, struct objectset
, ISWbemObjectSet_iface
);
355 static ULONG WINAPI
objectset_AddRef(
356 ISWbemObjectSet
*iface
)
358 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
359 return InterlockedIncrement( &objectset
->refs
);
362 static ULONG WINAPI
objectset_Release(
363 ISWbemObjectSet
*iface
)
365 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
366 LONG refs
= InterlockedDecrement( &objectset
->refs
);
369 TRACE( "destroying %p\n", objectset
);
370 IEnumWbemClassObject_Release( objectset
->objectenum
);
371 heap_free( objectset
);
376 static HRESULT WINAPI
objectset_QueryInterface(
377 ISWbemObjectSet
*iface
,
381 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
383 TRACE( "%p %s %p\n", objectset
, debugstr_guid(riid
), ppvObject
);
385 if (IsEqualGUID( riid
, &IID_ISWbemObjectSet
) ||
386 IsEqualGUID( riid
, &IID_IDispatch
) ||
387 IsEqualGUID( riid
, &IID_IUnknown
))
389 *ppvObject
= objectset
;
393 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
394 return E_NOINTERFACE
;
396 ISWbemObjectSet_AddRef( iface
);
400 static HRESULT WINAPI
objectset_GetTypeInfoCount(
401 ISWbemObjectSet
*iface
,
404 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
405 TRACE( "%p, %p\n", objectset
, count
);
410 static HRESULT WINAPI
objectset_GetTypeInfo(
411 ISWbemObjectSet
*iface
,
416 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
417 TRACE( "%p, %u, %u, %p\n", objectset
, index
, lcid
, info
);
419 return get_typeinfo( ISWbemObjectSet_tid
, info
);
422 static HRESULT WINAPI
objectset_GetIDsOfNames(
423 ISWbemObjectSet
*iface
,
430 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
434 TRACE( "%p, %s, %p, %u, %u, %p\n", objectset
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
436 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
438 hr
= get_typeinfo( ISWbemObjectSet_tid
, &typeinfo
);
441 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
442 ITypeInfo_Release( typeinfo
);
447 static HRESULT WINAPI
objectset_Invoke(
448 ISWbemObjectSet
*iface
,
455 EXCEPINFO
*excep_info
,
458 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
462 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", objectset
, member
, debugstr_guid(riid
),
463 lcid
, flags
, params
, result
, excep_info
, arg_err
);
465 hr
= get_typeinfo( ISWbemObjectSet_tid
, &typeinfo
);
468 hr
= ITypeInfo_Invoke( typeinfo
, &objectset
->ISWbemObjectSet_iface
, member
, flags
,
469 params
, result
, excep_info
, arg_err
);
470 ITypeInfo_Release( typeinfo
);
475 static HRESULT WINAPI
objectset_get__NewEnum(
476 ISWbemObjectSet
*iface
,
479 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
480 IEnumWbemClassObject
*objectenum
;
483 TRACE( "%p, %p\n", objectset
, pUnk
);
485 hr
= IEnumWbemClassObject_Clone( objectset
->objectenum
, &objectenum
);
486 if (FAILED( hr
)) return hr
;
488 hr
= EnumVARIANT_create( objectenum
, (IEnumVARIANT
**)pUnk
);
489 IEnumWbemClassObject_Release( objectenum
);
493 static HRESULT WINAPI
objectset_Item(
494 ISWbemObjectSet
*iface
,
497 ISWbemObject
**objWbemObject
)
503 static HRESULT WINAPI
objectset_get_Count(
504 ISWbemObjectSet
*iface
,
507 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
509 TRACE( "%p, %p\n", objectset
, iCount
);
511 *iCount
= objectset
->count
;
515 static HRESULT WINAPI
objectset_get_Security_(
516 ISWbemObjectSet
*iface
,
517 ISWbemSecurity
**objWbemSecurity
)
523 static HRESULT WINAPI
objectset_ItemIndex(
524 ISWbemObjectSet
*iface
,
526 ISWbemObject
**objWbemObject
)
532 static const ISWbemObjectSetVtbl objectset_vtbl
=
534 objectset_QueryInterface
,
537 objectset_GetTypeInfoCount
,
538 objectset_GetTypeInfo
,
539 objectset_GetIDsOfNames
,
541 objectset_get__NewEnum
,
544 objectset_get_Security_
,
548 static LONG
get_object_count( IEnumWbemClassObject
*iter
)
551 while (IEnumWbemClassObject_Skip( iter
, WBEM_INFINITE
, 1 ) == S_OK
) count
++;
552 IEnumWbemClassObject_Reset( iter
);
556 static HRESULT
SWbemObjectSet_create( IEnumWbemClassObject
*wbem_objectenum
, ISWbemObjectSet
**obj
)
558 struct objectset
*objectset
;
560 TRACE( "%p, %p\n", obj
, wbem_objectenum
);
562 if (!(objectset
= heap_alloc( sizeof(*objectset
) ))) return E_OUTOFMEMORY
;
563 objectset
->ISWbemObjectSet_iface
.lpVtbl
= &objectset_vtbl
;
565 objectset
->objectenum
= wbem_objectenum
;
566 IEnumWbemClassObject_AddRef( objectset
->objectenum
);
567 objectset
->count
= get_object_count( objectset
->objectenum
);
569 *obj
= &objectset
->ISWbemObjectSet_iface
;
570 TRACE( "returning iface %p\n", *obj
);
576 IEnumVARIANT IEnumVARIANT_iface
;
578 IEnumWbemClassObject
*objectenum
;
581 static inline struct enumvar
*impl_from_IEnumVARIANT(
582 IEnumVARIANT
*iface
)
584 return CONTAINING_RECORD( iface
, struct enumvar
, IEnumVARIANT_iface
);
587 static ULONG WINAPI
enumvar_AddRef(
588 IEnumVARIANT
*iface
)
590 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
591 return InterlockedIncrement( &enumvar
->refs
);
594 static ULONG WINAPI
enumvar_Release(
595 IEnumVARIANT
*iface
)
597 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
598 LONG refs
= InterlockedDecrement( &enumvar
->refs
);
601 TRACE( "destroying %p\n", enumvar
);
602 IEnumWbemClassObject_Release( enumvar
->objectenum
);
603 heap_free( enumvar
);
608 static HRESULT WINAPI
enumvar_QueryInterface(
613 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
615 TRACE( "%p %s %p\n", enumvar
, debugstr_guid(riid
), ppvObject
);
617 if (IsEqualGUID( riid
, &IID_IEnumVARIANT
) ||
618 IsEqualGUID( riid
, &IID_IUnknown
))
620 *ppvObject
= enumvar
;
624 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
625 return E_NOINTERFACE
;
627 IEnumVARIANT_AddRef( iface
);
631 static HRESULT WINAPI
enumvar_Next( IEnumVARIANT
*iface
, ULONG celt
, VARIANT
*var
, ULONG
*fetched
)
633 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
634 IWbemClassObject
*obj
;
637 TRACE( "%p, %u, %p, %p\n", iface
, celt
, var
, fetched
);
639 if (celt
) IEnumWbemClassObject_Next( enumvar
->objectenum
, WBEM_INFINITE
, 1, &obj
, &count
);
645 hr
= SWbemObject_create( obj
, &sobj
);
646 IWbemClassObject_Release( obj
);
647 if (FAILED( hr
)) return hr
;
649 V_VT( var
) = VT_DISPATCH
;
650 V_DISPATCH( var
) = (IDispatch
*)sobj
;
652 if (fetched
) *fetched
= count
;
653 return (count
< celt
) ? S_FALSE
: S_OK
;
656 static HRESULT WINAPI
enumvar_Skip( IEnumVARIANT
*iface
, ULONG celt
)
658 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
660 TRACE( "%p, %u\n", iface
, celt
);
662 return IEnumWbemClassObject_Skip( enumvar
->objectenum
, WBEM_INFINITE
, celt
);
665 static HRESULT WINAPI
enumvar_Reset( IEnumVARIANT
*iface
)
667 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
669 TRACE( "%p\n", iface
);
671 return IEnumWbemClassObject_Reset( enumvar
->objectenum
);
674 static HRESULT WINAPI
enumvar_Clone( IEnumVARIANT
*iface
, IEnumVARIANT
**penum
)
676 FIXME( "%p, %p\n", iface
, penum
);
680 static const struct IEnumVARIANTVtbl enumvar_vtbl
=
682 enumvar_QueryInterface
,
691 static HRESULT
EnumVARIANT_create( IEnumWbemClassObject
*objectenum
, IEnumVARIANT
**obj
)
693 struct enumvar
*enumvar
;
695 if (!(enumvar
= heap_alloc( sizeof(*enumvar
) ))) return E_OUTOFMEMORY
;
696 enumvar
->IEnumVARIANT_iface
.lpVtbl
= &enumvar_vtbl
;
698 enumvar
->objectenum
= objectenum
;
699 IEnumWbemClassObject_AddRef( enumvar
->objectenum
);
701 *obj
= &enumvar
->IEnumVARIANT_iface
;
702 TRACE( "returning iface %p\n", *obj
);
708 ISWbemServices ISWbemServices_iface
;
710 IWbemServices
*services
;
713 static inline struct services
*impl_from_ISWbemServices(
714 ISWbemServices
*iface
)
716 return CONTAINING_RECORD( iface
, struct services
, ISWbemServices_iface
);
719 static ULONG WINAPI
services_AddRef(
720 ISWbemServices
*iface
)
722 struct services
*services
= impl_from_ISWbemServices( iface
);
723 return InterlockedIncrement( &services
->refs
);
726 static ULONG WINAPI
services_Release(
727 ISWbemServices
*iface
)
729 struct services
*services
= impl_from_ISWbemServices( iface
);
730 LONG refs
= InterlockedDecrement( &services
->refs
);
733 TRACE( "destroying %p\n", services
);
734 IWbemServices_Release( services
->services
);
735 heap_free( services
);
740 static HRESULT WINAPI
services_QueryInterface(
741 ISWbemServices
*iface
,
745 struct services
*services
= impl_from_ISWbemServices( iface
);
747 TRACE( "%p %s %p\n", services
, debugstr_guid(riid
), ppvObject
);
749 if (IsEqualGUID( riid
, &IID_ISWbemServices
) ||
750 IsEqualGUID( riid
, &IID_IDispatch
) ||
751 IsEqualGUID( riid
, &IID_IUnknown
))
753 *ppvObject
= services
;
757 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
758 return E_NOINTERFACE
;
760 ISWbemServices_AddRef( iface
);
764 static HRESULT WINAPI
services_GetTypeInfoCount(
765 ISWbemServices
*iface
,
768 struct services
*services
= impl_from_ISWbemServices( iface
);
769 TRACE( "%p, %p\n", services
, count
);
775 static HRESULT WINAPI
services_GetTypeInfo(
776 ISWbemServices
*iface
,
781 struct services
*services
= impl_from_ISWbemServices( iface
);
782 TRACE( "%p, %u, %u, %p\n", services
, index
, lcid
, info
);
784 return get_typeinfo( ISWbemServices_tid
, info
);
787 static HRESULT WINAPI
services_GetIDsOfNames(
788 ISWbemServices
*iface
,
795 struct services
*services
= impl_from_ISWbemServices( iface
);
799 TRACE( "%p, %s, %p, %u, %u, %p\n", services
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
801 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
803 hr
= get_typeinfo( ISWbemServices_tid
, &typeinfo
);
806 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
807 ITypeInfo_Release( typeinfo
);
812 static HRESULT WINAPI
services_Invoke(
813 ISWbemServices
*iface
,
820 EXCEPINFO
*excep_info
,
823 struct services
*services
= impl_from_ISWbemServices( iface
);
827 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", services
, member
, debugstr_guid(riid
),
828 lcid
, flags
, params
, result
, excep_info
, arg_err
);
830 hr
= get_typeinfo( ISWbemServices_tid
, &typeinfo
);
833 hr
= ITypeInfo_Invoke( typeinfo
, &services
->ISWbemServices_iface
, member
, flags
,
834 params
, result
, excep_info
, arg_err
);
835 ITypeInfo_Release( typeinfo
);
840 static HRESULT WINAPI
services_Get(
841 ISWbemServices
*iface
,
844 IDispatch
*objWbemNamedValueSet
,
845 ISWbemObject
**objWbemObject
)
847 struct services
*services
= impl_from_ISWbemServices( iface
);
848 IWbemClassObject
*obj
;
851 TRACE( "%p, %s, %d, %p, %p\n", iface
, debugstr_w(strObjectPath
), iFlags
, objWbemNamedValueSet
,
854 if (objWbemNamedValueSet
) FIXME( "ignoring context\n" );
856 hr
= IWbemServices_GetObject( services
->services
, strObjectPath
, iFlags
, NULL
, &obj
, NULL
);
857 if (hr
!= S_OK
) return hr
;
859 hr
= SWbemObject_create( obj
, objWbemObject
);
860 IWbemClassObject_Release( obj
);
864 static HRESULT WINAPI
services_GetAsync(
865 ISWbemServices
*iface
,
866 IDispatch
*objWbemSink
,
869 IDispatch
*objWbemNamedValueSet
,
870 IDispatch
*objWbemAsyncContext
)
876 static HRESULT WINAPI
services_Delete(
877 ISWbemServices
*iface
,
880 IDispatch
*objWbemNamedValueSet
)
886 static HRESULT WINAPI
services_DeleteAsync(
887 ISWbemServices
* This
,
888 IDispatch
*objWbemSink
,
891 IDispatch
*objWbemNamedValueSet
,
892 IDispatch
*objWbemAsyncContext
)
898 static BSTR
build_query_string( const WCHAR
*class )
900 static const WCHAR selectW
[] = {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',0};
901 UINT len
= strlenW(class) + sizeof(selectW
) / sizeof(selectW
[0]);
904 if (!(ret
= SysAllocStringLen( NULL
, len
))) return NULL
;
905 strcpyW( ret
, selectW
);
906 strcatW( ret
, class );
910 static HRESULT WINAPI
services_InstancesOf(
911 ISWbemServices
*iface
,
914 IDispatch
*objWbemNamedValueSet
,
915 ISWbemObjectSet
**objWbemObjectSet
)
917 static const WCHAR wqlW
[] = {'W','Q','L',0};
918 BSTR query
, wql
= SysAllocString( wqlW
);
921 TRACE( "%p, %s, %x, %p, %p\n", iface
, debugstr_w(strClass
), iFlags
, objWbemNamedValueSet
,
924 if (!(query
= build_query_string( strClass
)))
926 SysFreeString( wql
);
927 return E_OUTOFMEMORY
;
929 hr
= ISWbemServices_ExecQuery( iface
, query
, wql
, iFlags
, objWbemNamedValueSet
, objWbemObjectSet
);
930 SysFreeString( wql
);
931 SysFreeString( query
);
935 static HRESULT WINAPI
services_InstancesOfAsync(
936 ISWbemServices
*iface
,
937 IDispatch
*objWbemSink
,
940 IDispatch
*objWbemNamedValueSet
,
941 IDispatch
*objWbemAsyncContext
)
947 static HRESULT WINAPI
services_SubclassesOf(
948 ISWbemServices
*iface
,
951 IDispatch
*objWbemNamedValueSet
,
952 ISWbemObjectSet
**objWbemObjectSet
)
958 static HRESULT WINAPI
services_SubclassesOfAsync(
959 ISWbemServices
*iface
,
960 IDispatch
*objWbemSink
,
963 IDispatch
*objWbemNamedValueSet
,
964 IDispatch
*objWbemAsyncContext
)
970 static HRESULT WINAPI
services_ExecQuery(
971 ISWbemServices
*iface
,
973 BSTR strQueryLanguage
,
975 IDispatch
*objWbemNamedValueSet
,
976 ISWbemObjectSet
**objWbemObjectSet
)
978 struct services
*services
= impl_from_ISWbemServices( iface
);
979 IEnumWbemClassObject
*iter
;
982 TRACE( "%p, %s, %s, %x, %p, %p\n", iface
, debugstr_w(strQuery
), debugstr_w(strQueryLanguage
),
983 iFlags
, objWbemNamedValueSet
, objWbemObjectSet
);
985 if (objWbemNamedValueSet
) FIXME( "ignoring context\n" );
987 hr
= IWbemServices_ExecQuery( services
->services
, strQueryLanguage
, strQuery
, iFlags
, NULL
, &iter
);
988 if (hr
!= S_OK
) return hr
;
990 hr
= SWbemObjectSet_create( iter
, objWbemObjectSet
);
991 IEnumWbemClassObject_Release( iter
);
995 static HRESULT WINAPI
services_ExecQueryAsync(
996 ISWbemServices
*iface
,
997 IDispatch
*objWbemSink
,
999 BSTR strQueryLanguage
,
1001 IDispatch
*objWbemNamedValueSet
,
1002 IDispatch
*objWbemAsyncContext
)
1008 static HRESULT WINAPI
services_AssociatorsOf(
1009 ISWbemServices
*iface
,
1012 BSTR strResultClass
,
1015 VARIANT_BOOL bClassesOnly
,
1016 VARIANT_BOOL bSchemaOnly
,
1017 BSTR strRequiredAssocQualifier
,
1018 BSTR strRequiredQualifier
,
1020 IDispatch
*objWbemNamedValueSet
,
1021 ISWbemObjectSet
**objWbemObjectSet
)
1027 static HRESULT WINAPI
services_AssociatorsOfAsync(
1028 ISWbemServices
*iface
,
1029 IDispatch
*objWbemSink
,
1032 BSTR strResultClass
,
1035 VARIANT_BOOL bClassesOnly
,
1036 VARIANT_BOOL bSchemaOnly
,
1037 BSTR strRequiredAssocQualifier
,
1038 BSTR strRequiredQualifier
,
1040 IDispatch
*objWbemNamedValueSet
,
1041 IDispatch
*objWbemAsyncContext
)
1047 static HRESULT WINAPI
services_ReferencesTo(
1048 ISWbemServices
*iface
,
1050 BSTR strResultClass
,
1052 VARIANT_BOOL bClassesOnly
,
1053 VARIANT_BOOL bSchemaOnly
,
1054 BSTR strRequiredQualifier
,
1056 IDispatch
*objWbemNamedValueSet
,
1057 ISWbemObjectSet
**objWbemObjectSet
)
1063 static HRESULT WINAPI
services_ReferencesToAsync(
1064 ISWbemServices
*iface
,
1065 IDispatch
*objWbemSink
,
1067 BSTR strResultClass
,
1069 VARIANT_BOOL bClassesOnly
,
1070 VARIANT_BOOL bSchemaOnly
,
1071 BSTR strRequiredQualifier
,
1073 IDispatch
*objWbemNamedValueSet
,
1074 IDispatch
*objWbemAsyncContext
)
1080 static HRESULT WINAPI
services_ExecNotificationQuery(
1081 ISWbemServices
*iface
,
1083 BSTR strQueryLanguage
,
1085 IDispatch
*objWbemNamedValueSet
,
1086 ISWbemEventSource
**objWbemEventSource
)
1092 static HRESULT WINAPI
services_ExecNotificationQueryAsync(
1093 ISWbemServices
*iface
,
1094 IDispatch
*objWbemSink
,
1096 BSTR strQueryLanguage
,
1098 IDispatch
*objWbemNamedValueSet
,
1099 IDispatch
*objWbemAsyncContext
)
1105 static HRESULT WINAPI
services_ExecMethod(
1106 ISWbemServices
*iface
,
1109 IDispatch
*objWbemInParameters
,
1111 IDispatch
*objWbemNamedValueSet
,
1112 ISWbemObject
**objWbemOutParameters
)
1118 static HRESULT WINAPI
services_ExecMethodAsync(
1119 ISWbemServices
*iface
,
1120 IDispatch
*objWbemSink
,
1123 IDispatch
*objWbemInParameters
,
1125 IDispatch
*objWbemNamedValueSet
,
1126 IDispatch
*objWbemAsyncContext
)
1132 static HRESULT WINAPI
services_get_Security_(
1133 ISWbemServices
*iface
,
1134 ISWbemSecurity
**objWbemSecurity
)
1136 TRACE( "%p, %p\n", iface
, objWbemSecurity
);
1138 if (!objWbemSecurity
)
1139 return E_INVALIDARG
;
1141 return ISWbemSecurity_create( objWbemSecurity
);
1144 static const ISWbemServicesVtbl services_vtbl
=
1146 services_QueryInterface
,
1149 services_GetTypeInfoCount
,
1150 services_GetTypeInfo
,
1151 services_GetIDsOfNames
,
1156 services_DeleteAsync
,
1157 services_InstancesOf
,
1158 services_InstancesOfAsync
,
1159 services_SubclassesOf
,
1160 services_SubclassesOfAsync
,
1162 services_ExecQueryAsync
,
1163 services_AssociatorsOf
,
1164 services_AssociatorsOfAsync
,
1165 services_ReferencesTo
,
1166 services_ReferencesToAsync
,
1167 services_ExecNotificationQuery
,
1168 services_ExecNotificationQueryAsync
,
1169 services_ExecMethod
,
1170 services_ExecMethodAsync
,
1171 services_get_Security_
1174 static HRESULT
SWbemServices_create( IWbemServices
*wbem_services
, ISWbemServices
**obj
)
1176 struct services
*services
;
1178 TRACE( "%p, %p\n", obj
, wbem_services
);
1180 if (!(services
= heap_alloc( sizeof(*services
) ))) return E_OUTOFMEMORY
;
1181 services
->ISWbemServices_iface
.lpVtbl
= &services_vtbl
;
1183 services
->services
= wbem_services
;
1184 IWbemServices_AddRef( services
->services
);
1186 *obj
= &services
->ISWbemServices_iface
;
1187 TRACE( "returning iface %p\n", *obj
);
1193 ISWbemLocator ISWbemLocator_iface
;
1195 IWbemLocator
*locator
;
1198 static inline struct locator
*impl_from_ISWbemLocator( ISWbemLocator
*iface
)
1200 return CONTAINING_RECORD( iface
, struct locator
, ISWbemLocator_iface
);
1203 static ULONG WINAPI
locator_AddRef(
1204 ISWbemLocator
*iface
)
1206 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1207 return InterlockedIncrement( &locator
->refs
);
1210 static ULONG WINAPI
locator_Release(
1211 ISWbemLocator
*iface
)
1213 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1214 LONG refs
= InterlockedDecrement( &locator
->refs
);
1217 TRACE( "destroying %p\n", locator
);
1218 if (locator
->locator
)
1219 IWbemLocator_Release( locator
->locator
);
1220 heap_free( locator
);
1225 static HRESULT WINAPI
locator_QueryInterface(
1226 ISWbemLocator
*iface
,
1230 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1232 TRACE( "%p, %s, %p\n", locator
, debugstr_guid( riid
), ppvObject
);
1234 if (IsEqualGUID( riid
, &IID_ISWbemLocator
) ||
1235 IsEqualGUID( riid
, &IID_IDispatch
) ||
1236 IsEqualGUID( riid
, &IID_IUnknown
))
1242 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1243 return E_NOINTERFACE
;
1245 ISWbemLocator_AddRef( iface
);
1249 static HRESULT WINAPI
locator_GetTypeInfoCount(
1250 ISWbemLocator
*iface
,
1253 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1255 TRACE( "%p, %p\n", locator
, count
);
1260 static HRESULT WINAPI
locator_GetTypeInfo(
1261 ISWbemLocator
*iface
,
1266 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1267 TRACE( "%p, %u, %u, %p\n", locator
, index
, lcid
, info
);
1269 return get_typeinfo( ISWbemLocator_tid
, info
);
1272 static HRESULT WINAPI
locator_GetIDsOfNames(
1273 ISWbemLocator
*iface
,
1280 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1281 ITypeInfo
*typeinfo
;
1284 TRACE( "%p, %s, %p, %u, %u, %p\n", locator
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1286 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
1288 hr
= get_typeinfo( ISWbemLocator_tid
, &typeinfo
);
1291 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
1292 ITypeInfo_Release( typeinfo
);
1297 static HRESULT WINAPI
locator_Invoke(
1298 ISWbemLocator
*iface
,
1305 EXCEPINFO
*excep_info
,
1308 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1309 ITypeInfo
*typeinfo
;
1312 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", locator
, member
, debugstr_guid(riid
),
1313 lcid
, flags
, params
, result
, excep_info
, arg_err
);
1315 hr
= get_typeinfo( ISWbemLocator_tid
, &typeinfo
);
1318 hr
= ITypeInfo_Invoke( typeinfo
, &locator
->ISWbemLocator_iface
, member
, flags
,
1319 params
, result
, excep_info
, arg_err
);
1320 ITypeInfo_Release( typeinfo
);
1325 static BSTR
build_resource_string( BSTR server
, BSTR
namespace )
1327 static const WCHAR defaultW
[] = {'r','o','o','t','\\','d','e','f','a','u','l','t',0};
1328 ULONG len
, len_server
= 0, len_namespace
= 0;
1331 if (server
&& *server
) len_server
= strlenW( server
);
1332 else len_server
= 1;
1333 if (namespace && *namespace) len_namespace
= strlenW( namespace );
1334 else len_namespace
= sizeof(defaultW
) / sizeof(defaultW
[0]) - 1;
1336 if (!(ret
= SysAllocStringLen( NULL
, 2 + len_server
+ 1 + len_namespace
))) return NULL
;
1338 ret
[0] = ret
[1] = '\\';
1339 if (server
&& *server
) strcpyW( ret
+ 2, server
);
1342 len
= len_server
+ 2;
1345 if (namespace && *namespace) strcpyW( ret
+ len
, namespace );
1346 else strcpyW( ret
+ len
, defaultW
);
1350 static HRESULT WINAPI
locator_ConnectServer(
1351 ISWbemLocator
*iface
,
1358 LONG iSecurityFlags
,
1359 IDispatch
*objWbemNamedValueSet
,
1360 ISWbemServices
**objWbemServices
)
1362 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1363 IWbemServices
*services
;
1367 TRACE( "%p, %s, %s, %s, %p, %s, %s, 0x%08x, %p, %p\n", iface
, debugstr_w(strServer
),
1368 debugstr_w(strNamespace
), debugstr_w(strUser
), strPassword
, debugstr_w(strLocale
),
1369 debugstr_w(strAuthority
), iSecurityFlags
, objWbemNamedValueSet
, objWbemServices
);
1371 if (objWbemNamedValueSet
) FIXME( "context not supported\n" );
1373 if (!locator
->locator
)
1375 hr
= CoCreateInstance( &CLSID_WbemLocator
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IWbemLocator
,
1376 (void **)&locator
->locator
);
1377 if (hr
!= S_OK
) return hr
;
1380 if (!(resource
= build_resource_string( strServer
, strNamespace
))) return E_OUTOFMEMORY
;
1381 hr
= IWbemLocator_ConnectServer( locator
->locator
, resource
, strUser
, strPassword
, strLocale
,
1382 iSecurityFlags
, strAuthority
, NULL
, &services
);
1383 SysFreeString( resource
);
1384 if (hr
!= S_OK
) return hr
;
1386 hr
= SWbemServices_create( services
, objWbemServices
);
1387 IWbemServices_Release( services
);
1391 static HRESULT WINAPI
locator_get_Security_(
1392 ISWbemLocator
*iface
,
1393 ISWbemSecurity
**objWbemSecurity
)
1395 TRACE( "%p, %p\n", iface
, objWbemSecurity
);
1397 if (!objWbemSecurity
)
1398 return E_INVALIDARG
;
1400 return ISWbemSecurity_create( objWbemSecurity
);
1403 static const ISWbemLocatorVtbl locator_vtbl
=
1405 locator_QueryInterface
,
1408 locator_GetTypeInfoCount
,
1409 locator_GetTypeInfo
,
1410 locator_GetIDsOfNames
,
1412 locator_ConnectServer
,
1413 locator_get_Security_
1416 HRESULT
SWbemLocator_create( void **obj
)
1418 struct locator
*locator
;
1420 TRACE( "%p\n", obj
);
1422 if (!(locator
= heap_alloc( sizeof(*locator
) ))) return E_OUTOFMEMORY
;
1423 locator
->ISWbemLocator_iface
.lpVtbl
= &locator_vtbl
;
1425 locator
->locator
= NULL
;
1427 *obj
= &locator
->ISWbemLocator_iface
;
1428 TRACE( "returning iface %p\n", *obj
);
1434 ISWbemSecurity ISWbemSecurity_iface
;
1436 WbemImpersonationLevelEnum implevel
;
1437 WbemAuthenticationLevelEnum authlevel
;
1440 static inline struct security
*impl_from_ISWbemSecurity( ISWbemSecurity
*iface
)
1442 return CONTAINING_RECORD( iface
, struct security
, ISWbemSecurity_iface
);
1445 static ULONG WINAPI
security_AddRef(
1446 ISWbemSecurity
*iface
)
1448 struct security
*security
= impl_from_ISWbemSecurity( iface
);
1449 return InterlockedIncrement( &security
->refs
);
1452 static ULONG WINAPI
security_Release(
1453 ISWbemSecurity
*iface
)
1455 struct security
*security
= impl_from_ISWbemSecurity( iface
);
1456 LONG refs
= InterlockedDecrement( &security
->refs
);
1459 TRACE( "destroying %p\n", security
);
1460 heap_free( security
);
1465 static HRESULT WINAPI
security_QueryInterface(
1466 ISWbemSecurity
*iface
,
1470 struct security
*security
= impl_from_ISWbemSecurity( iface
);
1471 TRACE( "%p, %s, %p\n", security
, debugstr_guid( riid
), ppvObject
);
1473 if (IsEqualGUID( riid
, &IID_ISWbemSecurity
) ||
1474 IsEqualGUID( riid
, &IID_IDispatch
) ||
1475 IsEqualGUID( riid
, &IID_IUnknown
))
1481 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1482 return E_NOINTERFACE
;
1484 ISWbemSecurity_AddRef( iface
);
1488 static HRESULT WINAPI
security_GetTypeInfoCount(
1489 ISWbemSecurity
*iface
,
1492 struct security
*security
= impl_from_ISWbemSecurity( iface
);
1493 TRACE( "%p, %p\n", security
, count
);
1499 static HRESULT WINAPI
security_GetTypeInfo(
1500 ISWbemSecurity
*iface
,
1505 struct security
*security
= impl_from_ISWbemSecurity( iface
);
1506 TRACE( "%p, %u, %u, %p\n", security
, index
, lcid
, info
);
1508 return get_typeinfo( ISWbemSecurity_tid
, info
);
1511 static HRESULT WINAPI
security_GetIDsOfNames(
1512 ISWbemSecurity
*iface
,
1519 struct security
*security
= impl_from_ISWbemSecurity( iface
);
1520 ITypeInfo
*typeinfo
;
1523 TRACE( "%p, %s, %p, %u, %u, %p\n", security
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1525 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
1527 hr
= get_typeinfo( ISWbemSecurity_tid
, &typeinfo
);
1530 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
1531 ITypeInfo_Release( typeinfo
);
1536 static HRESULT WINAPI
security_Invoke(
1537 ISWbemSecurity
*iface
,
1544 EXCEPINFO
*excep_info
,
1547 struct security
*security
= impl_from_ISWbemSecurity( iface
);
1548 ITypeInfo
*typeinfo
;
1551 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", security
, member
, debugstr_guid(riid
),
1552 lcid
, flags
, params
, result
, excep_info
, arg_err
);
1554 hr
= get_typeinfo( ISWbemSecurity_tid
, &typeinfo
);
1557 hr
= ITypeInfo_Invoke( typeinfo
, &security
->ISWbemSecurity_iface
, member
, flags
,
1558 params
, result
, excep_info
, arg_err
);
1559 ITypeInfo_Release( typeinfo
);
1564 static HRESULT WINAPI
security_get_ImpersonationLevel_(
1565 ISWbemSecurity
*iface
,
1566 WbemImpersonationLevelEnum
*impersonation_level
)
1568 struct security
*security
= impl_from_ISWbemSecurity( iface
);
1569 FIXME( "%p, %p: stub\n", security
, impersonation_level
);
1571 if (!impersonation_level
)
1572 return E_INVALIDARG
;
1574 *impersonation_level
= security
->implevel
;
1578 static HRESULT WINAPI
security_put_ImpersonationLevel_(
1579 ISWbemSecurity
*iface
,
1580 WbemImpersonationLevelEnum impersonation_level
)
1582 struct security
*security
= impl_from_ISWbemSecurity( iface
);
1583 FIXME( "%p, %d: stub\n", security
, impersonation_level
);
1585 security
->implevel
= impersonation_level
;
1589 static HRESULT WINAPI
security_get_AuthenticationLevel_(
1590 ISWbemSecurity
*iface
,
1591 WbemAuthenticationLevelEnum
*authentication_level
)
1593 struct security
*security
= impl_from_ISWbemSecurity( iface
);
1594 FIXME( "%p, %p: stub\n", security
, authentication_level
);
1596 if (!authentication_level
)
1597 return E_INVALIDARG
;
1599 *authentication_level
= security
->authlevel
;
1603 static HRESULT WINAPI
security_put_AuthenticationLevel_(
1604 ISWbemSecurity
*iface
,
1605 WbemAuthenticationLevelEnum authentication_level
)
1607 struct security
*security
= impl_from_ISWbemSecurity( iface
);
1608 FIXME( "%p, %d: stub\n", security
, authentication_level
);
1610 security
->authlevel
= authentication_level
;
1614 static HRESULT WINAPI
security_get_Privileges_(
1615 ISWbemSecurity
*iface
,
1616 ISWbemPrivilegeSet
**privilege_set
)
1618 struct security
*security
= impl_from_ISWbemSecurity( iface
);
1619 FIXME( "%p, %p: stub\n", security
, privilege_set
);
1622 return E_INVALIDARG
;
1627 static const ISWbemSecurityVtbl security_vtbl
=
1629 security_QueryInterface
,
1632 security_GetTypeInfoCount
,
1633 security_GetTypeInfo
,
1634 security_GetIDsOfNames
,
1636 security_get_ImpersonationLevel_
,
1637 security_put_ImpersonationLevel_
,
1638 security_get_AuthenticationLevel_
,
1639 security_put_AuthenticationLevel_
,
1640 security_get_Privileges_
1643 static HRESULT
ISWbemSecurity_create( ISWbemSecurity
**obj
)
1645 struct security
*security
;
1647 TRACE( "%p\n", obj
);
1649 if (!(security
= heap_alloc( sizeof(*security
) ))) return E_OUTOFMEMORY
;
1650 security
->ISWbemSecurity_iface
.lpVtbl
= &security_vtbl
;
1652 security
->implevel
= wbemImpersonationLevelAnonymous
;
1653 security
->authlevel
= wbemAuthenticationLevelDefault
;
1655 *obj
= &security
->ISWbemSecurity_iface
;
1656 TRACE( "returning iface %p\n", *obj
);