mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 16:36:33 +00:00
[FREELDR] Advance the file pointers every time a read operation is performed, in accordance with the ARC specification.
This commit is contained in:
parent
db15c921e8
commit
7909284220
7 changed files with 41 additions and 39 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -1201,6 +1201,7 @@ ARC_STATUS BtrFsRead(ULONG FileId, VOID *Buffer, ULONG Size, ULONG *BytesRead)
|
|||
return ENOENT;
|
||||
}
|
||||
|
||||
phandle->position += rd;
|
||||
*BytesRead = rd;
|
||||
return ESUCCESS;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
||||
//
|
||||
|
|
Loading…
Reference in a new issue