[2/4] advapi32: Add a basic implementation of LsaLookupNames2.

Hans Leidekker hans at codeweavers.com
Tue Aug 4 05:21:57 CDT 2009


diff --git a/dlls/advapi32/lsa.c b/dlls/advapi32/lsa.c
index 315cce9..edb20d8 100644
--- a/dlls/advapi32/lsa.c
+++ b/dlls/advapi32/lsa.c
@@ -297,19 +297,88 @@ NTSTATUS WINAPI LsaLookupNames(
     return STATUS_NONE_MAPPED;
 }
 
+static BOOL lookup_name(LSA_UNICODE_STRING *name, SID *sid, DWORD *sid_size, WCHAR *domain,
+                        DWORD *domain_size, SID_NAME_USE *use, BOOL *handled)
+{
+    BOOL ret;
+
+    ret = lookup_local_wellknown_name(name, sid, sid_size, domain, domain_size, use, handled);
+    if (!handled)
+        ret = lookup_local_user_name(name, sid, sid_size, domain, domain_size, use, handled);
+
+    return ret;
+}
+
 /******************************************************************************
  * LsaLookupNames2 [ADVAPI32.@]
  *
  */
-NTSTATUS WINAPI LsaLookupNames2(
-    LSA_HANDLE policy,
-    ULONG flags,
-    ULONG count,
-    PLSA_UNICODE_STRING names,
-    PLSA_REFERENCED_DOMAIN_LIST *domains,
-    PLSA_TRANSLATED_SID2 *sids)
+NTSTATUS WINAPI LsaLookupNames2( LSA_HANDLE policy, ULONG flags, ULONG count,
+                                 PLSA_UNICODE_STRING names, PLSA_REFERENCED_DOMAIN_LIST *domains,
+                                 PLSA_TRANSLATED_SID2 *sids)
 {
-    FIXME("(%p,0x%08x,0x%08x,%p,%p,%p) stub\n", policy, flags, count, names, domains, sids);
+    ULONG i, sid_size_total = 0, domain_size_total = 0, size, num_domains;
+    ULONG sid_size, domain_size, mapped;
+    BOOL ret, handled = FALSE;
+    SID_NAME_USE use;
+    SID *sid;
+
+    TRACE("(%p,0x%08x,0x%08x,%p,%p,%p)\n", policy, flags, count, names, domains, sids);
+
+    mapped = num_domains = 0;
+    for (i = 0; i < count; i++)
+    {
+        handled = FALSE;
+        sid_size = domain_size = 0;
+        ret = lookup_name(&names[i], NULL, &sid_size, NULL, &domain_size, &use, &handled);
+        if (handled)
+        {
+            sid_size_total += sid_size;
+            if (domain_size)
+            {
+                FIXME("domain not handled\n");
+                domain_size_total += domain_size;
+                num_domains++;
+            }
+            mapped++;
+        }
+    }
+    TRACE("mapped %u out of %u\n", mapped, count);
+
+    size = sizeof(LSA_TRANSLATED_SID2) * count + sid_size_total;
+    if (!(*sids = HeapAlloc(GetProcessHeap(), 0, size))) return STATUS_NO_MEMORY;
+
+    sid = (SID *)*sids + sizeof(LSA_TRANSLATED_SID2) * mapped;
+
+    if (!(*domains = HeapAlloc(GetProcessHeap(), 0, sizeof(LSA_REFERENCED_DOMAIN_LIST))))
+    {
+        HeapFree(GetProcessHeap(), 0, *sids);
+        return STATUS_NO_MEMORY;
+    }
+    (*domains)->Entries = 0;
+    (*domains)->Domains = NULL;
+
+    for (i = 0; i < count; i++)
+    {
+        (*sids)[i].Use = SidTypeUnknown;
+        (*sids)[i].DomainIndex = -1;
+
+        handled = FALSE;
+        sid_size = sid_size_total;
+        ret = lookup_name(&names[i], sid, &sid_size, NULL, &domain_size, &use, &handled);
+        if (handled)
+        {
+            (*sids)[i].Sid = sid;
+            (*sids)[i].Use = use;
+            (*sids)[i].Flags = 0;
+
+            sid += sid_size;
+            sid_size_total -= sid_size;
+        }
+    }
+
+    if (mapped == count) return STATUS_SUCCESS;
+    if (mapped > 0 && mapped < count) return STATUS_SOME_NOT_MAPPED;
     return STATUS_NONE_MAPPED;
 }
 



More information about the wine-patches mailing list