Author: tfaber
Date: Tue Oct 4 15:14:30 2016
New Revision: 72900
URL:
http://svn.reactos.org/svn/reactos?rev=72900&view=rev
Log:
[USER32_APITEST]
- Extend GetUserObjectInformation tests by adding tests for UOI_NAME on the default as
well as custom window stations/desktops.
CORE-12073
Modified:
trunk/rostests/apitests/user32/GetUserObjectInformation.c
Modified: trunk/rostests/apitests/user32/GetUserObjectInformation.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/GetUserOb…
==============================================================================
--- trunk/rostests/apitests/user32/GetUserObjectInformation.c [iso-8859-1] (original)
+++ trunk/rostests/apitests/user32/GetUserObjectInformation.c [iso-8859-1] Tue Oct 4
15:14:30 2016
@@ -6,9 +6,11 @@
*/
#include <apitest.h>
+#include <wingdi.h>
#include <winuser.h>
#include <ndk/mmfuncs.h>
#include <ndk/pstypes.h>
+#include <strsafe.h>
static
BOOLEAN
@@ -117,6 +119,36 @@
ok(_Error == ERROR_NOACCESS, "Error = %lu\n", _Error);
\
} while (0)
+#define TestUserObjectInfoWithString(Handle, Index, Buffer, BufferSize, String) do
\
+ {
\
+ BOOLEAN _Check;
\
+ ULONG SizeOfString = wcslen(String) * sizeof(WCHAR) + sizeof(UNICODE_NULL);
\
+ TestUserObjectInfo(Handle, Index, NULL, 0,
FALSE, ERROR_INSUFFICIENT_BUFFER, SizeOfString); \
+ TestUserObjectInfo(Handle, Index, (PVOID)1, 0,
FALSE, ERROR_INSUFFICIENT_BUFFER, SizeOfString); \
+ TestUserObjectInfo(Handle, Index, NULL, 1,
FALSE, ERROR_NOACCESS, NOTSET); \
+ TestUserObjectInfo(Handle, Index, (PVOID)1, 1,
FALSE, ERROR_NOACCESS, NOTSET); \
+ RtlFillMemory(Buffer, BufferSize, 0x55);
\
+ TestUserObjectInfo(Handle, Index, Buffer, SizeOfString - 2,
FALSE, ERROR_INSUFFICIENT_BUFFER, SizeOfString); \
+ _Check = CheckBuffer(Buffer, BufferSize, 0x55);
\
+ ok(_Check == TRUE, "CheckBuffer failed\n");
\
+ RtlFillMemory(Buffer, BufferSize, 0x55);
\
+ TestUserObjectInfo(Handle, Index, Buffer, SizeOfString - 1,
FALSE, ERROR_INSUFFICIENT_BUFFER, SizeOfString); \
+ _Check = CheckBuffer(Buffer, BufferSize, 0x55);
\
+ ok(_Check == TRUE, "CheckBuffer failed\n");
\
+ RtlFillMemory(Buffer, BufferSize, 0x55);
\
+ Buffer[BufferSize / sizeof(WCHAR) - 1] = UNICODE_NULL;
\
+ TestUserObjectInfo(Handle, Index, Buffer, SizeOfString,
TRUE, 0xdeadbeef, SizeOfString); \
+ ok(wcscmp(Buffer, String) == 0, "Buffer '%ls', expected
'%ls'\n", Buffer, String);
\
+ _Check = CheckBuffer(Buffer + SizeOfString / sizeof(Buffer[0]), BufferSize -
SizeOfString - sizeof(WCHAR), 0x55); \
+ ok(_Check == TRUE, "CheckBuffer failed\n");
\
+ RtlFillMemory(Buffer, BufferSize, 0x55);
\
+ Buffer[BufferSize / sizeof(WCHAR) - 1] = UNICODE_NULL;
\
+ TestUserObjectInfo(Handle, Index, Buffer, BufferSize,
TRUE, 0xdeadbeef, SizeOfString); \
+ ok(wcscmp(Buffer, String) == 0, "Buffer '%ls', expected
'%ls'\n", Buffer, String);
\
+ _Check = CheckBuffer(Buffer + SizeOfString / sizeof(Buffer[0]), BufferSize -
SizeOfString - sizeof(WCHAR), 0x55); \
+ ok(_Check == TRUE, "CheckBuffer failed\n");
\
+ } while (0)
+
static
void
TestGetUserObjectInfoW(void)
@@ -125,7 +157,13 @@
PWCHAR Buffer;
ULONG BufferSize = 64 * sizeof(WCHAR);
HDESK Desktop;
- BOOLEAN Check;
+ HDESK Desktop2;
+ HWINSTA WinSta;
+ HANDLE Token;
+ TOKEN_STATISTICS Statistics;
+ WCHAR WinStaName[64];
+ BOOL Success;
+ ULONG Length;
Buffer = AllocateGuarded(BufferSize);
@@ -142,10 +180,25 @@
TestUserObjectInfo(NULL, UOI_TYPE, (PVOID)1, 1,
FALSE, ERROR_NOACCESS, NOTSET);
TestUserObjectInfo(NULL, UOI_TYPE, Buffer, BufferSize,
FALSE, ERROR_INVALID_HANDLE, 0);
+ TestUserObjectInfo(NULL, UOI_NAME, NULL, 0,
FALSE, ERROR_INVALID_HANDLE, 0);
+ TestUserObjectInfo(NULL, UOI_NAME, (PVOID)1, 0,
FALSE, ERROR_INVALID_HANDLE, 0);
+ TestUserObjectInfo(NULL, UOI_NAME, NULL, 1,
FALSE, ERROR_NOACCESS, NOTSET);
+ TestUserObjectInfo(NULL, UOI_NAME, (PVOID)1, 1,
FALSE, ERROR_NOACCESS, NOTSET);
+ TestUserObjectInfo(NULL, UOI_NAME, Buffer, BufferSize,
FALSE, ERROR_INVALID_HANDLE, 0);
+
Desktop = GetThreadDesktop(GetCurrentThreadId());
if (!Desktop)
{
skip("Failed to get desktop handle\n");
+ FreeGuarded(Buffer);
+ return;
+ }
+
+ WinSta = GetProcessWindowStation();
+ if (!WinSta)
+ {
+ skip("Failed to get winsta handle\n");
+ FreeGuarded(Buffer);
return;
}
@@ -156,31 +209,115 @@
TestUserObjectInfo(Desktop, UOI_FLAGS, (PVOID)1, 1,
FALSE, ERROR_NOACCESS, NOTSET);
TestUserObjectInfo(Desktop, UOI_FLAGS, &UserObjectFlags, sizeof(UserObjectFlags),
TRUE, 0xdeadbeef, sizeof(USEROBJECTFLAGS));
- TestUserObjectInfo(Desktop, UOI_TYPE, NULL, 0,
FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(L"Desktop"));
- TestUserObjectInfo(Desktop, UOI_TYPE, (PVOID)1, 0,
FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(L"Desktop"));
- TestUserObjectInfo(Desktop, UOI_TYPE, NULL, 1,
FALSE, ERROR_NOACCESS, NOTSET);
- TestUserObjectInfo(Desktop, UOI_TYPE, (PVOID)1, 1,
FALSE, ERROR_NOACCESS, NOTSET);
- RtlFillMemory(Buffer, BufferSize, 0x55);
- TestUserObjectInfo(Desktop, UOI_TYPE, Buffer, sizeof(L"Desktop")
- 2, FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(L"Desktop"));
- Check = CheckBuffer(Buffer, BufferSize, 0x55);
- ok(Check == TRUE, "CheckBuffer failed\n");
- RtlFillMemory(Buffer, BufferSize, 0x55);
- TestUserObjectInfo(Desktop, UOI_TYPE, Buffer, sizeof(L"Desktop")
- 1, FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(L"Desktop"));
- Check = CheckBuffer(Buffer, BufferSize, 0x55);
- ok(Check == TRUE, "CheckBuffer failed\n");
- RtlFillMemory(Buffer, BufferSize, 0x55);
- TestUserObjectInfo(Desktop, UOI_TYPE, Buffer,
sizeof(L"Desktop"), TRUE, 0xdeadbeef,
sizeof(L"Desktop"));
- ok(wcscmp(Buffer, L"Desktop") == 0, "Buffer '%ls'\n",
Buffer);
- Check = CheckBuffer(Buffer + sizeof("Desktop"), BufferSize -
sizeof(L"Desktop"), 0x55);
- ok(Check == TRUE, "CheckBuffer failed\n");
- RtlFillMemory(Buffer, BufferSize, 0x55);
- TestUserObjectInfo(Desktop, UOI_TYPE, Buffer, BufferSize,
TRUE, 0xdeadbeef, sizeof(L"Desktop"));
- ok(wcscmp(Buffer, L"Desktop") == 0, "Buffer '%ls'\n",
Buffer);
- Check = CheckBuffer(Buffer + sizeof("Desktop"), BufferSize -
sizeof(L"Desktop"), 0x55);
- ok(Check == TRUE, "CheckBuffer failed\n");
+ TestUserObjectInfoWithString(Desktop, UOI_TYPE, Buffer, BufferSize,
L"Desktop");
+ TestUserObjectInfoWithString(Desktop, UOI_NAME, Buffer, BufferSize,
L"Default");
+
+ TestUserObjectInfoWithString(WinSta, UOI_TYPE, Buffer, BufferSize,
L"WindowStation");
+ TestUserObjectInfoWithString(WinSta, UOI_NAME, Buffer, BufferSize,
L"WinSta0");
+
+ /* Autogenerated name will be Service-0x<luidhigh>-<luidlow>$ */
+ StringCbCopyW(WinStaName, sizeof(WinStaName), L"<failed>");
+ Success = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &Token);
+ ok(Success == TRUE, "OpenProcessToken failed with %lu\n", GetLastError());
+ if (Success)
+ {
+ Success = GetTokenInformation(Token,
+ TokenStatistics,
+ &Statistics,
+ sizeof(Statistics),
+ &Length);
+ ok(Success == TRUE, "GetTokenInformation failed with %lu\n",
GetLastError());
+ if (Success)
+ {
+ StringCbPrintfW(WinStaName,
+ sizeof(WinStaName),
+ L"Service-0x%lx-%lx$",
+ Statistics.AuthenticationId.HighPart,
+ Statistics.AuthenticationId.LowPart);
+ trace("Expected autogenerated Winsta name: %ls\n", WinStaName);
+ }
+ CloseHandle(Token);
+ }
+
+ /* Create our own Winsta */
+ WinSta = CreateWindowStationW(NULL, 0, WINSTA_READATTRIBUTES, NULL);
+ ok(WinSta != NULL, "CreateWindowStationW failed with %lu\n",
GetLastError());
+ if (WinSta)
+ {
+ TestUserObjectInfoWithString(WinSta, UOI_TYPE, Buffer, BufferSize,
L"WindowStation");
+ TestUserObjectInfoWithString(WinSta, UOI_NAME, Buffer, BufferSize, WinStaName);
+ CloseWindowStation(WinSta);
+ }
+ else
+ {
+ skip("Failed to create winsta\n");
+ }
+
+ WinSta = CreateWindowStationW(L"", 0, WINSTA_READATTRIBUTES, NULL);
+ ok(WinSta != NULL, "CreateWindowStationW failed with %lu\n",
GetLastError());
+ if (WinSta)
+ {
+ TestUserObjectInfoWithString(WinSta, UOI_TYPE, Buffer, BufferSize,
L"WindowStation");
+ TestUserObjectInfoWithString(WinSta, UOI_NAME, Buffer, BufferSize, WinStaName);
+ CloseWindowStation(WinSta);
+ }
+ else
+ {
+ skip("Failed to create winsta\n");
+ }
+
+ WinSta = CreateWindowStationW(L"GetUserObjectInformation_apitest_winsta",
0, WINSTA_READATTRIBUTES, NULL);
+ ok(WinSta != NULL, "CreateWindowStationW failed with %lu\n",
GetLastError());
+ if (WinSta)
+ {
+ TestUserObjectInfoWithString(WinSta, UOI_TYPE, Buffer, BufferSize,
L"WindowStation");
+ TestUserObjectInfoWithString(WinSta, UOI_NAME, Buffer, BufferSize,
L"GetUserObjectInformation_apitest_winsta");
+ CloseWindowStation(WinSta);
+ }
+ else
+ {
+ skip("Failed to create winsta\n");
+ }
+
+ WinSta = CreateWindowStationW(L"1", 0, WINSTA_READATTRIBUTES, NULL);
+ ok(WinSta != NULL, "CreateWindowStationW failed with %lu\n",
GetLastError());
+ if (WinSta)
+ {
+ TestUserObjectInfoWithString(WinSta, UOI_TYPE, Buffer, BufferSize,
L"WindowStation");
+ TestUserObjectInfoWithString(WinSta, UOI_NAME, Buffer, BufferSize,
L"1");
+ CloseWindowStation(WinSta);
+ }
+ else
+ {
+ skip("Failed to create winsta\n");
+ }
+
+ /* Create our own desktop */
+ Desktop2 = CreateDesktopW(NULL, NULL, NULL, 0, DESKTOP_CREATEWINDOW |
DESKTOP_READOBJECTS, NULL);
+ ok(Desktop2 == NULL, "CreateDesktopW succeeded\n");
+ if (Desktop2) CloseDesktop(Desktop2);
+
+ Desktop2 = CreateDesktopW(L"", NULL, NULL, 0, DESKTOP_CREATEWINDOW |
DESKTOP_READOBJECTS, NULL);
+ ok(Desktop2 == NULL, "CreateDesktopW succeeded\n");
+ if (Desktop2) CloseDesktop(Desktop2);
+
+ Desktop2 = CreateDesktopW(L"2", NULL, NULL, 0, DESKTOP_CREATEWINDOW |
DESKTOP_READOBJECTS, NULL);
+ ok(Desktop2 != NULL, "CreateDesktopW failed with %lu\n", GetLastError());
+ if (Desktop2)
+ {
+ TestUserObjectInfoWithString(Desktop2, UOI_TYPE, Buffer, BufferSize,
L"Desktop");
+ TestUserObjectInfoWithString(Desktop2, UOI_NAME, Buffer, BufferSize,
L"2");
+ }
+ else
+ {
+ skip("Failed to create winsta\n");
+ }
+
+ CloseDesktop(Desktop2);
FreeGuarded(Buffer);
+ /* Make sure nothing behind the needed buffer is touched */
BufferSize = sizeof(L"Desktop");
Buffer = AllocateGuarded(BufferSize);
TestUserObjectInfo(Desktop, UOI_TYPE, Buffer, BufferSize,
TRUE, 0xdeadbeef, sizeof(L"Desktop"));
@@ -226,6 +363,34 @@
ok(_Error == ERROR_NOACCESS, "Error = %lu\n", _Error);
\
} while (0)
+#undef TestUserObjectInfoWithString
+#define TestUserObjectInfoWithString(Handle, Index, Buffer, BufferSize, String) do
\
+ {
\
+ BOOLEAN _Check;
\
+ TestUserObjectInfo(Handle, Index, NULL, 0,
FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(String) * sizeof(WCHAR));\
+ TestUserObjectInfo(Handle, Index, (PVOID)1, 0,
FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(String) * sizeof(WCHAR));\
+ TestUserObjectInfo(Handle, Index, NULL, 1,
FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(String) * sizeof(WCHAR));\
+ TestUserObjectInfo(Handle, Index, (PVOID)1, 1,
FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(String) * sizeof(WCHAR));\
+ RtlFillMemory(Buffer, BufferSize, 0x55);
\
+ TestUserObjectInfo(Handle, Index, Buffer, sizeof(String) - 2,
FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(String) * sizeof(WCHAR));\
+ _Check = CheckBuffer(Buffer, BufferSize, 0x55);
\
+ ok(_Check == TRUE, "CheckBuffer failed\n");
\
+ RtlFillMemory(Buffer, BufferSize, 0x55);
\
+ TestUserObjectInfo(Handle, Index, Buffer, sizeof(String) - 1,
FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(String) * sizeof(WCHAR));\
+ _Check = CheckBuffer(Buffer, BufferSize, 0x55);
\
+ ok(_Check == TRUE, "CheckBuffer failed\n");
\
+ RtlFillMemory(Buffer, BufferSize, 0x55);
\
+ TestUserObjectInfo(Handle, Index, Buffer, sizeof(String),
TRUE, 0xdeadbeef, sizeof(String)); \
+ ok(strcmp(Buffer, String) == 0, "Buffer '%s'\n", Buffer);
\
+ _Check = CheckBuffer(Buffer + sizeof(String), BufferSize - sizeof(String), 0x55);
\
+ ok(_Check == TRUE, "CheckBuffer failed\n");
\
+ RtlFillMemory(Buffer, BufferSize, 0x55);
\
+ TestUserObjectInfo(Handle, Index, Buffer, BufferSize,
TRUE, 0xdeadbeef, sizeof(String)); \
+ ok(strcmp(Buffer, String) == 0, "Buffer '%s'\n", Buffer);
\
+ _Check = CheckBuffer(Buffer + sizeof(String), BufferSize - sizeof(String), 0x55);
\
+ ok(_Check == TRUE, "CheckBuffer failed\n");
\
+ } while (0)
+
static
void
TestGetUserObjectInfoA(void)
@@ -234,7 +399,7 @@
PCHAR Buffer;
ULONG BufferSize = 64;
HDESK Desktop;
- BOOLEAN Check;
+ HWINSTA WinSta;
Buffer = AllocateGuarded(BufferSize);
@@ -251,10 +416,25 @@
TestUserObjectInfo(NULL, UOI_TYPE, (PVOID)1, 1,
FALSE, ERROR_INVALID_HANDLE, 0);
TestUserObjectInfo(NULL, UOI_TYPE, Buffer, BufferSize,
FALSE, ERROR_INVALID_HANDLE, 0);
+ TestUserObjectInfo(NULL, UOI_NAME, NULL, 0,
FALSE, ERROR_INVALID_HANDLE, 0);
+ TestUserObjectInfo(NULL, UOI_NAME, (PVOID)1, 0,
FALSE, ERROR_INVALID_HANDLE, 0);
+ TestUserObjectInfo(NULL, UOI_NAME, NULL, 1,
FALSE, ERROR_INVALID_HANDLE, 0);
+ TestUserObjectInfo(NULL, UOI_NAME, (PVOID)1, 1,
FALSE, ERROR_INVALID_HANDLE, 0);
+ TestUserObjectInfo(NULL, UOI_NAME, Buffer, BufferSize,
FALSE, ERROR_INVALID_HANDLE, 0);
+
Desktop = GetThreadDesktop(GetCurrentThreadId());
if (!Desktop)
{
skip("Failed to get desktop handle\n");
+ FreeGuarded(Buffer);
+ return;
+ }
+
+ WinSta = GetProcessWindowStation();
+ if (!WinSta)
+ {
+ skip("Failed to get winsta handle\n");
+ FreeGuarded(Buffer);
return;
}
@@ -265,31 +445,15 @@
TestUserObjectInfo(Desktop, UOI_FLAGS, (PVOID)1, 1,
FALSE, ERROR_NOACCESS, NOTSET);
TestUserObjectInfo(Desktop, UOI_FLAGS, &UserObjectFlags, sizeof(UserObjectFlags),
TRUE, 0xdeadbeef, sizeof(USEROBJECTFLAGS));
- TestUserObjectInfo(Desktop, UOI_TYPE, NULL, 0,
FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(L"Desktop"));
- TestUserObjectInfo(Desktop, UOI_TYPE, (PVOID)1, 0,
FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(L"Desktop"));
- TestUserObjectInfo(Desktop, UOI_TYPE, NULL, 1,
FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(L"Desktop"));
- TestUserObjectInfo(Desktop, UOI_TYPE, (PVOID)1, 1,
FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(L"Desktop"));
- RtlFillMemory(Buffer, BufferSize, 0x55);
- TestUserObjectInfo(Desktop, UOI_TYPE, Buffer, sizeof("Desktop")
- 2, FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(L"Desktop"));
- Check = CheckBuffer(Buffer, BufferSize, 0x55);
- ok(Check == TRUE, "CheckBuffer failed\n");
- RtlFillMemory(Buffer, BufferSize, 0x55);
- TestUserObjectInfo(Desktop, UOI_TYPE, Buffer, sizeof("Desktop")
- 1, FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(L"Desktop"));
- Check = CheckBuffer(Buffer, BufferSize, 0x55);
- ok(Check == TRUE, "CheckBuffer failed\n");
- RtlFillMemory(Buffer, BufferSize, 0x55);
- TestUserObjectInfo(Desktop, UOI_TYPE, Buffer, sizeof("Desktop"),
TRUE, 0xdeadbeef, sizeof("Desktop"));
- ok(strcmp(Buffer, "Desktop") == 0, "Buffer '%s'\n",
Buffer);
- Check = CheckBuffer(Buffer + sizeof("Desktop"), BufferSize -
sizeof("Desktop"), 0x55);
- ok(Check == TRUE, "CheckBuffer failed\n");
- RtlFillMemory(Buffer, BufferSize, 0x55);
- TestUserObjectInfo(Desktop, UOI_TYPE, Buffer, BufferSize,
TRUE, 0xdeadbeef, sizeof("Desktop"));
- ok(strcmp(Buffer, "Desktop") == 0, "Buffer '%s'\n",
Buffer);
- Check = CheckBuffer(Buffer + sizeof("Desktop"), BufferSize -
sizeof("Desktop"), 0x55);
- ok(Check == TRUE, "CheckBuffer failed\n");
+ TestUserObjectInfoWithString(Desktop, UOI_TYPE, Buffer, BufferSize,
"Desktop");
+ TestUserObjectInfoWithString(Desktop, UOI_NAME, Buffer, BufferSize,
"Default");
+
+ TestUserObjectInfoWithString(WinSta, UOI_TYPE, Buffer, BufferSize,
"WindowStation");
+ TestUserObjectInfoWithString(WinSta, UOI_NAME, Buffer, BufferSize,
"WinSta0");
FreeGuarded(Buffer);
+ /* Make sure nothing behind the needed buffer is touched */
BufferSize = sizeof("Desktop");
Buffer = AllocateGuarded(BufferSize);
TestUserObjectInfo(Desktop, UOI_TYPE, Buffer, BufferSize,
TRUE, 0xdeadbeef, sizeof("Desktop"));