Signed-off-by: Paul Gofman pgofman@codeweavers.com --- dlls/wbemprox/builtin.c | 58 +++++++++++++++++++++++++------- dlls/wbemprox/class.c | 38 +++++++++++---------- dlls/wbemprox/main.c | 2 +- dlls/wbemprox/process.c | 4 +-- dlls/wbemprox/qualifier.c | 22 ++++++------ dlls/wbemprox/query.c | 42 ++++++++++++----------- dlls/wbemprox/reg.c | 14 ++++---- dlls/wbemprox/security.c | 4 +-- dlls/wbemprox/service.c | 8 ++--- dlls/wbemprox/services.c | 48 ++++++++++++++++---------- dlls/wbemprox/sysrestore.c | 2 +- dlls/wbemprox/table.c | 18 ++++++---- dlls/wbemprox/wbemlocator.c | 4 +-- dlls/wbemprox/wbemprox_private.h | 35 ++++++++++++------- dlls/wbemprox/wql.y | 14 ++++---- 15 files changed, 190 insertions(+), 123 deletions(-)
diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c index 862c461d8b7..ad96182af6b 100644 --- a/dlls/wbemprox/builtin.c +++ b/dlls/wbemprox/builtin.c @@ -2284,12 +2284,14 @@ static struct association *get_diskdrivetodiskpartition_pairs( UINT *count ) HRESULT hr; UINT i;
- if (!(query = create_query())) return NULL; - if ((hr = parse_query( L"SELECT * FROM Win32_DiskDrive", &query->view, &query->mem )) != S_OK) goto done; + if (!(query = create_query( WBEMPROX_NAMESPACE_CIMV2 ))) return NULL; + if ((hr = parse_query( WBEMPROX_NAMESPACE_CIMV2, L"SELECT * FROM Win32_DiskDrive", + &query->view, &query->mem )) != S_OK) goto done; if ((hr = execute_view( query->view )) != S_OK) goto done;
- if (!(query2 = create_query())) return FALSE; - if ((hr = parse_query( L"SELECT * FROM Win32_DiskPartition", &query2->view, &query2->mem )) != S_OK) goto done; + if (!(query2 = create_query( WBEMPROX_NAMESPACE_CIMV2 ))) return FALSE; + if ((hr = parse_query( WBEMPROX_NAMESPACE_CIMV2, L"SELECT * FROM Win32_DiskPartition", + &query2->view, &query2->mem )) != S_OK) goto done; if ((hr = execute_view( query2->view )) != S_OK) goto done;
if (!(ret = heap_alloc_zero( query->view->result_count * sizeof(*ret) ))) goto done; @@ -2570,12 +2572,14 @@ static struct association *get_logicaldisktopartition_pairs( UINT *count ) HRESULT hr; UINT i;
- if (!(query = create_query())) return NULL; - if ((hr = parse_query( L"SELECT * FROM Win32_DiskPartition", &query->view, &query->mem )) != S_OK) goto done; + if (!(query = create_query( WBEMPROX_NAMESPACE_CIMV2 ))) return NULL; + if ((hr = parse_query( WBEMPROX_NAMESPACE_CIMV2, L"SELECT * FROM Win32_DiskPartition", + &query->view, &query->mem )) != S_OK) goto done; if ((hr = execute_view( query->view )) != S_OK) goto done;
- if (!(query2 = create_query())) return FALSE; - if ((hr = parse_query( L"SELECT * FROM Win32_LogicalDisk WHERE DriveType=2 OR DriveType=3", &query2->view, + if (!(query2 = create_query( WBEMPROX_NAMESPACE_CIMV2 ))) return FALSE; + if ((hr = parse_query( WBEMPROX_NAMESPACE_CIMV2, + L"SELECT * FROM Win32_LogicalDisk WHERE DriveType=2 OR DriveType=3", &query2->view, &query2->mem )) != S_OK) goto done; if ((hr = execute_view( query2->view )) != S_OK) goto done;
@@ -4070,7 +4074,7 @@ static enum fill_status fill_sounddevice( struct table *table, const struct expr
#define C(c) sizeof(c)/sizeof(c[0]), c #define D(d) sizeof(d)/sizeof(d[0]), 0, (BYTE *)d -static struct table builtin_classes[] = +static struct table cimv2_builtin_classes[] = { { L"__ASSOCIATORS", C(col_associator), D(data_associator) }, { L"__PARAMETERS", C(col_param), D(data_param) }, @@ -4115,11 +4119,39 @@ static struct table builtin_classes[] = #undef C #undef D
+static const struct +{ + const WCHAR *name; + struct table *classes; + unsigned int table_count; +} +builtin_namespaces[WBEMPROX_NAMESPACE_LAST] = +{ + {L"cimv2", cimv2_builtin_classes, ARRAY_SIZE(cimv2_builtin_classes)}, +}; + void init_table_list( void ) { - static struct list tables = LIST_INIT( tables ); - UINT i; + static struct list tables[WBEMPROX_NAMESPACE_LAST]; + UINT ns, i; + + for (ns = 0; ns < ARRAY_SIZE(builtin_namespaces); ns++) + { + list_init( &tables[ns] ); + for (i = 0; i < builtin_namespaces[ns].table_count; i++) + list_add_tail( &tables[ns], &builtin_namespaces[ns].classes[i].entry ); + table_list[ns] = &tables[ns]; + } +} + +enum wbm_namespace get_namespace_from_string( const WCHAR *namespace ) +{ + unsigned int i; + + if (!wcsicmp( namespace, L"default" )) return WBEMPROX_NAMESPACE_CIMV2; + + for (i = 0; i < WBEMPROX_NAMESPACE_LAST; ++i) + if (!wcsicmp( namespace, builtin_namespaces[i].name )) return i;
- for (i = 0; i < ARRAY_SIZE(builtin_classes); i++) list_add_tail( &tables, &builtin_classes[i].entry ); - table_list = &tables; + return WBEMPROX_NAMESPACE_LAST; } diff --git a/dlls/wbemprox/class.c b/dlls/wbemprox/class.c index 3b7bc066aea..cabf1c9058d 100644 --- a/dlls/wbemprox/class.c +++ b/dlls/wbemprox/class.c @@ -36,6 +36,7 @@ struct enum_class_object LONG refs; struct query *query; UINT index; + enum wbm_namespace ns; };
static inline struct enum_class_object *impl_from_IEnumWbemClassObject( @@ -129,7 +130,7 @@ static HRESULT WINAPI enum_class_object_Next( { if (ec->index >= view->result_count) return WBEM_S_FALSE; table = get_view_table( view, ec->index ); - hr = create_class_object( table->name, iface, ec->index, NULL, &apObjects[i] ); + hr = create_class_object( ec->ns, table->name, iface, ec->index, NULL, &apObjects[i] ); if (hr != S_OK) { for (j = 0; j < i; j++) IWbemClassObject_Release( apObjects[j] ); @@ -211,6 +212,7 @@ HRESULT EnumWbemClassObject_create( struct query *query, LPVOID *ppObj ) ec->refs = 1; ec->query = addref_query( query ); ec->index = 0; + ec->ns = query->ns;
*ppObj = &ec->IEnumWbemClassObject_iface;
@@ -278,6 +280,7 @@ struct class_object UINT index; UINT index_method; UINT index_property; + enum wbm_namespace ns; struct record *record; /* uncommitted instance */ };
@@ -346,7 +349,7 @@ static HRESULT WINAPI class_object_GetQualifierSet(
TRACE("%p, %p\n", iface, ppQualSet);
- return WbemQualifierSet_create( co->name, NULL, (void **)ppQualSet ); + return WbemQualifierSet_create( co->ns, co->name, NULL, (void **)ppQualSet ); }
static HRESULT record_get_value( const struct record *record, UINT index, VARIANT *var, CIMTYPE *type ) @@ -591,7 +594,7 @@ static HRESULT WINAPI class_object_GetPropertyQualifierSet(
TRACE("%p, %s, %p\n", iface, debugstr_w(wszProperty), ppQualSet);
- return WbemQualifierSet_create( co->name, wszProperty, (void **)ppQualSet ); + return WbemQualifierSet_create( co->ns, co->name, wszProperty, (void **)ppQualSet ); }
static HRESULT WINAPI class_object_Clone( @@ -697,7 +700,7 @@ static HRESULT WINAPI class_object_SpawnInstance( destroy_record( record ); return hr; } - hr = create_class_object( co->name, iter, 0, record, ppNewInstance ); + hr = create_class_object( co->ns, co->name, iter, 0, record, ppNewInstance ); IEnumWbemClassObject_Release( iter ); return hr; } @@ -808,7 +811,7 @@ error: return hr; }
-static HRESULT create_signature_table( IEnumWbemClassObject *iter, WCHAR *name ) +static HRESULT create_signature_table( IEnumWbemClassObject *iter, enum wbm_namespace ns, WCHAR *name ) { HRESULT hr; struct table *table; @@ -825,7 +828,7 @@ static HRESULT create_signature_table( IEnumWbemClassObject *iter, WCHAR *name ) heap_free( row ); return E_OUTOFMEMORY; } - if (!add_table( table )) free_table( table ); /* already exists */ + if (!add_table( ns, table )) free_table( table ); /* already exists */ return S_OK; }
@@ -839,7 +842,7 @@ static WCHAR *build_signature_table_name( const WCHAR *class, const WCHAR *metho return wcsupr( ret ); }
-HRESULT create_signature( const WCHAR *class, const WCHAR *method, enum param_direction dir, +HRESULT create_signature( enum wbm_namespace ns, const WCHAR *class, const WCHAR *method, enum param_direction dir, IWbemClassObject **sig ) { static const WCHAR selectW[] = L"SELECT * FROM __PARAMETERS WHERE Class='%s' AND Method='%s' AND Direction%s"; @@ -852,7 +855,7 @@ HRESULT create_signature( const WCHAR *class, const WCHAR *method, enum param_di if (!(query = heap_alloc( len * sizeof(WCHAR) ))) return E_OUTOFMEMORY; swprintf( query, len, selectW, class, method, dir >= 0 ? L">=0" : L"<=0" );
- hr = exec_query( query, &iter ); + hr = exec_query( ns, query, &iter ); heap_free( query ); if (hr != S_OK) return hr;
@@ -868,10 +871,10 @@ HRESULT create_signature( const WCHAR *class, const WCHAR *method, enum param_di IEnumWbemClassObject_Release( iter ); return E_OUTOFMEMORY; } - hr = create_signature_table( iter, name ); + hr = create_signature_table( iter, ns, name ); IEnumWbemClassObject_Release( iter ); if (hr == S_OK) - hr = get_object( name, sig ); + hr = get_object( ns, name, sig );
heap_free( name ); return hr; @@ -907,10 +910,10 @@ static HRESULT WINAPI class_object_GetMethod( return WBEM_E_NOT_FOUND; }
- hr = create_signature( co->name, wszName, PARAM_IN, &in ); + hr = create_signature( co->ns, co->name, wszName, PARAM_IN, &in ); if (hr != S_OK) return hr;
- hr = create_signature( co->name, wszName, PARAM_OUT, &out ); + hr = create_signature( co->ns, co->name, wszName, PARAM_OUT, &out ); if (hr == S_OK) { if (ppInSignature) *ppInSignature = in; @@ -968,15 +971,15 @@ static HRESULT WINAPI class_object_NextMethod(
TRACE("%p, %08x, %p, %p, %p\n", iface, lFlags, pstrName, ppInSignature, ppOutSignature);
- if (!(method = get_method_name( co->name, co->index_method ))) return WBEM_S_NO_MORE_DATA; + if (!(method = get_method_name( co->ns, co->name, co->index_method ))) return WBEM_S_NO_MORE_DATA;
- hr = create_signature( co->name, method, PARAM_IN, ppInSignature ); + hr = create_signature( co->ns, co->name, method, PARAM_IN, ppInSignature ); if (hr != S_OK) { SysFreeString( method ); return hr; } - hr = create_signature( co->name, method, PARAM_OUT, ppOutSignature ); + hr = create_signature( co->ns, co->name, method, PARAM_OUT, ppOutSignature ); if (hr != S_OK) { SysFreeString( method ); @@ -1011,7 +1014,7 @@ static HRESULT WINAPI class_object_GetMethodQualifierSet(
TRACE("%p, %s, %p\n", iface, debugstr_w(wszMethod), ppQualSet);
- return WbemQualifierSet_create( co->name, wszMethod, (void **)ppQualSet ); + return WbemQualifierSet_create( co->ns, co->name, wszMethod, (void **)ppQualSet ); }
static HRESULT WINAPI class_object_GetMethodOrigin( @@ -1054,7 +1057,7 @@ static const IWbemClassObjectVtbl class_object_vtbl = class_object_GetMethodOrigin };
-HRESULT create_class_object( const WCHAR *name, IEnumWbemClassObject *iter, UINT index, +HRESULT create_class_object( enum wbm_namespace ns, const WCHAR *name, IEnumWbemClassObject *iter, UINT index, struct record *record, IWbemClassObject **obj ) { struct class_object *co; @@ -1077,6 +1080,7 @@ HRESULT create_class_object( const WCHAR *name, IEnumWbemClassObject *iter, UINT co->index_method = 0; co->index_property = 0; co->record = record; + co->ns = ns; if (iter) IEnumWbemClassObject_AddRef( iter );
*obj = &co->IWbemClassObject_iface; diff --git a/dlls/wbemprox/main.c b/dlls/wbemprox/main.c index a1c65feadb5..20ca1a08530 100644 --- a/dlls/wbemprox/main.c +++ b/dlls/wbemprox/main.c @@ -35,7 +35,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wbemprox);
static HINSTANCE instance;
-struct list *table_list; +struct list *table_list[WBEMPROX_NAMESPACE_LAST];
typedef HRESULT (*fnCreateInstance)( LPVOID *ppObj );
diff --git a/dlls/wbemprox/process.c b/dlls/wbemprox/process.c index 5d8af54f217..93136e9aefc 100644 --- a/dlls/wbemprox/process.c +++ b/dlls/wbemprox/process.c @@ -70,7 +70,7 @@ HRESULT process_get_owner( IWbemClassObject *obj, IWbemContext *context, IWbemCl
TRACE("%p, %p, %p, %p\n", obj, context, in, out);
- hr = create_signature( L"Win32_Process", L"GetOwner", PARAM_OUT, &sig ); + hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"Win32_Process", L"GetOwner", PARAM_OUT, &sig ); if (hr != S_OK) return hr;
if (out) @@ -127,7 +127,7 @@ HRESULT process_create( IWbemClassObject *obj, IWbemContext *context, IWbemClass
*out = NULL;
- if ((hr = create_signature( L"Win32_Process", L"Create", PARAM_OUT, &sig ))) return hr; + if ((hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"Win32_Process", L"Create", PARAM_OUT, &sig ))) return hr;
VariantInit( &command_line ); VariantInit( ¤t_directory ); diff --git a/dlls/wbemprox/qualifier.c b/dlls/wbemprox/qualifier.c index 1cc4087ff35..73075b85a06 100644 --- a/dlls/wbemprox/qualifier.c +++ b/dlls/wbemprox/qualifier.c @@ -34,6 +34,7 @@ struct qualifier_set { IWbemQualifierSet IWbemQualifierSet_iface; LONG refs; + enum wbm_namespace ns; WCHAR *class; WCHAR *member; }; @@ -89,8 +90,8 @@ static HRESULT WINAPI qualifier_set_QueryInterface( return S_OK; }
-static HRESULT create_qualifier_enum( const WCHAR *class, const WCHAR *member, const WCHAR *name, - IEnumWbemClassObject **iter ) +static HRESULT create_qualifier_enum( enum wbm_namespace ns, const WCHAR *class, const WCHAR *member, + const WCHAR *name, IEnumWbemClassObject **iter ) { static const WCHAR fmtW[] = L"SELECT * FROM __QUALIFIERS WHERE Class='%s' AND Member='%s' AND Name='%s'"; static const WCHAR fmt2W[] = L"SELECT * FROM __QUALIFIERS WHERE Class='%s' AND Member='%s'"; @@ -118,12 +119,12 @@ static HRESULT create_qualifier_enum( const WCHAR *class, const WCHAR *member, c swprintf( query, len, fmt3W, class ); }
- hr = exec_query( query, iter ); + hr = exec_query( ns, query, iter ); heap_free( query ); return hr; }
-static HRESULT get_qualifier_value( const WCHAR *class, const WCHAR *member, const WCHAR *name, +static HRESULT get_qualifier_value( enum wbm_namespace ns, const WCHAR *class, const WCHAR *member, const WCHAR *name, VARIANT *val, LONG *flavor ) { IEnumWbemClassObject *iter; @@ -131,10 +132,10 @@ static HRESULT get_qualifier_value( const WCHAR *class, const WCHAR *member, con VARIANT var; HRESULT hr;
- hr = create_qualifier_enum( class, member, name, &iter ); + hr = create_qualifier_enum( ns, class, member, name, &iter ); if (FAILED( hr )) return hr;
- hr = create_class_object( NULL, iter, 0, NULL, &obj ); + hr = create_class_object( ns, NULL, iter, 0, NULL, &obj ); IEnumWbemClassObject_Release( iter ); if (FAILED( hr )) return hr;
@@ -182,7 +183,7 @@ static HRESULT WINAPI qualifier_set_Get( FIXME("flags %08x not supported\n", lFlags); return E_NOTIMPL; } - return get_qualifier_value( set->class, set->member, wszName, pVal, plFlavor ); + return get_qualifier_value( set->ns, set->class, set->member, wszName, pVal, plFlavor ); }
static HRESULT WINAPI qualifier_set_Put( @@ -220,10 +221,10 @@ static HRESULT WINAPI qualifier_set_GetNames( return E_NOTIMPL; }
- hr = create_qualifier_enum( set->class, set->member, NULL, &iter ); + hr = create_qualifier_enum( set->ns, set->class, set->member, NULL, &iter ); if (FAILED( hr )) return hr;
- hr = create_class_object( NULL, iter, 0, NULL, &obj ); + hr = create_class_object( set->ns, NULL, iter, 0, NULL, &obj ); IEnumWbemClassObject_Release( iter ); if (FAILED( hr )) return hr;
@@ -272,7 +273,7 @@ static const IWbemQualifierSetVtbl qualifier_set_vtbl = qualifier_set_EndEnumeration };
-HRESULT WbemQualifierSet_create( const WCHAR *class, const WCHAR *member, LPVOID *ppObj ) +HRESULT WbemQualifierSet_create( enum wbm_namespace ns, const WCHAR *class, const WCHAR *member, LPVOID *ppObj ) { struct qualifier_set *set;
@@ -293,6 +294,7 @@ HRESULT WbemQualifierSet_create( const WCHAR *class, const WCHAR *member, LPVOID heap_free( set ); return E_OUTOFMEMORY; } + set->ns = ns; set->refs = 1;
*ppObj = &set->IWbemQualifierSet_iface; diff --git a/dlls/wbemprox/query.c b/dlls/wbemprox/query.c index ec2a43c3f5f..108e3b4ad81 100644 --- a/dlls/wbemprox/query.c +++ b/dlls/wbemprox/query.c @@ -38,8 +38,8 @@ static HRESULT append_table( struct view *view, struct table *table ) return S_OK; }
-HRESULT create_view( enum view_type type, const WCHAR *path, const struct keyword *keywordlist, const WCHAR *class, - const struct property *proplist, const struct expr *cond, struct view **ret ) +HRESULT create_view( enum view_type type, enum wbm_namespace ns, const WCHAR *path, const struct keyword *keywordlist, + const WCHAR *class, const struct property *proplist, const struct expr *cond, struct view **ret ) { struct view *view = heap_alloc_zero( sizeof(*view) );
@@ -54,7 +54,7 @@ HRESULT create_view( enum view_type type, const WCHAR *path, const struct keywor
case VIEW_TYPE_SELECT: { - struct table *table = grab_table( class ); + struct table *table = grab_table( ns, class ); HRESULT hr;
if (table && (hr = append_table( view, table )) != S_OK) @@ -73,6 +73,7 @@ HRESULT create_view( enum view_type type, const WCHAR *path, const struct keywor }
view->type = type; + view->ns = ns; *ret = view; return S_OK; } @@ -480,13 +481,14 @@ static WCHAR *build_assoc_query( const WCHAR *class, UINT class_len ) return ret; }
-static HRESULT create_assoc_enum( const WCHAR *class, UINT class_len, IEnumWbemClassObject **iter ) +static HRESULT create_assoc_enum( enum wbm_namespace ns, const WCHAR *class, UINT class_len, + IEnumWbemClassObject **iter ) { WCHAR *query; HRESULT hr;
if (!(query = build_assoc_query( class, class_len ))) return E_OUTOFMEMORY; - hr = exec_query( query, iter ); + hr = exec_query( ns, query, iter ); heap_free( query ); return hr; } @@ -547,7 +549,7 @@ static WCHAR *build_canonical_path( const WCHAR *relpath ) return ret; }
-static HRESULT get_antecedent( const WCHAR *assocclass, const WCHAR *dependent, BSTR *ret ) +static HRESULT get_antecedent( enum wbm_namespace ns, const WCHAR *assocclass, const WCHAR *dependent, BSTR *ret ) { WCHAR *fullpath, *str; IEnumWbemClassObject *iter = NULL; @@ -558,7 +560,7 @@ static HRESULT get_antecedent( const WCHAR *assocclass, const WCHAR *dependent,
if (!(fullpath = build_canonical_path( dependent ))) return E_OUTOFMEMORY; if (!(str = build_antecedent_query( assocclass, fullpath ))) goto done; - if ((hr = exec_query( str, &iter )) != S_OK) goto done; + if ((hr = exec_query( ns, str, &iter )) != S_OK) goto done;
IEnumWbemClassObject_Next( iter, WBEM_INFINITE, 1, &obj, &count ); if (!count) @@ -579,13 +581,13 @@ done: return hr; }
-static HRESULT do_query( const WCHAR *str, struct query **ret_query ) +static HRESULT do_query( enum wbm_namespace ns, const WCHAR *str, struct query **ret_query ) { struct query *query; HRESULT hr;
- if (!(query = create_query())) return E_OUTOFMEMORY; - if ((hr = parse_query( str, &query->view, &query->mem )) != S_OK || (hr = execute_view( query->view )) != S_OK) + if (!(query = create_query( ns ))) return E_OUTOFMEMORY; + if ((hr = parse_query( ns, str, &query->view, &query->mem )) != S_OK || (hr = execute_view( query->view )) != S_OK) { release_query( query ); return hr; @@ -594,7 +596,8 @@ static HRESULT do_query( const WCHAR *str, struct query **ret_query ) return S_OK; }
-static HRESULT get_antecedent_table( const WCHAR *assocclass, const WCHAR *dependent, struct table **table ) +static HRESULT get_antecedent_table( enum wbm_namespace ns, const WCHAR *assocclass, const WCHAR *dependent, + struct table **table ) { BSTR antecedent = NULL; struct path *path = NULL; @@ -602,7 +605,7 @@ static HRESULT get_antecedent_table( const WCHAR *assocclass, const WCHAR *depen struct query *query = NULL; HRESULT hr;
- if ((hr = get_antecedent( assocclass, dependent, &antecedent )) != S_OK) return hr; + if ((hr = get_antecedent( ns, assocclass, dependent, &antecedent )) != S_OK) return hr; if (!antecedent) { *table = NULL; @@ -615,7 +618,7 @@ static HRESULT get_antecedent_table( const WCHAR *assocclass, const WCHAR *depen goto done; }
- if ((hr = do_query( str, &query )) != S_OK) goto done; + if ((hr = do_query( ns, str, &query )) != S_OK) goto done; if (query->view->table_count) *table = addref_table( query->view->table[0] ); else *table = NULL;
@@ -636,7 +639,7 @@ static HRESULT exec_assoc_view( struct view *view ) if (view->keywordlist) FIXME( "ignoring keywords\n" ); if ((hr = parse_path( view->path, &path )) != S_OK) return hr;
- if ((hr = create_assoc_enum( path->class, path->class_len, &iter )) != S_OK) goto done; + if ((hr = create_assoc_enum( view->ns, path->class, path->class_len, &iter )) != S_OK) goto done; for (;;) { ULONG count; @@ -654,7 +657,7 @@ static HRESULT exec_assoc_view( struct view *view ) } IWbemClassObject_Release( obj );
- hr = get_antecedent_table( V_BSTR(&var), view->path, &table ); + hr = get_antecedent_table( view->ns, V_BSTR(&var), view->path, &table ); VariantClear( &var ); if (hr != S_OK) goto done;
@@ -735,12 +738,13 @@ HRESULT execute_view( struct view *view ) } }
-struct query *create_query(void) +struct query *create_query( enum wbm_namespace ns ) { struct query *query;
if (!(query = heap_alloc( sizeof(*query) ))) return NULL; list_init( &query->mem ); + query->ns = ns; query->refs = 1; return query; } @@ -766,14 +770,14 @@ void release_query( struct query *query ) if (!InterlockedDecrement( &query->refs )) free_query( query ); }
-HRESULT exec_query( const WCHAR *str, IEnumWbemClassObject **result ) +HRESULT exec_query( enum wbm_namespace ns, const WCHAR *str, IEnumWbemClassObject **result ) { HRESULT hr; struct query *query;
*result = NULL; - if (!(query = create_query())) return E_OUTOFMEMORY; - hr = parse_query( str, &query->view, &query->mem ); + if (!(query = create_query( ns ))) return E_OUTOFMEMORY; + hr = parse_query( ns, str, &query->view, &query->mem ); if (hr != S_OK) goto done; hr = execute_view( query->view ); if (hr != S_OK) goto done; diff --git a/dlls/wbemprox/reg.c b/dlls/wbemprox/reg.c index 5cdd857a48f..361f0ec4b4a 100644 --- a/dlls/wbemprox/reg.c +++ b/dlls/wbemprox/reg.c @@ -129,7 +129,7 @@ HRESULT reg_create_key( IWbemClassObject *obj, IWbemContext *context, IWbemClass hr = IWbemClassObject_Get( in, L"sSubKeyName", 0, &subkey, NULL, NULL ); if (hr != S_OK) return hr;
- hr = create_signature( L"StdRegProv", L"CreateKey", PARAM_OUT, &sig ); + hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"StdRegProv", L"CreateKey", PARAM_OUT, &sig ); if (hr != S_OK) { VariantClear( &subkey ); @@ -228,7 +228,7 @@ HRESULT reg_enum_key( IWbemClassObject *obj, IWbemContext *context, IWbemClassOb hr = IWbemClassObject_Get( in, L"sSubKeyName", 0, &subkey, NULL, NULL ); if (hr != S_OK) return hr;
- hr = create_signature( L"StdRegProv", L"EnumKey", PARAM_OUT, &sig ); + hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"StdRegProv", L"EnumKey", PARAM_OUT, &sig ); if (hr != S_OK) { VariantClear( &subkey ); @@ -339,7 +339,7 @@ HRESULT reg_enum_values( IWbemClassObject *obj, IWbemContext *context, IWbemClas hr = IWbemClassObject_Get( in, L"sSubKeyName", 0, &subkey, NULL, NULL ); if (hr != S_OK) return hr;
- hr = create_signature( L"StdRegProv", L"EnumValues", PARAM_OUT, &sig ); + hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"StdRegProv", L"EnumValues", PARAM_OUT, &sig ); if (hr != S_OK) { VariantClear( &subkey ); @@ -436,7 +436,7 @@ HRESULT reg_get_stringvalue( IWbemClassObject *obj, IWbemContext *context, IWbem return hr; }
- hr = create_signature( L"StdRegProv", L"GetStringValue", PARAM_OUT, &sig ); + hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"StdRegProv", L"GetStringValue", PARAM_OUT, &sig ); if (hr != S_OK) { VariantClear( &name ); @@ -525,7 +525,7 @@ HRESULT reg_set_stringvalue( IWbemClassObject *obj, IWbemContext *context, IWbem return hr; }
- hr = create_signature( L"StdRegProv", L"SetStringValue", PARAM_OUT, &sig ); + hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"StdRegProv", L"SetStringValue", PARAM_OUT, &sig ); if (hr != S_OK) { VariantClear( &name ); @@ -608,7 +608,7 @@ HRESULT reg_set_dwordvalue( IWbemClassObject *obj, IWbemContext *context, IWbemC return hr; }
- hr = create_signature( L"StdRegProv", L"SetDWORDValue", PARAM_OUT, &sig ); + hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"StdRegProv", L"SetDWORDValue", PARAM_OUT, &sig ); if (hr != S_OK) { VariantClear( &name ); @@ -665,7 +665,7 @@ HRESULT reg_delete_key( IWbemClassObject *obj, IWbemContext *context, IWbemClass hr = IWbemClassObject_Get( in, L"sSubKeyName", 0, &subkey, NULL, NULL ); if (hr != S_OK) return hr;
- hr = create_signature( L"StdRegProv", L"DeleteKey", PARAM_OUT, &sig ); + hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"StdRegProv", L"DeleteKey", PARAM_OUT, &sig ); if (hr != S_OK) { VariantClear( &subkey ); diff --git a/dlls/wbemprox/security.c b/dlls/wbemprox/security.c index eee8b09369e..a27cca798f3 100644 --- a/dlls/wbemprox/security.c +++ b/dlls/wbemprox/security.c @@ -140,7 +140,7 @@ HRESULT security_get_sd( IWbemClassObject *obj, IWbemContext *context, IWbemClas
TRACE("%p, %p, %p, %p\n", obj, context, in, out);
- hr = create_signature( L"__SystemSecurity", L"GetSD", PARAM_OUT, &sig ); + hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"__SystemSecurity", L"GetSD", PARAM_OUT, &sig );
if (SUCCEEDED(hr)) { @@ -193,7 +193,7 @@ HRESULT security_set_sd( IWbemClassObject *obj, IWbemContext *context, IWbemClas
FIXME("stub\n");
- hr = create_signature( L"__SystemSecurity", L"SetSD", PARAM_OUT, &sig ); + hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"__SystemSecurity", L"SetSD", PARAM_OUT, &sig );
if (SUCCEEDED(hr)) { diff --git a/dlls/wbemprox/service.c b/dlls/wbemprox/service.c index 1ee0c9903ec..b0b7bce0872 100644 --- a/dlls/wbemprox/service.c +++ b/dlls/wbemprox/service.c @@ -87,7 +87,7 @@ HRESULT service_pause_service( IWbemClassObject *obj, IWbemContext *context, IWb hr = IWbemClassObject_Get( obj, L"Name", 0, &name, NULL, NULL ); if (hr != S_OK) return hr;
- hr = create_signature( L"Win32_Service", L"PauseService", PARAM_OUT, &sig ); + hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"Win32_Service", L"PauseService", PARAM_OUT, &sig ); if (hr != S_OK) { VariantClear( &name ); @@ -132,7 +132,7 @@ HRESULT service_resume_service( IWbemClassObject *obj, IWbemContext *context, IW hr = IWbemClassObject_Get( obj, L"Name", 0, &name, NULL, NULL ); if (hr != S_OK) return hr;
- hr = create_signature( L"Win32_Service", L"ResumeService", PARAM_OUT, &sig ); + hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"Win32_Service", L"ResumeService", PARAM_OUT, &sig ); if (hr != S_OK) { VariantClear( &name ); @@ -201,7 +201,7 @@ HRESULT service_start_service( IWbemClassObject *obj, IWbemContext *context, IWb hr = IWbemClassObject_Get( obj, L"Name", 0, &name, NULL, NULL ); if (hr != S_OK) return hr;
- hr = create_signature( L"Win32_Service", L"StartService", PARAM_OUT, &sig ); + hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"Win32_Service", L"StartService", PARAM_OUT, &sig ); if (hr != S_OK) { VariantClear( &name ); @@ -246,7 +246,7 @@ HRESULT service_stop_service( IWbemClassObject *obj, IWbemContext *context, IWbe hr = IWbemClassObject_Get( obj, L"Name", 0, &name, NULL, NULL ); if (hr != S_OK) return hr;
- hr = create_signature( L"Win32_Service", L"StopService", PARAM_OUT, &sig ); + hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"Win32_Service", L"StopService", PARAM_OUT, &sig ); if (hr != S_OK) { VariantClear( &name ); diff --git a/dlls/wbemprox/services.c b/dlls/wbemprox/services.c index faed31b79af..1c54cf3123e 100644 --- a/dlls/wbemprox/services.c +++ b/dlls/wbemprox/services.c @@ -159,6 +159,7 @@ struct async_header struct async_query { struct async_header hdr; + enum wbm_namespace ns; WCHAR *str; };
@@ -208,7 +209,7 @@ struct wbem_services IWbemServices IWbemServices_iface; LONG refs; CRITICAL_SECTION cs; - WCHAR *namespace; + enum wbm_namespace ns; struct async_header *async; IWbemContext *context; }; @@ -246,7 +247,6 @@ static ULONG WINAPI wbem_services_Release( DeleteCriticalSection( &ws->cs ); if (ws->context) IWbemContext_Release( ws->context ); - heap_free( ws->namespace ); heap_free( ws ); } return refs; @@ -293,10 +293,10 @@ static HRESULT WINAPI wbem_services_OpenNamespace( TRACE("%p, %s, 0x%08x, %p, %p, %p\n", iface, debugstr_w(strNamespace), lFlags, pCtx, ppWorkingNamespace, ppResult);
- if ((wcsicmp( strNamespace, L"cimv2" ) && wcsicmp( strNamespace, L"default" )) || ws->namespace) + if (ws->ns != WBEMPROX_NAMESPACE_LAST || !strNamespace) return WBEM_E_INVALID_NAMESPACE;
- return WbemServices_create( L"cimv2", NULL, (void **)ppWorkingNamespace ); + return WbemServices_create( strNamespace, NULL, (void **)ppWorkingNamespace ); }
static HRESULT WINAPI wbem_services_CancelAsyncCall( @@ -454,18 +454,18 @@ WCHAR *query_from_path( const struct path *path ) return query; }
-static HRESULT create_instance_enum( const struct path *path, IEnumWbemClassObject **iter ) +static HRESULT create_instance_enum( enum wbm_namespace ns, const struct path *path, IEnumWbemClassObject **iter ) { WCHAR *query; HRESULT hr;
if (!(query = query_from_path( path ))) return E_OUTOFMEMORY; - hr = exec_query( query, iter ); + hr = exec_query( ns, query, iter ); heap_free( query ); return hr; }
-HRESULT get_object( const WCHAR *object_path, IWbemClassObject **obj ) +HRESULT get_object( enum wbm_namespace ns, const WCHAR *object_path, IWbemClassObject **obj ) { IEnumWbemClassObject *iter; struct path *path; @@ -475,7 +475,7 @@ HRESULT get_object( const WCHAR *object_path, IWbemClassObject **obj ) hr = parse_path( object_path, &path ); if (hr != S_OK) return hr;
- hr = create_instance_enum( path, &iter ); + hr = create_instance_enum( ns, path, &iter ); if (hr != S_OK) { free_path( path ); @@ -500,15 +500,17 @@ static HRESULT WINAPI wbem_services_GetObject( IWbemClassObject **ppObject, IWbemCallResult **ppCallResult ) { + struct wbem_services *services = impl_from_IWbemServices( iface ); + TRACE("%p, %s, 0x%08x, %p, %p, %p\n", iface, debugstr_w(strObjectPath), lFlags, pCtx, ppObject, ppCallResult);
if (lFlags) FIXME("unsupported flags 0x%08x\n", lFlags);
if (!strObjectPath || !strObjectPath[0]) - return create_class_object( NULL, NULL, 0, NULL, ppObject ); + return create_class_object( services->ns, NULL, NULL, 0, NULL, ppObject );
- return get_object( strObjectPath, ppObject ); + return get_object( services->ns, strObjectPath, ppObject ); }
static HRESULT WINAPI wbem_services_GetObjectAsync( @@ -639,6 +641,7 @@ static HRESULT WINAPI wbem_services_CreateInstanceEnum( IWbemContext *pCtx, IEnumWbemClassObject **ppEnum ) { + struct wbem_services *services = impl_from_IWbemServices( iface ); struct path *path; HRESULT hr;
@@ -649,7 +652,7 @@ static HRESULT WINAPI wbem_services_CreateInstanceEnum( hr = parse_path( strClass, &path ); if (hr != S_OK) return hr;
- hr = create_instance_enum( path, ppEnum ); + hr = create_instance_enum( services->ns, path, ppEnum ); free_path( path ); return hr; } @@ -673,12 +676,14 @@ static HRESULT WINAPI wbem_services_ExecQuery( IWbemContext *pCtx, IEnumWbemClassObject **ppEnum ) { + struct wbem_services *services = impl_from_IWbemServices( iface ); + TRACE("%p, %s, %s, 0x%08x, %p, %p\n", iface, debugstr_w(strQueryLanguage), debugstr_w(strQuery), lFlags, pCtx, ppEnum);
if (!strQueryLanguage || !strQuery || !strQuery[0]) return WBEM_E_INVALID_PARAMETER; if (wcsicmp( strQueryLanguage, L"WQL" )) return WBEM_E_INVALID_QUERY_TYPE; - return exec_query( strQuery, ppEnum ); + return exec_query( services->ns, strQuery, ppEnum ); }
static void async_exec_query( struct async_header *hdr ) @@ -689,7 +694,7 @@ static void async_exec_query( struct async_header *hdr ) ULONG count; HRESULT hr;
- hr = exec_query( query->str, &result ); + hr = exec_query( query->ns, query->str, &result ); if (hr == S_OK) { for (;;) @@ -736,6 +741,7 @@ static HRESULT WINAPI wbem_services_ExecQueryAsync( goto done; } if (!(query = heap_alloc_zero( sizeof(*query) ))) goto done; + query->ns = services->ns; async = (struct async_header *)query;
if (!(init_async( async, sink, async_exec_query ))) @@ -862,12 +868,12 @@ static HRESULT WINAPI wbem_services_ExecMethod( hr = E_OUTOFMEMORY; goto done; } - if (!(query = create_query())) + if (!(query = create_query( services->ns ))) { hr = E_OUTOFMEMORY; goto done; } - hr = parse_query( str, &query->view, &query->mem ); + hr = parse_query( services->ns, str, &query->view, &query->mem ); if (hr != S_OK) goto done;
hr = execute_view( query->view ); @@ -877,7 +883,7 @@ static HRESULT WINAPI wbem_services_ExecMethod( if (hr != S_OK) goto done;
table = get_view_table( query->view, 0 ); - hr = create_class_object( table->name, result, 0, NULL, &obj ); + hr = create_class_object( services->ns, table->name, result, 0, NULL, &obj ); if (hr != S_OK) goto done;
hr = get_method( table, strMethodName, &func ); @@ -940,15 +946,21 @@ static const IWbemServicesVtbl wbem_services_vtbl = HRESULT WbemServices_create( const WCHAR *namespace, IWbemContext *context, LPVOID *ppObj ) { struct wbem_services *ws; + enum wbm_namespace ns; + + TRACE("namespace %s, context %p, ppObj %p.\n", debugstr_w(namespace), context, ppObj);
- TRACE("(%p)\n", ppObj); + if (!namespace) + ns = WBEMPROX_NAMESPACE_LAST; + else if ((ns = get_namespace_from_string( namespace )) == WBEMPROX_NAMESPACE_LAST) + return WBEM_E_INVALID_NAMESPACE;
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->ns = ns; InitializeCriticalSection( &ws->cs ); ws->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": wbemprox_services.cs"); if (context) diff --git a/dlls/wbemprox/sysrestore.c b/dlls/wbemprox/sysrestore.c index f84d9625ae4..44c7c4a98a3 100644 --- a/dlls/wbemprox/sysrestore.c +++ b/dlls/wbemprox/sysrestore.c @@ -54,7 +54,7 @@ HRESULT sysrestore_enable( IWbemClassObject *obj, IWbemContext *context, IWbemCl hr = IWbemClassObject_Get( in, L"Drive", 0, &drive, NULL, NULL ); if (hr != S_OK) return hr;
- hr = create_signature( L"SystemRestore", L"Enable", PARAM_OUT, &sig ); + hr = create_signature( WBEMPROX_NAMESPACE_CIMV2, L"SystemRestore", L"Enable", PARAM_OUT, &sig ); if (hr != S_OK) { VariantClear( &drive ); diff --git a/dlls/wbemprox/table.c b/dlls/wbemprox/table.c index 42971a420ea..02551af6eed 100644 --- a/dlls/wbemprox/table.c +++ b/dlls/wbemprox/table.c @@ -352,11 +352,13 @@ struct table *addref_table( struct table *table ) return table; }
-struct table *grab_table( const WCHAR *name ) +struct table *grab_table( enum wbm_namespace ns, const WCHAR *name ) { struct table *table;
- LIST_FOR_EACH_ENTRY( table, table_list, struct table, entry ) + if (ns == WBEMPROX_NAMESPACE_LAST) return NULL; + + LIST_FOR_EACH_ENTRY( table, table_list[ns], struct table, entry ) { if (name && !wcsicmp( table->name, name )) { @@ -387,11 +389,13 @@ struct table *create_table( const WCHAR *name, UINT num_cols, const struct colum return table; }
-BOOL add_table( struct table *table ) +BOOL add_table( enum wbm_namespace ns, struct table *table ) { struct table *iter;
- LIST_FOR_EACH_ENTRY( iter, table_list, struct table, entry ) + if (ns == WBEMPROX_NAMESPACE_LAST) return FALSE; + + LIST_FOR_EACH_ENTRY( iter, table_list[ns], struct table, entry ) { if (!wcsicmp( iter->name, table->name )) { @@ -399,18 +403,18 @@ BOOL add_table( struct table *table ) return FALSE; } } - list_add_tail( table_list, &table->entry ); + list_add_tail( table_list[ns], &table->entry ); TRACE("added %p\n", table); return TRUE; }
-BSTR get_method_name( const WCHAR *class, UINT index ) +BSTR get_method_name( enum wbm_namespace ns, const WCHAR *class, UINT index ) { struct table *table; UINT i, count = 0; BSTR ret;
- if (!(table = grab_table( class ))) return NULL; + if (!(table = grab_table( ns, class ))) return NULL;
for (i = 0; i < table->num_cols; i++) { diff --git a/dlls/wbemprox/wbemlocator.c b/dlls/wbemprox/wbemlocator.c index 161d9845ca9..dc2a13deda3 100644 --- a/dlls/wbemprox/wbemlocator.c +++ b/dlls/wbemprox/wbemlocator.c @@ -134,8 +134,6 @@ static HRESULT parse_resource( const WCHAR *resource, WCHAR **server, WCHAR **na } q++; len = lstrlenW( q ); - if (wcsicmp( q, L"cimv2" ) && wcsicmp( q, L"default" )) - goto done; if (!(*namespace = heap_alloc( (len + 1) * sizeof(WCHAR) ))) hr = E_OUTOFMEMORY; else { @@ -193,7 +191,7 @@ static HRESULT WINAPI wbem_locator_ConnectServer( if (SUCCEEDED( hr )) return WBEM_NO_ERROR;
- return WBEM_E_FAILED; + return hr; }
static const IWbemLocatorVtbl wbem_locator_vtbl = diff --git a/dlls/wbemprox/wbemprox_private.h b/dlls/wbemprox/wbemprox_private.h index ded413c99a7..cd655e54243 100644 --- a/dlls/wbemprox/wbemprox_private.h +++ b/dlls/wbemprox/wbemprox_private.h @@ -20,8 +20,14 @@ #include "wine/heap.h" #include "wine/list.h"
+enum wbm_namespace +{ + WBEMPROX_NAMESPACE_CIMV2, + WBEMPROX_NAMESPACE_LAST, +}; + extern IClientSecurity client_security DECLSPEC_HIDDEN; -extern struct list *table_list DECLSPEC_HIDDEN; +extern struct list *table_list[WBEMPROX_NAMESPACE_LAST] DECLSPEC_HIDDEN;
enum param_direction { @@ -162,6 +168,7 @@ enum view_type
struct view { + enum wbm_namespace ns; enum view_type type; const WCHAR *path; /* ASSOCIATORS OF query */ const struct keyword *keywordlist; @@ -176,6 +183,7 @@ struct view struct query { LONG refs; + enum wbm_namespace ns; struct view *view; struct list mem; }; @@ -192,24 +200,25 @@ HRESULT parse_path( const WCHAR *, struct path ** ) DECLSPEC_HIDDEN; void free_path( struct path * ) DECLSPEC_HIDDEN; WCHAR *query_from_path( const struct path * ) DECLSPEC_HIDDEN;
-struct query *create_query(void) DECLSPEC_HIDDEN; +struct query *create_query( enum wbm_namespace ) DECLSPEC_HIDDEN; void free_query( struct query * ) DECLSPEC_HIDDEN; struct query *addref_query( struct query * ) DECLSPEC_HIDDEN; void release_query( struct query *query ) DECLSPEC_HIDDEN; -HRESULT exec_query( const WCHAR *, IEnumWbemClassObject ** ) DECLSPEC_HIDDEN; -HRESULT parse_query( const WCHAR *, struct view **, struct list * ) DECLSPEC_HIDDEN; -HRESULT create_view( enum view_type, const WCHAR *, const struct keyword *, const WCHAR *, const struct property *, - const struct expr *, struct view ** ) DECLSPEC_HIDDEN; +HRESULT exec_query( enum wbm_namespace, const WCHAR *, IEnumWbemClassObject ** ) DECLSPEC_HIDDEN; +HRESULT parse_query( enum wbm_namespace, const WCHAR *, struct view **, struct list * ) DECLSPEC_HIDDEN; +HRESULT create_view( enum view_type, enum wbm_namespace, const WCHAR *, const struct keyword *, const WCHAR *, + const struct property *, const struct expr *, struct view ** ) DECLSPEC_HIDDEN; void destroy_view( struct view * ) DECLSPEC_HIDDEN; HRESULT execute_view( struct view * ) DECLSPEC_HIDDEN; struct table *get_view_table( const struct view *, UINT ) DECLSPEC_HIDDEN; void init_table_list( void ) DECLSPEC_HIDDEN; -struct table *grab_table( const WCHAR * ) DECLSPEC_HIDDEN; +enum wbm_namespace get_namespace_from_string( const WCHAR *namespace ) DECLSPEC_HIDDEN; +struct table *grab_table( enum wbm_namespace, const WCHAR * ) DECLSPEC_HIDDEN; struct table *addref_table( struct table * ) DECLSPEC_HIDDEN; void release_table( struct table * ) DECLSPEC_HIDDEN; struct table *create_table( const WCHAR *, UINT, const struct column *, UINT, UINT, BYTE *, enum fill_status (*)(struct table *, const struct expr *) ) DECLSPEC_HIDDEN; -BOOL add_table( struct table * ) DECLSPEC_HIDDEN; +BOOL add_table( enum wbm_namespace, struct table * ) DECLSPEC_HIDDEN; void free_columns( struct column *, UINT ) DECLSPEC_HIDDEN; void free_row_values( const struct table *, UINT ) DECLSPEC_HIDDEN; void clear_table( struct table * ) DECLSPEC_HIDDEN; @@ -230,19 +239,19 @@ VARTYPE to_vartype( CIMTYPE ) DECLSPEC_HIDDEN; void destroy_array( struct array *, CIMTYPE ) DECLSPEC_HIDDEN; BOOL is_result_prop( const struct view *, const WCHAR * ) DECLSPEC_HIDDEN; HRESULT get_properties( const struct view *, UINT, LONG, SAFEARRAY ** ) DECLSPEC_HIDDEN; -HRESULT get_object( const WCHAR *, IWbemClassObject ** ) DECLSPEC_HIDDEN; -BSTR get_method_name( const WCHAR *, UINT ) DECLSPEC_HIDDEN; +HRESULT get_object( enum wbm_namespace ns, const WCHAR *, IWbemClassObject ** ) DECLSPEC_HIDDEN; +BSTR get_method_name( enum wbm_namespace ns, const WCHAR *, UINT ) DECLSPEC_HIDDEN; void set_variant( VARTYPE, LONGLONG, void *, VARIANT * ) DECLSPEC_HIDDEN; -HRESULT create_signature( const WCHAR *, const WCHAR *, enum param_direction, +HRESULT create_signature( enum wbm_namespace ns, const WCHAR *, const WCHAR *, enum param_direction, IWbemClassObject ** ) DECLSPEC_HIDDEN;
HRESULT WbemLocator_create(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, +HRESULT create_class_object(enum wbm_namespace ns, const WCHAR *, IEnumWbemClassObject *, UINT, struct record *, IWbemClassObject **) DECLSPEC_HIDDEN; HRESULT EnumWbemClassObject_create(struct query *, LPVOID *) DECLSPEC_HIDDEN; -HRESULT WbemQualifierSet_create(const WCHAR *, const WCHAR *, LPVOID *) DECLSPEC_HIDDEN; +HRESULT WbemQualifierSet_create(enum wbm_namespace, const WCHAR *, const WCHAR *, LPVOID *) DECLSPEC_HIDDEN;
HRESULT process_get_owner(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; HRESULT process_create(IWbemClassObject *obj, IWbemContext *context, IWbemClassObject *in, IWbemClassObject **out) DECLSPEC_HIDDEN; diff --git a/dlls/wbemprox/wql.y b/dlls/wbemprox/wql.y index 4d9333f9c17..7a6d7cf505c 100644 --- a/dlls/wbemprox/wql.y +++ b/dlls/wbemprox/wql.y @@ -38,6 +38,7 @@ struct parser HRESULT error; struct view **view; struct list *mem; + enum wbm_namespace ns; };
struct string @@ -289,7 +290,7 @@ associatorsof: struct parser *parser = ctx; struct view *view;
- hr = create_view( VIEW_TYPE_ASSOCIATORS, $3, NULL, NULL, NULL, NULL, &view ); + hr = create_view( VIEW_TYPE_ASSOCIATORS, ctx->ns, $3, NULL, NULL, NULL, NULL, &view ); if (hr != S_OK) { ctx->error = hr; @@ -304,7 +305,7 @@ associatorsof: struct parser *parser = ctx; struct view *view;
- hr = create_view( VIEW_TYPE_ASSOCIATORS, $3, $5, NULL, NULL, NULL, &view ); + hr = create_view( VIEW_TYPE_ASSOCIATORS, ctx->ns, $3, $5, NULL, NULL, NULL, &view ); if (hr != S_OK) { ctx->error = hr; @@ -322,7 +323,7 @@ select: struct parser *parser = ctx; struct view *view;
- hr = create_view( VIEW_TYPE_SELECT, NULL, NULL, $3, NULL, NULL, &view ); + hr = create_view( VIEW_TYPE_SELECT, ctx->ns, NULL, NULL, $3, NULL, NULL, &view ); if (hr != S_OK) { ctx->error = hr; @@ -337,7 +338,7 @@ select: struct parser *parser = ctx; struct view *view;
- hr = create_view( VIEW_TYPE_SELECT, NULL, NULL, $4, $2, NULL, &view ); + hr = create_view( VIEW_TYPE_SELECT, ctx->ns, NULL, NULL, $4, $2, NULL, &view ); if (hr != S_OK) { ctx->error = hr; @@ -352,7 +353,7 @@ select: struct parser *parser = ctx; struct view *view;
- hr = create_view( VIEW_TYPE_SELECT, NULL, NULL, $4, $2, $6, &view ); + hr = create_view( VIEW_TYPE_SELECT, ctx->ns, NULL, NULL, $4, $2, $6, &view ); if (hr != S_OK) { ctx->error = hr; @@ -594,7 +595,7 @@ const_val:
%%
-HRESULT parse_query( const WCHAR *str, struct view **view, struct list *mem ) +HRESULT parse_query( enum wbm_namespace ns, const WCHAR *str, struct view **view, struct list *mem ) { struct parser parser; int ret; @@ -607,6 +608,7 @@ HRESULT parse_query( const WCHAR *str, struct view **view, struct list *mem ) parser.error = WBEM_E_INVALID_QUERY; parser.view = view; parser.mem = mem; + parser.ns = ns;
ret = wql_parse( &parser ); TRACE("wql_parse returned %d\n", ret);