From 21cd59bc0fc5cf69983610a16bba24bc7894cd9e Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 2 Nov 2014 23:11:22 +0000 Subject: [PATCH] [DISK] Add a hack to forcibly set sector size in case of weird input. This is noisy on purpose. Also, be more informative in case of read rejection. Are we reading beyond partition or do we have invalid sector size? With the hack, the invalid sector size should disappear. This is to help debugging the recent errors with the removal of IopParseDevice() hack svn path=/trunk/; revision=65205 --- reactos/drivers/storage/class/disk/disk.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/storage/class/disk/disk.c b/reactos/drivers/storage/class/disk/disk.c index fff47f2c536..d896ec415e3 100644 --- a/reactos/drivers/storage/class/disk/disk.c +++ b/reactos/drivers/storage/class/disk/disk.c @@ -1514,6 +1514,15 @@ Return Value: ULONG transferByteCount = currentIrpStack->Parameters.Read.Length; LARGE_INTEGER startingOffset; + // + // HACK: How can we end here with null sector size?! + // + + if (deviceExtension->DiskGeometry->Geometry.BytesPerSector == 0) { + DPRINT1("Hack! Received invalid sector size\n"); + deviceExtension->DiskGeometry->Geometry.BytesPerSector = 512; + } + // // Verify parameters of this request. // Check that ending sector is within partition and @@ -1550,7 +1559,18 @@ Return Value: Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; } - DPRINT1("STATUS_INVALID_PARAMETER\n"); + if (startingOffset.QuadPart > deviceExtension->PartitionLength.QuadPart) { + DPRINT1("Reading beyond partition end! startingOffset: %I64d, PartitionLength: %I64d\n", startingOffset.QuadPart, deviceExtension->PartitionLength.QuadPart); + } + + if (transferByteCount & (deviceExtension->DiskGeometry->Geometry.BytesPerSector - 1)) { + DPRINT1("Not reading sectors! TransferByteCount: %lu, BytesPerSector: %lu\n", transferByteCount, deviceExtension->DiskGeometry->Geometry.BytesPerSector); + } + + if (Irp->IoStatus.Status == STATUS_DEVICE_NOT_READY) { + DPRINT1("Failing due to device not ready!\n"); + } + return STATUS_INVALID_PARAMETER; } -- 2.17.1