Rémi Bernon : winebus.sys: Create stub Wine HID keyboard device.

Alexandre Julliard julliard at winehq.org
Fri Apr 23 15:20:17 CDT 2021


Module: wine
Branch: master
Commit: 709c801fb1f5b8a7679bbd655cd76757f42e7b82
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=709c801fb1f5b8a7679bbd655cd76757f42e7b82

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Thu Apr 22 21:26:49 2021 +0200

winebus.sys: Create stub Wine HID keyboard device.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winebus.sys/main.c      | 70 ++++++++++++++++++++++++++++++++++++++++++++
 dlls/winehid.sys/winehid.inf |  1 +
 2 files changed, 71 insertions(+)

diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index acd166758e7..99f834d2f40 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -97,6 +97,7 @@ static const struct product_desc XBOX_CONTROLLERS[] = {
 static DRIVER_OBJECT *driver_obj;
 
 static DEVICE_OBJECT *mouse_obj;
+static DEVICE_OBJECT *keyboard_obj;
 
 /* The root-enumerated device stack. */
 DEVICE_OBJECT *bus_pdo;
@@ -540,6 +541,74 @@ static void mouse_device_create(void)
     IoInvalidateDeviceRelations(bus_pdo, BusRelations);
 }
 
+static NTSTATUS keyboard_get_reportdescriptor(DEVICE_OBJECT *device, BYTE *buffer, DWORD length, DWORD *ret_length)
+{
+    TRACE("buffer %p, length %u.\n", buffer, length);
+
+    *ret_length = sizeof(REPORT_HEADER) + sizeof(REPORT_TAIL);
+    if (length < sizeof(REPORT_HEADER) + sizeof(REPORT_TAIL))
+        return STATUS_BUFFER_TOO_SMALL;
+
+    memcpy(buffer, REPORT_HEADER, sizeof(REPORT_HEADER));
+    memcpy(buffer + sizeof(REPORT_HEADER), REPORT_TAIL, sizeof(REPORT_TAIL));
+    buffer[IDX_HEADER_PAGE] = HID_USAGE_PAGE_GENERIC;
+    buffer[IDX_HEADER_USAGE] = HID_USAGE_GENERIC_KEYBOARD;
+
+    return STATUS_SUCCESS;
+}
+
+static NTSTATUS keyboard_get_string(DEVICE_OBJECT *device, DWORD index, WCHAR *buffer, DWORD length)
+{
+    static const WCHAR nameW[] = {'W','i','n','e',' ','H','I','D',' ','k','e','y','b','o','a','r','d',0};
+    if (index != HID_STRING_ID_IPRODUCT)
+        return STATUS_NOT_IMPLEMENTED;
+    if (length < ARRAY_SIZE(nameW))
+        return STATUS_BUFFER_TOO_SMALL;
+    strcpyW(buffer, nameW);
+    return STATUS_SUCCESS;
+}
+
+static NTSTATUS keyboard_begin_report_processing(DEVICE_OBJECT *device)
+{
+    return STATUS_SUCCESS;
+}
+
+static NTSTATUS keyboard_set_output_report(DEVICE_OBJECT *device, UCHAR id, BYTE *report, DWORD length, ULONG_PTR *ret_length)
+{
+    FIXME("id %u, stub!\n", id);
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+static NTSTATUS keyboard_get_feature_report(DEVICE_OBJECT *device, UCHAR id, BYTE *report, DWORD length, ULONG_PTR *ret_length)
+{
+    FIXME("id %u, stub!\n", id);
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+static NTSTATUS keyboard_set_feature_report(DEVICE_OBJECT *device, UCHAR id, BYTE *report, DWORD length, ULONG_PTR *ret_length)
+{
+    FIXME("id %u, stub!\n", id);
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+static const platform_vtbl keyboard_vtbl =
+{
+    .get_reportdescriptor = keyboard_get_reportdescriptor,
+    .get_string = keyboard_get_string,
+    .begin_report_processing = keyboard_begin_report_processing,
+    .set_output_report = keyboard_set_output_report,
+    .get_feature_report = keyboard_get_feature_report,
+    .set_feature_report = keyboard_set_feature_report,
+};
+
+static void keyboard_device_create(void)
+{
+    static const WCHAR busidW[] = {'W','I','N','E','K','E','Y','B','O','A','R','D',0};
+
+    keyboard_obj = bus_create_hid_device(busidW, 0, 0, -1, 0, 0, busidW, FALSE, &keyboard_vtbl, 0);
+    IoInvalidateDeviceRelations(bus_pdo, BusRelations);
+}
+
 static NTSTATUS fdo_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
 {
     static const WCHAR SDL_enabledW[] = {'E','n','a','b','l','e',' ','S','D','L',0};
@@ -554,6 +623,7 @@ static NTSTATUS fdo_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
         break;
     case IRP_MN_START_DEVICE:
         mouse_device_create();
+        keyboard_device_create();
 
         if (check_bus_option(&SDL_enabled, 1))
         {
diff --git a/dlls/winehid.sys/winehid.inf b/dlls/winehid.sys/winehid.inf
index 566448e4a51..f9ed4091217 100644
--- a/dlls/winehid.sys/winehid.inf
+++ b/dlls/winehid.sys/winehid.inf
@@ -12,6 +12,7 @@ Wine IOHID device=device_section,IOHID
 Wine libevent device=device_section,LNXEV
 Wine SDL HID device=device_section,SDLJOY
 Wine mouse device=device_section,WINEMOUSE
+Wine keyboard device=device_section,WINEKEYBOARD
 
 [device_section.Services]
 AddService = winehid,0x2,svc_section




More information about the wine-cvs mailing list