https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7909284220c291465de9ef02a9bbddf903fafe7f

commit 7909284220c291465de9ef02a9bbddf903fafe7f
Author:     Hermès Bélusca-Maïto <hermes.belusca-ma...@reactos.org>
AuthorDate: Wed Oct 9 02:26:29 2019 +0200
Commit:     Hermès Bélusca-Maïto <hermes.belusca-ma...@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;
 
     //

Reply via email to