*LengthRead = 0;
if (Length == 0)
- return STATUS_SUCCESS;
+ return(STATUS_SUCCESS);
Ccb = (PCCB)FileObject->FsContext2;
Fcb = Ccb->Fcb;
- if (ReadOffset + Length > Fcb->Entry.DataLengthL)
- Length = Fcb->Entry.DataLengthL - ReadOffset;
+ if (ReadOffset >= Fcb->Entry.DataLengthL)
+ return(STATUS_END_OF_FILE);
DPRINT("Reading %d bytes at %d\n", Length, ReadOffset);
- if (Length == 0)
- return(STATUS_UNSUCCESSFUL);
-
if (!(IrpFlags & (IRP_NOCACHE|IRP_PAGING_IO)))
{
LARGE_INTEGER FileOffset;
IO_STATUS_BLOCK IoStatus;
+ if (ReadOffset + Length > Fcb->Entry.DataLengthL)
+ Length = Fcb->Entry.DataLengthL - ReadOffset;
if (FileObject->PrivateCacheMap == NULL)
{
CcRosInitializeFileCache(FileObject, &Fcb->RFCB.Bcb, PAGE_SIZE);
return(IoStatus.Status);
}
- if ((ReadOffset % BLOCKSIZE) != 0)
+ if ((ReadOffset % BLOCKSIZE) != 0 || (Length % BLOCKSIZE) != 0)
{
- TempLength = min(Length, BLOCKSIZE - (ReadOffset % BLOCKSIZE));
- TempBuffer = ExAllocatePool(NonPagedPool, BLOCKSIZE);
-
- Status = CdfsReadSectors(DeviceExt->StorageDevice,
- Fcb->Entry.ExtentLocationL + (ReadOffset / BLOCKSIZE),
- 1,
- TempBuffer);
- if (NT_SUCCESS(Status))
- {
- memcpy(Buffer, TempBuffer + (ReadOffset % BLOCKSIZE), TempLength);
- (*LengthRead) = (*LengthRead) + TempLength;
- Length = Length - TempLength;
- Buffer = Buffer + TempLength;
- ReadOffset = ReadOffset + TempLength;
- }
- ExFreePool(TempBuffer);
+ return STATUS_INVALID_PARAMETER;
}
+ if (ReadOffset + Length > ROUND_UP(Fcb->Entry.DataLengthL, BLOCKSIZE))
+ Length = ROUND_UP(Fcb->Entry.DataLengthL, BLOCKSIZE) - ReadOffset;
- DPRINT("Status %lx\n", Status);
-
- if ((Length / BLOCKSIZE) != 0 && NT_SUCCESS(Status))
- {
- TempLength = ROUND_DOWN(Length, BLOCKSIZE);
- Status = CdfsReadSectors(DeviceExt->StorageDevice,
- Fcb->Entry.ExtentLocationL + (ReadOffset / BLOCKSIZE),
- TempLength / BLOCKSIZE,
- Buffer);
- if (NT_SUCCESS(Status))
- {
- (*LengthRead) = (*LengthRead) + TempLength;
- Length = Length - TempLength;
- Buffer = Buffer + TempLength;
- ReadOffset = ReadOffset + TempLength;
- }
- }
-
- DPRINT("Status %lx\n", Status);
-
- if (Length > 0 && NT_SUCCESS(Status))
+ Status = CdfsReadSectors(DeviceExt->StorageDevice,
+ Fcb->Entry.ExtentLocationL + (ReadOffset / BLOCKSIZE),
+ Length / BLOCKSIZE,
+ Buffer);
+ if (NT_SUCCESS(Status))
{
- TempBuffer = ExAllocatePool(NonPagedPool, BLOCKSIZE);
-
- Status = CdfsReadSectors(DeviceExt->StorageDevice,
- Fcb->Entry.ExtentLocationL + (ReadOffset / BLOCKSIZE),
- 1,
- TempBuffer);
- if (NT_SUCCESS(Status))
- {
- memcpy(Buffer, TempBuffer, Length);
- (*LengthRead) = (*LengthRead) + Length;
- }
- ExFreePool(TempBuffer);
+ *LengthRead = Length;
+ if (Length + ReadOffset > Fcb->Entry.DataLengthL)
+ {
+ memset(Buffer + Fcb->Entry.DataLengthL - ReadOffset,
+ 0, Length + ReadOffset - Fcb->Entry.DataLengthL);
+ }
}
return(Status);