Rémi Bernon : winebus.sys: Consistently trace HID reports.

Alexandre Julliard julliard at winehq.org
Wed Oct 27 16:26:03 CDT 2021


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

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Wed Oct 27 10:39:12 2021 +0200

winebus.sys: Consistently trace HID reports.

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

---

 dlls/winebus.sys/main.c | 75 +++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 66 insertions(+), 9 deletions(-)

diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index 1353df7d000..0e7889386dc 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -401,6 +401,7 @@ static BOOL deliver_next_report(struct device_extension *ext, IRP *irp)
 {
     struct hid_report *report;
     struct list *entry;
+    ULONG i;
 
     if (!(entry = list_head(&ext->reports))) return FALSE;
     report = LIST_ENTRY(entry, struct hid_report, entry);
@@ -410,6 +411,19 @@ static BOOL deliver_next_report(struct device_extension *ext, IRP *irp)
     irp->IoStatus.Information = report->length;
     irp->IoStatus.Status = STATUS_SUCCESS;
 
+    if (TRACE_ON(plugplay))
+    {
+        TRACE("read input report length %u:\n", report->length);
+        for (i = 0; i < report->length;)
+        {
+            char buffer[256], *buf = buffer;
+            buf += sprintf(buf, "%08x ", i);
+            do { buf += sprintf(buf, " %02x", report->buffer[i]); }
+            while (++i % 16 && i < report->length);
+            TRACE("%s\n", buffer);
+        }
+    }
+
     RtlFreeHeap(GetProcessHeap(), 0, report);
     return TRUE;
 }
@@ -937,11 +951,9 @@ static NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
 {
     IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp);
     struct device_extension *ext = (struct device_extension *)device->DeviceExtension;
-    ULONG code, buffer_len = irpsp->Parameters.DeviceIoControl.OutputBufferLength;
+    ULONG i, code, buffer_len = irpsp->Parameters.DeviceIoControl.OutputBufferLength;
     NTSTATUS status;
 
-    TRACE("(%p, %p)\n", device, irp);
-
     if (device == bus_fdo)
     {
         IoSkipCurrentIrpStackLocation(irp);
@@ -1026,6 +1038,18 @@ static NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
             memcpy(packet->reportBuffer, ext->last_reports[packet->reportId], packet->reportBufferLen);
             irp->IoStatus.Information = packet->reportBufferLen;
             irp->IoStatus.Status = STATUS_SUCCESS;
+            if (TRACE_ON(plugplay))
+            {
+                TRACE("read input report id %u length %u:\n", packet->reportId, packet->reportBufferLen);
+                for (i = 0; i < packet->reportBufferLen;)
+                {
+                    char buffer[256], *buf = buffer;
+                    buf += sprintf(buf, "%08x ", i);
+                    do { buf += sprintf(buf, " %02x", packet->reportBuffer[i]); }
+                    while (++i % 16 && i < packet->reportBufferLen);
+                    TRACE("%s\n", buffer);
+                }
+            }
             break;
         }
         case IOCTL_HID_READ_REPORT:
@@ -1043,22 +1067,55 @@ static NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
         case IOCTL_HID_SET_OUTPUT_REPORT:
         case IOCTL_HID_WRITE_REPORT:
         {
-            HID_XFER_PACKET *packet = (HID_XFER_PACKET*)(irp->UserBuffer);
-            TRACE("IOCTL_HID_WRITE_REPORT / IOCTL_HID_SET_OUTPUT_REPORT\n");
+            HID_XFER_PACKET *packet = (HID_XFER_PACKET *)irp->UserBuffer;
+            if (TRACE_ON(plugplay))
+            {
+                TRACE("write output report id %u length %u:\n", packet->reportId, packet->reportBufferLen);
+                for (i = 0; i < packet->reportBufferLen;)
+                {
+                    char buffer[256], *buf = buffer;
+                    buf += sprintf(buf, "%08x ", i);
+                    do { buf += sprintf(buf, " %02x", packet->reportBuffer[i]); }
+                    while (++i % 16 && i < packet->reportBufferLen);
+                    TRACE("%s\n", buffer);
+                }
+            }
             unix_device_set_output_report(device, packet, &irp->IoStatus);
             break;
         }
         case IOCTL_HID_GET_FEATURE:
         {
-            HID_XFER_PACKET *packet = (HID_XFER_PACKET*)(irp->UserBuffer);
-            TRACE("IOCTL_HID_GET_FEATURE\n");
+            HID_XFER_PACKET *packet = (HID_XFER_PACKET *)irp->UserBuffer;
             unix_device_get_feature_report(device, packet, &irp->IoStatus);
+            if (!irp->IoStatus.Status && TRACE_ON(plugplay))
+            {
+                TRACE("read feature report id %u length %u:\n", packet->reportId, packet->reportBufferLen);
+                for (i = 0; i < packet->reportBufferLen;)
+                {
+                    char buffer[256], *buf = buffer;
+                    buf += sprintf(buf, "%08x ", i);
+                    do { buf += sprintf(buf, " %02x", packet->reportBuffer[i]); }
+                    while (++i % 16 && i < packet->reportBufferLen);
+                    TRACE("%s\n", buffer);
+                }
+            }
             break;
         }
         case IOCTL_HID_SET_FEATURE:
         {
-            HID_XFER_PACKET *packet = (HID_XFER_PACKET*)(irp->UserBuffer);
-            TRACE("IOCTL_HID_SET_FEATURE\n");
+            HID_XFER_PACKET *packet = (HID_XFER_PACKET *)irp->UserBuffer;
+            if (TRACE_ON(plugplay))
+            {
+                TRACE("write feature report id %u length %u:\n", packet->reportId, packet->reportBufferLen);
+                for (i = 0; i < packet->reportBufferLen;)
+                {
+                    char buffer[256], *buf = buffer;
+                    buf += sprintf(buf, "%08x ", i);
+                    do { buf += sprintf(buf, " %02x", packet->reportBuffer[i]); }
+                    while (++i % 16 && i < packet->reportBufferLen);
+                    TRACE("%s\n", buffer);
+                }
+            }
             unix_device_set_feature_report(device, packet, &irp->IoStatus);
             break;
         }




More information about the wine-cvs mailing list