From: Katharina Bogad <katharina@hacked.xyz> WINE manages two sessions; Services and Console. Since support for more sessions is currently non-existent, hardcode both sessions. --- dlls/wtsapi32/tests/wtsapi.c | 2 +- dlls/wtsapi32/wtsapi32.c | 37 +++++++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/dlls/wtsapi32/tests/wtsapi.c b/dlls/wtsapi32/tests/wtsapi.c index 49d74b42afc..60ee705b57b 100644 --- a/dlls/wtsapi32/tests/wtsapi.c +++ b/dlls/wtsapi32/tests/wtsapi.c @@ -430,7 +430,7 @@ static void test_WTSEnumerateSessions(void) } } ok(console_found, "Console session not found.\n"); - todo_wine ok(services_found, "Services session not found.\n"); + ok(services_found, "Services session not found.\n"); WTSFreeMemory(info); WTSFreeMemory(infoA); diff --git a/dlls/wtsapi32/wtsapi32.c b/dlls/wtsapi32/wtsapi32.c index 0a2e25bb9cd..306f43bcc53 100644 --- a/dlls/wtsapi32/wtsapi32.c +++ b/dlls/wtsapi32/wtsapi32.c @@ -348,26 +348,41 @@ BOOL WINAPI WTSEnumerateSessionsA(HANDLE server, DWORD reserved, DWORD version, BOOL WINAPI WTSEnumerateSessionsW(HANDLE server, DWORD reserved, DWORD version, PWTS_SESSION_INFOW *session_info, DWORD *count) { - static const WCHAR session_name[] = L"Console"; + static const WCHAR interactive_session_name[] = L"Console"; + static const WCHAR service_session_name[] = L"Services"; + PWTS_SESSION_INFOW sessions; + size_t next_string_offset = 2 * sizeof(**session_info); FIXME("%p 0x%08lx 0x%08lx %p %p semi-stub.\n", server, reserved, version, session_info, count); if (!session_info || !count) return FALSE; - if (!(*session_info = malloc(sizeof(**session_info) + sizeof(session_name)))) + if (!(*session_info = malloc(2 * sizeof(**session_info) + sizeof(interactive_session_name) + sizeof(service_session_name)))) { SetLastError(ERROR_OUTOFMEMORY); return FALSE; } - if (!ProcessIdToSessionId( GetCurrentProcessId(), &(*session_info)->SessionId)) - { - WTSFreeMemory(*session_info); - return FALSE; - } - *count = 1; - (*session_info)->State = WTSActive; - (*session_info)->pWinStationName = (WCHAR *)((char *)*session_info + sizeof(**session_info)); - memcpy((*session_info)->pWinStationName, session_name, sizeof(session_name)); + + /* As per discussion in IRC, we hardcode the console and server session. + * If WINE ever supports multiple users, this probably needs to query smss.exe. */ + + *count = 2; + + sessions = *session_info; + + /* Services session; has session ID 0 */ + sessions[0].SessionId = 0; + sessions[0].State = WTSDisconnected; + sessions[0].pWinStationName = (WCHAR *)((char *)*session_info + next_string_offset); + memcpy(sessions[0].pWinStationName, service_session_name, sizeof(service_session_name)); + + next_string_offset += sizeof(service_session_name); + + /* Console session; WINE sets this to session ID 1 */ + sessions[1].SessionId = 1; + sessions[1].State = WTSActive; + sessions[1].pWinStationName = (WCHAR*)((char *)*session_info + next_string_offset); + memcpy(sessions[1].pWinStationName, interactive_session_name, sizeof(interactive_session_name)); return TRUE; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9843