https://git.reactos.org/?p=reactos.git;a=commitdiff;h=8786e12d134c1ab46b308…
commit 8786e12d134c1ab46b30878a7aab8fa36020eea4
Author: Amine Khaldi <amine.khaldi(a)reactos.org>
AuthorDate: Mon Feb 4 13:09:55 2019 +0100
Commit: Amine Khaldi <amine.khaldi(a)reactos.org>
CommitDate: Mon Feb 4 13:09:55 2019 +0100
[WBEMDISP] Sync with Wine Staging 4.0. CORE-15682
---
dll/win32/wbemdisp/locator.c | 145 +++++++++++++++++++++++++++++++------------
dll/win32/wbemdisp/main.c | 2 +-
media/doc/README.WINE | 2 +-
3 files changed, 106 insertions(+), 43 deletions(-)
diff --git a/dll/win32/wbemdisp/locator.c b/dll/win32/wbemdisp/locator.c
index 18d735392e..c307e347cf 100644
--- a/dll/win32/wbemdisp/locator.c
+++ b/dll/win32/wbemdisp/locator.c
@@ -438,8 +438,19 @@ static HRESULT WINAPI propertyset_Item( ISWbemPropertySet *iface,
BSTR name,
static HRESULT WINAPI propertyset_get_Count( ISWbemPropertySet *iface, LONG *count )
{
- FIXME( "\n" );
- return E_NOTIMPL;
+ static const WCHAR propcountW[] =
{'_','_','P','R','O','P','E','R','T','Y','_','C','O','U','N','T',0};
+ struct propertyset *propertyset = impl_from_ISWbemPropertySet( iface );
+ HRESULT hr;
+ VARIANT val;
+
+ TRACE( "%p, %p\n", propertyset, count );
+
+ hr = IWbemClassObject_Get( propertyset->object, propcountW, 0, &val, NULL,
NULL );
+ if (SUCCEEDED(hr))
+ {
+ *count = V_I4( &val );
+ }
+ return hr;
}
static HRESULT WINAPI propertyset_Add( ISWbemPropertySet *iface, BSTR name,
WbemCimtypeEnum type,
@@ -488,11 +499,13 @@ static HRESULT SWbemPropertySet_create( IWbemClassObject
*wbem_object, ISWbemPro
return S_OK;
}
-#define DISPID_BASE 0x1800000
+#define DISPID_BASE 0x1800000
+#define DISPID_BASE_METHOD 0x1000000
struct member
{
BSTR name;
+ BOOL is_method;
DISPID dispid;
};
@@ -504,6 +517,7 @@ struct object
struct member *members;
UINT nb_members;
DISPID last_dispid;
+ DISPID last_dispid_method;
};
static inline struct object *impl_from_ISWbemObject(
@@ -585,41 +599,83 @@ static HRESULT WINAPI object_GetTypeInfo(
static HRESULT init_members( struct object *object )
{
- LONG bound, i;
- SAFEARRAY *sa;
+ IWbemClassObject *sig_in, *sig_out;
+ LONG i = 0, count = 0;
+ BSTR name;
HRESULT hr;
if (object->members) return S_OK;
- hr = IWbemClassObject_GetNames( object->object, NULL, 0, NULL, &sa );
- if (FAILED( hr )) return hr;
- hr = SafeArrayGetUBound( sa, 1, &bound );
- if (FAILED( hr ))
+ hr = IWbemClassObject_BeginEnumeration( object->object, 0 );
+ if (SUCCEEDED( hr ))
{
- SafeArrayDestroy( sa );
- return hr;
+ while (IWbemClassObject_Next( object->object, 0, NULL, NULL, NULL, NULL ) ==
S_OK) count++;
+ IWbemClassObject_EndEnumeration( object->object );
+ }
+
+ hr = IWbemClassObject_BeginMethodEnumeration( object->object, 0 );
+ if (SUCCEEDED( hr ))
+ {
+ while (IWbemClassObject_NextMethod( object->object, 0, &name, &sig_in,
&sig_out ) == S_OK)
+ {
+ count++;
+ SysFreeString( name );
+ IWbemClassObject_Release( sig_in );
+ IWbemClassObject_Release( sig_out );
+ }
+ IWbemClassObject_EndMethodEnumeration( object->object );
}
- if (!(object->members = heap_alloc( sizeof(struct member) * (bound + 1) )))
+
+ if (!(object->members = heap_alloc( sizeof(struct member) * count ))) return
E_OUTOFMEMORY;
+
+ hr = IWbemClassObject_BeginEnumeration( object->object, 0 );
+ if (SUCCEEDED( hr ))
{
- SafeArrayDestroy( sa );
- return E_OUTOFMEMORY;
+ while (IWbemClassObject_Next( object->object, 0, &name, NULL, NULL, NULL )
== S_OK)
+ {
+ object->members[i].name = name;
+ object->members[i].is_method = FALSE;
+ object->members[i].dispid = 0;
+ if (++i > count)
+ {
+ IWbemClassObject_EndEnumeration( object->object );
+ goto error;
+ }
+ TRACE( "added property %s\n", debugstr_w(name) );
+ }
+ IWbemClassObject_EndEnumeration( object->object );
}
- for (i = 0; i <= bound; i++)
+
+ hr = IWbemClassObject_BeginMethodEnumeration( object->object, 0 );
+ if (SUCCEEDED( hr ))
{
- hr = SafeArrayGetElement( sa, &i, &object->members[i].name );
- if (FAILED( hr ))
+ while (IWbemClassObject_NextMethod( object->object, 0, &name, &sig_in,
&sig_out ) == S_OK)
{
- for (i--; i >= 0; i--) SysFreeString( object->members[i].name );
- SafeArrayDestroy( sa );
- heap_free( object->members );
- object->members = NULL;
- return E_OUTOFMEMORY;
+ object->members[i].name = name;
+ object->members[i].is_method = TRUE;
+ object->members[i].dispid = 0;
+ if (++i > count)
+ {
+ IWbemClassObject_EndMethodEnumeration( object->object );
+ goto error;
+ }
+ IWbemClassObject_Release( sig_in );
+ IWbemClassObject_Release( sig_out );
+ TRACE( "added method %s\n", debugstr_w(name) );
}
- object->members[i].dispid = 0;
+ IWbemClassObject_EndMethodEnumeration( object->object );
}
- object->nb_members = bound + 1;
- SafeArrayDestroy( sa );
+
+ object->nb_members = count;
+ TRACE( "added %u members\n", object->nb_members );
return S_OK;
+
+error:
+ for (--i; i >= 0; i--) SysFreeString( object->members[i].name );
+ heap_free( object->members );
+ object->members = NULL;
+ object->nb_members = 0;
+ return E_FAIL;
}
static DISPID get_member_dispid( struct object *object, const WCHAR *name )
@@ -629,7 +685,13 @@ static DISPID get_member_dispid( struct object *object, const WCHAR
*name )
{
if (!strcmpiW( object->members[i].name, name ))
{
- if (!object->members[i].dispid) object->members[i].dispid =
++object->last_dispid;
+ if (!object->members[i].dispid)
+ {
+ if (object->members[i].is_method)
+ object->members[i].dispid = ++object->last_dispid_method;
+ else
+ object->members[i].dispid = ++object->last_dispid;
+ }
return object->members[i].dispid;
}
}
@@ -701,7 +763,7 @@ static HRESULT WINAPI object_Invoke(
TRACE( "%p, %x, %s, %u, %x, %p, %p, %p, %p\n", object, member,
debugstr_guid(riid),
lcid, flags, params, result, excep_info, arg_err );
- if (member <= DISPID_BASE)
+ if (member <= DISPID_BASE_METHOD)
{
hr = get_typeinfo( ISWbemObject_tid, &typeinfo );
if (SUCCEEDED(hr))
@@ -1044,6 +1106,7 @@ static HRESULT SWbemObject_create( IWbemClassObject *wbem_object,
ISWbemObject *
object->members = NULL;
object->nb_members = 0;
object->last_dispid = DISPID_BASE;
+ object->last_dispid_method = DISPID_BASE_METHOD;
*obj = &object->ISWbemObject_iface;
TRACE( "returning iface %p\n", *obj );
@@ -1641,7 +1704,7 @@ static HRESULT WINAPI services_DeleteAsync(
static BSTR build_query_string( const WCHAR *class )
{
static const WCHAR selectW[] =
{'S','E','L','E','C','T','
','*',' ','F','R','O','M','
',0};
- UINT len = strlenW(class) + sizeof(selectW) / sizeof(selectW[0]);
+ UINT len = strlenW(class) + ARRAY_SIZE(selectW);
BSTR ret;
if (!(ret = SysAllocStringLen( NULL, len ))) return NULL;
@@ -2074,7 +2137,7 @@ static BSTR build_resource_string( BSTR server, BSTR namespace )
if (server && *server) len_server = strlenW( server );
else len_server = 1;
if (namespace && *namespace) len_namespace = strlenW( namespace );
- else len_namespace = sizeof(defaultW) / sizeof(defaultW[0]) - 1;
+ else len_namespace = ARRAY_SIZE(defaultW) - 1;
if (!(ret = SysAllocStringLen( NULL, 2 + len_server + 1 + len_namespace ))) return
NULL;
@@ -2304,7 +2367,7 @@ static HRESULT WINAPI security_Invoke(
return hr;
}
-static HRESULT WINAPI security_get_ImpersonationLevel_(
+static HRESULT WINAPI security_get_ImpersonationLevel(
ISWbemSecurity *iface,
WbemImpersonationLevelEnum *impersonation_level )
{
@@ -2318,7 +2381,7 @@ static HRESULT WINAPI security_get_ImpersonationLevel_(
return S_OK;
}
-static HRESULT WINAPI security_put_ImpersonationLevel_(
+static HRESULT WINAPI security_put_ImpersonationLevel(
ISWbemSecurity *iface,
WbemImpersonationLevelEnum impersonation_level )
{
@@ -2329,7 +2392,7 @@ static HRESULT WINAPI security_put_ImpersonationLevel_(
return S_OK;
}
-static HRESULT WINAPI security_get_AuthenticationLevel_(
+static HRESULT WINAPI security_get_AuthenticationLevel(
ISWbemSecurity *iface,
WbemAuthenticationLevelEnum *authentication_level )
{
@@ -2343,7 +2406,7 @@ static HRESULT WINAPI security_get_AuthenticationLevel_(
return S_OK;
}
-static HRESULT WINAPI security_put_AuthenticationLevel_(
+static HRESULT WINAPI security_put_AuthenticationLevel(
ISWbemSecurity *iface,
WbemAuthenticationLevelEnum authentication_level )
{
@@ -2354,7 +2417,7 @@ static HRESULT WINAPI security_put_AuthenticationLevel_(
return S_OK;
}
-static HRESULT WINAPI security_get_Privileges_(
+static HRESULT WINAPI security_get_Privileges(
ISWbemSecurity *iface,
ISWbemPrivilegeSet **privilege_set )
{
@@ -2376,11 +2439,11 @@ static const ISWbemSecurityVtbl security_vtbl =
security_GetTypeInfo,
security_GetIDsOfNames,
security_Invoke,
- security_get_ImpersonationLevel_,
- security_put_ImpersonationLevel_,
- security_get_AuthenticationLevel_,
- security_put_AuthenticationLevel_,
- security_get_Privileges_
+ security_get_ImpersonationLevel,
+ security_put_ImpersonationLevel,
+ security_get_AuthenticationLevel,
+ security_put_AuthenticationLevel,
+ security_get_Privileges
};
static HRESULT ISWbemSecurity_create( ISWbemSecurity **obj )
@@ -2392,8 +2455,8 @@ static HRESULT ISWbemSecurity_create( ISWbemSecurity **obj )
if (!(security = heap_alloc( sizeof(*security) ))) return E_OUTOFMEMORY;
security->ISWbemSecurity_iface.lpVtbl = &security_vtbl;
security->refs = 1;
- security->implevel = wbemImpersonationLevelAnonymous;
- security->authlevel = wbemAuthenticationLevelDefault;
+ security->implevel = wbemImpersonationLevelImpersonate;
+ security->authlevel = wbemAuthenticationLevelPktPrivacy;
*obj = &security->ISWbemSecurity_iface;
TRACE( "returning iface %p\n", *obj );
diff --git a/dll/win32/wbemdisp/main.c b/dll/win32/wbemdisp/main.c
index 9d9b0adf40..aff4d5042b 100644
--- a/dll/win32/wbemdisp/main.c
+++ b/dll/win32/wbemdisp/main.c
@@ -374,7 +374,7 @@ static HRESULT WINAPI WinMGMTS_ParseDisplayName(IParseDisplayName
*iface, IBindC
ULONG *pchEaten, IMoniker **ppmkOut)
{
static const WCHAR prefixW[] =
{'w','i','n','m','g','m','t','s',':',0};
- const DWORD prefix_len = sizeof(prefixW) / sizeof(prefixW[0]) - 1;
+ const DWORD prefix_len = ARRAY_SIZE(prefixW) - 1;
ISWbemLocator *locator = NULL;
ISWbemServices *services = NULL;
ISWbemObject *obj = NULL;
diff --git a/media/doc/README.WINE b/media/doc/README.WINE
index e63e791d25..f81e450da1 100644
--- a/media/doc/README.WINE
+++ b/media/doc/README.WINE
@@ -194,7 +194,7 @@ reactos/dll/win32/uxtheme # Forked
reactos/dll/win32/vbscript # Synced to WineStaging-4.0
reactos/dll/win32/version # Synced to WineStaging-4.0
reactos/dll/win32/vssapi # Synced to WineStaging-2.9
-reactos/dll/win32/wbemdisp # Synced to WineStaging-3.3
+reactos/dll/win32/wbemdisp # Synced to WineStaging-4.0
reactos/dll/win32/wbemprox # Synced to WineStaging-3.9
reactos/dll/win32/windowscodecs # Synced to WineStaging-3.9
reactos/dll/win32/windowscodecsext # Synced to WineStaging-2.9