https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7909284220c291465de9e…
commit 7909284220c291465de9ef02a9bbddf903fafe7f
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Wed Oct 9 02:26:29 2019 +0200
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Wed Oct 9 03:26:48 2019 +0200
[FREELDR] Advance the file pointers every time a read operation is performed, in
accordance with the ARC specification.
---
boot/freeldr/freeldr/arch/i386/hwdisk.c | 5 ++--
boot/freeldr/freeldr/disk/scsiport.c | 5 +++-
boot/freeldr/freeldr/lib/fs/btrfs.c | 1 +
boot/freeldr/freeldr/lib/fs/ext2.c | 10 +++----
boot/freeldr/freeldr/lib/fs/fat.c | 11 ++++----
boot/freeldr/freeldr/lib/fs/iso.c | 47 +++++++++++++++------------------
boot/freeldr/freeldr/lib/fs/ntfs.c | 1 +
7 files changed, 41 insertions(+), 39 deletions(-)
diff --git a/boot/freeldr/freeldr/arch/i386/hwdisk.c
b/boot/freeldr/freeldr/arch/i386/hwdisk.c
index 1717bdbd2dd..7aec1c3db99 100644
--- a/boot/freeldr/freeldr/arch/i386/hwdisk.c
+++ b/boot/freeldr/freeldr/arch/i386/hwdisk.c
@@ -157,8 +157,8 @@ DiskRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
UCHAR* Ptr = (UCHAR*)Buffer;
ULONG Length, TotalSectors, MaxSectors, ReadSectors;
- BOOLEAN ret;
ULONGLONG SectorOffset;
+ BOOLEAN ret;
ASSERT(DiskReadBufferSize > 0);
@@ -197,7 +197,8 @@ DiskRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
TotalSectors -= ReadSectors;
}
- *Count = (ULONG)(Ptr - (UCHAR*)Buffer);
+ *Count = (ULONG)((ULONG_PTR)Ptr - (ULONG_PTR)Buffer);
+ Context->SectorNumber = SectorOffset - Context->SectorOffset;
return (!ret) ? EIO : ESUCCESS;
}
diff --git a/boot/freeldr/freeldr/disk/scsiport.c b/boot/freeldr/freeldr/disk/scsiport.c
index a42cadc6164..c9cff4bfd60 100644
--- a/boot/freeldr/freeldr/disk/scsiport.c
+++ b/boot/freeldr/freeldr/disk/scsiport.c
@@ -318,6 +318,7 @@ static ARC_STATUS DiskRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG*
Count)
Buffer = (PUCHAR)Buffer + FullSectors * Context->SectorSize;
N -= FullSectors * Context->SectorSize;
*Count += FullSectors * Context->SectorSize;
+ Context->SectorNumber += FullSectors;
Lba += FullSectors;
}
@@ -364,6 +365,7 @@ static ARC_STATUS DiskRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG*
Count)
}
RtlCopyMemory(Buffer, Sector, N);
*Count += N;
+ /* Context->SectorNumber remains untouched (incomplete sector read) */
ExFreePool(Sector);
}
@@ -399,7 +401,8 @@ static ARC_STATUS DiskSeek(ULONG FileId, LARGE_INTEGER* Position,
SEEKMODE SeekM
return ESUCCESS;
}
-static const DEVVTBL DiskVtbl = {
+static const DEVVTBL DiskVtbl =
+{
DiskClose,
DiskGetFileInformation,
DiskOpen,
diff --git a/boot/freeldr/freeldr/lib/fs/btrfs.c b/boot/freeldr/freeldr/lib/fs/btrfs.c
index 16a861427c4..2f763f061f9 100644
--- a/boot/freeldr/freeldr/lib/fs/btrfs.c
+++ b/boot/freeldr/freeldr/lib/fs/btrfs.c
@@ -1201,6 +1201,7 @@ ARC_STATUS BtrFsRead(ULONG FileId, VOID *Buffer, ULONG Size, ULONG
*BytesRead)
return ENOENT;
}
+ phandle->position += rd;
*BytesRead = rd;
return ESUCCESS;
}
diff --git a/boot/freeldr/freeldr/lib/fs/ext2.c b/boot/freeldr/freeldr/lib/fs/ext2.c
index 9d183488d68..6ab00f3d1ab 100644
--- a/boot/freeldr/freeldr/lib/fs/ext2.c
+++ b/boot/freeldr/freeldr/lib/fs/ext2.c
@@ -386,9 +386,8 @@ BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG
BytesToRead, ULO
}
//
- // If they are trying to read past the
- // end of the file then return success
- // with BytesRead == 0
+ // If the user is trying to read past the end of
+ // the file then return success with BytesRead == 0.
//
if (Ext2FileInfo->FilePointer >= Ext2FileInfo->FileSize)
{
@@ -396,8 +395,8 @@ BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG
BytesToRead, ULO
}
//
- // If they are trying to read more than there is to read
- // then adjust the amount to read
+ // If the user is trying to read more than there is to read
+ // then adjust the amount to read.
//
if ((Ext2FileInfo->FilePointer + BytesToRead) > Ext2FileInfo->FileSize)
{
@@ -418,6 +417,7 @@ BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG
BytesToRead, ULO
{
*BytesRead = BytesToRead;
}
+ // Ext2FileInfo->FilePointer += BytesToRead;
return TRUE;
}
diff --git a/boot/freeldr/freeldr/lib/fs/fat.c b/boot/freeldr/freeldr/lib/fs/fat.c
index 35233c414b5..4c3358b9f2b 100644
--- a/boot/freeldr/freeldr/lib/fs/fat.c
+++ b/boot/freeldr/freeldr/lib/fs/fat.c
@@ -1206,9 +1206,8 @@ BOOLEAN FatReadFile(PFAT_FILE_INFO FatFileInfo, ULONG BytesToRead,
ULONG* BytesR
}
//
- // If they are trying to read past the
- // end of the file then return success
- // with BytesRead == 0
+ // If the user is trying to read past the end of
+ // the file then return success with BytesRead == 0.
//
if (FatFileInfo->FilePointer >= FatFileInfo->FileSize)
{
@@ -1216,8 +1215,8 @@ BOOLEAN FatReadFile(PFAT_FILE_INFO FatFileInfo, ULONG BytesToRead,
ULONG* BytesR
}
//
- // If they are trying to read more than there is to read
- // then adjust the amount to read
+ // If the user is trying to read more than there is to read
+ // then adjust the amount to read.
//
if ((FatFileInfo->FilePointer + BytesToRead) > FatFileInfo->FileSize)
{
@@ -1489,7 +1488,7 @@ ARC_STATUS FatSeek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE
SeekMode)
case SeekAbsolute:
break;
case SeekRelative:
- NewPosition.QuadPart += (UINT64)FileHandle->FilePointer;
+ NewPosition.QuadPart += (ULONGLONG)FileHandle->FilePointer;
break;
default:
ASSERT(FALSE);
diff --git a/boot/freeldr/freeldr/lib/fs/iso.c b/boot/freeldr/freeldr/lib/fs/iso.c
index 6c08d32a0e9..ba7c57f38d4 100644
--- a/boot/freeldr/freeldr/lib/fs/iso.c
+++ b/boot/freeldr/freeldr/lib/fs/iso.c
@@ -75,7 +75,7 @@ static BOOLEAN IsoSearchDirectoryBufferForFile(PVOID DirectoryBuffer,
ULONG Dire
IsoFileInfoPointer->FileStart = Record->ExtentLocationL;
IsoFileInfoPointer->FileSize = Record->DataLengthL;
IsoFileInfoPointer->FilePointer = 0;
- IsoFileInfoPointer->Directory = (Record->FileFlags &
0x02)?TRUE:FALSE;
+ IsoFileInfoPointer->Directory = !!(Record->FileFlags & 0x02);
return TRUE;
}
@@ -292,17 +292,16 @@ ARC_STATUS IsoOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
ARC_STATUS IsoRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
{
+ ARC_STATUS Status;
PISO_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId);
UCHAR SectorBuffer[SECTORSIZE];
LARGE_INTEGER Position;
ULONG DeviceId;
- ULONG FilePointer;
- ULONG SectorNumber;
- ULONG OffsetInSector;
- ULONG LengthInSector;
- ULONG NumberOfSectors;
+ ULONG SectorNumber;
+ ULONG OffsetInSector;
+ ULONG LengthInSector;
+ ULONG NumberOfSectors;
ULONG BytesRead;
- ARC_STATUS Status;
TRACE("IsoRead() Buffer = %p, N = %lu\n", Buffer, N);
@@ -310,23 +309,21 @@ ARC_STATUS IsoRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG*
Count)
*Count = 0;
//
- // If they are trying to read past the
- // end of the file then return success
- // with Count == 0
+ // If the user is trying to read past the end of
+ // the file then return success with Count == 0.
//
- FilePointer = FileHandle->FilePointer;
- if (FilePointer >= FileHandle->FileSize)
+ if (FileHandle->FilePointer >= FileHandle->FileSize)
{
return ESUCCESS;
}
//
- // If they are trying to read more than there is to read
- // then adjust the amount to read
+ // If the user is trying to read more than there is to read
+ // then adjust the amount to read.
//
- if (FilePointer + N > FileHandle->FileSize)
+ if (FileHandle->FilePointer + N > FileHandle->FileSize)
{
- N = FileHandle->FileSize - FilePointer;
+ N = FileHandle->FileSize - FileHandle->FilePointer;
}
//
@@ -362,14 +359,14 @@ ARC_STATUS IsoRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG*
Count)
// Only do the first read if we
// aren't aligned on a cluster boundary
//
- if (FilePointer % SECTORSIZE)
+ if (FileHandle->FilePointer % SECTORSIZE)
{
//
// Do the math for our first read
//
- SectorNumber = FileHandle->FileStart + (FilePointer / SECTORSIZE);
- OffsetInSector = FilePointer % SECTORSIZE;
- LengthInSector = (N > (SECTORSIZE - OffsetInSector)) ? (SECTORSIZE -
OffsetInSector) : N;
+ SectorNumber = FileHandle->FileStart + (FileHandle->FilePointer /
SECTORSIZE);
+ OffsetInSector = FileHandle->FilePointer % SECTORSIZE;
+ LengthInSector = min(N, SECTORSIZE - OffsetInSector);
//
// Now do the read and update Count, N, FilePointer, & Buffer
@@ -389,7 +386,7 @@ ARC_STATUS IsoRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
RtlCopyMemory(Buffer, SectorBuffer + OffsetInSector, LengthInSector);
*Count += LengthInSector;
N -= LengthInSector;
- FilePointer += LengthInSector;
+ FileHandle->FilePointer += LengthInSector;
Buffer = (PVOID)((ULONG_PTR)Buffer + LengthInSector);
}
@@ -403,7 +400,7 @@ ARC_STATUS IsoRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
//
NumberOfSectors = (N / SECTORSIZE);
- SectorNumber = FileHandle->FileStart + (FilePointer / SECTORSIZE);
+ SectorNumber = FileHandle->FileStart + (FileHandle->FilePointer /
SECTORSIZE);
//
// Now do the read and update Count, N, FilePointer, & Buffer
@@ -423,7 +420,7 @@ ARC_STATUS IsoRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
*Count += NumberOfSectors * SECTORSIZE;
N -= NumberOfSectors * SECTORSIZE;
- FilePointer += NumberOfSectors * SECTORSIZE;
+ FileHandle->FilePointer += NumberOfSectors * SECTORSIZE;
Buffer = (PVOID)((ULONG_PTR)Buffer + NumberOfSectors * SECTORSIZE);
}
@@ -432,7 +429,7 @@ ARC_STATUS IsoRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
//
if (N > 0)
{
- SectorNumber = FileHandle->FileStart + (FilePointer / SECTORSIZE);
+ SectorNumber = FileHandle->FileStart + (FileHandle->FilePointer /
SECTORSIZE);
//
// Now do the read and update Count, N, FilePointer, & Buffer
@@ -451,7 +448,7 @@ ARC_STATUS IsoRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
}
RtlCopyMemory(Buffer, SectorBuffer, N);
*Count += N;
- FilePointer += N;
+ FileHandle->FilePointer += N;
}
TRACE("IsoRead() done\n");
diff --git a/boot/freeldr/freeldr/lib/fs/ntfs.c b/boot/freeldr/freeldr/lib/fs/ntfs.c
index bc2e6bfee86..233a2e5ac23 100644
--- a/boot/freeldr/freeldr/lib/fs/ntfs.c
+++ b/boot/freeldr/freeldr/lib/fs/ntfs.c
@@ -832,6 +832,7 @@ ARC_STATUS NtfsRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG*
Count)
// Read file
//
BytesRead64 = NtfsReadAttribute(FileHandle->Volume, FileHandle->DataContext,
FileHandle->Offset, Buffer, N);
+ FileHandle->Offset += BytesRead64;
*Count = (ULONG)BytesRead64;
//