mirror of
https://github.com/reactos/reactos.git
synced 2026-06-01 08:50:24 +08:00
[FREELDR] scsiport.c: Set the Information->Type field (#8418)
CORE-9023 And more accurately detect and report disks: using `InquiryBuffer.DeviceType`, differentiate between "rigid" disks, floppy disks, and CD-ROM drives.
This commit is contained in:
@@ -67,7 +67,7 @@ typedef struct
|
||||
PVOID NonCachedExtension;
|
||||
|
||||
ULONG BusNum;
|
||||
ULONG MaxTargedIds;
|
||||
ULONG MaxTargetIds;
|
||||
|
||||
ULONG InterruptFlags;
|
||||
|
||||
@@ -99,6 +99,7 @@ typedef struct tagDISKCONTEXT
|
||||
UCHAR Lun;
|
||||
|
||||
/* Device characteristics */
|
||||
BOOLEAN IsFloppy;
|
||||
ULONG SectorSize;
|
||||
ULONGLONG SectorOffset;
|
||||
ULONGLONG SectorCount;
|
||||
@@ -196,6 +197,8 @@ static ARC_STATUS DiskGetFileInformation(ULONG FileId, FILEINFORMATION* Informat
|
||||
Information->EndingAddress.QuadPart = (Context->SectorOffset + Context->SectorCount) * Context->SectorSize;
|
||||
Information->CurrentAddress.QuadPart = Context->SectorNumber * Context->SectorSize;
|
||||
|
||||
Information->Type = (Context->IsFloppy ? FloppyDiskPeripheral : DiskPeripheral);
|
||||
|
||||
return ESUCCESS;
|
||||
}
|
||||
|
||||
@@ -260,6 +263,7 @@ static ARC_STATUS DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
|
||||
Context->PathId = (UCHAR)PathId;
|
||||
Context->TargetId = (UCHAR)TargetId;
|
||||
Context->Lun = (UCHAR)Lun;
|
||||
Context->IsFloppy = (!strstr(Path, ")cdrom(") && strstr(Path, ")fdisk("));
|
||||
Context->SectorSize = SectorSize;
|
||||
Context->SectorOffset = SectorOffset;
|
||||
Context->SectorCount = SectorCount;
|
||||
@@ -894,13 +898,11 @@ SpiScanAdapter(
|
||||
/* Remember the extension */
|
||||
ScsiDeviceExtensions[ScsiBus] = DeviceExtension;
|
||||
|
||||
for (TargetId = 0; TargetId < DeviceExtension->MaxTargedIds; TargetId++)
|
||||
for (TargetId = 0; TargetId < DeviceExtension->MaxTargetIds; TargetId++)
|
||||
{
|
||||
Lun = 0;
|
||||
do
|
||||
for (Lun = 0; Lun < SCSI_MAXIMUM_LOGICAL_UNITS; Lun++)
|
||||
{
|
||||
TRACE("Scanning SCSI device %d.%d.%d\n",
|
||||
ScsiBus, TargetId, Lun);
|
||||
TRACE("Scanning SCSI device %lu.%u.%u\n", ScsiBus, TargetId, Lun);
|
||||
|
||||
Srb = ExAllocatePool(PagedPool, sizeof(SCSI_REQUEST_BLOCK));
|
||||
if (!Srb)
|
||||
@@ -926,24 +928,43 @@ SpiScanAdapter(
|
||||
break;
|
||||
}
|
||||
|
||||
/* Device exists, create its ARC name */
|
||||
if (InquiryBuffer.RemovableMedia)
|
||||
/*
|
||||
* Device exists, create its ARC name.
|
||||
* NOTE: Other devices are not supported:
|
||||
* - SEQUENTIAL_ACCESS_DEVICE i.e. Tape,
|
||||
* - WRITE_ONCE_READ_MULTIPLE_DEVICE i.e. Worm.
|
||||
*/
|
||||
if ((InquiryBuffer.DeviceType == DIRECT_ACCESS_DEVICE) ||
|
||||
(InquiryBuffer.DeviceType == OPTICAL_DEVICE))
|
||||
{
|
||||
sprintf(ArcName, "scsi(%ld)cdrom(%d)fdisk(%d)",
|
||||
ScsiBus, TargetId, Lun);
|
||||
if ((InquiryBuffer.DeviceType == DIRECT_ACCESS_DEVICE) &&
|
||||
InquiryBuffer.RemovableMedia)
|
||||
{
|
||||
/* Floppy disk */
|
||||
RtlStringCbPrintfA(ArcName, sizeof(ArcName),
|
||||
"scsi(%lu)disk(%u)fdisk(%u)",
|
||||
ScsiBus, TargetId, Lun);
|
||||
FsRegisterDevice(ArcName, &DiskVtbl);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Other rigid disk */
|
||||
RtlStringCbPrintfA(ArcName, sizeof(ArcName),
|
||||
"scsi(%lu)disk(%u)rdisk(%u)",
|
||||
ScsiBus, TargetId, Lun);
|
||||
/* Now, check if it has partitions */
|
||||
SpiScanDevice(DeviceExtension, ArcName, PathId, TargetId, Lun);
|
||||
}
|
||||
}
|
||||
else if (InquiryBuffer.DeviceType == READ_ONLY_DIRECT_ACCESS_DEVICE)
|
||||
{
|
||||
/* CD-ROM; note that the RemovableMedia bit may or may not be set */
|
||||
RtlStringCbPrintfA(ArcName, sizeof(ArcName),
|
||||
"scsi(%lu)cdrom(%u)fdisk(%u)",
|
||||
ScsiBus, TargetId, Lun);
|
||||
FsRegisterDevice(ArcName, &DiskVtbl);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(ArcName, "scsi(%ld)disk(%d)rdisk(%d)",
|
||||
ScsiBus, TargetId, Lun);
|
||||
/* Now, check if it has partitions */
|
||||
SpiScanDevice(DeviceExtension, ArcName, PathId, TargetId, Lun);
|
||||
}
|
||||
|
||||
/* Check next LUN */
|
||||
Lun++;
|
||||
} while (Lun < SCSI_MAXIMUM_LOGICAL_UNITS);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1249,14 +1270,14 @@ ScsiPortInitialize(
|
||||
|
||||
/* Copy all stuff which we ever need from PortConfig to the DeviceExtension */
|
||||
if (PortConfig.MaximumNumberOfTargets > SCSI_MAXIMUM_TARGETS_PER_BUS)
|
||||
DeviceExtension->MaxTargedIds = SCSI_MAXIMUM_TARGETS_PER_BUS;
|
||||
DeviceExtension->MaxTargetIds = SCSI_MAXIMUM_TARGETS_PER_BUS;
|
||||
else
|
||||
DeviceExtension->MaxTargedIds = PortConfig.MaximumNumberOfTargets;
|
||||
DeviceExtension->MaxTargetIds = PortConfig.MaximumNumberOfTargets;
|
||||
|
||||
DeviceExtension->BusNum = PortConfig.SystemIoBusNumber;
|
||||
|
||||
TRACE("Adapter found: buses = %d, targets = %d\n",
|
||||
PortConfig.NumberOfBuses, DeviceExtension->MaxTargedIds);
|
||||
TRACE("Adapter found: buses = %u, targets = %u\n",
|
||||
PortConfig.NumberOfBuses, DeviceExtension->MaxTargetIds);
|
||||
|
||||
/* Initialize adapter */
|
||||
if (!DeviceExtension->HwInitialize(DeviceExtension->MiniPortDeviceExtension))
|
||||
|
||||
Reference in New Issue
Block a user