[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