https://git.reactos.org/?p=reactos.git;a=commitdiff;h=cbe88e287f45ae0dead0d80f169a7e20e569480c

commit cbe88e287f45ae0dead0d80f169a7e20e569480c
Author:     Victor Perevertkin <[email protected]>
AuthorDate: Sun Dec 6 01:57:56 2020 +0300
Commit:     Victor Perevertkin <[email protected]>
CommitDate: Sun Dec 6 01:57:56 2020 +0300

    [USBSTOR][SCSIPORT] Use STORAGE_ADAPTER_DESCRIPTOR from WIN8
    
    This way, these drivers are more compatible with classpnp and cdrom used
    by ReactOS (and don't fire asserts)
---
 drivers/storage/port/scsiport/ioctl.c    | 18 ++++++++--------
 drivers/storage/port/scsiport/scsiport.h | 17 +++++++++++++++
 drivers/usb/usbstor/disk.c               | 37 ++++++++++++++++----------------
 drivers/usb/usbstor/usbstor.h            | 18 ++++++++++++++++
 4 files changed, 63 insertions(+), 27 deletions(-)

diff --git a/drivers/storage/port/scsiport/ioctl.c 
b/drivers/storage/port/scsiport/ioctl.c
index 7346f7f3228..b3a28416d09 100644
--- a/drivers/storage/port/scsiport/ioctl.c
+++ b/drivers/storage/port/scsiport/ioctl.c
@@ -335,7 +335,7 @@ FdoHandleQueryProperty(
         goto completeIrp;
     }
 
-    if (ioStack->Parameters.DeviceIoControl.OutputBufferLength < 
sizeof(STORAGE_ADAPTER_DESCRIPTOR))
+    if (ioStack->Parameters.DeviceIoControl.OutputBufferLength < 
sizeof(STORAGE_ADAPTER_DESCRIPTOR_WIN8))
     {
         // buffer too small
         PSTORAGE_DESCRIPTOR_HEADER DescriptorHeader = 
Irp->AssociatedIrp.SystemBuffer;
@@ -343,8 +343,8 @@ FdoHandleQueryProperty(
                >= sizeof(STORAGE_DESCRIPTOR_HEADER));
 
         // return required size
-        DescriptorHeader->Version = sizeof(STORAGE_ADAPTER_DESCRIPTOR);
-        DescriptorHeader->Size = sizeof(STORAGE_ADAPTER_DESCRIPTOR);
+        DescriptorHeader->Version = sizeof(STORAGE_ADAPTER_DESCRIPTOR_WIN8);
+        DescriptorHeader->Size = sizeof(STORAGE_ADAPTER_DESCRIPTOR_WIN8);
 
         Irp->IoStatus.Information = sizeof(STORAGE_DESCRIPTOR_HEADER);
         status = STATUS_SUCCESS;
@@ -352,14 +352,14 @@ FdoHandleQueryProperty(
     }
 
     // get adapter descriptor, information is returned in the same buffer
-    PSTORAGE_ADAPTER_DESCRIPTOR adapterDescriptor = 
Irp->AssociatedIrp.SystemBuffer;
+    PSTORAGE_ADAPTER_DESCRIPTOR_WIN8 adapterDescriptor = 
Irp->AssociatedIrp.SystemBuffer;
 
     // fill out descriptor
-    // NOTE: STORAGE_ADAPTER_DESCRIPTOR may vary in size, so it's important to 
zero out
+    // NOTE: STORAGE_ADAPTER_DESCRIPTOR_WIN8 may vary in size, so it's 
important to zero out
     // all unused fields
-    *adapterDescriptor = (STORAGE_ADAPTER_DESCRIPTOR) {
-        .Version = sizeof(STORAGE_ADAPTER_DESCRIPTOR),
-        .Size = sizeof(STORAGE_ADAPTER_DESCRIPTOR),
+    *adapterDescriptor = (STORAGE_ADAPTER_DESCRIPTOR_WIN8) {
+        .Version = sizeof(STORAGE_ADAPTER_DESCRIPTOR_WIN8),
+        .Size = sizeof(STORAGE_ADAPTER_DESCRIPTOR_WIN8),
         .MaximumTransferLength = 
portExt->PortCapabilities.MaximumTransferLength,
         .MaximumPhysicalPages = portExt->PortCapabilities.MaximumPhysicalPages,
         .AlignmentMask = portExt->PortCapabilities.AlignmentMask,
@@ -373,7 +373,7 @@ FdoHandleQueryProperty(
     };
 
     // store returned length
-    Irp->IoStatus.Information = sizeof(STORAGE_ADAPTER_DESCRIPTOR);
+    Irp->IoStatus.Information = sizeof(STORAGE_ADAPTER_DESCRIPTOR_WIN8);
     status = STATUS_SUCCESS;
 
 completeIrp:
diff --git a/drivers/storage/port/scsiport/scsiport.h 
b/drivers/storage/port/scsiport/scsiport.h
index b2db80654f0..a81ef4cbb41 100644
--- a/drivers/storage/port/scsiport/scsiport.h
+++ b/drivers/storage/port/scsiport/scsiport.h
@@ -50,6 +50,23 @@
 #define LUNEX_REQUEST_PENDING            0x0020
 #define SCSI_PORT_SCAN_IN_PROGRESS       0x8000
 
+// we need this to be compatible with ReactOS' classpnp (which is compiled 
with NTDDI_WIN8)
+typedef struct _STORAGE_ADAPTER_DESCRIPTOR_WIN8 {
+    ULONG Version;
+    ULONG Size;
+    ULONG MaximumTransferLength;
+    ULONG MaximumPhysicalPages;
+    ULONG AlignmentMask;
+    BOOLEAN AdapterUsesPio;
+    BOOLEAN AdapterScansDown;
+    BOOLEAN CommandQueueing;
+    BOOLEAN AcceleratedTransfer;
+    UCHAR BusType;
+    USHORT BusMajorVersion;
+    USHORT BusMinorVersion;
+    UCHAR SrbType;
+    UCHAR AddressType;
+} STORAGE_ADAPTER_DESCRIPTOR_WIN8, *PSTORAGE_ADAPTER_DESCRIPTOR_WIN8;
 
 typedef enum _SCSI_PORT_TIMER_STATES
 {
diff --git a/drivers/usb/usbstor/disk.c b/drivers/usb/usbstor/disk.c
index 1e5bd1299fb..1dbe0ad83d8 100644
--- a/drivers/usb/usbstor/disk.c
+++ b/drivers/usb/usbstor/disk.c
@@ -230,7 +230,7 @@ USBSTOR_HandleQueryProperty(
     PIO_STACK_LOCATION IoStack;
     PSTORAGE_PROPERTY_QUERY PropertyQuery;
     PSTORAGE_DESCRIPTOR_HEADER DescriptorHeader;
-    PSTORAGE_ADAPTER_DESCRIPTOR AdapterDescriptor;
+    PSTORAGE_ADAPTER_DESCRIPTOR_WIN8 AdapterDescriptor;
     ULONG FieldLengthVendor, FieldLengthProduct, FieldLengthRevision, 
TotalLength, FieldLengthSerialNumber;
     PPDO_DEVICE_EXTENSION PDODeviceExtension;
     PINQUIRYDATA InquiryData;
@@ -375,39 +375,40 @@ USBSTOR_HandleQueryProperty(
 
         DPRINT("USBSTOR_HandleQueryProperty StorageAdapterProperty 
OutputBufferLength %lu\n", 
IoStack->Parameters.DeviceIoControl.OutputBufferLength);
 
-        if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < 
sizeof(STORAGE_ADAPTER_DESCRIPTOR))
+        if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < 
sizeof(STORAGE_ADAPTER_DESCRIPTOR_WIN8))
         {
             // buffer too small
             DescriptorHeader = 
(PSTORAGE_DESCRIPTOR_HEADER)Irp->AssociatedIrp.SystemBuffer;
             ASSERT(IoStack->Parameters.DeviceIoControl.OutputBufferLength >= 
sizeof(STORAGE_DESCRIPTOR_HEADER));
 
             // return required size
-            DescriptorHeader->Version = sizeof(STORAGE_ADAPTER_DESCRIPTOR);
-            DescriptorHeader->Size = sizeof(STORAGE_ADAPTER_DESCRIPTOR);
+            DescriptorHeader->Version = 
sizeof(STORAGE_ADAPTER_DESCRIPTOR_WIN8);
+            DescriptorHeader->Size = sizeof(STORAGE_ADAPTER_DESCRIPTOR_WIN8);
 
             Irp->IoStatus.Information = sizeof(STORAGE_DESCRIPTOR_HEADER);
             return STATUS_SUCCESS;
         }
 
         // get adapter descriptor, information is returned in the same buffer
-        AdapterDescriptor = 
(PSTORAGE_ADAPTER_DESCRIPTOR)Irp->AssociatedIrp.SystemBuffer;
+        AdapterDescriptor = Irp->AssociatedIrp.SystemBuffer;
 
         // fill out descriptor
-        AdapterDescriptor->Version = sizeof(STORAGE_ADAPTER_DESCRIPTOR);
-        AdapterDescriptor->Size = sizeof(STORAGE_ADAPTER_DESCRIPTOR);
-        AdapterDescriptor->MaximumTransferLength = 
USBSTOR_DEFAULT_MAX_TRANSFER_LENGTH;
-        AdapterDescriptor->MaximumPhysicalPages = 
USBSTOR_DEFAULT_MAX_TRANSFER_LENGTH / PAGE_SIZE + 1; // See CORE-10515 and 
CORE-10755
-        AdapterDescriptor->AlignmentMask = 0;
-        AdapterDescriptor->AdapterUsesPio = FALSE;
-        AdapterDescriptor->AdapterScansDown = FALSE;
-        AdapterDescriptor->CommandQueueing = FALSE;
-        AdapterDescriptor->AcceleratedTransfer = FALSE;
-        AdapterDescriptor->BusType = BusTypeUsb;
-        AdapterDescriptor->BusMajorVersion = 0x2; //FIXME verify
-        AdapterDescriptor->BusMinorVersion = 0x00; //FIXME
+        // NOTE: STORAGE_ADAPTER_DESCRIPTOR_WIN8 may vary in size, so it's 
important to zero out
+        // all unused fields
+        *AdapterDescriptor = (STORAGE_ADAPTER_DESCRIPTOR_WIN8) {
+            .Version = sizeof(STORAGE_ADAPTER_DESCRIPTOR_WIN8),
+            .Size = sizeof(STORAGE_ADAPTER_DESCRIPTOR_WIN8),
+            .MaximumTransferLength = USBSTOR_DEFAULT_MAX_TRANSFER_LENGTH,
+            .MaximumPhysicalPages = USBSTOR_DEFAULT_MAX_TRANSFER_LENGTH / 
PAGE_SIZE + 1, // See CORE-10515 and CORE-10755
+            .BusType = BusTypeUsb,
+            .BusMajorVersion = 2, //FIXME verify
+            .BusMinorVersion = 0 //FIXME
+        };
+
+        // __debugbreak();
 
         // store returned length
-        Irp->IoStatus.Information = sizeof(STORAGE_ADAPTER_DESCRIPTOR);
+        Irp->IoStatus.Information = sizeof(STORAGE_ADAPTER_DESCRIPTOR_WIN8);
 
         return STATUS_SUCCESS;
     }
diff --git a/drivers/usb/usbstor/usbstor.h b/drivers/usb/usbstor/usbstor.h
index 71e90708311..318010f791e 100644
--- a/drivers/usb/usbstor/usbstor.h
+++ b/drivers/usb/usbstor/usbstor.h
@@ -169,6 +169,24 @@ typedef struct _ERRORHANDLER_WORKITEM_DATA
     PIRP Irp;
 } ERRORHANDLER_WORKITEM_DATA, *PERRORHANDLER_WORKITEM_DATA;
 
+// we need this to be compatible with ReactOS' classpnp (which is compiled 
with NTDDI_WIN8)
+typedef struct _STORAGE_ADAPTER_DESCRIPTOR_WIN8 {
+    ULONG Version;
+    ULONG Size;
+    ULONG MaximumTransferLength;
+    ULONG MaximumPhysicalPages;
+    ULONG AlignmentMask;
+    BOOLEAN AdapterUsesPio;
+    BOOLEAN AdapterScansDown;
+    BOOLEAN CommandQueueing;
+    BOOLEAN AcceleratedTransfer;
+    UCHAR BusType;
+    USHORT BusMajorVersion;
+    USHORT BusMinorVersion;
+    UCHAR SrbType;
+    UCHAR AddressType;
+} STORAGE_ADAPTER_DESCRIPTOR_WIN8, *PSTORAGE_ADAPTER_DESCRIPTOR_WIN8;
+
 
 //---------------------------------------------------------------------
 //

Reply via email to