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