Rémi Bernon : winebus.sys: Query manufacturer string on device creation.
Alexandre Julliard
julliard at winehq.org
Mon Sep 13 16:12:34 CDT 2021
Module: wine
Branch: master
Commit: 9d4b70473c147b148039f34bfb63c07adb54638e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=9d4b70473c147b148039f34bfb63c07adb54638e
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Mon Sep 13 13:01:46 2021 +0200
winebus.sys: Query manufacturer string on device creation.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winebus.sys/bus_iohid.c | 6 +++---
dlls/winebus.sys/bus_sdl.c | 4 +---
dlls/winebus.sys/bus_udev.c | 14 ++++++--------
dlls/winebus.sys/main.c | 25 ++++++++++++++++++++++++-
dlls/winebus.sys/unixlib.c | 2 ++
dlls/winebus.sys/unixlib.h | 2 ++
6 files changed, 38 insertions(+), 15 deletions(-)
diff --git a/dlls/winebus.sys/bus_iohid.c b/dlls/winebus.sys/bus_iohid.c
index 3df60a1b516..8969e59f252 100644
--- a/dlls/winebus.sys/bus_iohid.c
+++ b/dlls/winebus.sys/bus_iohid.c
@@ -193,9 +193,6 @@ static NTSTATUS iohid_device_get_string(struct unix_device *iface, DWORD index,
case HID_STRING_ID_IPRODUCT:
str = IOHIDDeviceGetProperty(private->device, CFSTR(kIOHIDProductKey));
break;
- case HID_STRING_ID_IMANUFACTURER:
- str = IOHIDDeviceGetProperty(private->device, CFSTR(kIOHIDManufacturerKey));
- break;
case HID_STRING_ID_ISERIALNUMBER:
str = IOHIDDeviceGetProperty(private->device, CFSTR(kIOHIDSerialNumberKey));
break;
@@ -313,6 +310,9 @@ static void handle_DeviceMatchingCallback(void *context, IOReturn result, void *
}
IOHIDDeviceScheduleWithRunLoop(IOHIDDevice, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+ str = IOHIDDeviceGetProperty(IOHIDDevice, CFSTR(kIOHIDManufacturerKey));
+ if (str) lstrcpynA(desc.manufacturer, str, sizeof(desc.manufacturer));
+
if (IOHIDDeviceConformsTo(IOHIDDevice, kHIDPage_GenericDesktop, kHIDUsage_GD_GamePad) ||
IOHIDDeviceConformsTo(IOHIDDevice, kHIDPage_GenericDesktop, kHIDUsage_GD_Joystick))
{
diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c
index 80252e7e6b1..1f4098dcb40 100644
--- a/dlls/winebus.sys/bus_sdl.c
+++ b/dlls/winebus.sys/bus_sdl.c
@@ -528,9 +528,6 @@ static NTSTATUS sdl_device_get_string(struct unix_device *iface, DWORD index, WC
else
str = pSDL_JoystickName(ext->sdl_joystick);
break;
- case HID_STRING_ID_IMANUFACTURER:
- str = "SDL";
- break;
case HID_STRING_ID_ISERIALNUMBER:
str = "000000";
break;
@@ -739,6 +736,7 @@ static void sdl_add_device(unsigned int index)
.busid = sdl_busidW,
.input = -1,
.serial = {'0','0','0','0',0},
+ .manufacturer = {"SDL"},
};
struct platform_private *private;
char guid_str[34];
diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c
index 78e74de842a..b5b478b2d3d 100644
--- a/dlls/winebus.sys/bus_udev.c
+++ b/dlls/winebus.sys/bus_udev.c
@@ -677,9 +677,6 @@ static NTSTATUS hidraw_device_get_string(struct unix_device *iface, DWORD index,
case HID_STRING_ID_IPRODUCT:
str = get_sysattr_string(usbdev, "product");
break;
- case HID_STRING_ID_IMANUFACTURER:
- str = get_sysattr_string(usbdev, "manufacturer");
- break;
case HID_STRING_ID_ISERIALNUMBER:
str = get_sysattr_string(usbdev, "serial");
break;
@@ -702,8 +699,6 @@ static NTSTATUS hidraw_device_get_string(struct unix_device *iface, DWORD index,
str = strdupAtoW(buf);
break;
}
- case HID_STRING_ID_IMANUFACTURER:
- break;
case HID_STRING_ID_ISERIALNUMBER:
break;
default:
@@ -969,9 +964,6 @@ static NTSTATUS lnxev_device_get_string(struct unix_device *iface, DWORD index,
case HID_STRING_ID_IPRODUCT:
ioctl(ext->base.device_fd, EVIOCGNAME(sizeof(str)), str);
break;
- case HID_STRING_ID_IMANUFACTURER:
- strcpy(str,"evdev");
- break;
case HID_STRING_ID_ISERIALNUMBER:
ioctl(ext->base.device_fd, EVIOCGUNIQ(sizeof(str)), str);
break;
@@ -1088,6 +1080,9 @@ static void get_device_subsystem_info(struct udev_device *dev, char const *subsy
}
}
}
+
+ if (!desc->manufacturer[0] && (tmp = udev_device_get_sysattr_value(dev, "manufacturer")))
+ lstrcpynA(desc->manufacturer, tmp, sizeof(desc->manufacturer));
}
static void udev_add_device(struct udev_device *dev)
@@ -1133,6 +1128,7 @@ static void udev_add_device(struct udev_device *dev)
if (!strcmp(subsystem, "hidraw"))
{
desc.busid = hidraw_busidW;
+ if (!desc.manufacturer[0]) strcpy(desc.manufacturer, "hidraw");
}
#ifdef HAS_PROPER_INPUT_HEADER
else if (!strcmp(subsystem, "input"))
@@ -1154,6 +1150,8 @@ static void udev_add_device(struct udev_device *dev)
device_uid[0] = 0;
if (ioctl(fd, EVIOCGUNIQ(254), device_uid) >= 0 && device_uid[0])
MultiByteToWideChar(CP_UNIXCP, 0, device_uid, -1, desc.serial, ARRAY_SIZE(desc.serial));
+
+ if (!desc.manufacturer[0]) strcpy(desc.manufacturer, "evdev");
}
#endif
diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index 53f6ac032e8..2e355be0d99 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -111,6 +111,8 @@ struct device_extension
struct device_desc desc;
DWORD index;
+ WCHAR manufacturer[MAX_PATH];
+
BYTE *last_report;
DWORD last_report_size;
BOOL last_report_read;
@@ -364,6 +366,8 @@ static DEVICE_OBJECT *bus_create_hid_device(struct device_desc *desc, struct uni
ext->buffer_size = 0;
ext->unix_device = unix_device;
+ MultiByteToWideChar(CP_UNIXCP, 0, ext->desc.manufacturer, -1, ext->manufacturer, MAX_PATH);
+
InitializeListHead(&ext->irp_queue);
InitializeCriticalSection(&ext->cs);
ext->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": cs");
@@ -815,6 +819,23 @@ static NTSTATUS deliver_last_report(struct device_extension *ext, DWORD buffer_l
}
}
+static NTSTATUS hid_get_device_string(DEVICE_OBJECT *device, DWORD index, WCHAR *buffer, DWORD buffer_len)
+{
+ struct device_extension *ext = (struct device_extension *)device->DeviceExtension;
+ DWORD len;
+
+ switch (index)
+ {
+ case HID_STRING_ID_IMANUFACTURER:
+ len = (strlenW(ext->manufacturer) + 1) * sizeof(WCHAR);
+ if (len > buffer_len) return STATUS_BUFFER_TOO_SMALL;
+ else memcpy(buffer, ext->manufacturer, len);
+ return STATUS_SUCCESS;
+ }
+
+ return STATUS_NOT_IMPLEMENTED;
+}
+
static NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
{
IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp);
@@ -906,7 +927,9 @@ static NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
DWORD index = (ULONG_PTR)irpsp->Parameters.DeviceIoControl.Type3InputBuffer;
TRACE("IOCTL_HID_GET_STRING[%08x]\n", index);
- irp->IoStatus.Status = unix_device_get_string(device, index, (WCHAR *)irp->UserBuffer, buffer_len / sizeof(WCHAR));
+ irp->IoStatus.Status = hid_get_device_string(device, index, (WCHAR *)irp->UserBuffer, buffer_len);
+ if (irp->IoStatus.Status != STATUS_SUCCESS)
+ irp->IoStatus.Status = unix_device_get_string(device, index, (WCHAR *)irp->UserBuffer, buffer_len / sizeof(WCHAR));
if (irp->IoStatus.Status == STATUS_SUCCESS)
irp->IoStatus.Information = (strlenW((WCHAR *)irp->UserBuffer) + 1) * sizeof(WCHAR);
break;
diff --git a/dlls/winebus.sys/unixlib.c b/dlls/winebus.sys/unixlib.c
index 9b0ccc0ae1a..357a327ef37 100644
--- a/dlls/winebus.sys/unixlib.c
+++ b/dlls/winebus.sys/unixlib.c
@@ -119,6 +119,7 @@ static const struct device_desc mouse_device_desc =
.busid = mouse_bus_id,
.input = -1,
.serial = {'0','0','0','0',0},
+ .manufacturer = {"The Wine Project"},
};
static struct unix_device mouse_device = {.vtbl = &mouse_vtbl};
@@ -212,6 +213,7 @@ static const struct device_desc keyboard_device_desc =
.busid = keyboard_bus_id,
.input = -1,
.serial = {'0','0','0','0',0},
+ .manufacturer = {"The Wine Project"},
};
static struct unix_device keyboard_device = {.vtbl = &keyboard_vtbl};
diff --git a/dlls/winebus.sys/unixlib.h b/dlls/winebus.sys/unixlib.h
index 85a03dd17ee..cedee183507 100644
--- a/dlls/winebus.sys/unixlib.h
+++ b/dlls/winebus.sys/unixlib.h
@@ -42,6 +42,8 @@ struct device_desc
DWORD uid;
WCHAR serial[256];
BOOL is_gamepad;
+
+ char manufacturer[MAX_PATH];
};
struct sdl_bus_options
More information about the wine-cvs
mailing list