wbemprox: Prepare for multiple namespaces.

Signed-off-by: Paul Gofman <pgofman@codeweavers.com>
Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Paul Gofman 2021-09-13 17:13:27 +03:00 committed by Alexandre Julliard
parent 3113d64f73
commit 73d8cc3281
15 changed files with 190 additions and 123 deletions

View File

@ -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 (i = 0; i < ARRAY_SIZE(builtin_classes); i++) list_add_tail( &tables, &builtin_classes[i].entry );
table_list = &tables;
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;
return WBEMPROX_NAMESPACE_LAST;
}

View File

@ -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;

View File

@ -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 );

View File

@ -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( &current_directory );

View File

@ -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;

View File

@ -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;

View File

@ -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 );

View File

@ -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))
{

View File

@ -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 );

View File

@ -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("(%p)\n", ppObj);
TRACE("namespace %s, context %p, ppObj %p.\n", debugstr_w(namespace), context, 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)

View File

@ -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 );

View File

@ -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++)
{

View File

@ -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 =

View File

@ -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;

View File

@ -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);