[PATCH v2 0/7] MR11711: wbemdisp: Fixes and implementations part 1.
-- v2: wbemdisp: Return null object on failure of QueryInterface(). wbemdisp: Implement ISWbemObject::GetTypeInfo(). wbemdisp: Partially implement get ISWbemObjectPath::DisplayName. wbemdisp: Add ISWbemObjectPath stub implementation. wbemdisp: Handle null output pointer in enumvar_Next(). https://gitlab.winehq.org/wine/wine/-/merge_requests/11711
From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/wbemdisp/tests/wbemdisp.c | 38 ++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/dlls/wbemdisp/tests/wbemdisp.c b/dlls/wbemdisp/tests/wbemdisp.c index 0144f91c493..2e1881118a6 100644 --- a/dlls/wbemdisp/tests/wbemdisp.c +++ b/dlls/wbemdisp/tests/wbemdisp.c @@ -138,6 +138,8 @@ static void test_ParseDisplayName(void) DISPID dispid; DISPPARAMS params; UINT arg_err; + ISWbemObjectPath *objpath; + BSTR dispname; fetched = 0xdeadbeef; hr = IEnumVARIANT_Next( enumvar, 0, &var, &fetched ); @@ -238,6 +240,42 @@ static void test_ParseDisplayName(void) ok( V_VT( &res ) == VT_BSTR, "got %u\n", V_VT( &res ) ); ok( V_BSTR( &res ) != (BSTR)0xdeadbeef, "got %u\n", V_VT( &res ) ); VariantClear( &res ); + + str = SysAllocString( L"Path_" ); + dispid = 0xdeadbeef; + hr = IDispatch_GetIDsOfNames( dispatch, &IID_NULL, &str, 1, english, &dispid ); + SysFreeString( str ); + ok( hr == S_OK, "got %#lx\n", hr ); + ok( dispid == 0x18, "got %#lx\n", dispid ); + + V_VT( &res ) = VT_ERROR; + V_DISPATCH( &res ) = (IDispatch *)0xdeadbeef; + memset( ¶ms, 0, sizeof(params) ); + hr = IDispatch_Invoke( dispatch, dispid, &IID_NULL, english, + DISPATCH_METHOD|DISPATCH_PROPERTYGET, + ¶ms, &res, NULL, NULL ); + todo_wine + ok( hr == S_OK, "got %#lx\n", hr ); + ok( params.rgvarg == NULL, "got %p\n", params.rgvarg ); + ok( params.rgdispidNamedArgs == NULL, "got %p\n", params.rgdispidNamedArgs ); + ok( !params.cArgs, "got %u\n", params.cArgs ); + ok( !params.cNamedArgs, "got %u\n", params.cNamedArgs ); + ok( V_VT( &res ) == VT_DISPATCH, "got %u\n", V_VT( &res ) ); + + if (hr == S_OK) + { + hr = IDispatch_QueryInterface( V_DISPATCH( &res ), &IID_ISWbemObjectPath, (void**)&objpath ); + ok( hr == S_OK, "got %#lx\n", hr ); + VariantClear( &res ); + + dispname = NULL; + hr = ISWbemObjectPath_get_DisplayName( objpath, &dispname ); + todo_wine + ok( hr == S_OK, "got %#lx\n", hr ); + SysFreeString( dispname ); + ISWbemObjectPath_Release( objpath ); + } + VariantClear( &var ); fetched = 0xdeadbeef; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11711
From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/wbemdisp/tests/wbemdisp.c | 108 ++++++++++++++++++++++++++++++++- 1 file changed, 107 insertions(+), 1 deletion(-) diff --git a/dlls/wbemdisp/tests/wbemdisp.c b/dlls/wbemdisp/tests/wbemdisp.c index 2e1881118a6..0c68e903d63 100644 --- a/dlls/wbemdisp/tests/wbemdisp.c +++ b/dlls/wbemdisp/tests/wbemdisp.c @@ -139,7 +139,14 @@ static void test_ParseDisplayName(void) DISPPARAMS params; UINT arg_err; ISWbemObjectPath *objpath; - BSTR dispname; + ISWbemObject *object; + BSTR dispname, dispname2; + ISWbemPropertySet *props; + IEnumVARIANT *setenumvar, *propenumvar; + VARIANT vars[40] = {0}; + ISWbemProperty *prop; + ISWbemMethodSet *methods; + ISWbemQualifierSet *quals = NULL; fetched = 0xdeadbeef; hr = IEnumVARIANT_Next( enumvar, 0, &var, &fetched ); @@ -276,6 +283,105 @@ static void test_ParseDisplayName(void) ISWbemObjectPath_Release( objpath ); } + hr = IDispatch_QueryInterface( dispatch, &IID_ISWbemObject, (void**)&object ); + ok( hr == S_OK, "got %#lx\n", hr ); + hr = ISWbemObject_get_Properties_( object, &props ); + ok( hr == S_OK, "got %#lx\n", hr ); + hr = ISWbemObject_get_Methods_( object, &methods ); + ok( hr == S_OK, "got %#lx\n", hr ); + hr = ISWbemObject_get_Qualifiers_( object, &quals ); + todo_wine + ok( hr == S_OK, "got %#lx\n", hr ); + ISWbemObject_Release( object ); + + hr = ISWbemPropertySet_get__NewEnum( props, (IUnknown **)&setenumvar ); + todo_wine + ok( hr == S_OK, "got %#lx\n", hr ); + if (hr == S_OK) + { + V_VT( vars + ARRAY_SIZE(vars) - 1 ) = VT_ERROR; + hr = IEnumVARIANT_Next( setenumvar, ARRAY_SIZE(vars), vars, &fetched ); + ok( hr == S_FALSE, "got %#lx\n", hr ); + ok( !!fetched, "got %lu\n", fetched ); + todo_wine + ok ( V_VT( vars + ARRAY_SIZE(vars) - 1 ) == VT_EMPTY, "got %u\n", V_VT( vars + ARRAY_SIZE(vars) - 1 ) ); + + dispname = NULL; + for (i = 0; i < fetched; ++i) + { + ok( V_VT( vars + i ) == VT_DISPATCH, "got %u\n", V_VT( vars + i ) ); + hr = IDispatch_QueryInterface( V_DISPATCH(vars + i), &IID_ISWbemProperty, (void**)&prop ); + ok( hr == S_OK, "got %#lx\n", hr ); + VariantClear( vars + i ); + hr = ISWbemProperty_get_Name( prop, &dispname ); + todo_wine + ok( hr == S_OK, "got %#lx\n", hr ); + SysFreeString( dispname ); + hr = ISWbemProperty_get_Value( prop, &res ); + ok( hr == S_OK, "got %#lx\n", hr ); + VariantClear( &res ); + ISWbemProperty_Release( prop ); + } + + /* enums are independent */ + hr = IEnumVARIANT_Reset( setenumvar ); + ok( hr == S_OK, "got %#lx\n", hr ); + hr = IEnumVARIANT_Next( setenumvar, 1, vars, &fetched ); + ok( hr == S_OK, "got %#lx\n", hr ); + hr = ISWbemPropertySet_get__NewEnum( props, (IUnknown **)&propenumvar ); + ok( hr == S_OK, "got %#lx\n", hr ); + hr = IEnumVARIANT_Next( setenumvar, 1, vars + 1, &fetched ); + ok( hr == S_OK, "got %#lx\n", hr ); + hr = ISWbemProperty_get_Name( (ISWbemProperty *)V_DISPATCH(vars), &dispname ); + todo_wine + ok( hr == S_OK, "got %#lx\n", hr ); + dispname2 = NULL; + hr = ISWbemProperty_get_Name( (ISWbemProperty *)V_DISPATCH(vars + 1), &dispname2 ); + todo_wine + ok( hr == S_OK, "got %#lx\n", hr ); + if (dispname) ok( wcscmp( dispname, dispname2 ), "got equal names\n" ); + SysFreeString( dispname ); + SysFreeString( dispname2 ); + VariantClear( vars ); + VariantClear( vars + 1 ); + IEnumVARIANT_Release( setenumvar ); + IEnumVARIANT_Release( propenumvar ); + } + + ISWbemPropertySet_Release( props ); + + hr = ISWbemMethodSet_get__NewEnum( methods, (IUnknown **)&setenumvar ); + todo_wine + ok( hr == S_OK, "got %#lx\n", hr ); + if (hr == S_OK) + { + hr = IEnumVARIANT_Next( setenumvar, ARRAY_SIZE(vars), vars, &fetched ); + ok( hr == S_FALSE, "got %#lx\n", hr ); + ok( !fetched, "got %lu\n", fetched ); + IEnumVARIANT_Release( setenumvar ); + } + + ISWbemMethodSet_Release( methods ); + + if (quals) + { + hr = ISWbemQualifierSet_get__NewEnum( quals, (IUnknown **)&setenumvar ); + todo_wine + ok( hr == S_OK, "got %#lx\n", hr ); + if (hr == S_OK) + { + hr = IEnumVARIANT_Next( setenumvar, ARRAY_SIZE(vars), vars, &fetched ); + ok( hr == S_FALSE, "got %#lx\n", hr ); + todo_wine + ok( !!fetched, "got %lu\n", fetched ); + for (i = 0; i < fetched; ++i) + VariantClear( vars + i ); + IEnumVARIANT_Release( setenumvar ); + } + + ISWbemQualifierSet_Release( quals ); + } + VariantClear( &var ); fetched = 0xdeadbeef; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11711
From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/wbemdisp/locator.c | 2 ++ dlls/wbemdisp/tests/wbemdisp.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/dlls/wbemdisp/locator.c b/dlls/wbemdisp/locator.c index c3e0c86f4ae..6afe1875a69 100644 --- a/dlls/wbemdisp/locator.c +++ b/dlls/wbemdisp/locator.c @@ -2020,6 +2020,8 @@ static HRESULT WINAPI enumvar_Next( IEnumVARIANT *iface, ULONG celt, VARIANT *va TRACE( "%p, %lu, %p, %p\n", iface, celt, var, fetched ); + if (!var) return S_FALSE; + if (celt) IEnumWbemClassObject_Next( enumvar->objectenum, WBEM_INFINITE, 1, &obj, &count ); if (count) { diff --git a/dlls/wbemdisp/tests/wbemdisp.c b/dlls/wbemdisp/tests/wbemdisp.c index 0c68e903d63..73f4272f66e 100644 --- a/dlls/wbemdisp/tests/wbemdisp.c +++ b/dlls/wbemdisp/tests/wbemdisp.c @@ -516,6 +516,8 @@ static void test_locator(void) hr = ISWbemObjectSet_get__NewEnum( object_set, (IUnknown**)&enum_var ); ok( hr == S_OK, "got %#lx\n", hr ); + hr = IEnumVARIANT_Next( enum_var, 1, NULL, NULL ); + ok( hr == S_FALSE, "got %#lx\n", hr ); VariantInit( &var ); hr = IEnumVARIANT_Next( enum_var, 1, &var, NULL ); ok( hr == S_OK, "got %#lx\n", hr ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11711
From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/wbemdisp/locator.c | 324 ++++++++++++++++++++++++++++++++- dlls/wbemdisp/tests/wbemdisp.c | 4 - 2 files changed, 322 insertions(+), 6 deletions(-) diff --git a/dlls/wbemdisp/locator.c b/dlls/wbemdisp/locator.c index 6afe1875a69..ab23b8c51f7 100644 --- a/dlls/wbemdisp/locator.c +++ b/dlls/wbemdisp/locator.c @@ -55,6 +55,7 @@ struct services; static HRESULT EnumVARIANT_create( struct services *, IEnumWbemClassObject *, IEnumVARIANT ** ); static HRESULT ISWbemSecurity_create( ISWbemSecurity ** ); static HRESULT SWbemObject_create( struct services *, IWbemClassObject *, ISWbemObject ** ); +static HRESULT SWbemObjectPath_create( IWbemClassObject *, ISWbemObjectPath ** ); enum type_id { @@ -69,6 +70,7 @@ enum type_id ISWbemNamedValue_tid, ISWbemMethodSet_tid, ISWbemMethod_tid, + ISWbemObjectPath_tid, last_tid }; @@ -88,6 +90,7 @@ static REFIID wbemdisp_tid_id[] = &IID_ISWbemNamedValue, &IID_ISWbemMethodSet, &IID_ISWbemMethod, + &IID_ISWbemObjectPath, }; static HRESULT get_typeinfo( enum type_id tid, ITypeInfo **ret ) @@ -1600,8 +1603,8 @@ static HRESULT WINAPI object_get_Path_( ISWbemObject *iface, ISWbemObjectPath **objWbemObjectPath ) { - FIXME( "\n" ); - return E_NOTIMPL; + struct object *object = impl_from_ISWbemObject( iface ); + return SWbemObjectPath_create( object->object, objWbemObjectPath ); } static HRESULT WINAPI object_get_Security_( @@ -3519,3 +3522,320 @@ HRESULT SWbemNamedValueSet_create( void **obj ) TRACE( "returning iface %p\n", *obj ); return hr; } + +struct objectpath +{ + ISWbemObjectPath ISWbemObjectPath_iface; + LONG refs; + IWbemPath *path; +}; + +static struct objectpath *impl_from_ISWbemObjectPath( ISWbemObjectPath *iface ) +{ + return CONTAINING_RECORD( iface, struct objectpath, ISWbemObjectPath_iface ); +} + +static HRESULT WINAPI objectpath_QueryInterface( ISWbemObjectPath *iface, REFIID riid, void **ppvObject ) +{ + struct objectpath *objectpath = impl_from_ISWbemObjectPath( iface ); + + TRACE( "%p %s %p\n", objectpath, debugstr_guid( riid ), ppvObject ); + + if (IsEqualGUID( riid, &IID_ISWbemObjectPath ) || + IsEqualGUID( riid, &IID_IDispatch ) || + IsEqualGUID( riid, &IID_IUnknown )) + { + *ppvObject = iface; + } + else + { + WARN( "interface %s not implemented\n", debugstr_guid( riid ) ); + *ppvObject = NULL; + return E_NOINTERFACE; + } + + ISWbemObjectPath_AddRef( iface ); + return S_OK; +} + +static ULONG WINAPI objectpath_AddRef( ISWbemObjectPath *iface ) +{ + struct objectpath *objectpath = impl_from_ISWbemObjectPath( iface ); + return InterlockedIncrement( &objectpath->refs ); +} + +static ULONG WINAPI objectpath_Release( ISWbemObjectPath *iface ) +{ + struct objectpath *objectpath = impl_from_ISWbemObjectPath( iface ); + LONG refs = InterlockedDecrement( &objectpath->refs ); + + if (!refs) + { + TRACE( "destroying %p\n", objectpath ); + IWbemPath_Release( objectpath->path ); + free( objectpath ); + } + + return refs; +} + +static HRESULT WINAPI objectpath_GetTypeInfoCount( ISWbemObjectPath *iface, UINT *count ) +{ + struct objectpath *objectpath = impl_from_ISWbemObjectPath( iface ); + + TRACE( "%p, %p\n", objectpath, count ); + + *count = 1; + return S_OK; +} + +static HRESULT WINAPI objectpath_GetTypeInfo( ISWbemObjectPath *iface, UINT index, LCID lcid, ITypeInfo **info ) +{ + struct objectpath *objectpath = impl_from_ISWbemObjectPath( iface ); + + TRACE( "%p, %u, %#lx, %p\n", objectpath, index, lcid, info ); + + return get_typeinfo( ISWbemObjectPath_tid, info ); +} + +static HRESULT WINAPI objectpath_GetIDsOfNames( ISWbemObjectPath *iface, REFIID riid, + LPOLESTR *names, UINT count, LCID lcid, DISPID *dispid ) +{ + struct objectpath *objectpath = impl_from_ISWbemObjectPath( iface ); + ITypeInfo *typeinfo; + HRESULT hr; + + TRACE( "%p, %s, %p, %u, %#lx, %p\n", objectpath, debugstr_guid( riid ), names, count, lcid, dispid ); + + if (!names || !count || !dispid) return E_INVALIDARG; + + hr = get_typeinfo( ISWbemObjectPath_tid, &typeinfo ); + if (SUCCEEDED(hr)) + { + hr = ITypeInfo_GetIDsOfNames( typeinfo, names, count, dispid ); + ITypeInfo_Release( typeinfo ); + } + return hr; +} + +static HRESULT WINAPI objectpath_Invoke( ISWbemObjectPath *iface, DISPID member, REFIID riid, LCID lcid, + WORD flags, DISPPARAMS *params, VARIANT *result, EXCEPINFO *excep_info, UINT *arg_err ) +{ + struct objectpath *objectpath = impl_from_ISWbemObjectPath( iface ); + ITypeInfo *typeinfo; + HRESULT hr; + + TRACE( "%p, %ld, %s, %#lx, %#x, %p, %p, %p, %p\n", objectpath, member, debugstr_guid( riid ), + lcid, flags, params, result, excep_info, arg_err ); + + hr = get_typeinfo( ISWbemObjectPath_tid, &typeinfo ); + if (SUCCEEDED(hr)) + { + hr = ITypeInfo_Invoke( typeinfo, &objectpath->ISWbemObjectPath_iface, member, flags, + params, result, excep_info, arg_err ); + ITypeInfo_Release( typeinfo ); + } + return hr; +} + +static HRESULT WINAPI objectpath_get_Path( ISWbemObjectPath *iface, BSTR *strPath ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_Path( ISWbemObjectPath *iface, BSTR strPath ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_RelPath( ISWbemObjectPath *iface, BSTR *strRelPath ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_RelPath( ISWbemObjectPath *iface, BSTR strRelPath ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_Server( ISWbemObjectPath *iface, BSTR *strServer ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_Server( ISWbemObjectPath *iface, BSTR strServer ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_Namespace( ISWbemObjectPath *iface, BSTR *strNamespace ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_Namespace( ISWbemObjectPath *iface, BSTR strNamespace ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_ParentNamespace( ISWbemObjectPath *iface, BSTR *strParentNamespace ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_DisplayName( ISWbemObjectPath *iface, BSTR *strDisplayName ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_DisplayName( ISWbemObjectPath *iface, BSTR strDisplayName ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_Class( ISWbemObjectPath *iface, BSTR *strClass ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_Class( ISWbemObjectPath *iface, BSTR strClass ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_IsClass( ISWbemObjectPath *iface, VARIANT_BOOL *bIsClass ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_SetAsClass( ISWbemObjectPath *iface ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_IsSingleton( ISWbemObjectPath *iface, VARIANT_BOOL *bIsSingleton ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_SetAsSingleton( ISWbemObjectPath *iface ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_Keys( ISWbemObjectPath *iface, ISWbemNamedValueSet **objWbemNamedValueSet ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_Security_( ISWbemObjectPath *iface, ISWbemSecurity **objWbemSecurity ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_Locale( ISWbemObjectPath *iface, BSTR *strLocale ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_Locale( ISWbemObjectPath *iface, BSTR strLocale ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_Authority( ISWbemObjectPath *iface, BSTR *strAuthority ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_Authority( ISWbemObjectPath *iface, BSTR strAuthority ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static const ISWbemObjectPathVtbl objectpath_vtbl = +{ + objectpath_QueryInterface, + objectpath_AddRef, + objectpath_Release, + objectpath_GetTypeInfoCount, + objectpath_GetTypeInfo, + objectpath_GetIDsOfNames, + objectpath_Invoke, + objectpath_get_Path, + objectpath_put_Path, + objectpath_get_RelPath, + objectpath_put_RelPath, + objectpath_get_Server, + objectpath_put_Server, + objectpath_get_Namespace, + objectpath_put_Namespace, + objectpath_get_ParentNamespace, + objectpath_get_DisplayName, + objectpath_put_DisplayName, + objectpath_get_Class, + objectpath_put_Class, + objectpath_get_IsClass, + objectpath_SetAsClass, + objectpath_get_IsSingleton, + objectpath_SetAsSingleton, + objectpath_get_Keys, + objectpath_get_Security_, + objectpath_get_Locale, + objectpath_put_Locale, + objectpath_get_Authority, + objectpath_put_Authority, +}; + +static HRESULT SWbemObjectPath_create( IWbemClassObject *object, ISWbemObjectPath **obj ) +{ + struct objectpath *objectpath; + VARIANT var; + HRESULT hr; + + TRACE( "%p\n", obj ); + + if (!(objectpath = calloc( 1, sizeof(*objectpath) ))) return E_OUTOFMEMORY; + objectpath->ISWbemObjectPath_iface.lpVtbl = &objectpath_vtbl; + objectpath->refs = 1; + + if (FAILED( hr = CoCreateInstance( &CLSID_WbemDefPath, NULL, CLSCTX_INPROC_SERVER, &IID_IWbemPath, + (void **)&objectpath->path ) )) goto error; + VariantInit( &var ); + if (FAILED( hr = IWbemClassObject_Get( object, L"__PATH", 0, &var, NULL, NULL ) )) goto error; + if (FAILED( hr = IWbemPath_SetText( objectpath->path, WBEMPATH_CREATE_ACCEPT_ALL, V_BSTR( &var ) ))) goto error; + VariantClear( &var ); + + *obj = &objectpath->ISWbemObjectPath_iface; + TRACE( "returning iface %p\n", *obj ); + return S_OK; + +error: + VariantClear( &var ); + if (objectpath->path) IWbemPath_Release( objectpath->path ); + free( objectpath ); + return hr; +} diff --git a/dlls/wbemdisp/tests/wbemdisp.c b/dlls/wbemdisp/tests/wbemdisp.c index 73f4272f66e..940f9370026 100644 --- a/dlls/wbemdisp/tests/wbemdisp.c +++ b/dlls/wbemdisp/tests/wbemdisp.c @@ -261,7 +261,6 @@ static void test_ParseDisplayName(void) hr = IDispatch_Invoke( dispatch, dispid, &IID_NULL, english, DISPATCH_METHOD|DISPATCH_PROPERTYGET, ¶ms, &res, NULL, NULL ); - todo_wine ok( hr == S_OK, "got %#lx\n", hr ); ok( params.rgvarg == NULL, "got %p\n", params.rgvarg ); ok( params.rgdispidNamedArgs == NULL, "got %p\n", params.rgdispidNamedArgs ); @@ -269,8 +268,6 @@ static void test_ParseDisplayName(void) ok( !params.cNamedArgs, "got %u\n", params.cNamedArgs ); ok( V_VT( &res ) == VT_DISPATCH, "got %u\n", V_VT( &res ) ); - if (hr == S_OK) - { hr = IDispatch_QueryInterface( V_DISPATCH( &res ), &IID_ISWbemObjectPath, (void**)&objpath ); ok( hr == S_OK, "got %#lx\n", hr ); VariantClear( &res ); @@ -281,7 +278,6 @@ static void test_ParseDisplayName(void) ok( hr == S_OK, "got %#lx\n", hr ); SysFreeString( dispname ); ISWbemObjectPath_Release( objpath ); - } hr = IDispatch_QueryInterface( dispatch, &IID_ISWbemObject, (void**)&object ); ok( hr == S_OK, "got %#lx\n", hr ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11711
From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/wbemdisp/locator.c | 22 ++++++++++++++++++++-- dlls/wbemdisp/tests/wbemdisp.c | 2 -- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/dlls/wbemdisp/locator.c b/dlls/wbemdisp/locator.c index ab23b8c51f7..6a3d3cbf467 100644 --- a/dlls/wbemdisp/locator.c +++ b/dlls/wbemdisp/locator.c @@ -3694,8 +3694,26 @@ static HRESULT WINAPI objectpath_get_ParentNamespace( ISWbemObjectPath *iface, B static HRESULT WINAPI objectpath_get_DisplayName( ISWbemObjectPath *iface, BSTR *strDisplayName ) { - FIXME( "\n" ); - return E_NOTIMPL; + struct objectpath *objectpath = impl_from_ISWbemObjectPath( iface ); + ULONG len = 0; + WCHAR *buf; + HRESULT hr; + + FIXME( "%p, %p semi-stub\n", objectpath, strDisplayName ); + + if (FAILED( hr = IWbemPath_GetText( objectpath->path, WBEMPATH_GET_SERVER_TOO, &len, NULL ) )) return hr; + if (!(buf = SysAllocStringLen( L"winmgmts:", len + ARRAY_SIZE( L"winmgmts:" ) - 2 ) )) return E_OUTOFMEMORY; + /* TODO: add 'authenticationLevel' and 'impersonationLevel' from the security object. Native also + * includes 'Name', 'SoftwareElementID', 'SoftwareElementState' and 'TargetOperatingSystem' values. + * The last three are currently missing from the properties. */ + if (FAILED( hr = IWbemPath_GetText( objectpath->path, WBEMPATH_GET_SERVER_TOO, &len, buf + wcslen( buf ) ) )) + { + SysFreeString( buf ); + buf = NULL; + } + + *strDisplayName = buf; + return hr; } static HRESULT WINAPI objectpath_put_DisplayName( ISWbemObjectPath *iface, BSTR strDisplayName ) diff --git a/dlls/wbemdisp/tests/wbemdisp.c b/dlls/wbemdisp/tests/wbemdisp.c index 940f9370026..261ff86b4bd 100644 --- a/dlls/wbemdisp/tests/wbemdisp.c +++ b/dlls/wbemdisp/tests/wbemdisp.c @@ -272,9 +272,7 @@ static void test_ParseDisplayName(void) ok( hr == S_OK, "got %#lx\n", hr ); VariantClear( &res ); - dispname = NULL; hr = ISWbemObjectPath_get_DisplayName( objpath, &dispname ); - todo_wine ok( hr == S_OK, "got %#lx\n", hr ); SysFreeString( dispname ); ISWbemObjectPath_Release( objpath ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11711
From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/wbemdisp/locator.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/wbemdisp/locator.c b/dlls/wbemdisp/locator.c index 6a3d3cbf467..1ba775a9dde 100644 --- a/dlls/wbemdisp/locator.c +++ b/dlls/wbemdisp/locator.c @@ -1064,8 +1064,8 @@ static HRESULT WINAPI object_GetTypeInfo( ITypeInfo **info ) { struct object *object = impl_from_ISWbemObject( iface ); - FIXME( "%p, %u, %#lx, %p\n", object, index, lcid, info ); - return E_NOTIMPL; + TRACE( "%p, %u, %#lx, %p\n", object, index, lcid, info ); + return get_typeinfo( ISWbemObject_tid, info ); } static BOOL object_reserve_member( struct object *object, unsigned int count, unsigned int *capacity ) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11711
From: Conor McCarthy <cmccarthy@codeweavers.com> Prevent access via garbage pointers in apps which assume success. --- dlls/wbemdisp/locator.c | 12 ++++++++++++ dlls/wbemdisp/main.c | 1 + 2 files changed, 13 insertions(+) diff --git a/dlls/wbemdisp/locator.c b/dlls/wbemdisp/locator.c index 1ba775a9dde..c3ad6fa50a2 100644 --- a/dlls/wbemdisp/locator.c +++ b/dlls/wbemdisp/locator.c @@ -176,6 +176,7 @@ static HRESULT WINAPI property_QueryInterface( ISWbemProperty *iface, REFIID rii else { WARN( "interface %s not implemented\n", debugstr_guid(riid) ); + *obj = NULL; return E_NOINTERFACE; } ISWbemProperty_AddRef( iface ); @@ -375,6 +376,7 @@ static HRESULT WINAPI propertyset_QueryInterface( ISWbemPropertySet *iface, else { WARN( "interface %s not implemented\n", debugstr_guid(riid) ); + *obj = NULL; return E_NOINTERFACE; } ISWbemPropertySet_AddRef( iface ); @@ -587,6 +589,7 @@ static HRESULT WINAPI method_QueryInterface( ISWbemMethod *iface, REFIID riid, v else { WARN( "interface %s not implemented\n", debugstr_guid(riid) ); + *ppvObject = NULL; return E_NOINTERFACE; } ISWbemMethod_AddRef( iface ); @@ -810,6 +813,7 @@ static HRESULT WINAPI methodset_QueryInterface( ISWbemMethodSet *iface, REFIID r else { WARN( "interface %s not implemented\n", debugstr_guid(riid) ); + *ppvObject = NULL; return E_NOINTERFACE; } ISWbemMethodSet_AddRef( iface ); @@ -1040,6 +1044,7 @@ static HRESULT WINAPI object_QueryInterface( else { WARN( "interface %s not implemented\n", debugstr_guid(riid) ); + *ppvObject = NULL; return E_NOINTERFACE; } ISWbemObject_AddRef( iface ); @@ -1742,6 +1747,7 @@ static HRESULT WINAPI objectset_QueryInterface( else { WARN( "interface %s not implemented\n", debugstr_guid(riid) ); + *ppvObject = NULL; return E_NOINTERFACE; } ISWbemObjectSet_AddRef( iface ); @@ -2009,6 +2015,7 @@ static HRESULT WINAPI enumvar_QueryInterface( else { WARN( "interface %s not implemented\n", debugstr_guid(riid) ); + *ppvObject = NULL; return E_NOINTERFACE; } IEnumVARIANT_AddRef( iface ); @@ -2140,6 +2147,7 @@ static HRESULT WINAPI services_QueryInterface( else { WARN( "interface %s not implemented\n", debugstr_guid(riid) ); + *ppvObject = NULL; return E_NOINTERFACE; } ISWbemServices_AddRef( iface ); @@ -2645,6 +2653,7 @@ static HRESULT WINAPI locator_QueryInterface( else { WARN( "interface %s not implemented\n", debugstr_guid(riid) ); + *ppvObject = NULL; return E_NOINTERFACE; } ISWbemLocator_AddRef( iface ); @@ -2884,6 +2893,7 @@ static HRESULT WINAPI security_QueryInterface( else { WARN( "interface %s not implemented\n", debugstr_guid(riid) ); + *ppvObject = NULL; return E_NOINTERFACE; } ISWbemSecurity_AddRef( iface ); @@ -3096,6 +3106,7 @@ static HRESULT WINAPI namedvalue_QueryInterface( else { WARN( "interface %s not implemented\n", debugstr_guid(riid) ); + *ppvObject = NULL; return E_NOINTERFACE; } ISWbemNamedValue_AddRef( iface ); @@ -3272,6 +3283,7 @@ static HRESULT WINAPI namedvalueset_QueryInterface( else { WARN( "interface %s not implemented\n", debugstr_guid(riid) ); + *ppvObject = NULL; return E_NOINTERFACE; } ISWbemNamedValueSet_AddRef( iface ); diff --git a/dlls/wbemdisp/main.c b/dlls/wbemdisp/main.c index b71efdb6da0..5bc39007344 100644 --- a/dlls/wbemdisp/main.c +++ b/dlls/wbemdisp/main.c @@ -209,6 +209,7 @@ static HRESULT WINAPI factory_QueryInterface( IClassFactory *iface, REFIID riid, return S_OK; } WARN( "interface %s not implemented\n", debugstr_guid(riid) ); + *obj = NULL; return E_NOINTERFACE; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11711
All done. For the `QueryInterface()` changes, I figured I may as well do them all. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11711#note_149350
This merge request was approved by Hans Leidekker. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11711
participants (3)
-
Conor McCarthy -
Conor McCarthy (@cmccarthy) -
Hans Leidekker (@hans)