wtsapi32: Implement WTSQuerySessionInformationA.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49178
Signed-off-by: Gijs Vermeulen <gijsvrm@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Gijs Vermeulen 2020-05-28 15:59:26 +02:00 committed by Alexandre Julliard
parent 5d92cf7dbf
commit 1db2b56336
2 changed files with 72 additions and 18 deletions

View File

@ -90,19 +90,47 @@ static void test_WTSEnumerateProcessesW(void)
WTSFreeMemory(info); WTSFreeMemory(info);
} }
static void test_WTSQuerySessionInformationW(void) static void test_WTSQuerySessionInformation(void)
{ {
BOOL ret; BOOL ret;
WCHAR *buf; WCHAR *buf1;
char *buf2;
DWORD count; DWORD count;
count = 0; count = 0;
buf = NULL; buf1 = NULL;
ret = WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSUserName, &buf, &count); ret = WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSUserName, &buf1, &count);
ok(ret, "got %u\n", GetLastError()); ok(ret, "got %u\n", GetLastError());
ok(buf != NULL, "buf not set\n"); ok(buf1 != NULL, "buf not set\n");
ok(count == (lstrlenW(buf) + 1) * sizeof(WCHAR), "got %u\n", count); ok(count == (lstrlenW(buf1) + 1) * sizeof(WCHAR), "expected %u, got %u\n", (lstrlenW(buf1) + 1) * sizeof(WCHAR), count);
WTSFreeMemory(buf); WTSFreeMemory(buf1);
SetLastError(0xdeadbeef);
count = 0;
ret = WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSUserName, NULL, &count);
ok(!ret, "got %u\n", GetLastError());
ok(count == 0, "got %u\n", count);
ok(GetLastError() == ERROR_INVALID_USER_BUFFER, "got %u\n", GetLastError());
SetLastError(0xdeadbeef);
count = 1;
ret = WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSUserName, NULL, &count);
ok(!ret, "got %u\n", GetLastError());
ok(count == 1, "got %u\n", count);
ok(GetLastError() == ERROR_INVALID_USER_BUFFER, "got %u\n", GetLastError());
SetLastError(0xdeadbeef);
ret = WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSUserName, &buf2, NULL);
ok(!ret, "got %u\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_USER_BUFFER, "got %u\n", GetLastError());
count = 0;
buf2 = NULL;
ret = WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSUserName, &buf2, &count);
ok(ret, "got %u\n", GetLastError());
ok(buf2 != NULL, "buf not set\n");
ok(count == lstrlenA(buf2) + 1, "expected %u, got %u\n", lstrlenA(buf2) + 1, count);
WTSFreeMemory(buf2);
} }
static void test_WTSQueryUserToken(void) static void test_WTSQueryUserToken(void)
@ -118,6 +146,6 @@ static void test_WTSQueryUserToken(void)
START_TEST (wtsapi) START_TEST (wtsapi)
{ {
test_WTSEnumerateProcessesW(); test_WTSEnumerateProcessesW();
test_WTSQuerySessionInformationW(); test_WTSQuerySessionInformation();
test_WTSQueryUserToken(); test_WTSQueryUserToken();
} }

View File

@ -19,6 +19,7 @@
#include <stdlib.h> #include <stdlib.h>
#include "windef.h" #include "windef.h"
#include "winbase.h" #include "winbase.h"
#include "winnls.h"
#include "wtsapi32.h" #include "wtsapi32.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "wine/heap.h" #include "wine/heap.h"
@ -287,18 +288,43 @@ HANDLE WINAPI WTSOpenServerW(LPWSTR pServerName)
/************************************************************ /************************************************************
* WTSQuerySessionInformationA (WTSAPI32.@) * WTSQuerySessionInformationA (WTSAPI32.@)
*/ */
BOOL WINAPI WTSQuerySessionInformationA( BOOL WINAPI WTSQuerySessionInformationA(HANDLE server, DWORD session_id, WTS_INFO_CLASS class, char **buffer, DWORD *count)
HANDLE hServer,
DWORD SessionId,
WTS_INFO_CLASS WTSInfoClass,
LPSTR* Buffer,
DWORD* BytesReturned)
{ {
/* FIXME: Forward request to winsta.dll::WinStationQueryInformationA */ WCHAR *bufferW = NULL;
FIXME("Stub %p 0x%08x %d %p %p\n", hServer, SessionId, WTSInfoClass,
Buffer, BytesReturned);
return FALSE; TRACE("%p 0x%08x %d %p %p\n", server, session_id, class, buffer, count);
if (!buffer || !count)
{
SetLastError(ERROR_INVALID_USER_BUFFER);
return FALSE;
}
if (!WTSQuerySessionInformationW(server, session_id, class, &bufferW, count))
return FALSE;
*count = WideCharToMultiByte(CP_ACP, 0, bufferW, -1, NULL, 0, NULL, NULL);
if (!*count)
{
WTSFreeMemory(bufferW);
return FALSE;
}
if (!(*buffer = heap_alloc(*count)))
{
WTSFreeMemory(bufferW);
return FALSE;
}
if (!(*count = WideCharToMultiByte(CP_ACP, 0, bufferW, -1, *buffer, *count, NULL, NULL)))
{
WTSFreeMemory(bufferW);
heap_free(*buffer);
return FALSE;
}
WTSFreeMemory(bufferW);
return TRUE;
} }
/************************************************************ /************************************************************