Fix GetRawInputDeviceList() to return ERROR_INSUFFICIENT_BUFFER

Andrew Church achurch at achurch.org
Wed May 27 15:23:40 CDT 2015


(Note: I am not subscribed to the list; please CC me on any replies.)

When GetRawInputDeviceList() is passed a buffer which is too small, the
function should set the last error code to ERROR_INSUFFICIENT_BUFFER and
return failure (see
<http://msdn.microsoft.com/en-us/library/windows/desktop/ms645598(v=vs.85).aspx>).
However, the current Wine implementation does not set the last error code,
meaning that callers expecting to see ERROR_INSUFFICIENT_BUFFER will behave
incorrectly.  I've confirmed that Windows itself (at least XP and 8)
matches the documented behavior.

See also: https://bugs.winehq.org/show_bug.cgi?id=37667

  --Andrew Church
    http://achurch.org/

diff -urN wine-1.7.43-orig/dlls/user32/input.c wine-1.7.43/dlls/user32/input.c
--- wine-1.7.43-orig/dlls/user32/input.c	2015-05-15 22:36:39 +0900
+++ wine-1.7.43/dlls/user32/input.c	2015-05-25 22:47:49 +0900
@@ -507,6 +507,7 @@
     if (*device_count < 2)
     {
         *device_count = 2;
+        SetLastError(ERROR_INSUFFICIENT_BUFFER);
         return ~0U;
     }
 
diff -urN wine-1.7.43-orig/dlls/user32/tests/Makefile.in wine-1.7.43/dlls/user32/tests/Makefile.in
--- wine-1.7.43-orig/dlls/user32/tests/Makefile.in	2015-05-15 22:36:39 +0900
+++ wine-1.7.43/dlls/user32/tests/Makefile.in	2015-05-25 22:48:27 +0900
@@ -17,6 +17,7 @@
 	menu.c \
 	monitor.c \
 	msg.c \
+	rawinput.c \
 	resource.c \
 	scroll.c \
 	static.c \
diff -urN wine-1.7.43-orig/dlls/user32/tests/rawinput.c wine-1.7.43/dlls/user32/tests/rawinput.c
--- wine-1.7.43-orig/dlls/user32/tests/rawinput.c	1970-01-01 09:00:00 +0900
+++ wine-1.7.43/dlls/user32/tests/rawinput.c	2015-05-25 22:44:36 +0900
@@ -0,0 +1,43 @@
+ /* Unit test suite for the rawinput functions
+ *
+ * Copyright 2015 Andrew Church
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define WINVER 0x0501
+
+#include "wine/test.h"
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+
+static void GRIDLShortArrayTest()
+{
+    RAWINPUTDEVICELIST devices[1];
+    UINT device_count = 1;
+    int result, error;
+
+    result = GetRawInputDeviceList(devices, &device_count, sizeof(*devices));
+    ok(result == ~0U, "wrong result: %d\n", result);
+    ok(device_count >= 2, "wrong device_count: %d\n", device_count);
+    error = GetLastError();
+    ok(error == ERROR_INSUFFICIENT_BUFFER, "wrong error code: %d\n", error);
+}
+
+START_TEST(rawinput)
+{
+    GRIDLShortArrayTest();
+}



More information about the wine-devel mailing list