mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 04:43:51 +00:00
- Enabled the command queueing (in DiskClassCreateDeviceObject).
- Do always reread the partition table in DiskBuildPartitionTable, because DiskBuildPartitionTable is only called for removable media's. - If there is no partition table available, set the disk data entries for this volume to the super floppy format (in DiskBuildPartitionTable). svn path=/trunk/; revision=9807
This commit is contained in:
parent
7d5a8e2e07
commit
7b96a26e57
1 changed files with 53 additions and 27 deletions
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: disk.c,v 1.41 2004/05/10 18:02:20 gvg Exp $
|
/* $Id: disk.c,v 1.42 2004/06/21 21:03:12 hbirr Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -548,6 +548,14 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
|
||||||
DiskDeviceExtension->PathId = InquiryData->PathId;
|
DiskDeviceExtension->PathId = InquiryData->PathId;
|
||||||
DiskDeviceExtension->TargetId = InquiryData->TargetId;
|
DiskDeviceExtension->TargetId = InquiryData->TargetId;
|
||||||
DiskDeviceExtension->Lun = InquiryData->Lun;
|
DiskDeviceExtension->Lun = InquiryData->Lun;
|
||||||
|
DiskDeviceExtension->SrbFlags = 0;
|
||||||
|
|
||||||
|
/* Enable the command queueing, if it possible */
|
||||||
|
if (Capabilities->TaggedQueuing &&
|
||||||
|
((PINQUIRYDATA)InquiryData->InquiryData)->CommandQueue)
|
||||||
|
{
|
||||||
|
DiskDeviceExtension->SrbFlags |= SRB_FLAGS_QUEUE_ACTION_ENABLE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Get timeout value */
|
/* Get timeout value */
|
||||||
DiskDeviceExtension->TimeOutValue =
|
DiskDeviceExtension->TimeOutValue =
|
||||||
|
@ -589,7 +597,7 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate sense data buffer */
|
/* Allocate sense data buffer */
|
||||||
DiskDeviceExtension->SenseData = ExAllocatePool(NonPagedPool,
|
DiskDeviceExtension->SenseData = ExAllocatePool(NonPagedPoolCacheAligned,
|
||||||
SENSE_BUFFER_SIZE);
|
SENSE_BUFFER_SIZE);
|
||||||
if (DiskDeviceExtension->SenseData == NULL)
|
if (DiskDeviceExtension->SenseData == NULL)
|
||||||
{
|
{
|
||||||
|
@ -853,14 +861,17 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject,
|
||||||
DiskDeviceExtension = (PDEVICE_EXTENSION)DiskDeviceObject->DeviceExtension;
|
DiskDeviceExtension = (PDEVICE_EXTENSION)DiskDeviceObject->DeviceExtension;
|
||||||
DiskData = (PDISK_DATA)(DiskDeviceExtension + 1);
|
DiskData = (PDISK_DATA)(DiskDeviceExtension + 1);
|
||||||
|
|
||||||
if (DiskDeviceExtension->StartingOffset.QuadPart)
|
Status = ScsiClassReadDriveCapacity(DiskDeviceObject);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT("Partition already installed\n");
|
/* Drive is not ready. */
|
||||||
return(STATUS_SUCCESS);
|
DPRINT("Drive not ready\n");
|
||||||
|
DiskData->DriveNotReady = TRUE;
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read partition table */
|
/* Read partition table */
|
||||||
Status = IoReadPartitionTable(DiskDeviceObject,
|
Status = IoReadPartitionTable(DiskDeviceExtension->PhysicalDevice,
|
||||||
DiskDeviceExtension->DiskGeometry->BytesPerSector,
|
DiskDeviceExtension->DiskGeometry->BytesPerSector,
|
||||||
TRUE,
|
TRUE,
|
||||||
&PartitionList);
|
&PartitionList);
|
||||||
|
@ -886,27 +897,42 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject,
|
||||||
/* Set disk signature */
|
/* Set disk signature */
|
||||||
DiskData->Signature = PartitionList->Signature;
|
DiskData->Signature = PartitionList->Signature;
|
||||||
|
|
||||||
for (PartitionNumber = 0; PartitionNumber < PartitionList->PartitionCount; PartitionNumber++)
|
DiskData->NextPartition = NULL;
|
||||||
{
|
|
||||||
PartitionEntry = &PartitionList->PartitionEntry[PartitionNumber];
|
|
||||||
|
|
||||||
DiskData->NextPartition = NULL;
|
if (PartitionList->PartitionCount)
|
||||||
DiskData->PartitionType = PartitionEntry->PartitionType;
|
{
|
||||||
DiskData->PartitionNumber = PartitionNumber + 1;
|
for (PartitionNumber = 0; PartitionNumber < PartitionList->PartitionCount; PartitionNumber++)
|
||||||
DiskData->PartitionOrdinal = PartitionNumber + 1;
|
{
|
||||||
DiskData->HiddenSectors = PartitionEntry->HiddenSectors;
|
PartitionEntry = &PartitionList->PartitionEntry[PartitionNumber];
|
||||||
DiskData->BootIndicator = PartitionEntry->BootIndicator;
|
|
||||||
DiskData->DriveNotReady = FALSE;
|
DiskData->PartitionType = PartitionEntry->PartitionType;
|
||||||
DiskDeviceExtension->StartingOffset = PartitionEntry->StartingOffset;
|
DiskData->PartitionNumber = PartitionNumber + 1;
|
||||||
DiskDeviceExtension->PartitionLength = PartitionEntry->PartitionLength;
|
DiskData->PartitionOrdinal = PartitionNumber + 1;
|
||||||
|
DiskData->HiddenSectors = PartitionEntry->HiddenSectors;
|
||||||
|
DiskData->BootIndicator = PartitionEntry->BootIndicator;
|
||||||
|
DiskData->DriveNotReady = FALSE;
|
||||||
|
DiskDeviceExtension->StartingOffset = PartitionEntry->StartingOffset;
|
||||||
|
DiskDeviceExtension->PartitionLength = PartitionEntry->PartitionLength;
|
||||||
|
|
||||||
DPRINT("Partition %02ld: nr: %d boot: %1x type: %x offset: %I64d size: %I64d\n",
|
DPRINT1("Partition %02ld: nr: %d boot: %1x type: %x offset: %I64d size: %I64d\n",
|
||||||
PartitionNumber,
|
PartitionNumber,
|
||||||
DiskData->PartitionNumber,
|
DiskData->PartitionNumber,
|
||||||
DiskData->BootIndicator,
|
DiskData->BootIndicator,
|
||||||
DiskData->PartitionType,
|
DiskData->PartitionType,
|
||||||
DiskDeviceExtension->StartingOffset.QuadPart / 512 /*DrvParms.BytesPerSector*/,
|
DiskDeviceExtension->StartingOffset.QuadPart / 512 /*DrvParms.BytesPerSector*/,
|
||||||
DiskDeviceExtension->PartitionLength.QuadPart / 512 /* DrvParms.BytesPerSector*/);
|
DiskDeviceExtension->PartitionLength.QuadPart / 512 /* DrvParms.BytesPerSector*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DiskData->PartitionType = 0;
|
||||||
|
DiskData->PartitionNumber = 1;
|
||||||
|
DiskData->PartitionOrdinal = 0;
|
||||||
|
DiskData->HiddenSectors = 0;
|
||||||
|
DiskData->BootIndicator = 0;
|
||||||
|
DiskData->DriveNotReady = FALSE;
|
||||||
|
DiskDeviceExtension->PartitionLength.QuadPart += DiskDeviceExtension->StartingOffset.QuadPart;
|
||||||
|
DiskDeviceExtension->StartingOffset.QuadPart = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -980,7 +1006,7 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject,
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* Drive is not ready */
|
/* Drive is not ready */
|
||||||
DiskData->DriveNotReady = FALSE;
|
DiskData->DriveNotReady = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue