[2/5] advapi32: Break local username parsing out of LookupAccountNameW and into a helper function.

Hans Leidekker hans at codeweavers.com
Wed Jul 22 04:54:28 CDT 2009


diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index c5a8b18..8905a44 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -2763,48 +2763,32 @@ static BOOL lookup_local_wellknown_name(LPCWSTR lpAccountName, DWORD ccAccountNa
     return ret;
 }
 
-/******************************************************************************
- * LookupAccountNameW [ADVAPI32.@]
- */
-BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSID Sid,
-                                LPDWORD cbSid, LPWSTR ReferencedDomainName,
-                                LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse )
+static BOOL lookup_local_user_name(LPCWSTR lpAccountName, DWORD ccAccountName,
+                            PSID Sid, LPDWORD cbSid,
+                            LPWSTR ReferencedDomainName,
+                            LPDWORD cchReferencedDomainName,
+                            PSID_NAME_USE peUse, BOOL *handled)
 {
-    BOOL ret, handled;
     DWORD nameLen;
     LPWSTR userName = NULL;
+    DWORD accountLen;
+    DWORD domainLen;
     LPCWSTR lpAccountNamePtr;
     LPCWSTR lpDomainNamePtr = NULL;
+    BOOL ret = TRUE;
 
-    FIXME("%s %s %p %p %p %p %p - stub\n", debugstr_w(lpSystemName), debugstr_w(lpAccountName),
-          Sid, cbSid, ReferencedDomainName, cchReferencedDomainName, peUse);
-
-    if (!ADVAPI_IsLocalComputer(lpSystemName))
-    {
-        SetLastError(RPC_S_SERVER_UNAVAILABLE);
-        return FALSE;
-    }
+    *handled = FALSE;
 
-    if (!lpAccountName || !strcmpW(lpAccountName, Blank))
-    {
-        lpAccountName = BUILTIN;
-    }
+    if (ccAccountName != -1)
+        accountLen = ccAccountName;
+    else
+        accountLen = lstrlenW(lpAccountName);
 
-    /* Check well known SIDs first */
-    ret = lookup_local_wellknown_name(lpAccountName, -1, Sid, cbSid,
-                                 ReferencedDomainName, cchReferencedDomainName,
-                                 peUse, &handled);
-    if (handled)
-        return ret;
+    split_domain_account(lpAccountName, accountLen,
+                         &lpAccountNamePtr, &accountLen,
+                         &lpDomainNamePtr, &domainLen);
 
     /* Let the current Unix user id masquerade as first Windows user account */
-    if ((lpAccountNamePtr = strrchrW(lpAccountName,'\\')))
-    {
-        lpAccountNamePtr++;
-        lpDomainNamePtr = lpAccountName;
-    }
-    else
-        lpAccountNamePtr = lpAccountName;
 
     nameLen = UNLEN + 1;
 
@@ -2822,27 +2806,68 @@ BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSI
     }
 
     if (GetUserNameW(userName, &nameLen) && !strcmpW(lpAccountNamePtr, userName))
+    {
         ret = lookup_user_account_name(Sid, cbSid, ReferencedDomainName,
                                        cchReferencedDomainName, peUse);
+        *handled = TRUE;
+    }
     else
     {
         nameLen = UNLEN + 1;
         if (GetComputerNameW(userName, &nameLen) && !strcmpW(lpAccountNamePtr, userName))
+        {
             ret = lookup_computer_account_name(Sid, cbSid, ReferencedDomainName,
                                                cchReferencedDomainName, peUse);
-        else
-        {
-            SetLastError(ERROR_NONE_MAPPED);
-            ret = FALSE;
+            *handled = TRUE;
         }
     }
 
     HeapFree(GetProcessHeap(), 0, userName);
-
     return ret;
 }
 
 /******************************************************************************
+ * LookupAccountNameW [ADVAPI32.@]
+ */
+BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSID Sid,
+                                LPDWORD cbSid, LPWSTR ReferencedDomainName,
+                                LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse )
+{
+    BOOL ret, handled;
+
+    FIXME("%s %s %p %p %p %p %p - stub\n", debugstr_w(lpSystemName), debugstr_w(lpAccountName),
+          Sid, cbSid, ReferencedDomainName, cchReferencedDomainName, peUse);
+
+    if (!ADVAPI_IsLocalComputer(lpSystemName))
+    {
+        SetLastError(RPC_S_SERVER_UNAVAILABLE);
+        return FALSE;
+    }
+
+    if (!lpAccountName || !strcmpW(lpAccountName, Blank))
+    {
+        lpAccountName = BUILTIN;
+    }
+
+    /* Check well known SIDs first */
+    ret = lookup_local_wellknown_name(lpAccountName, -1, Sid, cbSid,
+                                 ReferencedDomainName, cchReferencedDomainName,
+                                 peUse, &handled);
+    if (handled)
+        return ret;
+
+    /* Check user names */
+    ret = lookup_local_user_name(lpAccountName, -1, Sid, cbSid,
+                               ReferencedDomainName, cchReferencedDomainName,
+                               peUse, &handled);
+    if (handled)
+        return ret;
+
+    SetLastError(ERROR_NONE_MAPPED);
+    return FALSE;
+}
+
+/******************************************************************************
  * PrivilegeCheck [ADVAPI32.@]
  */
 BOOL WINAPI PrivilegeCheck( HANDLE ClientToken, PPRIVILEGE_SET RequiredPrivileges, LPBOOL pfResult)



More information about the wine-patches mailing list