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:
parent
5d92cf7dbf
commit
1db2b56336
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************
|
/************************************************************
|
||||||
|
|
Loading…
Reference in New Issue