Dmitry Timoshkov : advapi32: Implement LsaGetUserName.
Alexandre Julliard
julliard at winehq.org
Tue Nov 10 15:30:25 CST 2020
Module: wine
Branch: master
Commit: b940c5e7c91bff963336dd7d2c4defc3a82c75a1
URL: https://source.winehq.org/git/wine.git/?a=commit;h=b940c5e7c91bff963336dd7d2c4defc3a82c75a1
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Tue Nov 10 20:53:08 2020 +0300
advapi32: Implement LsaGetUserName.
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/advapi32/advapi32.spec | 2 +-
dlls/advapi32/lsa.c | 58 +++++++++++++++++++++++++++++++++++++++++++++
dlls/advapi32/tests/lsa.c | 50 +++++++++++++++++++++++++++++++++++++-
3 files changed, 108 insertions(+), 2 deletions(-)
diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec
index fcef859a7c1..d5235c6adb9 100644
--- a/dlls/advapi32/advapi32.spec
+++ b/dlls/advapi32/advapi32.spec
@@ -463,7 +463,7 @@
# @ stub LsaGetQuotasForAccount
# @ stub LsaGetRemoteUserName
@ stub LsaGetSystemAccessAccount
-# @ stub LsaGetUserName
+@ stdcall LsaGetUserName(ptr ptr)
@ stub LsaICLookupNames
# @ stub LsaICLookupNamesWithCreds
@ stub LsaICLookupSids
diff --git a/dlls/advapi32/lsa.c b/dlls/advapi32/lsa.c
index bd3585f8d06..55e42400c6d 100644
--- a/dlls/advapi32/lsa.c
+++ b/dlls/advapi32/lsa.c
@@ -104,6 +104,64 @@ static void* ADVAPI_GetDomainName(unsigned sz, unsigned ofs)
return ptr;
}
+/******************************************************************************
+ * LsaGetUserName [ADVAPI32.@]
+ *
+ */
+NTSTATUS WINAPI LsaGetUserName(PUNICODE_STRING *user_name, PUNICODE_STRING *domain_name)
+{
+ UNICODE_STRING *user;
+ DWORD user_size;
+
+ user_size = 0;
+ if (GetUserNameW(NULL, &user_size) || GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+ return STATUS_UNSUCCESSFUL;
+
+ user = heap_alloc(sizeof(*user) + user_size * sizeof(WCHAR));
+ if (!user) return STATUS_NO_MEMORY;
+
+ user->Buffer = (WCHAR *)(user + 1);
+ user->MaximumLength = user_size * sizeof(WCHAR);
+ user->Length = user->MaximumLength - sizeof(WCHAR);
+ if (!GetUserNameW(user->Buffer, &user_size))
+ {
+ heap_free(user);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ if (domain_name)
+ {
+ UNICODE_STRING *domain;
+ WCHAR computer[MAX_COMPUTERNAME_LENGTH + 1];
+ DWORD domain_size;
+
+ domain_size = ARRAY_SIZE(computer);
+ if (!GetComputerNameW(computer, &domain_size))
+ {
+ heap_free(user);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ domain = heap_alloc(sizeof(*domain) + (domain_size + 1) * sizeof(WCHAR));
+ if (!domain)
+ {
+ heap_free(user);
+ return STATUS_NO_MEMORY;
+ }
+
+ domain->Buffer = (WCHAR *)(domain + 1);
+ domain->Length = domain_size * sizeof(WCHAR);
+ domain->MaximumLength = domain->Length + sizeof(WCHAR);
+ wcscpy(domain->Buffer, computer);
+
+ *domain_name = domain;
+ }
+
+ *user_name = user;
+
+ return STATUS_SUCCESS;
+}
+
/******************************************************************************
* LsaAddAccountRights [ADVAPI32.@]
*
diff --git a/dlls/advapi32/tests/lsa.c b/dlls/advapi32/tests/lsa.c
index 54a8528bc21..f8c822a7de2 100644
--- a/dlls/advapi32/tests/lsa.c
+++ b/dlls/advapi32/tests/lsa.c
@@ -2,6 +2,7 @@
* Unit tests for lsa functions
*
* Copyright (c) 2006 Robert Reif
+ * Copyright (c) 2020 Dmitry Timoshkov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -38,6 +39,7 @@
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
static BOOL (WINAPI *pGetSystemPreferredUILanguages)(DWORD, ULONG*, WCHAR*, ULONG*);
+static NTSTATUS (WINAPI *pLsaGetUserName)(PUNICODE_STRING *user, PUNICODE_STRING *domain);
static void test_lsa(void)
{
@@ -463,13 +465,59 @@ static void test_LsaLookupPrivilegeName(void)
LsaFreeMemory(name);
}
+static void test_LsaGetUserName(void)
+{
+ NTSTATUS status;
+ BOOL ret;
+ UNICODE_STRING *lsa_user, *lsa_domain;
+ WCHAR user[256], computer[256];
+ DWORD size;
+
+ if (!pLsaGetUserName)
+ {
+ skip("LsaGetUserName is not available on this platform\n");
+ return;
+ }
+
+ size = ARRAY_SIZE(user);
+ ret = GetUserNameW(user, &size);
+ ok(ret, "GetUserName error %u\n", GetLastError());
+
+ size = ARRAY_SIZE(computer);
+ ret = GetComputerNameW(computer, &size);
+ ok(ret, "GetComputerName error %u\n", GetLastError());
+
+ if (0) /* crashes under Windows */
+ status = pLsaGetUserName(NULL, NULL);
+
+ if (0) /* crashes under Windows */
+ status = pLsaGetUserName(NULL, &lsa_domain);
+
+ status = pLsaGetUserName(&lsa_user, NULL);
+ ok(!status, "got %#x\n", status);
+ check_unicode_string(lsa_user, user);
+ LsaFreeMemory(lsa_user);
+
+ status = pLsaGetUserName(&lsa_user, &lsa_domain);
+ ok(!status, "got %#x\n", status);
+ ok(!lstrcmpW(user, lsa_user->Buffer), "%s != %s\n", wine_dbgstr_w(user), wine_dbgstr_wn(lsa_user->Buffer, lsa_user->Length/sizeof(WCHAR)));
+ check_unicode_string(lsa_user, user);
+ check_unicode_string(lsa_domain, computer);
+ LsaFreeMemory(lsa_user);
+ LsaFreeMemory(lsa_domain);
+}
+
START_TEST(lsa)
{
- HMODULE hkernel32 = GetModuleHandleA("kernel32");
+ HMODULE hkernel32 = GetModuleHandleA("kernel32.dll");
+ HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
+
pGetSystemPreferredUILanguages = (void*)GetProcAddress(hkernel32, "GetSystemPreferredUILanguages");
+ pLsaGetUserName = (void *)GetProcAddress(hadvapi32, "LsaGetUserName");
test_lsa();
test_LsaLookupNames2();
test_LsaLookupSids();
test_LsaLookupPrivilegeName();
+ test_LsaGetUserName();
}
More information about the wine-cvs
mailing list