Piotr Caban : wbemprox: Support specifying server and namespace in WbemServices functions.
Alexandre Julliard
julliard at winehq.org
Tue Oct 16 15:53:06 CDT 2018
Module: wine
Branch: master
Commit: ff4f1c2e3ad3c0e08cbfe820fa1b4906eb6f1b56
URL: https://source.winehq.org/git/wine.git/?a=commit;h=ff4f1c2e3ad3c0e08cbfe820fa1b4906eb6f1b56
Author: Piotr Caban <piotr at codeweavers.com>
Date: Mon Oct 15 19:59:21 2018 +0200
wbemprox: Support specifying server and namespace in WbemServices functions.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wbemprox/services.c | 35 +++++++++++++++++++++++++++++++++--
dlls/wbemprox/tests/query.c | 27 ++++++++++++++++++++++-----
2 files changed, 55 insertions(+), 7 deletions(-)
diff --git a/dlls/wbemprox/services.c b/dlls/wbemprox/services.c
index fd87feb..fa1386f 100644
--- a/dlls/wbemprox/services.c
+++ b/dlls/wbemprox/services.c
@@ -338,15 +338,46 @@ static HRESULT parse_path( const WCHAR *str, struct path **ret )
if (!(path = heap_alloc_zero( sizeof(*path) ))) return E_OUTOFMEMORY;
+ if (*p == '\\')
+ {
+ static const WCHAR cimv2W[] = {'R','O','O','T','\\','C','I','M','V','2'};
+
+ WCHAR server[MAX_COMPUTERNAME_LENGTH+1];
+ DWORD server_len = ARRAY_SIZE(server);
+
+ p++;
+ if (*p != '\\') return WBEM_E_INVALID_OBJECT_PATH;
+ p++;
+
+ q = p;
+ while (*p && *p != '\\') p++;
+ if (!*p) return WBEM_E_INVALID_OBJECT_PATH;
+
+ len = p - q;
+ if (!GetComputerNameW( server, &server_len ) || server_len != len
+ || memcmp( q, server, server_len * sizeof(WCHAR) ))
+ return WBEM_E_NOT_SUPPORTED;
+
+ q = ++p;
+ while (*p && *p != ':') p++;
+ if (!*p) return WBEM_E_INVALID_OBJECT_PATH;
+
+ len = p - q;
+ if (len != ARRAY_SIZE(cimv2W) || memcmp( q, cimv2W, sizeof(cimv2W) ))
+ return WBEM_E_INVALID_NAMESPACE;
+ p++;
+ }
+
+ q = p;
while (*p && *p != '.') p++;
- len = p - str;
+ len = p - q;
if (!(path->class = heap_alloc( (len + 1) * sizeof(WCHAR) )))
{
heap_free( path );
return E_OUTOFMEMORY;
}
- memcpy( path->class, str, len * sizeof(WCHAR) );
+ memcpy( path->class, q, len * sizeof(WCHAR) );
path->class[len] = 0;
path->class_len = len;
diff --git a/dlls/wbemprox/tests/query.c b/dlls/wbemprox/tests/query.c
index 387952d..168c290 100644
--- a/dlls/wbemprox/tests/query.c
+++ b/dlls/wbemprox/tests/query.c
@@ -398,7 +398,7 @@ static void test_Win32_Bios( IWbemServices *services )
SysFreeString( wql );
}
-static void test_Win32_Process( IWbemServices *services )
+static void test_Win32_Process( IWbemServices *services, BOOL use_full_path )
{
static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
static const WCHAR getownerW[] = {'G','e','t','O','w','n','e','r',0};
@@ -408,18 +408,33 @@ static void test_Win32_Process( IWbemServices *services )
static const WCHAR idW[] = {'I','D',0};
static const WCHAR fmtW[] = {'W','i','n','3','2','_','P','r','o','c','e','s','s','.',
'H','a','n','d','l','e','=','"','%','u','"',0};
+ static const WCHAR full_path_fmt[] =
+ {'\\','\\','%','s','\\','R','O','O','T','\\','C','I','M','V','2',':',0};
static const LONG expected_flavor = WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE |
WBEM_FLAVOR_NOT_OVERRIDABLE |
WBEM_FLAVOR_ORIGIN_PROPAGATED;
+ WCHAR full_path[MAX_COMPUTERNAME_LENGTH + ARRAY_SIZE(full_path_fmt)];
BSTR class, method;
IWbemClassObject *process, *out;
IWbemQualifierSet *qualifiers;
VARIANT user, domain, retval, val;
+ DWORD full_path_len = 0;
LONG flavor;
CIMTYPE type;
HRESULT hr;
- class = SysAllocString( processW );
+ if (use_full_path)
+ {
+ WCHAR server[MAX_COMPUTERNAME_LENGTH+1];
+
+ full_path_len = ARRAY_SIZE(server);
+ ok( GetComputerNameW(server, &full_path_len), "GetComputerName failed\n" );
+ full_path_len = wsprintfW(full_path, full_path_fmt, server);
+ }
+
+ class = SysAllocStringLen( NULL, full_path_len + ARRAY_SIZE( processW ) );
+ memcpy( class, full_path, full_path_len * sizeof(WCHAR) );
+ memcpy( class + full_path_len, processW, sizeof(processW) );
hr = IWbemServices_GetObject( services, class, 0, NULL, &process, NULL );
SysFreeString( class );
if (hr != S_OK)
@@ -433,8 +448,9 @@ static void test_Win32_Process( IWbemServices *services )
out = NULL;
method = SysAllocString( getownerW );
- class = SysAllocStringLen( NULL, ARRAY_SIZE( fmtW ) + 10 );
- wsprintfW( class, fmtW, GetCurrentProcessId() );
+ class = SysAllocStringLen( NULL, full_path_len + ARRAY_SIZE( fmtW ) + 10 );
+ memcpy( class, full_path, full_path_len * sizeof(WCHAR) );
+ wsprintfW( class + full_path_len, fmtW, GetCurrentProcessId() );
hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
ok( hr == S_OK, "failed to execute method %08x\n", hr );
SysFreeString( method );
@@ -1860,7 +1876,8 @@ START_TEST(query)
test_select( services );
test_associators( services );
test_Win32_Bios( services );
- test_Win32_Process( services );
+ test_Win32_Process( services, FALSE );
+ test_Win32_Process( services, TRUE );
test_Win32_Service( services );
test_Win32_ComputerSystem( services );
test_Win32_SystemEnclosure( services );
More information about the wine-cvs
mailing list