Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/wbemprox/services.c | 12 ++++++++---- dlls/wbemprox/tests/services.c | 24 ++++++++++++++++++++++++ dlls/wbemprox/wbemlocator.c | 6 +++--- dlls/wbemprox/wbemprox_private.h | 2 +- 4 files changed, 36 insertions(+), 8 deletions(-)
diff --git a/dlls/wbemprox/services.c b/dlls/wbemprox/services.c index eff5148ef29..19e03fa152b 100644 --- a/dlls/wbemprox/services.c +++ b/dlls/wbemprox/services.c @@ -210,6 +210,7 @@ struct wbem_services CRITICAL_SECTION cs; WCHAR *namespace; struct async_header *async; + IWbemContext *context; };
static inline struct wbem_services *impl_from_IWbemServices( IWbemServices *iface ) @@ -243,6 +244,8 @@ static ULONG WINAPI wbem_services_Release( } ws->cs.DebugInfo->Spare[0] = 0; DeleteCriticalSection( &ws->cs ); + if (ws->context) + IWbemContext_Release( ws->context ); heap_free( ws->namespace ); heap_free( ws ); } @@ -293,7 +296,7 @@ static HRESULT WINAPI wbem_services_OpenNamespace( if ((wcsicmp( strNamespace, L"cimv2" ) && wcsicmp( strNamespace, L"default" )) || ws->namespace) return WBEM_E_INVALID_NAMESPACE;
- return WbemServices_create( L"cimv2", (void **)ppWorkingNamespace ); + return WbemServices_create( L"cimv2", NULL, (void **)ppWorkingNamespace ); }
static HRESULT WINAPI wbem_services_CancelAsyncCall( @@ -933,21 +936,22 @@ static const IWbemServicesVtbl wbem_services_vtbl = wbem_services_ExecMethodAsync };
-HRESULT WbemServices_create( const WCHAR *namespace, LPVOID *ppObj ) +HRESULT WbemServices_create( const WCHAR *namespace, IWbemContext *context, LPVOID *ppObj ) { struct wbem_services *ws;
TRACE("(%p)\n", ppObj);
- ws = heap_alloc( sizeof(*ws) ); + ws = heap_alloc_zero( sizeof(*ws) ); if (!ws) return E_OUTOFMEMORY;
ws->IWbemServices_iface.lpVtbl = &wbem_services_vtbl; ws->refs = 1; ws->namespace = heap_strdupW( namespace ); - ws->async = NULL; InitializeCriticalSection( &ws->cs ); ws->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": wbemprox_services.cs"); + if (context) + IWbemContext_Clone( context, &ws->context );
*ppObj = &ws->IWbemServices_iface;
diff --git a/dlls/wbemprox/tests/services.c b/dlls/wbemprox/tests/services.c index c17a502f984..5ad73e7a8ec 100644 --- a/dlls/wbemprox/tests/services.c +++ b/dlls/wbemprox/tests/services.c @@ -24,6 +24,15 @@ #include "wbemcli.h" #include "wine/test.h"
+#define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__) +static void _expect_ref(IUnknown* obj, ULONG ref, int line) +{ + ULONG rc; + IUnknown_AddRef(obj); + rc = IUnknown_Release(obj); + ok_(__FILE__,line)(rc == ref, "expected refcount %d, got %d\n", ref, rc); +} + static void test_IClientSecurity(void) { HRESULT hr; @@ -124,6 +133,7 @@ static void test_IWbemLocator(void) }; IWbemLocator *locator; IWbemServices *services; + IWbemContext *context; unsigned int i; HRESULT hr; BSTR resource; @@ -146,6 +156,20 @@ static void test_IWbemLocator(void) SysFreeString( resource ); if (hr == S_OK) IWbemServices_Release( services ); } + + hr = CoCreateInstance( &CLSID_WbemContext, NULL, CLSCTX_INPROC_SERVER, &IID_IWbemContext, (void **)&context ); + ok(hr == S_OK, "Failed to create context object, hr %#x.\n", hr); + + EXPECT_REF(context, 1); + resource = SysAllocString( L"root\default" ); + hr = IWbemLocator_ConnectServer( locator, resource, NULL, NULL, NULL, 0, NULL, context, &services ); + ok(hr == S_OK, "Failed to connect, hr %#x.\n", hr); + SysFreeString( resource ); + EXPECT_REF(context, 1); + IWbemServices_Release( services ); + + IWbemContext_Release( context ); + IWbemLocator_Release( locator ); }
diff --git a/dlls/wbemprox/wbemlocator.c b/dlls/wbemprox/wbemlocator.c index 9b6f2cbc741..5e86f2be86d 100644 --- a/dlls/wbemprox/wbemlocator.c +++ b/dlls/wbemprox/wbemlocator.c @@ -161,14 +161,14 @@ static HRESULT WINAPI wbem_locator_ConnectServer( const BSTR Locale, LONG SecurityFlags, const BSTR Authority, - IWbemContext *pCtx, + IWbemContext *context, IWbemServices **ppNamespace) { HRESULT hr; WCHAR *server, *namespace;
TRACE("%p, %s, %s, %s, %s, 0x%08x, %s, %p, %p)\n", iface, debugstr_w(NetworkResource), debugstr_w(User), - debugstr_w(Password), debugstr_w(Locale), SecurityFlags, debugstr_w(Authority), pCtx, ppNamespace); + debugstr_w(Password), debugstr_w(Locale), SecurityFlags, debugstr_w(Authority), context, ppNamespace);
hr = parse_resource( NetworkResource, &server, &namespace ); if (hr != S_OK) return hr; @@ -187,7 +187,7 @@ static HRESULT WINAPI wbem_locator_ConnectServer( if (SecurityFlags) FIXME("unsupported flags\n");
- hr = WbemServices_create( namespace, (void **)ppNamespace ); + hr = WbemServices_create( namespace, context, (void **)ppNamespace ); heap_free( namespace ); heap_free( server ); if (SUCCEEDED( hr )) diff --git a/dlls/wbemprox/wbemprox_private.h b/dlls/wbemprox/wbemprox_private.h index bae4b5d20c5..7e1efe65874 100644 --- a/dlls/wbemprox/wbemprox_private.h +++ b/dlls/wbemprox/wbemprox_private.h @@ -236,7 +236,7 @@ HRESULT create_signature( const WCHAR *, const WCHAR *, enum param_direction, IWbemClassObject ** ) DECLSPEC_HIDDEN;
HRESULT WbemLocator_create(LPVOID *) DECLSPEC_HIDDEN; -HRESULT WbemServices_create(const WCHAR *, LPVOID *) DECLSPEC_HIDDEN; +HRESULT WbemServices_create(const WCHAR *, IWbemContext *, LPVOID *) DECLSPEC_HIDDEN; HRESULT WbemContext_create(void **) DECLSPEC_HIDDEN; HRESULT create_class_object(const WCHAR *, IEnumWbemClassObject *, UINT, struct record *, IWbemClassObject **) DECLSPEC_HIDDEN;
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/wbemprox/services.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-)
diff --git a/dlls/wbemprox/services.c b/dlls/wbemprox/services.c index 19e03fa152b..7de97dbae64 100644 --- a/dlls/wbemprox/services.c +++ b/dlls/wbemprox/services.c @@ -1039,9 +1039,32 @@ static HRESULT WINAPI wbem_context_Clone( IWbemContext *iface, IWbemContext **newcopy ) { - FIXME("%p, %p\n", iface, newcopy); + struct wbem_context *context = impl_from_IWbemContext( iface ); + struct wbem_context_value *value; + IWbemContext *cloned_context; + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p, %p\n", iface, newcopy); + + if (SUCCEEDED(hr = WbemContext_create( (void **)&cloned_context ))) + { + LIST_FOR_EACH_ENTRY( value, &context->values, struct wbem_context_value, entry ) + { + if (FAILED(hr = IWbemContext_SetValue( cloned_context, value->name, 0, &value->value ))) break; + } + } + + if (SUCCEEDED(hr)) + { + *newcopy = cloned_context; + } + else + { + *newcopy = NULL; + IWbemContext_Release( cloned_context ); + } + + return hr; }
static HRESULT WINAPI wbem_context_GetNames(
Signed-off-by: Hans Leidekker hans@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/wbemprox/process.c | 2 +- dlls/wbemprox/reg.c | 14 +++++------ dlls/wbemprox/security.c | 4 ++-- dlls/wbemprox/service.c | 8 +++---- dlls/wbemprox/services.c | 2 +- dlls/wbemprox/sysrestore.c | 10 ++++---- dlls/wbemprox/wbemprox_private.h | 41 ++++++++++++++++---------------- 7 files changed, 41 insertions(+), 40 deletions(-)
diff --git a/dlls/wbemprox/process.c b/dlls/wbemprox/process.c index 0ee81e8b523..a9057daa384 100644 --- a/dlls/wbemprox/process.c +++ b/dlls/wbemprox/process.c @@ -62,7 +62,7 @@ done: return S_OK; }
-HRESULT process_get_owner( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT process_get_owner( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT user, domain, retval; IWbemClassObject *sig, *out_params = NULL; diff --git a/dlls/wbemprox/reg.c b/dlls/wbemprox/reg.c index f021aa14af8..41195e3e21e 100644 --- a/dlls/wbemprox/reg.c +++ b/dlls/wbemprox/reg.c @@ -92,7 +92,7 @@ static HRESULT create_key( HKEY root, const WCHAR *subkey, VARIANT *retval ) return HRESULT_FROM_WIN32( res ); }
-HRESULT reg_create_key( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT reg_create_key( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT defkey, subkey, retval; IWbemClassObject *sig, *out_params = NULL; @@ -191,7 +191,7 @@ static HRESULT enum_key( HKEY root, const WCHAR *subkey, VARIANT *names, VARIANT return hr; }
-HRESULT reg_enum_key( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT reg_enum_key( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT defkey, subkey, names, retval; IWbemClassObject *sig, *out_params = NULL; @@ -301,7 +301,7 @@ done: return hr; }
-HRESULT reg_enum_values( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT reg_enum_values( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT defkey, subkey, names, types, retval; IWbemClassObject *sig, *out_params = NULL; @@ -384,7 +384,7 @@ done: return hr; }
-HRESULT reg_get_stringvalue( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT reg_get_stringvalue( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT defkey, subkey, name, value, retval; IWbemClassObject *sig, *out_params = NULL; @@ -453,7 +453,7 @@ static void set_stringvalue( HKEY root, const WCHAR *subkey, const WCHAR *name, set_variant( VT_UI4, res, NULL, retval ); }
-HRESULT reg_set_stringvalue( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT reg_set_stringvalue( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT defkey, subkey, name, value, retval; IWbemClassObject *sig, *out_params = NULL; @@ -518,7 +518,7 @@ static void set_dwordvalue( HKEY root, const WCHAR *subkey, const WCHAR *name, D set_variant( VT_UI4, res, NULL, retval ); }
-HRESULT reg_set_dwordvalue( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT reg_set_dwordvalue( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT defkey, subkey, name, value, retval; IWbemClassObject *sig, *out_params = NULL; @@ -579,7 +579,7 @@ static void delete_key( HKEY root, const WCHAR *subkey, VARIANT *retval ) set_variant( VT_UI4, res, NULL, retval ); }
-HRESULT reg_delete_key( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT reg_delete_key( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT defkey, subkey, retval; IWbemClassObject *sig, *out_params = NULL; diff --git a/dlls/wbemprox/security.c b/dlls/wbemprox/security.c index b8c5d90e30d..82e45060714 100644 --- a/dlls/wbemprox/security.c +++ b/dlls/wbemprox/security.c @@ -130,7 +130,7 @@ static HRESULT get_sd( SECURITY_DESCRIPTOR **sd, DWORD *size ) return hr; }
-HRESULT security_get_sd( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT security_get_sd( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT var_sd, retval; IWbemClassObject *sig, *out_params = NULL; @@ -185,7 +185,7 @@ HRESULT security_get_sd( IWbemClassObject *obj, IWbemClassObject *in, IWbemClass }
-HRESULT security_set_sd( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT security_set_sd( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT retval; IWbemClassObject *sig, *out_params = NULL; diff --git a/dlls/wbemprox/service.c b/dlls/wbemprox/service.c index 56bc2c50167..4c909713dc3 100644 --- a/dlls/wbemprox/service.c +++ b/dlls/wbemprox/service.c @@ -76,7 +76,7 @@ done: return S_OK; }
-HRESULT service_pause_service( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT service_pause_service( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT name, retval; IWbemClassObject *sig, *out_params = NULL; @@ -121,7 +121,7 @@ done: return hr; }
-HRESULT service_resume_service( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT service_resume_service( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT name, retval; IWbemClassObject *sig, *out_params = NULL; @@ -190,7 +190,7 @@ done: return S_OK; }
-HRESULT service_start_service( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT service_start_service( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT name, retval; IWbemClassObject *sig, *out_params = NULL; @@ -235,7 +235,7 @@ done: return hr; }
-HRESULT service_stop_service( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT service_stop_service( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT name, retval; IWbemClassObject *sig, *out_params = NULL; diff --git a/dlls/wbemprox/services.c b/dlls/wbemprox/services.c index 7de97dbae64..5275dd348c7 100644 --- a/dlls/wbemprox/services.c +++ b/dlls/wbemprox/services.c @@ -882,7 +882,7 @@ static HRESULT WINAPI wbem_services_ExecMethod( hr = get_method( table, strMethodName, &func ); if (hr != S_OK) goto done;
- hr = func( obj, pInParams, ppOutParams ); + hr = func( obj, NULL, pInParams, ppOutParams );
done: if (result) IEnumWbemClassObject_Release( result ); diff --git a/dlls/wbemprox/sysrestore.c b/dlls/wbemprox/sysrestore.c index d59077381fb..8092dd7227e 100644 --- a/dlls/wbemprox/sysrestore.c +++ b/dlls/wbemprox/sysrestore.c @@ -31,19 +31,19 @@
WINE_DEFAULT_DEBUG_CHANNEL(wbemprox);
-HRESULT create_restore_point( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT create_restore_point( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { FIXME("stub\n"); return S_OK; }
-HRESULT disable_restore( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT disable_restore( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { FIXME("stub\n"); return S_OK; }
-HRESULT enable_restore( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT enable_restore( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT drive, retval; IWbemClassObject *sig, *out_params = NULL; @@ -93,13 +93,13 @@ HRESULT enable_restore( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassO return hr; }
-HRESULT get_last_restore_status( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT get_last_restore_status( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { FIXME("stub\n"); return E_NOTIMPL; }
-HRESULT restore( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) +HRESULT restore( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) { FIXME("stub\n"); return S_OK; diff --git a/dlls/wbemprox/wbemprox_private.h b/dlls/wbemprox/wbemprox_private.h index 7e1efe65874..5ccbed18023 100644 --- a/dlls/wbemprox/wbemprox_private.h +++ b/dlls/wbemprox/wbemprox_private.h @@ -37,7 +37,8 @@ enum param_direction #define COL_FLAG_KEY 0x00020000 #define COL_FLAG_METHOD 0x00040000
-typedef HRESULT (class_method)(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **); +typedef HRESULT (class_method)(IWbemClassObject *object, IWbemContext *context, IWbemClassObject *in_params, + IWbemClassObject **out_params);
enum operator { @@ -243,25 +244,25 @@ HRESULT create_class_object(const WCHAR *, IEnumWbemClassObject *, UINT, HRESULT EnumWbemClassObject_create(struct query *, LPVOID *) DECLSPEC_HIDDEN; HRESULT WbemQualifierSet_create(const WCHAR *, const WCHAR *, LPVOID *) DECLSPEC_HIDDEN;
-HRESULT process_get_owner(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT reg_create_key(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT reg_enum_key(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT reg_enum_values(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT reg_get_stringvalue(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT reg_set_stringvalue(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT reg_set_dwordvalue(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT reg_delete_key(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT service_pause_service(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT service_resume_service(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT service_start_service(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT service_stop_service(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT security_get_sd(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT security_set_sd(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT create_restore_point(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT disable_restore(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT enable_restore(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT get_last_restore_status(IWbemClassObject *, IWbemClassObject *in, IWbemClassObject **) DECLSPEC_HIDDEN; -HRESULT restore(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN; +HRESULT process_get_owner(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT reg_create_key(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT reg_enum_key(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT reg_enum_values(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT reg_get_stringvalue(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT reg_set_stringvalue(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT reg_set_dwordvalue(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT reg_delete_key(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT service_pause_service(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT service_resume_service(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT service_start_service(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT service_stop_service(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT security_get_sd(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT security_set_sd(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT create_restore_point(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT disable_restore(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT enable_restore(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT get_last_restore_status(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; +HRESULT restore(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN;
static inline WCHAR *heap_strdupW( const WCHAR *src ) {
Signed-off-by: Hans Leidekker hans@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/wbemprox/services.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/dlls/wbemprox/services.c b/dlls/wbemprox/services.c index 5275dd348c7..faed31b79af 100644 --- a/dlls/wbemprox/services.c +++ b/dlls/wbemprox/services.c @@ -836,11 +836,12 @@ static HRESULT WINAPI wbem_services_ExecMethod( const BSTR strObjectPath, const BSTR strMethodName, LONG lFlags, - IWbemContext *pCtx, + IWbemContext *context, IWbemClassObject *pInParams, IWbemClassObject **ppOutParams, IWbemCallResult **ppCallResult ) { + struct wbem_services *services = impl_from_IWbemServices( iface ); IEnumWbemClassObject *result = NULL; IWbemClassObject *obj = NULL; struct query *query = NULL; @@ -851,7 +852,7 @@ static HRESULT WINAPI wbem_services_ExecMethod( HRESULT hr;
TRACE("%p, %s, %s, %08x, %p, %p, %p, %p\n", iface, debugstr_w(strObjectPath), - debugstr_w(strMethodName), lFlags, pCtx, pInParams, ppOutParams, ppCallResult); + debugstr_w(strMethodName), lFlags, context, pInParams, ppOutParams, ppCallResult);
if (lFlags) FIXME("flags %08x not supported\n", lFlags);
@@ -882,7 +883,7 @@ static HRESULT WINAPI wbem_services_ExecMethod( hr = get_method( table, strMethodName, &func ); if (hr != S_OK) goto done;
- hr = func( obj, NULL, pInParams, ppOutParams ); + hr = func( obj, context ? context : services->context, pInParams, ppOutParams );
done: if (result) IEnumWbemClassObject_Release( result );
Signed-off-by: Hans Leidekker hans@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/wbemprox/reg.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-)
diff --git a/dlls/wbemprox/reg.c b/dlls/wbemprox/reg.c index 41195e3e21e..cc65ef2c8d9 100644 --- a/dlls/wbemprox/reg.c +++ b/dlls/wbemprox/reg.c @@ -75,6 +75,30 @@ static HRESULT to_i4_array( DWORD *values, DWORD count, VARIANT *var ) return S_OK; }
+static unsigned int reg_get_access_mask( IWbemContext *context ) +{ + VARIANT value; + + if (!context) return 0; + + V_VT( &value ) = VT_EMPTY; + if (FAILED(IWbemContext_GetValue( context, L"__ProviderArchitecture", 0, &value ))) + return 0; + + if (FAILED(VariantChangeType( &value, &value, 0, VT_I4 ))) + { + VariantClear( &value ); + return 0; + } + + if (V_I4( &value ) == 32) + return KEY_WOW64_32KEY; + else if (V_I4( &value ) == 64) + return KEY_WOW64_64KEY; + + return 0; +} + static HRESULT create_key( HKEY root, const WCHAR *subkey, VARIANT *retval ) { LONG res; @@ -569,13 +593,13 @@ HRESULT reg_set_dwordvalue( IWbemClassObject *obj, IWbemContext *context, IWbemC return hr; }
-static void delete_key( HKEY root, const WCHAR *subkey, VARIANT *retval ) +static void delete_key( HKEY root, const WCHAR *subkey, IWbemContext *context, VARIANT *retval ) { LONG res;
TRACE("%p, %s\n", root, debugstr_w(subkey));
- res = RegDeleteKeyExW( root, subkey, 0, 0 ); + res = RegDeleteKeyExW( root, subkey, reg_get_access_mask( context ), 0 ); set_variant( VT_UI4, res, NULL, retval ); }
@@ -608,7 +632,7 @@ HRESULT reg_delete_key( IWbemClassObject *obj, IWbemContext *context, IWbemClass return hr; } } - delete_key( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), &retval ); + delete_key( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), context, &retval ); if (out_params) hr = IWbemClassObject_Put( out_params, L"ReturnValue", 0, &retval, CIM_UINT32 );
Signed-off-by: Hans Leidekker hans@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/wbemprox/reg.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/dlls/wbemprox/reg.c b/dlls/wbemprox/reg.c index cc65ef2c8d9..8cda101860f 100644 --- a/dlls/wbemprox/reg.c +++ b/dlls/wbemprox/reg.c @@ -384,22 +384,30 @@ done: return hr; }
-static HRESULT get_stringvalue( HKEY root, const WCHAR *subkey, const WCHAR *name, VARIANT *value, VARIANT *retval ) +static HRESULT get_stringvalue( HKEY root, const WCHAR *subkey, const WCHAR *name, VARIANT *value, + IWbemContext *context, VARIANT *retval ) { + DWORD size, mask, flags = RRF_RT_REG_SZ; HRESULT hr = S_OK; BSTR str = NULL; - DWORD size; LONG res;
TRACE("%p, %s, %s\n", root, debugstr_w(subkey), debugstr_w(name));
- if ((res = RegGetValueW( root, subkey, name, RRF_RT_REG_SZ, NULL, NULL, &size ))) goto done; + mask = reg_get_access_mask( context ); + + if (mask & KEY_WOW64_64KEY) + flags |= RRF_SUBKEY_WOW6464KEY; + else if (mask & KEY_WOW64_32KEY) + flags |= RRF_SUBKEY_WOW6432KEY; + + if ((res = RegGetValueW( root, subkey, name, flags, NULL, NULL, &size ))) goto done; if (!(str = SysAllocStringLen( NULL, size / sizeof(WCHAR) - 1 ))) { hr = E_OUTOFMEMORY; goto done; } - if (!(res = RegGetValueW( root, subkey, name, RRF_RT_REG_SZ, NULL, str, &size ))) + if (!(res = RegGetValueW( root, subkey, name, flags, NULL, str, &size ))) set_variant( VT_BSTR, 0, str, value );
done: @@ -442,7 +450,7 @@ HRESULT reg_get_stringvalue( IWbemClassObject *obj, IWbemContext *context, IWbem } } VariantInit( &value ); - hr = get_stringvalue( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), V_BSTR(&name), &value, &retval ); + hr = get_stringvalue( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), V_BSTR(&name), &value, context, &retval ); if (hr != S_OK) goto done; if (out_params) {
Signed-off-by: Hans Leidekker hans@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/wbemprox/reg.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/wbemprox/reg.c b/dlls/wbemprox/reg.c index 8cda101860f..c1c5f4a51f0 100644 --- a/dlls/wbemprox/reg.c +++ b/dlls/wbemprox/reg.c @@ -99,14 +99,14 @@ static unsigned int reg_get_access_mask( IWbemContext *context ) return 0; }
-static HRESULT create_key( HKEY root, const WCHAR *subkey, VARIANT *retval ) +static HRESULT create_key( HKEY root, const WCHAR *subkey, IWbemContext *context, VARIANT *retval ) { LONG res; HKEY hkey;
TRACE("%p, %s\n", root, debugstr_w(subkey));
- res = RegCreateKeyExW( root, subkey, 0, NULL, 0, 0, NULL, &hkey, NULL ); + res = RegCreateKeyExW( root, subkey, 0, NULL, 0, reg_get_access_mask( context ), NULL, &hkey, NULL ); set_variant( VT_UI4, res, NULL, retval ); if (!res) { @@ -145,7 +145,7 @@ HRESULT reg_create_key( IWbemClassObject *obj, IWbemContext *context, IWbemClass return hr; } } - hr = create_key( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), &retval ); + hr = create_key( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), context, &retval ); if (hr == S_OK && out_params) hr = IWbemClassObject_Put( out_params, L"ReturnValue", 0, &retval, CIM_UINT32 );
Signed-off-by: Hans Leidekker hans@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/wbemprox/reg.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/wbemprox/reg.c b/dlls/wbemprox/reg.c index c1c5f4a51f0..1a963b0754b 100644 --- a/dlls/wbemprox/reg.c +++ b/dlls/wbemprox/reg.c @@ -160,7 +160,7 @@ HRESULT reg_create_key( IWbemClassObject *obj, IWbemContext *context, IWbemClass return hr; }
-static HRESULT enum_key( HKEY root, const WCHAR *subkey, VARIANT *names, VARIANT *retval ) +static HRESULT enum_key( HKEY root, const WCHAR *subkey, VARIANT *names, IWbemContext *context, VARIANT *retval ) { HKEY hkey; HRESULT hr = S_OK; @@ -172,7 +172,7 @@ static HRESULT enum_key( HKEY root, const WCHAR *subkey, VARIANT *names, VARIANT TRACE("%p, %s\n", root, debugstr_w(subkey));
if (!(strings = heap_alloc( count * sizeof(BSTR) ))) return E_OUTOFMEMORY; - if ((res = RegOpenKeyExW( root, subkey, 0, KEY_ENUMERATE_SUB_KEYS, &hkey ))) + if ((res = RegOpenKeyExW( root, subkey, 0, KEY_ENUMERATE_SUB_KEYS | reg_get_access_mask( context ), &hkey ))) { set_variant( VT_UI4, res, NULL, retval ); heap_free( strings ); @@ -245,7 +245,7 @@ HRESULT reg_enum_key( IWbemClassObject *obj, IWbemContext *context, IWbemClassOb } } VariantInit( &names ); - hr = enum_key( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), &names, &retval ); + hr = enum_key( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), &names, context, &retval ); if (hr != S_OK) goto done; if (out_params) {
Signed-off-by: Hans Leidekker hans@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/wbemprox/reg.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/dlls/wbemprox/reg.c b/dlls/wbemprox/reg.c index 1a963b0754b..59f94abfc4a 100644 --- a/dlls/wbemprox/reg.c +++ b/dlls/wbemprox/reg.c @@ -270,7 +270,8 @@ done: return hr; }
-static HRESULT enum_values( HKEY root, const WCHAR *subkey, VARIANT *names, VARIANT *types, VARIANT *retval ) +static HRESULT enum_values( HKEY root, const WCHAR *subkey, VARIANT *names, VARIANT *types, IWbemContext *context, + VARIANT *retval ) { HKEY hkey = NULL; HRESULT hr = S_OK; @@ -281,7 +282,7 @@ static HRESULT enum_values( HKEY root, const WCHAR *subkey, VARIANT *names, VARI
TRACE("%p, %s\n", root, debugstr_w(subkey));
- if ((res = RegOpenKeyExW( root, subkey, 0, KEY_QUERY_VALUE, &hkey ))) goto done; + if ((res = RegOpenKeyExW( root, subkey, 0, KEY_QUERY_VALUE | reg_get_access_mask( context ), &hkey ))) goto done; if ((res = RegQueryInfoKeyW( hkey, NULL, NULL, NULL, NULL, NULL, NULL, &count, &buflen, NULL, NULL, NULL ))) goto done;
@@ -356,7 +357,7 @@ HRESULT reg_enum_values( IWbemClassObject *obj, IWbemContext *context, IWbemClas } VariantInit( &names ); VariantInit( &types ); - hr = enum_values( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), &names, &types, &retval ); + hr = enum_values( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), &names, &types, context, &retval ); if (hr != S_OK) goto done; if (out_params) {
Signed-off-by: Hans Leidekker hans@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/wbemprox/reg.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/dlls/wbemprox/reg.c b/dlls/wbemprox/reg.c index 59f94abfc4a..63870bfc52c 100644 --- a/dlls/wbemprox/reg.c +++ b/dlls/wbemprox/reg.c @@ -476,14 +476,23 @@ done: return hr; }
-static void set_stringvalue( HKEY root, const WCHAR *subkey, const WCHAR *name, const WCHAR *value, VARIANT *retval ) +static void set_stringvalue( HKEY root, const WCHAR *subkey, const WCHAR *name, const WCHAR *value, + IWbemContext *context, VARIANT *retval ) { + HKEY hkey; LONG res;
TRACE("%p, %s, %s, %s\n", root, debugstr_w(subkey), debugstr_w(name), debugstr_w(value));
- res = RegSetKeyValueW( root, subkey, name, REG_SZ, value, (lstrlenW( value ) + 1) * sizeof(*value) ); + if ((res = RegOpenKeyExW( root, subkey, 0, KEY_SET_VALUE | reg_get_access_mask( context ), &hkey ))) + { + set_variant( VT_UI4, res, NULL, retval ); + return; + } + + res = RegSetKeyValueW( hkey, NULL, name, REG_SZ, value, (lstrlenW( value ) + 1) * sizeof(*value) ); set_variant( VT_UI4, res, NULL, retval ); + RegCloseKey( hkey ); }
HRESULT reg_set_stringvalue( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) @@ -524,7 +533,7 @@ HRESULT reg_set_stringvalue( IWbemClassObject *obj, IWbemContext *context, IWbem } }
- set_stringvalue( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), V_BSTR(&name), V_BSTR(&value), &retval ); + set_stringvalue( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), V_BSTR(&name), V_BSTR(&value), context, &retval ); if (out_params) hr = IWbemClassObject_Put( out_params, L"ReturnValue", 0, &retval, CIM_UINT32 );
Signed-off-by: Hans Leidekker hans@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/wbemprox/reg.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/dlls/wbemprox/reg.c b/dlls/wbemprox/reg.c index 63870bfc52c..edcdb1902f1 100644 --- a/dlls/wbemprox/reg.c +++ b/dlls/wbemprox/reg.c @@ -550,14 +550,23 @@ HRESULT reg_set_stringvalue( IWbemClassObject *obj, IWbemContext *context, IWbem return hr; }
-static void set_dwordvalue( HKEY root, const WCHAR *subkey, const WCHAR *name, DWORD value, VARIANT *retval ) +static void set_dwordvalue( HKEY root, const WCHAR *subkey, const WCHAR *name, DWORD value, IWbemContext *context, + VARIANT *retval ) { + HKEY hkey; LONG res;
TRACE("%p, %s, %s, %#x\n", root, debugstr_w(subkey), debugstr_w(name), value);
- res = RegSetKeyValueW( root, subkey, name, REG_DWORD, &value, sizeof(value) ); + if ((res = RegOpenKeyExW( root, subkey, 0, KEY_SET_VALUE | reg_get_access_mask( context ), &hkey ))) + { + set_variant( VT_UI4, res, NULL, retval ); + return; + } + + res = RegSetKeyValueW( hkey, NULL, name, REG_DWORD, &value, sizeof(value) ); set_variant( VT_UI4, res, NULL, retval ); + RegCloseKey( hkey ); }
HRESULT reg_set_dwordvalue( IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out ) @@ -595,7 +604,7 @@ HRESULT reg_set_dwordvalue( IWbemClassObject *obj, IWbemContext *context, IWbemC return hr; } } - set_dwordvalue( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), V_BSTR(&name), V_UI4(&value), &retval ); + set_dwordvalue( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), V_BSTR(&name), V_UI4(&value), context, &retval ); if (out_params) hr = IWbemClassObject_Put( out_params, L"ReturnValue", 0, &retval, CIM_UINT32 );
Signed-off-by: Hans Leidekker hans@codeweavers.com