[PATCH 3/5] user32: Set last error codes on GetRawInputDeviceInfoW failure.
Rémi Bernon
rbernon at codeweavers.com
Tue May 4 03:24:54 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/user32/rawinput.c | 16 ++++++++++++++--
dlls/user32/tests/input.c | 37 +++++++++++++++++++++++++++++++++++++
2 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c
index 1e66b394cb5..9a72a9a323e 100644
--- a/dlls/user32/rawinput.c
+++ b/dlls/user32/rawinput.c
@@ -696,8 +696,16 @@ UINT WINAPI GetRawInputDeviceInfoW(HANDLE handle, UINT command, void *data, UINT
TRACE("handle %p, command %#x, data %p, data_size %p.\n",
handle, command, data, data_size);
- if (!data_size) return ~0U;
- if (!(device = find_device_from_handle(handle))) return ~0U;
+ if (!data_size)
+ {
+ SetLastError(ERROR_NOACCESS);
+ return ~0U;
+ }
+ if (!(device = find_device_from_handle(handle)))
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return ~0U;
+ }
/* each case below must set:
* *data_size: length (meaning defined by command) of data we want to copy
@@ -769,6 +777,7 @@ UINT WINAPI GetRawInputDeviceInfoW(HANDLE handle, UINT command, void *data, UINT
default:
FIXME("command %#x not supported\n", command);
+ SetLastError(ERROR_INVALID_PARAMETER);
return ~0U;
}
@@ -776,7 +785,10 @@ UINT WINAPI GetRawInputDeviceInfoW(HANDLE handle, UINT command, void *data, UINT
return 0;
if (avail_bytes < to_copy_bytes)
+ {
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
return ~0U;
+ }
memcpy(data, to_copy, to_copy_bytes);
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
index 382e124e1f4..4ce2c5643cd 100644
--- a/dlls/user32/tests/input.c
+++ b/dlls/user32/tests/input.c
@@ -1834,6 +1834,43 @@ static void test_GetRawInputDeviceList(void)
ret = pGetRawInputDeviceList(devices, &devcount, sizeof(devices[0]));
ok(ret > 0, "expected non-zero\n");
+ if (devcount)
+ {
+ RID_DEVICE_INFO info;
+ UINT size;
+
+ SetLastError( 0xdeadbeef );
+ ret = pGetRawInputDeviceInfoW( UlongToHandle( 0xdeadbeef ), RIDI_DEVICEINFO, NULL, NULL );
+ ok( ret == ~0U, "GetRawInputDeviceInfoW returned %#x, expected ~0.\n", ret );
+ ok( GetLastError() == ERROR_NOACCESS, "GetRawInputDeviceInfoW last error %#x, expected 0xdeadbeef.\n", GetLastError() );
+
+ SetLastError( 0xdeadbeef );
+ size = 0xdeadbeef;
+ ret = pGetRawInputDeviceInfoW( UlongToHandle( 0xdeadbeef ), RIDI_DEVICEINFO, NULL, &size );
+ ok( ret == ~0U, "GetRawInputDeviceInfoW returned %#x, expected ~0.\n", ret );
+ ok( size == 0xdeadbeef, "GetRawInputDeviceInfoW returned size %#x, expected 0.\n", size );
+ ok( GetLastError() == ERROR_INVALID_HANDLE, "GetRawInputDeviceInfoW last error %#x, expected 0xdeadbeef.\n", GetLastError() );
+
+ SetLastError( 0xdeadbeef );
+ size = 0xdeadbeef;
+ ret = pGetRawInputDeviceInfoW( devices[0].hDevice, 0xdeadbeef, NULL, &size );
+ ok( ret == ~0U, "GetRawInputDeviceInfoW returned %#x, expected ~0.\n", ret );
+ ok( size == 0xdeadbeef, "GetRawInputDeviceInfoW returned size %#x, expected 0.\n", size );
+ ok( GetLastError() == ERROR_INVALID_PARAMETER, "GetRawInputDeviceInfoW last error %#x, expected 0xdeadbeef.\n", GetLastError() );
+
+ SetLastError( 0xdeadbeef );
+ ret = pGetRawInputDeviceInfoW( devices[0].hDevice, RIDI_DEVICEINFO, &info, NULL );
+ ok( ret == ~0U, "GetRawInputDeviceInfoW returned %#x, expected ~0.\n", ret );
+ ok( GetLastError() == ERROR_NOACCESS, "GetRawInputDeviceInfoW last error %#x, expected 0xdeadbeef.\n", GetLastError() );
+
+ SetLastError( 0xdeadbeef );
+ size = 0;
+ ret = pGetRawInputDeviceInfoW( devices[0].hDevice, RIDI_DEVICEINFO, &info, &size );
+ ok( ret == ~0U, "GetRawInputDeviceInfoW returned %#x, expected ~0.\n", ret );
+ ok( size == sizeof(info), "GetRawInputDeviceInfoW returned size %#x, expected %#x.\n", size, sizeof(info) );
+ ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetRawInputDeviceInfoW last error %#x, expected 0xdeadbeef.\n", GetLastError() );
+ }
+
for(i = 0; i < devcount; ++i)
{
WCHAR name[128];
--
2.31.0
More information about the wine-devel
mailing list