forked from Mirrors/wine-wine
advapi32: Return the string SID if LookupAccountSid() fails.
Based on a patch by Qian Hong. Signed-off-by: Zebediah Figura <z.figura12@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>feature/deterministic
parent
e291fb4dc9
commit
ee01244434
|
@ -29,6 +29,7 @@
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "winreg.h"
|
#include "winreg.h"
|
||||||
#include "winternl.h"
|
#include "winternl.h"
|
||||||
|
#include "sddl.h"
|
||||||
#include "advapi32_misc.h"
|
#include "advapi32_misc.h"
|
||||||
|
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
@ -486,6 +487,7 @@ NTSTATUS WINAPI LsaLookupSids(
|
||||||
WCHAR *name_buffer;
|
WCHAR *name_buffer;
|
||||||
char *domain_data;
|
char *domain_data;
|
||||||
SID_NAME_USE use;
|
SID_NAME_USE use;
|
||||||
|
WCHAR *strsid;
|
||||||
|
|
||||||
TRACE("(%p, %u, %p, %p, %p)\n", PolicyHandle, Count, Sids, ReferencedDomains, Names);
|
TRACE("(%p, %u, %p, %p, %p)\n", PolicyHandle, Count, Sids, ReferencedDomains, Names);
|
||||||
|
|
||||||
|
@ -561,6 +563,14 @@ NTSTATUS WINAPI LsaLookupSids(
|
||||||
domain.MaximumLength = sizeof(WCHAR);
|
domain.MaximumLength = sizeof(WCHAR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (ConvertSidToStringSidW(Sids[i], &strsid))
|
||||||
|
{
|
||||||
|
(*Names)[i].Name.Length = strlenW(strsid) * sizeof(WCHAR);
|
||||||
|
(*Names)[i].Name.MaximumLength = (strlenW(strsid) + 1) * sizeof(WCHAR);
|
||||||
|
name_fullsize += (strlenW(strsid) + 1) * sizeof(WCHAR);
|
||||||
|
|
||||||
|
LocalFree(strsid);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now we have full length needed for both */
|
/* now we have full length needed for both */
|
||||||
|
@ -577,6 +587,8 @@ NTSTATUS WINAPI LsaLookupSids(
|
||||||
{
|
{
|
||||||
name_size = domain_size = 0;
|
name_size = domain_size = 0;
|
||||||
|
|
||||||
|
(*Names)[i].Name.Buffer = name_buffer;
|
||||||
|
|
||||||
if (!LookupAccountSidW(NULL, Sids[i], NULL, &name_size, NULL, &domain_size, &use) &&
|
if (!LookupAccountSidW(NULL, Sids[i], NULL, &name_size, NULL, &domain_size, &use) &&
|
||||||
GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||||
{
|
{
|
||||||
|
@ -596,15 +608,19 @@ NTSTATUS WINAPI LsaLookupSids(
|
||||||
|
|
||||||
domain.Buffer = heap_alloc(domain.MaximumLength);
|
domain.Buffer = heap_alloc(domain.MaximumLength);
|
||||||
|
|
||||||
(*Names)[i].Name.Buffer = name_buffer;
|
|
||||||
LookupAccountSidW(NULL, Sids[i], (*Names)[i].Name.Buffer, &name_size, domain.Buffer, &domain_size, &use);
|
LookupAccountSidW(NULL, Sids[i], (*Names)[i].Name.Buffer, &name_size, domain.Buffer, &domain_size, &use);
|
||||||
(*Names)[i].Use = use;
|
(*Names)[i].Use = use;
|
||||||
|
|
||||||
(*Names)[i].DomainIndex = lsa_reflist_add_domain(*ReferencedDomains, &domain, &domain_data);
|
(*Names)[i].DomainIndex = lsa_reflist_add_domain(*ReferencedDomains, &domain, &domain_data);
|
||||||
heap_free(domain.Buffer);
|
heap_free(domain.Buffer);
|
||||||
}
|
}
|
||||||
|
else if (ConvertSidToStringSidW(Sids[i], &strsid))
|
||||||
|
{
|
||||||
|
strcpyW((*Names)[i].Name.Buffer, strsid);
|
||||||
|
LocalFree(strsid);
|
||||||
|
}
|
||||||
|
|
||||||
name_buffer += name_size;
|
name_buffer += strlenW(name_buffer) + 1;
|
||||||
}
|
}
|
||||||
TRACE("mapped %u out of %u\n", mapped, Count);
|
TRACE("mapped %u out of %u\n", mapped, Count);
|
||||||
|
|
||||||
|
|
|
@ -403,6 +403,7 @@ static void test_LsaLookupSids(void)
|
||||||
|
|
||||||
ok(names[0].Use == SidTypeUnknown, "got type %u\n", names[0].Use);
|
ok(names[0].Use == SidTypeUnknown, "got type %u\n", names[0].Use);
|
||||||
ok(names[0].DomainIndex == -1, "got index %u\n", names[0].DomainIndex);
|
ok(names[0].DomainIndex == -1, "got index %u\n", names[0].DomainIndex);
|
||||||
|
check_unicode_string(&names[0].Name, L"S-1-1234-5678-1234-5678");
|
||||||
|
|
||||||
LsaFreeMemory(names);
|
LsaFreeMemory(names);
|
||||||
LsaFreeMemory(list);
|
LsaFreeMemory(list);
|
||||||
|
|
Loading…
Reference in New Issue