-/* $Id: rw.c,v 1.15 2001/01/12 21:00:08 dwelch Exp $
+/* $Id: rw.c,v 1.16 2001/01/13 12:40:21 dwelch Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
ULONG FirstCluster,
PULONG CurrentCluster,
PVOID Destination,
- ULONG Cached)
+ ULONG Cached,
+ ULONG InternalOffset,
+ ULONG InternalLength)
{
ULONG BytesPerCluster;
BOOLEAN Valid;
/*
* Copy the data from the cache to the caller
*/
- memcpy(Destination, BaseAddress, BytesPerCluster);
+ memcpy(Destination, BaseAddress + InternalOffset, InternalLength);
CcReleaseCacheSegment(Fcb->RFCB.Bcb, CacheSeg, TRUE);
Status = NextCluster(DeviceExt, FirstCluster, CurrentCluster);
/*
* Copy the data from the cache to the caller
*/
- memcpy(Destination, BaseAddress + InternalOffset, BytesPerCluster);
+ memcpy(Destination, BaseAddress + InternalOffset, InternalLength);
CcReleaseCacheSegment(Fcb->RFCB.Bcb, CacheSeg, TRUE);
}
return(STATUS_SUCCESS);
ULONG CurrentCluster;
ULONG FirstCluster;
PVFATFCB Fcb;
- PVOID Temp;
- ULONG TempLength;
ULONG ChunkSize;
NTSTATUS Status;
+ ULONG TempLength;
/* PRECONDITION */
assert (DeviceExt != NULL);
ChunkSize = max(DeviceExt->BytesPerCluster, PAGESIZE);
- *LengthRead = 0;
-
- /*
- * Allocate a buffer to hold partial clusters
- */
- Temp = ExAllocatePool (NonPagedPool, ChunkSize);
- if (!Temp)
- {
- return(STATUS_NO_MEMORY);
- }
+ *LengthRead = 0;
/*
* Find the cluster to start the read from
* cluster and copy it.
*/
if ((ReadOffset % ChunkSize) != 0)
- {
+ {
+ TempLength = min (Length, ChunkSize - (ReadOffset % ChunkSize));
VfatReadCluster(DeviceExt, Fcb,
ROUND_DOWN(ReadOffset, ChunkSize),
- FirstCluster, &CurrentCluster, Temp, 1);
- TempLength = min (Length, ChunkSize - (ReadOffset % ChunkSize));
-
- memcpy (Buffer, Temp + ReadOffset % ChunkSize, TempLength);
+ FirstCluster, &CurrentCluster, Buffer, 1,
+ ReadOffset % ChunkSize, TempLength);
(*LengthRead) = (*LengthRead) + TempLength;
Length = Length - TempLength;
while (Length >= ChunkSize)
{
VfatReadCluster(DeviceExt, Fcb, ReadOffset,
- FirstCluster, &CurrentCluster, Buffer, 1);
+ FirstCluster, &CurrentCluster, Buffer, 1, 0, ChunkSize);
if (CurrentCluster == 0xffffffff)
{
- ExFreePool (Temp);
return (STATUS_SUCCESS);
}
Length = Length - ChunkSize;
ReadOffset = ReadOffset + ChunkSize;
}
-
if (Length > 0)
{
VfatReadCluster(DeviceExt, Fcb, ReadOffset,
- FirstCluster, &CurrentCluster, Temp, 1);
+ FirstCluster, &CurrentCluster, Buffer, 1, 0, Length);
(*LengthRead) = (*LengthRead) + Length;
- memcpy (Buffer, Temp, Length);
}
- ExFreePool (Temp);
return (STATUS_SUCCESS);
}