From f6d2cc099ea1d5490c7a97d0192c53e59e431097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 29 Oct 2011 20:34:08 +0000 Subject: [PATCH] [CDFS] - fix non cached reading when offset or length is not aligned on block size svn path=/trunk/; revision=54271 --- reactos/drivers/filesystems/cdfs/rw.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/reactos/drivers/filesystems/cdfs/rw.c b/reactos/drivers/filesystems/cdfs/rw.c index 40095898a6a..c5a216f053e 100644 --- a/reactos/drivers/filesystems/cdfs/rw.c +++ b/reactos/drivers/filesystems/cdfs/rw.c @@ -75,6 +75,8 @@ CdfsReadFile(PDEVICE_EXTENSION DeviceExt, LARGE_INTEGER FileOffset; IO_STATUS_BLOCK IoStatus; CC_FILE_SIZES FileSizes; + + DPRINT("Using cache\n"); if (ReadOffset + Length > Fcb->Entry.DataLengthL) Length = Fcb->Entry.DataLengthL - ReadOffset; @@ -111,8 +113,7 @@ CdfsReadFile(PDEVICE_EXTENSION DeviceExt, if ((ReadOffset % BLOCKSIZE) != 0 || (Length % BLOCKSIZE) != 0) { /* Then we need to do a partial or misaligned read ... */ - PVOID PageBuf = ExAllocatePool(NonPagedPool, BLOCKSIZE); - PCHAR ReadInPage = (PCHAR)PageBuf + (ReadOffset & (BLOCKSIZE - 1)); + PCHAR PageBuf = ExAllocatePool(NonPagedPool, BLOCKSIZE); PCHAR TargetRead = (PCHAR)Buffer; ULONG ActualReadOffset, EndOfExtent, ReadLen; @@ -121,7 +122,7 @@ CdfsReadFile(PDEVICE_EXTENSION DeviceExt, return STATUS_NO_MEMORY; } - ActualReadOffset = ReadOffset & ~(BLOCKSIZE - 1); + ActualReadOffset = ROUND_DOWN(ReadOffset, BLOCKSIZE); EndOfExtent = ReadOffset + Length; while (ActualReadOffset < EndOfExtent) @@ -130,22 +131,23 @@ CdfsReadFile(PDEVICE_EXTENSION DeviceExt, (DeviceExt->StorageDevice, Fcb->Entry.ExtentLocationL + (ActualReadOffset / BLOCKSIZE), 1, - PageBuf, + (PVOID)PageBuf, FALSE); if (!NT_SUCCESS(Status)) break; - ReadLen = BLOCKSIZE - (ActualReadOffset & (BLOCKSIZE - 1)); - if (ReadLen > EndOfExtent - ActualReadOffset) + ReadLen = BLOCKSIZE - (ReadOffset - ActualReadOffset); + if (ReadLen > EndOfExtent - ReadOffset) { - ReadLen = EndOfExtent - ActualReadOffset; + ReadLen = EndOfExtent - ReadOffset; } + DPRINT("Copying %d bytes.\n", ReadLen); + RtlCopyMemory(TargetRead, PageBuf + (ReadOffset - ActualReadOffset), ReadLen); - RtlCopyMemory(TargetRead, ReadInPage, ReadLen); - - ActualReadOffset += ReadLen; - TargetRead += ReadLen; + ActualReadOffset += BLOCKSIZE; + TargetRead += ReadLen; + ReadOffset += ReadLen; } ExFreePool(PageBuf);