- Fixed the directory index of a file for FATX.
authorHartmut Birr <osexpert@googlemail.com>
Tue, 25 Jan 2005 21:14:57 +0000 (21:14 +0000)
committerHartmut Birr <osexpert@googlemail.com>
Tue, 25 Jan 2005 21:14:57 +0000 (21:14 +0000)
- Check for the file size before eache call to CcMapData. W2K doesnt like to map over the end of a directory.

svn path=/trunk/; revision=13284

reactos/drivers/fs/vfat/direntry.c

index 46b4790..f3efe7f 100644 (file)
@@ -175,7 +175,8 @@ NTSTATUS FATGetNextDirEntry(PVOID * pContext,
        {
          CcUnpinData(*pContext);
        }
-       if (!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
+       if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
+           !CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
        {
          *pContext = NULL;
           return STATUS_NO_MORE_ENTRIES;
@@ -204,7 +205,8 @@ NTSTATUS FATGetNextDirEntry(PVOID * pContext,
               {
                 CcUnpinData(*pContext);
                 FileOffset.u.LowPart -= PAGE_SIZE;
-                if (!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
+                if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
+                    !CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
                   {
                    CHECKPOINT;
                    *pContext = NULL;
@@ -228,7 +230,8 @@ NTSTATUS FATGetNextDirEntry(PVOID * pContext,
              {
                CcUnpinData(*pContext);
                FileOffset.u.LowPart += PAGE_SIZE;
-               if (!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
+               if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart || 
+                   !CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
                  {
                    CHECKPOINT;
                    *pContext = NULL;
@@ -325,7 +328,8 @@ NTSTATUS FATGetNextDirEntry(PVOID * pContext,
          {
            CcUnpinData(*pContext);
            FileOffset.u.LowPart += PAGE_SIZE;
-           if (!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
+           if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
+               !CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
              {
                CHECKPOINT;
                *pContext = NULL;
@@ -361,7 +365,6 @@ NTSTATUS FATXGetNextDirEntry(PVOID * pContext,
    ULONG DirIndex = DirContext->DirIndex;
 
    FileOffset.u.HighPart = 0;
-   FileOffset.u.LowPart = ROUND_DOWN(DirContext->DirIndex * sizeof(FATX_DIR_ENTRY), PAGE_SIZE);
    
    if (!vfatFCBIsRoot(pDirFcb))
    {
@@ -403,7 +406,9 @@ NTSTATUS FATXGetNextDirEntry(PVOID * pContext,
       {
          CcUnpinData(*pContext);
       }
-      if (!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
+      FileOffset.u.LowPart = ROUND_DOWN(DirIndex * sizeof(FATX_DIR_ENTRY), PAGE_SIZE);
+      if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
+          !CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
       {
          *pContext = NULL;
          return STATUS_NO_MORE_ENTRIES;
@@ -412,33 +417,35 @@ NTSTATUS FATXGetNextDirEntry(PVOID * pContext,
 
    fatxDirEntry = (PFATX_DIR_ENTRY)(*pPage) + DirIndex % FATX_ENTRIES_PER_PAGE;
 
-   DirContext->StartIndex = DirIndex;
+   DirContext->StartIndex = DirContext->DirIndex;
 
    while (TRUE)
    {
-          if (FATX_ENTRY_END(fatxDirEntry))
-          {
-             CcUnpinData(*pContext);
-             *pContext = NULL;
-             return STATUS_NO_MORE_ENTRIES;
-          }
+      if (FATX_ENTRY_END(fatxDirEntry))
+      {
+          CcUnpinData(*pContext);
+          *pContext = NULL;
+          return STATUS_NO_MORE_ENTRIES;
+      }           
 
-          if (!FATX_ENTRY_DELETED(fatxDirEntry))
-          {
-         RtlCopyMemory(&DirContext->DirEntry.FatX, fatxDirEntry, sizeof(FATX_DIR_ENTRY));
-                  break;
+      if (!FATX_ENTRY_DELETED(fatxDirEntry))
+      {
+          RtlCopyMemory(&DirContext->DirEntry.FatX, fatxDirEntry, sizeof(FATX_DIR_ENTRY));
+          break;
       }
-       DirContext->DirIndex++;
-       DirContext->StartIndex++;
-       if ((DirContext->DirIndex % FATX_ENTRIES_PER_PAGE) == 0)
+      DirContext->DirIndex++;
+      DirContext->StartIndex++;
+      DirIndex++;
+      if ((DirIndex % FATX_ENTRIES_PER_PAGE) == 0)
       {
          CcUnpinData(*pContext);
          FileOffset.u.LowPart += PAGE_SIZE;
-         if (!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
+         if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
+             !CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
          {
             CHECKPOINT;
-                  *pContext = NULL;
-                  return STATUS_NO_MORE_ENTRIES;
+            *pContext = NULL;
+           return STATUS_NO_MORE_ENTRIES;
          }
          fatxDirEntry = (PFATX_DIR_ENTRY)*pPage;
       }