From cbe88e287f45ae0dead0d80f169a7e20e569480c Mon Sep 17 00:00:00 2001 From: Victor Perevertkin Date: Sun, 6 Dec 2020 01:57:56 +0300 Subject: [PATCH] [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; + //--------------------------------------------------------------------- // -- 2.17.1