[USBSTOR]
authorThomas Faber <thomas.faber@reactos.org>
Sat, 9 Apr 2016 16:13:37 +0000 (16:13 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Sat, 9 Apr 2016 16:13:37 +0000 (16:13 +0000)
- In USBSTOR_GetMaxLUN, correctly handle devices that do not support this request. Patch by Vadim Galyant.
CORE-10515 #resolve

svn path=/trunk/; revision=71128

reactos/drivers/usb/usbstor/misc.c

index f78b91c..6b60cf8 100644 (file)
@@ -23,7 +23,7 @@ NTSTATUS
 NTAPI
 USBSTOR_SyncForwardIrpCompletionRoutine(
     PDEVICE_OBJECT DeviceObject,
 NTAPI
 USBSTOR_SyncForwardIrpCompletionRoutine(
     PDEVICE_OBJECT DeviceObject,
-    PIRP Irp, 
+    PIRP Irp,
     PVOID Context)
 {
     if (Irp->PendingReturned)
     PVOID Context)
 {
     if (Irp->PendingReturned)
@@ -362,19 +362,34 @@ USBSTOR_GetMaxLUN(
 
     DPRINT("MaxLUN: %x\n", *Buffer);
 
 
     DPRINT("MaxLUN: %x\n", *Buffer);
 
-    if (*Buffer > 0xF)
+    if (NT_SUCCESS(Status))
     {
     {
-        //
-        // invalid response documented in usb mass storage specification
-        //
-        Status = STATUS_DEVICE_DATA_ERROR;
+        if (*Buffer > 0xF)
+        {
+            //
+            // invalid response documented in usb mass storage specification
+            //
+            Status = STATUS_DEVICE_DATA_ERROR;
+        }
+        else
+        {
+            //
+            // store maxlun
+            //
+            DeviceExtension->MaxLUN = *Buffer;
+        }
     }
     else
     {
         //
     }
     else
     {
         //
-        // store maxlun
+        // "USB Mass Storage Class. Bulk-Only Transport. Revision 1.0"
+        // 3.2  Get Max LUN (class-specific request) :
+        // Devices that do not support multiple LUNs may STALL this command.
         //
         //
-        DeviceExtension->MaxLUN = *Buffer;
+        USBSTOR_ResetDevice(DeviceExtension->LowerDeviceObject, DeviceExtension);
+
+        DeviceExtension->MaxLUN = 0;
+        Status = STATUS_SUCCESS;
     }
 
     //
     }
 
     //