mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 10:35:28 +00:00
[FASTFAT]
Properly round up 64b values. This fixes reads on 4GB+ volumes. Patch by Wim Hueskes. CORE-10932 #resolve #comment Thanks for the patch! Commited in r71610 svn path=/trunk/; revision=71610
This commit is contained in:
parent
a44dfe6c76
commit
4746de9066
5 changed files with 12 additions and 6 deletions
|
@ -668,7 +668,7 @@ vfatMakeFCBFromDirEntry(
|
||||||
}
|
}
|
||||||
rcFCB->RFCB.FileSize.QuadPart = Size;
|
rcFCB->RFCB.FileSize.QuadPart = Size;
|
||||||
rcFCB->RFCB.ValidDataLength.QuadPart = Size;
|
rcFCB->RFCB.ValidDataLength.QuadPart = Size;
|
||||||
rcFCB->RFCB.AllocationSize.QuadPart = ROUND_UP(Size, vcb->FatInfo.BytesPerCluster);
|
rcFCB->RFCB.AllocationSize.QuadPart = ROUND_UP_64(Size, vcb->FatInfo.BytesPerCluster);
|
||||||
rcFCB->RefCount = 1;
|
rcFCB->RefCount = 1;
|
||||||
if (vfatFCBIsDirectory(rcFCB))
|
if (vfatFCBIsDirectory(rcFCB))
|
||||||
{
|
{
|
||||||
|
|
|
@ -1114,7 +1114,7 @@ UpdateFileSize(
|
||||||
{
|
{
|
||||||
if (Size > 0)
|
if (Size > 0)
|
||||||
{
|
{
|
||||||
Fcb->RFCB.AllocationSize.QuadPart = ROUND_UP(Size, ClusterSize);
|
Fcb->RFCB.AllocationSize.QuadPart = ROUND_UP_64(Size, ClusterSize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -576,7 +576,7 @@ VfatMount(
|
||||||
}
|
}
|
||||||
|
|
||||||
VolumeFcb->Flags = FCB_IS_VOLUME;
|
VolumeFcb->Flags = FCB_IS_VOLUME;
|
||||||
VolumeFcb->RFCB.FileSize.QuadPart = DeviceExt->FatInfo.Sectors * DeviceExt->FatInfo.BytesPerSector;
|
VolumeFcb->RFCB.FileSize.QuadPart = (LONGLONG) DeviceExt->FatInfo.Sectors * DeviceExt->FatInfo.BytesPerSector;
|
||||||
VolumeFcb->RFCB.ValidDataLength = VolumeFcb->RFCB.FileSize;
|
VolumeFcb->RFCB.ValidDataLength = VolumeFcb->RFCB.FileSize;
|
||||||
VolumeFcb->RFCB.AllocationSize = VolumeFcb->RFCB.FileSize;
|
VolumeFcb->RFCB.AllocationSize = VolumeFcb->RFCB.FileSize;
|
||||||
DeviceExt->VolumeFcb = VolumeFcb;
|
DeviceExt->VolumeFcb = VolumeFcb;
|
||||||
|
|
|
@ -150,7 +150,7 @@ VfatReadFileData(
|
||||||
BytesPerSector = DeviceExt->FatInfo.BytesPerSector;
|
BytesPerSector = DeviceExt->FatInfo.BytesPerSector;
|
||||||
BytesPerCluster = DeviceExt->FatInfo.BytesPerCluster;
|
BytesPerCluster = DeviceExt->FatInfo.BytesPerCluster;
|
||||||
|
|
||||||
ASSERT(ReadOffset.QuadPart + Length <= ROUND_UP(Fcb->RFCB.FileSize.QuadPart, BytesPerSector));
|
ASSERT(ReadOffset.QuadPart + Length <= ROUND_UP_64(Fcb->RFCB.FileSize.QuadPart, BytesPerSector));
|
||||||
ASSERT(ReadOffset.u.LowPart % BytesPerSector == 0);
|
ASSERT(ReadOffset.u.LowPart % BytesPerSector == 0);
|
||||||
ASSERT(Length % BytesPerSector == 0);
|
ASSERT(Length % BytesPerSector == 0);
|
||||||
|
|
||||||
|
@ -711,9 +711,9 @@ VfatRead(
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// non cached read
|
// non cached read
|
||||||
if (ByteOffset.QuadPart + Length > ROUND_UP(Fcb->RFCB.FileSize.QuadPart, BytesPerSector))
|
if (ByteOffset.QuadPart + Length > ROUND_UP_64(Fcb->RFCB.FileSize.QuadPart, BytesPerSector))
|
||||||
{
|
{
|
||||||
Length = (ULONG)(ROUND_UP(Fcb->RFCB.FileSize.QuadPart, BytesPerSector) - ByteOffset.QuadPart);
|
Length = (ULONG)(ROUND_UP_64(Fcb->RFCB.FileSize.QuadPart, BytesPerSector) - ByteOffset.QuadPart);
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = VfatReadFileData(IrpContext, Length, ByteOffset, &ReturnedLength);
|
Status = VfatReadFileData(IrpContext, Length, ByteOffset, &ReturnedLength);
|
||||||
|
|
|
@ -25,6 +25,12 @@
|
||||||
#define ROUND_UP(n, align) \
|
#define ROUND_UP(n, align) \
|
||||||
ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
|
ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
|
||||||
|
|
||||||
|
#define ROUND_DOWN_64(n, align) \
|
||||||
|
(((ULONGLONG)n) & ~((align) - 1LL))
|
||||||
|
|
||||||
|
#define ROUND_UP_64(n, align) \
|
||||||
|
ROUND_DOWN_64(((ULONGLONG)n) + (align) - 1LL, (align))
|
||||||
|
|
||||||
#include <pshpack1.h>
|
#include <pshpack1.h>
|
||||||
struct _BootSector
|
struct _BootSector
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue