This basic implementation is sufficient to fix .NET applications that use System.Security.Principal.WindowsIdentity.AuthenticationType.
-- v5: secur32: Implement basic functionality for LsaGetLogonSessionData.
From: Owen Rudge orudge@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(); }
From: Owen Rudge orudge@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;
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.
This merge request was approved by Hans Leidekker.