Hans Leidekker : netapi32: Add support for info level 20 in NetUserEnum.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Mar 16 10:34:24 CDT 2015


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Mon Mar 16 10:57:41 2015 +0100

netapi32: Add support for info level 20 in NetUserEnum.

---

 dlls/netapi32/netapi32.c | 97 +++++++++++++++++++++++++++++++++---------------
 1 file changed, 67 insertions(+), 30 deletions(-)

diff --git a/dlls/netapi32/netapi32.c b/dlls/netapi32/netapi32.c
index 3823fa9..f7701e3 100644
--- a/dlls/netapi32/netapi32.c
+++ b/dlls/netapi32/netapi32.c
@@ -2291,9 +2291,8 @@ NetUserEnum(LPCWSTR servername, DWORD level, DWORD filter, LPBYTE* bufptr,
             LPDWORD resume_handle)
 {
     NET_API_STATUS status;
-    USER_INFO_0 *info;
-    WCHAR *user;
-    DWORD size;
+    WCHAR user[UNLEN + 1];
+    DWORD size, len = sizeof(user)/sizeof(user[0]);
 
     TRACE("(%s, %u, 0x%x, %p, %u, %p, %p, %p)\n", debugstr_w(servername), level,
           filter, bufptr, prefmaxlen, entriesread, totalentries, resume_handle);
@@ -2309,43 +2308,81 @@ NetUserEnum(LPCWSTR servername, DWORD level, DWORD filter, LPBYTE* bufptr,
         return NERR_InvalidComputer;
     }
 
-    if (level)
+    if (!GetUserNameW(user, &len)) return GetLastError();
+
+    switch (level)
     {
-        FIXME("level %u not supported\n", level);
-        return ERROR_INVALID_LEVEL;
-    }
+    case 0:
+    {
+        USER_INFO_0 *info;
 
-    size = UNLEN + 1;
-    status = NetApiBufferAllocate(size * sizeof(WCHAR), (void **)&user);
-    if (status != NERR_Success)
-        return status;
+        size = sizeof(*info) + (strlenW(user) + 1) * sizeof(WCHAR);
 
-    if (!GetUserNameW(user, &size))
-    {
-        NetApiBufferFree(user);
-        return ERROR_NOT_ENOUGH_MEMORY;
-    }
+        if (prefmaxlen < size)
+            status = ERROR_MORE_DATA;
+        else
+            status = NetApiBufferAllocate(size, (void **)&info);
 
-    size = sizeof(*info) + (strlenW(user) + 1) * sizeof(WCHAR);
+        if (status != NERR_Success)
+            return status;
 
-    if (prefmaxlen < size)
-        status = ERROR_MORE_DATA;
-    else
-        status = NetApiBufferAllocate(size, (void **)&info);
+        info->usri0_name = (WCHAR *)((char *)info + sizeof(*info));
+        strcpyW(info->usri0_name, user);
 
-    if (status != NERR_Success)
-    {
-        NetApiBufferFree(user);
-        return status;
+        *bufptr = (BYTE *)info;
+        *entriesread = *totalentries = 1;
+        break;
     }
+    case 20:
+    {
+        USER_INFO_20 *info;
+        SID *sid;
+        UCHAR *count;
+        DWORD *rid;
+        SID_NAME_USE use;
 
-    info->usri0_name = (WCHAR *)((char *)info + sizeof(*info));
-    strcpyW(info->usri0_name, user);
+        size = sizeof(*info) + (strlenW(user) + 1) * sizeof(WCHAR);
 
-    *bufptr = (BYTE *)info;
-    *entriesread = *totalentries = 1;
+        if (prefmaxlen < size)
+            status = ERROR_MORE_DATA;
+        else
+            status = NetApiBufferAllocate(size, (void **)&info);
+
+        if (status != NERR_Success)
+            return status;
+
+        size = len = 0;
+        LookupAccountNameW(NULL, user, NULL, &size, NULL, &len, &use);
+        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+            return GetLastError();
+
+        status = NetApiBufferAllocate(size, (void **)&sid);
+        if (status != NERR_Success)
+            return status;
 
-    NetApiBufferFree(user);
+        if (!LookupAccountNameW(NULL, user, sid, &size, NULL, &len, &use))
+            return GetLastError();
+
+        count = GetSidSubAuthorityCount(sid);
+        rid = GetSidSubAuthority(sid, *count - 1);
+
+        info->usri20_name      = (WCHAR *)((char *)info + sizeof(*info));
+        strcpyW(info->usri20_name, user);
+        info->usri20_full_name = NULL;
+        info->usri20_comment   = NULL;
+        info->usri20_flags     = UF_NORMAL_ACCOUNT;
+        info->usri20_user_id   = *rid;
+
+        *bufptr = (BYTE *)info;
+        *entriesread = *totalentries = 1;
+
+        NetApiBufferFree(sid);
+        break;
+    }
+    default:
+        FIXME("level %u not supported\n", level);
+        return ERROR_INVALID_LEVEL;
+    }
     return NERR_Success;
 }
 




More information about the wine-cvs mailing list