[FREELDR] Advance the file pointers every time a read operation is performed, in...
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Wed, 9 Oct 2019 00:26:29 +0000 (02:26 +0200)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Wed, 9 Oct 2019 01:26:48 +0000 (03:26 +0200)
boot/freeldr/freeldr/arch/i386/hwdisk.c
boot/freeldr/freeldr/disk/scsiport.c
boot/freeldr/freeldr/lib/fs/btrfs.c
boot/freeldr/freeldr/lib/fs/ext2.c
boot/freeldr/freeldr/lib/fs/fat.c
boot/freeldr/freeldr/lib/fs/iso.c
boot/freeldr/freeldr/lib/fs/ntfs.c

index 1717bdb..7aec1c3 100644 (file)
@@ -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;
 }
index a42cadc..c9cff4b 100644 (file)
@@ -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,
index 16a8614..2f763f0 100644 (file)
@@ -1201,6 +1201,7 @@ ARC_STATUS BtrFsRead(ULONG FileId, VOID *Buffer, ULONG Size, ULONG *BytesRead)
         return ENOENT;
     }
 
+    phandle->position += rd;
     *BytesRead = rd;
     return ESUCCESS;
 }
index 9d18348..6ab00f3 100644 (file)
@@ -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;
     }
index 35233c4..4c3358b 100644 (file)
@@ -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);
index 6c08d32..ba7c57f 100644 (file)
@@ -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");
index bc2e6bf..233a2e5 100644 (file)
@@ -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;
 
     //