https://git.reactos.org/?p=reactos.git;a=commitdiff;h=cbe88e287f45ae0dead0d8...
commit cbe88e287f45ae0dead0d80f169a7e20e569480c Author: Victor Perevertkin victor.perevertkin@reactos.org AuthorDate: Sun Dec 6 01:57:56 2020 +0300 Commit: Victor Perevertkin victor.perevertkin@reactos.org 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; +
//--------------------------------------------------------------------- //