[ros-diffs] [arty] 36835: Sorry, wound up reversing my change. Misread the diff.

arty at svn.reactos.org arty at svn.reactos.org
Sun Oct 19 22:11:53 CEST 2008


Author: arty
Date: Sun Oct 19 15:11:52 2008
New Revision: 36835

URL: http://svn.reactos.org/svn/reactos?rev=36835&view=rev
Log:
Sorry, wound up reversing my change.  Misread the diff.

Modified:
    branches/arty-newcc/drivers/filesystems/cdfs/rw.c

Modified: branches/arty-newcc/drivers/filesystems/cdfs/rw.c
URL: http://svn.reactos.org/svn/reactos/branches/arty-newcc/drivers/filesystems/cdfs/rw.c?rev=36835&r1=36834&r2=36835&view=diff
==============================================================================
--- branches/arty-newcc/drivers/filesystems/cdfs/rw.c [iso-8859-1] (original)
+++ branches/arty-newcc/drivers/filesystems/cdfs/rw.c [iso-8859-1] Sun Oct 19 15:11:52 2008
@@ -76,14 +76,23 @@
     {
       LARGE_INTEGER FileOffset;
       IO_STATUS_BLOCK IoStatus;
+      CC_FILE_SIZES FileSizes;
 
       if (ReadOffset + Length > Fcb->Entry.DataLengthL)
          Length = Fcb->Entry.DataLengthL - ReadOffset;
 
       if (FileObject->PrivateCacheMap == NULL)
 	{
+	  FileSizes.AllocationSize = Fcb->RFCB.AllocationSize;
+	  FileSizes.FileSize = Fcb->RFCB.FileSize;
+	  FileSizes.ValidDataLength = Fcb->RFCB.ValidDataLength;
+
+	  DPRINT("Attach FCB to File: Size %08x%08x\n", 
+		 Fcb->RFCB.ValidDataLength.HighPart,
+		 Fcb->RFCB.ValidDataLength.LowPart);
+
           CcInitializeCacheMap(FileObject,
-                               (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
+                               &FileSizes,
 		               FALSE,
 		               &(CdfsGlobalData->CacheMgrCallbacks),
 		               Fcb);
@@ -103,25 +112,65 @@
 
   if ((ReadOffset % BLOCKSIZE) != 0 || (Length % BLOCKSIZE) != 0)
     {
-      return STATUS_INVALID_PARAMETER;
-    }
-
-  if (ReadOffset + Length > ROUND_UP(Fcb->Entry.DataLengthL, BLOCKSIZE))
-    Length = ROUND_UP(Fcb->Entry.DataLengthL, BLOCKSIZE) - ReadOffset;
-
-  Status = CdfsReadSectors(DeviceExt->StorageDevice,
-			   Fcb->Entry.ExtentLocationL + (ReadOffset / BLOCKSIZE),
-			   Length / BLOCKSIZE,
-			   Buffer,
-			   FALSE);
-  if (NT_SUCCESS(Status))
-    {
-      *LengthRead = Length;
-      if (Length + ReadOffset > Fcb->Entry.DataLengthL)
-	{
-	  memset(Buffer + Fcb->Entry.DataLengthL - ReadOffset,
-		 0,
-		 Length + ReadOffset - Fcb->Entry.DataLengthL);
+      /* Then we need to do a partial or misaligned read ... */
+      PVOID PageBuf = ExAllocatePool(NonPagedPool, BLOCKSIZE);
+      PCHAR ReadInPage = (PCHAR)PageBuf + (ReadOffset & (BLOCKSIZE - 1));
+      PCHAR TargetRead = (PCHAR)Buffer;
+      ULONG ActualReadOffset, EndOfExtent, ReadLen;
+
+      if (!PageBuf)
+        {
+	    return STATUS_NO_MEMORY;
+	}
+
+      ActualReadOffset = ReadOffset & ~(BLOCKSIZE - 1);
+      EndOfExtent = ReadOffset + Length;
+
+      while (ActualReadOffset < EndOfExtent)
+        {
+	  Status = CdfsReadSectors
+	      (DeviceExt->StorageDevice,
+	       Fcb->Entry.ExtentLocationL + (ActualReadOffset / BLOCKSIZE),
+	       1,
+	       PageBuf,
+	       FALSE);
+	  
+	  if (!NT_SUCCESS(Status))
+	    break;
+	  
+	  ReadLen = BLOCKSIZE - (ActualReadOffset & (BLOCKSIZE - 1));
+	  if (ReadLen > EndOfExtent - ActualReadOffset)
+	    {
+		ReadLen = EndOfExtent - ActualReadOffset;
+	    }
+
+	  RtlCopyMemory(TargetRead, ReadInPage, ReadLen);
+
+	  ActualReadOffset += ReadLen;
+	  TargetRead += ReadLen;	  
+	}
+
+      ExFreePool(PageBuf);
+    }
+  else
+    {
+      if (ReadOffset + Length > ROUND_UP(Fcb->Entry.DataLengthL, BLOCKSIZE))
+	Length = ROUND_UP(Fcb->Entry.DataLengthL, BLOCKSIZE) - ReadOffset;
+
+      Status = CdfsReadSectors(DeviceExt->StorageDevice,
+			       Fcb->Entry.ExtentLocationL + (ReadOffset / BLOCKSIZE),
+			       Length / BLOCKSIZE,
+			       Buffer,
+			       FALSE);
+      if (NT_SUCCESS(Status))
+        {
+	  *LengthRead = Length;
+	  if (Length + ReadOffset > Fcb->Entry.DataLengthL)
+	    {
+	      memset(Buffer + Fcb->Entry.DataLengthL - ReadOffset,
+		     0,
+		     Length + ReadOffset - Fcb->Entry.DataLengthL);
+	    }
 	}
     }
 



More information about the Ros-diffs mailing list