[ros-diffs] [hpoussin] 17980: Fix IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / DeviceTextLocationInformation for USB devices

hpoussin at svn.reactos.com hpoussin at svn.reactos.com
Thu Sep 22 11:17:21 CEST 2005


Fix IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT /
DeviceTextLocationInformation for USB devices
I was mis-using usb_get_string() method...
Modified: trunk/reactos/drivers/usb/usbhub/pdo.c
  _____  

Modified: trunk/reactos/drivers/usb/usbhub/pdo.c
--- trunk/reactos/drivers/usb/usbhub/pdo.c	2005-09-22 07:24:08 UTC
(rev 17979)
+++ trunk/reactos/drivers/usb/usbhub/pdo.c	2005-09-22 09:17:17 UTC
(rev 17980)
@@ -156,30 +156,47 @@

 		}*/
 		case DeviceTextLocationInformation:
 		{
-			int size;
-			char *buf;
+			unsigned short size;
+			int ret;
+			PWCHAR buf;
+			PWCHAR bufret;
 
 			DPRINT("Usbhub: IRP_MJ_PNP /
IRP_MN_QUERY_DEVICE_TEXT / DeviceTextLocationInformation\n");
 			if (!DeviceExtension->dev->descriptor.iProduct)
 				return STATUS_NOT_SUPPORTED;
 
-			size = usb_get_string(DeviceExtension->dev,
LocaleId, DeviceExtension->dev->descriptor.iProduct, NULL, 0);
-			if (size < 2)
+			ret = usb_get_string(DeviceExtension->dev,
LocaleId, DeviceExtension->dev->descriptor.iProduct, &size,
sizeof(size));
+			if (ret < 2)
 			{
-				DPRINT("Usbhub: usb_get_string()
failed\n");
+				DPRINT("Usbhub: usb_get_string() failed
with error %d\n", ret);
 				return STATUS_IO_DEVICE_ERROR;
 			}
+			size &= 0xff;
 			buf = ExAllocatePool(PagedPool, size);
 			if (buf == NULL)
+			{
+				DPRINT("Usbhub: ExAllocatePool()
failed\n");
 				return STATUS_INSUFFICIENT_RESOURCES;
-			size = usb_get_string(DeviceExtension->dev,
LocaleId, DeviceExtension->dev->descriptor.iProduct, buf, size);
-			if (size < 0)
+			}
+			ret = usb_get_string(DeviceExtension->dev,
LocaleId, DeviceExtension->dev->descriptor.iProduct, buf, size);
+			if (ret < 0)
 			{
-				DPRINT("Usbhub: usb_get_string()
failed\n");
+				DPRINT("Usbhub: usb_get_string() failed
with error %d\n", ret);
 				ExFreePool(buf);
 				return STATUS_IO_DEVICE_ERROR;
 			}
-			*Information = (ULONG_PTR)buf;
+			bufret = ExAllocatePool(PagedPool, size - 2 /*
size of length identifier */ + 2 /* final NULL */);
+			if (bufret == NULL)
+			{
+				DPRINT("Usbhub: ExAllocatePool()
failed\n");
+				ExFreePool(buf);
+				return STATUS_INSUFFICIENT_RESOURCES;
+			}
+
+			RtlCopyMemory(bufret, &buf[1], size - 2);
+			bufret[(size - 1) / sizeof(WCHAR)] = 0;
+			*Information = (ULONG_PTR)bufret;
+			ExFreePool(buf);
 			return STATUS_SUCCESS;
 		}
 		default:
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.reactos.org/pipermail/ros-diffs/attachments/20050922/8adf286f/attachment.html


More information about the Ros-diffs mailing list