1
0
mirror of https://github.com/winfsp/winspd.git synced 2025-04-18 23:23:59 +03:00

Fix issue when device size greater than 2TB

Windows system will use `READ_CAPACITY_DATA_EX` to read block device size,
when the block count greater to 0xFFFFFFFF.

Signed-off-by: VRan Liu <gliuwr@gmail.com>
This commit is contained in:
CzBiX 2020-09-17 14:10:18 +08:00
parent d5a23f0da2
commit 580eeb177e

View File

@ -505,10 +505,10 @@ static UCHAR SpdScsiReadCapacity(PVOID DeviceExtension, SPD_STORAGE_UNIT *Storag
else
{
/* READ CAPACITY (16) */
if (sizeof(READ_CAPACITY16_DATA) > DataTransferLength)
if (sizeof(READ_CAPACITY_DATA_EX) > DataTransferLength)
return SRB_STATUS_DATA_OVERRUN;
PREAD_CAPACITY16_DATA ReadCapacityData = DataBuffer;
PREAD_CAPACITY_DATA_EX ReadCapacityData = DataBuffer;
UINT64 U64;
UINT32 U32;
U64 = StorageUnit->StorageUnitParams.BlockCount - 1;
@ -525,10 +525,18 @@ static UCHAR SpdScsiReadCapacity(PVOID DeviceExtension, SPD_STORAGE_UNIT *Storag
((PUINT8)&ReadCapacityData->BytesPerBlock)[1] = (U32 >> 16) & 0xff;
((PUINT8)&ReadCapacityData->BytesPerBlock)[2] = (U32 >> 8) & 0xff;
((PUINT8)&ReadCapacityData->BytesPerBlock)[3] = U32 & 0xff;
if (StorageUnit->StorageUnitParams.UnmapSupported)
ReadCapacityData->LBPME = 1;
SrbSetDataTransferLength(Srb, sizeof(READ_CAPACITY16_DATA));
ULONG DataLength;
if (sizeof(READ_CAPACITY16_DATA) <= DataTransferLength)
{
if (StorageUnit->StorageUnitParams.UnmapSupported)
((PREAD_CAPACITY16_DATA)ReadCapacityData)->LBPME = 1;
DataLength = sizeof(READ_CAPACITY16_DATA);
}
else
DataLength = sizeof(READ_CAPACITY_DATA_EX);
SrbSetDataTransferLength(Srb, DataLength);
return SRB_STATUS_SUCCESS;
}