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; //