Author: tfaber
Date: Fri Apr 25 11:24:41 2014
New Revision: 62964
URL:
http://svn.reactos.org/svn/reactos?rev=62964&view=rev
Log:
[USER32_APITEST]
- Add parameter checks for GetUserObjectInformationW
CORE-8094
Added:
trunk/rostests/apitests/user32/GetUserObjectInformation.c (with props)
Modified:
trunk/rostests/apitests/user32/CMakeLists.txt
trunk/rostests/apitests/user32/testlist.c
Modified: trunk/rostests/apitests/user32/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/CMakeList…
==============================================================================
--- trunk/rostests/apitests/user32/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/rostests/apitests/user32/CMakeLists.txt [iso-8859-1] Fri Apr 25 11:24:41 2014
@@ -12,6 +12,7 @@
GetKeyState.c
GetPeekMessage.c
GetSystemMetrics.c
+ GetUserObjectInformation.c
InitializeLpkHooks.c
LoadImage.c
LookupIconIdFromDirectoryEx.c
Added: trunk/rostests/apitests/user32/GetUserObjectInformation.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/GetUserOb…
==============================================================================
--- trunk/rostests/apitests/user32/GetUserObjectInformation.c (added)
+++ trunk/rostests/apitests/user32/GetUserObjectInformation.c [iso-8859-1] Fri Apr 25
11:24:41 2014
@@ -0,0 +1,185 @@
+/*
+ * PROJECT: ReactOS API tests
+ * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
+ * PURPOSE: Test for GetUserObjectInformation
+ * PROGRAMMERS: Thomas Faber <thomas.faber(a)reactos.org>
+ */
+
+#include <apitest.h>
+#include <winuser.h>
+#include <ndk/mmfuncs.h>
+#include <ndk/pstypes.h>
+
+static
+BOOLEAN
+CheckBuffer(
+ PVOID Buffer,
+ SIZE_T Size,
+ UCHAR Value)
+{
+ PUCHAR Array = Buffer;
+ SIZE_T i;
+
+ for (i = 0; i < Size; i++)
+ if (Array[i] != Value)
+ {
+ trace("Expected %x, found %x at offset %lu\n", Value, Array[i],
(ULONG)i);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static
+PVOID
+AllocateGuarded(
+ SIZE_T SizeRequested)
+{
+ NTSTATUS Status;
+ SIZE_T Size = PAGE_ROUND_UP(SizeRequested + PAGE_SIZE);
+ PVOID VirtualMemory = NULL;
+ PCHAR StartOfBuffer;
+
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory, 0,
&Size, MEM_RESERVE, PAGE_NOACCESS);
+
+ if (!NT_SUCCESS(Status))
+ return NULL;
+
+ Size -= PAGE_SIZE;
+ if (Size)
+ {
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory, 0,
&Size, MEM_COMMIT, PAGE_READWRITE);
+ if (!NT_SUCCESS(Status))
+ {
+ Size = 0;
+ Status = NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory,
&Size, MEM_RELEASE);
+ ok(Status == STATUS_SUCCESS, "Status = %lx\n", Status);
+ return NULL;
+ }
+ }
+
+ StartOfBuffer = VirtualMemory;
+ StartOfBuffer += Size - SizeRequested;
+
+ return StartOfBuffer;
+}
+
+static
+VOID
+FreeGuarded(
+ PVOID Pointer)
+{
+ NTSTATUS Status;
+ PVOID VirtualMemory = (PVOID)PAGE_ROUND_DOWN((SIZE_T)Pointer);
+ SIZE_T Size = 0;
+
+ Status = NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory, &Size,
MEM_RELEASE);
+ ok(Status == STATUS_SUCCESS, "Status = %lx\n", Status);
+}
+
+#define NOTSET 1234
+
+#define TestUserObjectInfo(Handle, Index, Buffer, Length, Ret, Error, LengthNeeded) do
\
+ {
\
+ DWORD _LengthNeeded = NOTSET;
\
+ DECLSPEC_ALIGN(16) CHAR _LengthBuffer[2 * sizeof(DWORD)];
\
+ DWORD _Error;
\
+ BOOL _Ret;
\
+
\
+ SetLastError(0xdeadbeef);
\
+ _Ret = GetUserObjectInformationW(Handle, Index, Buffer, Length, NULL);
\
+ _Error = GetLastError();
\
+ ok(_Ret == (Ret), "Ret = %d\n", _Ret);
\
+ ok(_Error == (Error), "Error = %lu\n", _Error);
\
+
\
+ SetLastError(0xdeadbeef);
\
+ _Ret = GetUserObjectInformationW(Handle, Index, Buffer, Length,
&_LengthNeeded);\
+ _Error = GetLastError();
\
+ ok(_Ret == (Ret), "Ret = %d\n", _Ret);
\
+ ok(_Error == (Error), "Error = %lu\n", _Error);
\
+ ok(_LengthNeeded == (LengthNeeded), "LengthNeeded = %lu\n",
_LengthNeeded); \
+
\
+ SetLastError(0xdeadbeef);
\
+ *(PDWORD)&_LengthBuffer[1] = NOTSET;
\
+ _Ret = GetUserObjectInformationW(Handle, Index, Buffer, Length,
\
+ (PDWORD)&_LengthBuffer[1]);
\
+ _Error = GetLastError();
\
+ ok(_Ret == (Ret), "Ret = %d\n", _Ret);
\
+ ok(_Error == (Error), "Error = %lu\n", _Error);
\
+ _LengthNeeded = *(PDWORD)&_LengthBuffer[1];
\
+ ok(_LengthNeeded == (LengthNeeded), "LengthNeeded = %lu\n",
_LengthNeeded); \
+
\
+ SetLastError(0xdeadbeef);
\
+ _Ret = GetUserObjectInformationW(Handle, Index, Buffer, Length, (PVOID)-4);
\
+ _Error = GetLastError();
\
+ ok(_Ret == FALSE, "Ret = %d\n", _Ret);
\
+ ok(_Error == ERROR_NOACCESS, "Error = %lu\n", _Error);
\
+ } while (0)
+
+START_TEST(GetUserObjectInformation)
+{
+ USEROBJECTFLAGS UserObjectFlags;
+ PWCHAR Buffer;
+ ULONG BufferSize = 64 * sizeof(WCHAR);
+ HDESK Desktop;
+ BOOLEAN Check;
+
+ Buffer = AllocateGuarded(BufferSize);
+
+ TestUserObjectInfo(NULL, 5, NULL, 0,
FALSE, ERROR_INVALID_HANDLE, 0);
+ TestUserObjectInfo(NULL, UOI_FLAGS, NULL, 0,
FALSE, ERROR_INVALID_HANDLE, 0);
+ TestUserObjectInfo(NULL, UOI_FLAGS, (PVOID)1, 0,
FALSE, ERROR_INVALID_HANDLE, 0);
+ TestUserObjectInfo(NULL, UOI_FLAGS, NULL, 1,
FALSE, ERROR_NOACCESS, NOTSET);
+ TestUserObjectInfo(NULL, UOI_FLAGS, (PVOID)1, 1,
FALSE, ERROR_NOACCESS, NOTSET);
+ TestUserObjectInfo(NULL, UOI_FLAGS, &UserObjectFlags, sizeof(UserObjectFlags),
FALSE, ERROR_INVALID_HANDLE, 0);
+
+ TestUserObjectInfo(NULL, UOI_TYPE, NULL, 0,
FALSE, ERROR_INVALID_HANDLE, 0);
+ TestUserObjectInfo(NULL, UOI_TYPE, (PVOID)1, 0,
FALSE, ERROR_INVALID_HANDLE, 0);
+ TestUserObjectInfo(NULL, UOI_TYPE, NULL, 1,
FALSE, ERROR_NOACCESS, NOTSET);
+ TestUserObjectInfo(NULL, UOI_TYPE, (PVOID)1, 1,
FALSE, ERROR_NOACCESS, NOTSET);
+ TestUserObjectInfo(NULL, UOI_TYPE, Buffer, BufferSize,
FALSE, ERROR_INVALID_HANDLE, 0);
+
+ Desktop = GetThreadDesktop(GetCurrentThreadId());
+ if (!Desktop)
+ {
+ skip("Failed to get desktop handle\n");
+ return;
+ }
+
+ TestUserObjectInfo(Desktop, 5, NULL, 0,
FALSE, ERROR_INVALID_PARAMETER, 0);
+ TestUserObjectInfo(Desktop, UOI_FLAGS, NULL, 0,
FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(USEROBJECTFLAGS));
+ TestUserObjectInfo(Desktop, UOI_FLAGS, (PVOID)1, 0,
FALSE, ERROR_INSUFFICIENT_BUFFER, sizeof(USEROBJECTFLAGS));
+ TestUserObjectInfo(Desktop, UOI_FLAGS, NULL, 1,
FALSE, ERROR_NOACCESS, NOTSET);
+ 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");
+
+ FreeGuarded(Buffer);
+
+ BufferSize = sizeof(L"Desktop");
+ Buffer = AllocateGuarded(BufferSize);
+ TestUserObjectInfo(Desktop, UOI_TYPE, Buffer, BufferSize,
TRUE, 0xdeadbeef, sizeof(L"Desktop"));
+ TestUserObjectInfo(Desktop, UOI_TYPE, Buffer, BufferSize + 1,
FALSE, ERROR_NOACCESS, NOTSET);
+ FreeGuarded(Buffer);
+}
Propchange: trunk/rostests/apitests/user32/GetUserObjectInformation.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/rostests/apitests/user32/testlist.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/testlist.…
==============================================================================
--- trunk/rostests/apitests/user32/testlist.c [iso-8859-1] (original)
+++ trunk/rostests/apitests/user32/testlist.c [iso-8859-1] Fri Apr 25 11:24:41 2014
@@ -14,6 +14,7 @@
extern void func_GetKeyState(void);
extern void func_GetPeekMessage(void);
extern void func_GetSystemMetrics(void);
+extern void func_GetUserObjectInformation(void);
extern void func_InitializeLpkHooks(void);
extern void func_LoadImage(void);
extern void func_LookupIconIdFromDirectoryEx(void);
@@ -40,6 +41,7 @@
{ "GetKeyState", func_GetKeyState },
{ "GetPeekMessage", func_GetPeekMessage },
{ "GetSystemMetrics", func_GetSystemMetrics },
+ { "GetUserObjectInformation", func_GetUserObjectInformation },
{ "InitializeLpkHooks", func_InitializeLpkHooks },
{ "LoadImage", func_LoadImage },
{ "LookupIconIdFromDirectoryEx", func_LookupIconIdFromDirectoryEx },