[PATCH v5 0/2] MR907: secur32: Implement basic functionality for LsaGetLogonSessionData.
This basic implementation is sufficient to fix .NET applications that use System.Security.Principal.WindowsIdentity.AuthenticationType. -- v5: secur32: Implement basic functionality for LsaGetLogonSessionData. https://gitlab.winehq.org/wine/wine/-/merge_requests/907
From: Owen Rudge <orudge(a)codeweavers.com> --- dlls/secur32/tests/main.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/dlls/secur32/tests/main.c b/dlls/secur32/tests/main.c index 36ed02ab467..9b148a5368f 100644 --- a/dlls/secur32/tests/main.c +++ b/dlls/secur32/tests/main.c @@ -26,6 +26,7 @@ #include <windef.h> #include <winbase.h> #include <sspi.h> +#include <ntsecapi.h> #include "wine/test.h" @@ -244,6 +245,42 @@ static void testQuerySecurityPackageInfo(void) ok(pkg_info == (void *)0xdeadbeef, "wrong pkg_info address %p\n", pkg_info); } +static void test_get_logon_session_data(void) +{ + SECURITY_LOGON_SESSION_DATA *data = NULL; + TOKEN_STATISTICS ts; + HANDLE thread_hdl; + NTSTATUS status; + DWORD ret_len; + BOOL ret; + + ret = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &thread_hdl); + ok(ret, "got %ld\n", GetLastError()); + + if (!ret) return; + + ret_len = sizeof(TOKEN_STATISTICS); + ret = GetTokenInformation(thread_hdl, TokenStatistics, &ts, sizeof(TOKEN_STATISTICS), &ret_len); + ok(ret, "got %ld\n", GetLastError()); + + if (!ret) goto cleanup; + + status = LsaGetLogonSessionData(&ts.AuthenticationId, &data); + todo_wine ok(!status, "got %08lx\n", status); + + if (status) goto cleanup; + + ok(data->Size >= sizeof(SECURITY_LOGON_SESSION_DATA), "Size == %ld\n", data->Size); + ok(!memcmp(&data->LogonId, &ts.AuthenticationId, sizeof(LUID)), "LogonId mismatch\n"); + + /* We can't easily verify the content of the various logon parameters, so just ensure data is present */ + ok(data->AuthenticationPackage.Length > 0, "AuthenticationPackage missing\n"); + +cleanup: + CloseHandle(thread_hdl); + if (data != NULL) LsaFreeReturnBuffer(data); +} + START_TEST(main) { InitFunctionPtrs(); @@ -260,4 +297,6 @@ START_TEST(main) } if(secdll) FreeLibrary(secdll); + + test_get_logon_session_data(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/907
From: Owen Rudge <orudge(a)codeweavers.com> --- dlls/secur32/lsa.c | 29 ++++++++++++++++++++++++++--- dlls/secur32/tests/main.c | 2 +- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/dlls/secur32/lsa.c b/dlls/secur32/lsa.c index 9368d3728e4..3cbd49e6b0e 100644 --- a/dlls/secur32/lsa.c +++ b/dlls/secur32/lsa.c @@ -43,6 +43,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(secur32); #define LSA_MAGIC_CREDENTIALS ('L' << 24 | 'S' << 16 | 'A' << 8 | '1') #define LSA_MAGIC_CONTEXT ('L' << 24 | 'S' << 16 | 'A' << 8 | '2') +static const WCHAR *default_authentication_package = L"Negotiate"; + struct lsa_package { ULONG package_id; @@ -157,9 +159,30 @@ NTSTATUS WINAPI LsaFreeReturnBuffer(PVOID buffer) NTSTATUS WINAPI LsaGetLogonSessionData(PLUID LogonId, PSECURITY_LOGON_SESSION_DATA* ppLogonSessionData) { - FIXME("%p %p stub\n", LogonId, ppLogonSessionData); - *ppLogonSessionData = NULL; - return STATUS_NOT_IMPLEMENTED; + SECURITY_LOGON_SESSION_DATA *data; + int authpkg_len; + WCHAR *end; + + FIXME("%p %p semi-stub\n", LogonId, ppLogonSessionData); + + authpkg_len = wcslen(default_authentication_package) * sizeof(WCHAR); + + data = calloc(1, sizeof(*data) + authpkg_len + sizeof(WCHAR)); + if (!data) return STATUS_NO_MEMORY; + + data->Size = sizeof(*data); + data->LogonId = *LogonId; + + end = (WCHAR *)(data + 1); + wcscpy(end, default_authentication_package); + + data->AuthenticationPackage.Length = authpkg_len; + data->AuthenticationPackage.MaximumLength = authpkg_len + sizeof(WCHAR); + data->AuthenticationPackage.Buffer = end; + + *ppLogonSessionData = data; + + return STATUS_SUCCESS; } NTSTATUS WINAPI LsaLogonUser(HANDLE LsaHandle, PLSA_STRING OriginName, diff --git a/dlls/secur32/tests/main.c b/dlls/secur32/tests/main.c index 9b148a5368f..46a62c8ea02 100644 --- a/dlls/secur32/tests/main.c +++ b/dlls/secur32/tests/main.c @@ -266,7 +266,7 @@ static void test_get_logon_session_data(void) if (!ret) goto cleanup; status = LsaGetLogonSessionData(&ts.AuthenticationId, &data); - todo_wine ok(!status, "got %08lx\n", status); + ok(!status, "got %08lx\n", status); if (status) goto cleanup; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/907
On Thu Sep 22 09:32:22 2022 +0000, Owen Rudge wrote:
changed this line in [version 5 of the diff](/wine/wine/-/merge_requests/907/diffs?diff_id=11858&start_sha=1812003ad74401de5d6662b03d7c96fbf8c1d4a9#60daaa93dcfa008e12b12bad94263cac3567b021_172_173) Thanks, now done.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/907#note_9049
This merge request was approved by Hans Leidekker. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/907
participants (3)
-
Hans Leidekker (@hans) -
Owen Rudge -
Owen Rudge (@orudge)