[1/5] advapi32: Break well known sid handling out of LookupAccountNameW and into a helper function.

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


Based on a patch set by Aric Stewart.

 -Hans

diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index e1cbb1a..c5a8b18 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -2653,44 +2653,55 @@ static BOOL lookup_computer_account_name(PSID Sid, PDWORD cbSid, LPWSTR Referenc
     return ret;
 }
 
-/******************************************************************************
- * LookupAccountNameW [ADVAPI32.@]
+static void split_domain_account(LPCWSTR lpAccountName, DWORD accountNameLen,
+                                 LPCWSTR *lpAccountNamePtr, DWORD *accountLen,
+                                 LPCWSTR *lpDomainNamePtr, DWORD *domainLen)
+{
+    *lpDomainNamePtr = NULL;
+    *domainLen = 0;
+    *accountLen = accountNameLen;
+
+    if ((*lpAccountNamePtr = strrchrW(lpAccountName,'\\')))
+    {
+        *domainLen = *lpAccountNamePtr - lpAccountName;
+        (*lpAccountNamePtr)++;
+        *lpDomainNamePtr = lpAccountName;
+        *accountLen = accountNameLen - (*domainLen) - 1;
+    }
+    else
+        *lpAccountNamePtr = lpAccountName;
+}
+
+
+/*
+ * Helper function for LookupAccountNameW
  */
-BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSID Sid,
-                                LPDWORD cbSid, LPWSTR ReferencedDomainName,
-                                LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse )
+
+static BOOL lookup_local_wellknown_name(LPCWSTR lpAccountName, DWORD ccAccountName,
+                                 PSID Sid, LPDWORD cbSid,
+                                 LPWSTR ReferencedDomainName,
+                                 LPDWORD cchReferencedDomainName,
+                                 PSID_NAME_USE peUse, BOOL *handled)
 {
-    BOOL ret;
+    int i;
     PSID pSid;
-    unsigned int i;
-    DWORD nameLen;
-    LPWSTR userName = NULL;
     LPCWSTR domainName;
+    DWORD nameLen;
+    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;
-    }
-
-    if (!lpAccountName || !strcmpW(lpAccountName, Blank))
-    {
-        lpAccountName = BUILTIN;
-    }
-
-    /* Check well known SIDs first */
-    if ((lpAccountNamePtr = strrchrW(lpAccountName,'\\')))
-    {
-        lpAccountNamePtr++;
-        lpDomainNamePtr = lpAccountName;
-    }
+    *handled = FALSE;
+    if (ccAccountName != -1)
+        accountLen = ccAccountName;
     else
-        lpAccountNamePtr = lpAccountName;
+        accountLen = lstrlenW(lpAccountName);
+
+    split_domain_account(lpAccountName, accountLen,
+                         &lpAccountNamePtr, &accountLen,
+                         &lpDomainNamePtr, &domainLen);
 
     for (i = 0; i < (sizeof(ACCOUNT_SIDS) / sizeof(ACCOUNT_SIDS[0])); i++)
     {
@@ -2698,8 +2709,8 @@ BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSI
         if (lpDomainNamePtr && (strncmpiW(lpDomainNamePtr, ACCOUNT_SIDS[i].domain, strlenW(ACCOUNT_SIDS[i].domain)) || lpDomainNamePtr[strlenW(ACCOUNT_SIDS[i].domain)]!='\\'))
             continue;
 
-        if (!strcmpiW(lpAccountNamePtr, ACCOUNT_SIDS[i].account) ||
-            (ACCOUNT_SIDS[i].alias && !strcmpiW(lpAccountNamePtr, ACCOUNT_SIDS[i].alias)))
+        if ((!strncmpiW(lpAccountNamePtr, ACCOUNT_SIDS[i].account,accountLen) && ACCOUNT_SIDS[i].account[accountLen] == 0) ||
+            (ACCOUNT_SIDS[i].alias && !strncmpiW(lpAccountNamePtr, ACCOUNT_SIDS[i].alias,accountLen) && ACCOUNT_SIDS[i].alias[accountLen] == 0))
         {
             DWORD sidLen = SECURITY_MAX_SID_SIZE;
 
@@ -2745,11 +2756,55 @@ BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSI
 
             HeapFree(GetProcessHeap(), 0, pSid);
 
+            *handled = TRUE;
             return ret;
         }
     }
+    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;
+    DWORD nameLen;
+    LPWSTR userName = NULL;
+    LPCWSTR lpAccountNamePtr;
+    LPCWSTR lpDomainNamePtr = NULL;
+
+    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;
 
     /* 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;
 



More information about the wine-patches mailing list