[PATCH 1/4] user32: Uppercase the RawInput device names sans the GUID.

Rémi Bernon rbernon at codeweavers.com
Thu Dec 23 08:33:08 CST 2021


From: Arkadiusz Hiler <ahiler at codeweavers.com>

This is a preparation for a patch that changes setupapi to return lowercased
device paths, which is the source of RawInput device name here. On Windows
RawInput returns mostly uppercase names (except the GUID) and we want to keep
that behavior.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---

First two patches have been in Proton for a long while.

They aren't directly related to the SDL issue described in PATCH 3, and
as we're already using upper case device paths it's possible to skip
them.

However they fix some other kind of hotplug problem, and so I think they
are related and worth having. Then, because SDL checks for uppercase
"IG_", we need PATCH 1 before PATCH 2.

I'm a bit unsure about PATCH 4, as creating a (msg) window in DllMain is
probably not great, but I don't really how else we can make sure XInput
gets notified first. It would be better to avoid refreshing the device
list on every call.

 dlls/user32/rawinput.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c
index f3dc4ae67de..a774f12231b 100644
--- a/dlls/user32/rawinput.c
+++ b/dlls/user32/rawinput.c
@@ -101,6 +101,7 @@ static struct device *add_device(HDEVINFO set, SP_DEVICE_INTERFACE_DATA *iface)
     struct device *device = NULL;
     UINT32 handle;
     HANDLE file;
+    WCHAR *pos;
     DWORD i, size, type;
 
     SetupDiGetDeviceInterfaceDetailW(set, iface, NULL, 0, &size, &device_data);
@@ -125,6 +126,9 @@ static struct device *add_device(HDEVINFO set, SP_DEVICE_INTERFACE_DATA *iface)
     detail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W);
     SetupDiGetDeviceInterfaceDetailW(set, iface, detail, size, NULL, NULL);
 
+    /* upper case everything but the GUID */
+    for (pos = detail->DevicePath; *pos && *pos != '{'; pos++) *pos = towupper(*pos);
+
     file = CreateFileW(detail->DevicePath, GENERIC_READ | GENERIC_WRITE,
             FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
     if (file == INVALID_HANDLE_VALUE)
-- 
2.34.1




More information about the wine-devel mailing list