Thomas Faber : wbemprox: Implement Win32_ComputerSystem.UserName.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Feb 23 09:04:44 CST 2015


Module: wine
Branch: master
Commit: 00b2461ba98a7006bdd43ec2bf0c70412d8c3561
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=00b2461ba98a7006bdd43ec2bf0c70412d8c3561

Author: Thomas Faber <thomas.faber at reactos.org>
Date:   Sun Feb 22 22:23:12 2015 +0100

wbemprox: Implement Win32_ComputerSystem.UserName.

---

 dlls/wbemprox/builtin.c     | 25 ++++++++++++++++++++++++-
 dlls/wbemprox/tests/query.c | 22 ++++++++++++++++++++--
 2 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c
index 6ead196..e9c95ac 100644
--- a/dlls/wbemprox/builtin.c
+++ b/dlls/wbemprox/builtin.c
@@ -306,6 +306,8 @@ static const WCHAR prop_typeW[] =
     {'T','y','p','e',0};
 static const WCHAR prop_uniqueidW[] =
     {'U','n','i','q','u','e','I','d',0};
+static const WCHAR prop_usernameW[] =
+    {'U','s','e','r','N','a','m','e',0};
 static const WCHAR prop_uuidW[] =
     {'U','U','I','D',0};
 static const WCHAR prop_varianttypeW[] =
@@ -358,7 +360,8 @@ static const struct column col_compsys[] =
     { prop_nameW,                 CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_numlogicalprocessorsW, CIM_UINT32, VT_I4 },
     { prop_numprocessorsW,        CIM_UINT32, VT_I4 },
-    { prop_totalphysicalmemoryW,  CIM_UINT64 }
+    { prop_totalphysicalmemoryW,  CIM_UINT64 },
+    { prop_usernameW,             CIM_STRING }
 };
 static const struct column col_compsysproduct[] =
 {
@@ -705,6 +708,7 @@ struct record_computersystem
     UINT32       num_logical_processors;
     UINT32       num_processors;
     UINT64       total_physical_memory;
+    const WCHAR *username;
 };
 struct record_computersystemproduct
 {
@@ -1128,6 +1132,24 @@ static WCHAR *get_computername(void)
     return ret;
 }
 
+static WCHAR *get_username(void)
+{
+    WCHAR *ret;
+    DWORD compsize, usersize;
+    DWORD size;
+
+    compsize = 0;
+    GetComputerNameW( NULL, &compsize );
+    usersize = 0;
+    GetUserNameW( NULL, &usersize );
+    size = compsize + usersize; /* two null terminators account for the \ */
+    if (!(ret = heap_alloc( size * sizeof(WCHAR) ))) return NULL;
+    GetComputerNameW( ret, &compsize );
+    ret[compsize] = '\\';
+    GetUserNameW( ret + compsize + 1, &usersize );
+    return ret;
+}
+
 static enum fill_status fill_compsys( struct table *table, const struct expr *cond )
 {
     struct record_computersystem *rec;
@@ -1146,6 +1168,7 @@ static enum fill_status fill_compsys( struct table *table, const struct expr *co
     rec->num_logical_processors = get_logical_processor_count( NULL );
     rec->num_processors         = get_processor_count();
     rec->total_physical_memory  = get_total_physical_memory();
+    rec->username               = get_username();
     if (!match_row( table, row, cond, &status )) free_row_values( table, row );
     else row++;
 
diff --git a/dlls/wbemprox/tests/query.c b/dlls/wbemprox/tests/query.c
index bdac50d..7e031d2 100644
--- a/dlls/wbemprox/tests/query.c
+++ b/dlls/wbemprox/tests/query.c
@@ -344,6 +344,8 @@ static void test_Win32_Process( IWbemServices *services )
 static void test_Win32_ComputerSystem( IWbemServices *services )
 {
     static const WCHAR nameW[] = {'N','a','m','e',0};
+    static const WCHAR usernameW[] = {'U','s','e','r','N','a','m','e',0};
+    static const WCHAR backslashW[] = {'\\',0};
     static const WCHAR queryW[] =
         {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
          'C','o','m','p','u','t','e','r','S','y','s','t','e','m',0};
@@ -354,15 +356,22 @@ static void test_Win32_ComputerSystem( IWbemServices *services )
     CIMTYPE type;
     HRESULT hr;
     WCHAR compname[MAX_COMPUTERNAME_LENGTH + 1];
+    WCHAR username[128];
     DWORD len, count;
 
     len = sizeof(compname) / sizeof(compname[0]);
     if (!GetComputerNameW( compname, &len ))
         compname[0] = 0;
 
-    if (!compname[0])
+    lstrcpyW( username, compname );
+    lstrcatW( username, backslashW );
+    len = sizeof(username) / sizeof(username[0]) - lstrlenW( username );
+    if (!GetUserNameW( username + lstrlenW( username ), &len ))
+        username[0] = 0;
+
+    if (!compname[0] || !username[0])
     {
-        skip( "Failed to get computer name\n" );
+        skip( "Failed to get user or computer name\n" );
         return;
     }
 
@@ -385,6 +394,15 @@ static void test_Win32_ComputerSystem( IWbemServices *services )
     ok( !lstrcmpiW( V_BSTR( &value ), compname ), "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value)), wine_dbgstr_w(compname) );
     VariantClear( &value );
 
+    type = 0xdeadbeef;
+    VariantInit( &value );
+    hr = IWbemClassObject_Get( service, usernameW, 0, &value, &type, NULL );
+    ok( hr == S_OK, "failed to get computer name %08x\n", hr );
+    ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
+    ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
+    ok( !lstrcmpiW( V_BSTR( &value ), username ), "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value)), wine_dbgstr_w(username) );
+    VariantClear( &value );
+
     IWbemClassObject_Release( service );
     IEnumWbemClassObject_Release( result );
     SysFreeString( query );




More information about the wine-cvs mailing list