From: Sanskar Jaiswal <phoenix2810@protonmail.com> make_unique_serial() synthesizes a new serial number on any collision with an already-registered device, including the expected collision between two HID interfaces of the same composite device. Windows keeps the real, shared serial number across such sibling interfaces, and applications may rely on that to pair them together. Skip the rewrite when the collision is with a sibling interface of the same device (same VID/PID, different interface index); other collisions still get a synthesized unique serial. Signed-off-by: Sanskar Jaiswal <phoenix2810@protonmail.com> --- dlls/winebus.sys/main.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c index a9dcc9fc86c..3efc17baf21 100644 --- a/dlls/winebus.sys/main.c +++ b/dlls/winebus.sys/main.c @@ -360,6 +360,18 @@ static void make_unique_serial(struct device_extension *device) if (!wcscmp(device->desc.serialnumber, ext->desc.serialnumber)) break; if (&ext->entry == &device_list && *device->desc.serialnumber) return; + /* + * A collision with a sibling HID interface of the same physical device + * (same VID/PID, different interface index) is expected and should not + * be rewritten, since applications may rely on the shared serial number + * to pair a device's interfaces together. + */ + if (&ext->entry != &device_list && + ext->desc.vid == device->desc.vid && + ext->desc.pid == device->desc.pid && + ext->desc.input != device->desc.input) + return; + swprintf(device->desc.serialnumber, ARRAY_SIZE(device->desc.serialnumber), L"%04x%08x%04x%04x", device->index, device->desc.input, device->desc.pid, device->desc.vid); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11745