Module: wine Branch: master Commit: bf021af0eedc30cc8c6cc77b090563218f4ee989 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bf021af0eedc30cc8c6cc77b09...
Author: Hans Leidekker hans@codeweavers.com Date: Fri Aug 7 08:36:20 2009 +0200
advapi32: Add a basic implementation of LsaLookupNames2.
---
dlls/advapi32/lsa.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 77 insertions(+), 8 deletions(-)
diff --git a/dlls/advapi32/lsa.c b/dlls/advapi32/lsa.c index ffc7cfd..66727ba 100644 --- a/dlls/advapi32/lsa.c +++ b/dlls/advapi32/lsa.c @@ -299,19 +299,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; + (*sids)[i].Flags = 0; + + 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; + + 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; }