[FASTFAT][CDFS]
[reactos.git] / reactos / drivers / filesystems / fastfat / direntry.c
index 336f014..2485c39 100644 (file)
@@ -70,10 +70,15 @@ FATIsDirectoryEmpty(
                 CcUnpinData(Context);
             }
 
-            if (!CcMapData(Fcb->FileObject, &FileOffset, sizeof(FAT_DIR_ENTRY), TRUE, &Context, (PVOID*)&FatDirEntry))
+            _SEH2_TRY
             {
-                return TRUE;
+                CcMapData(Fcb->FileObject, &FileOffset, sizeof(FAT_DIR_ENTRY), TRUE, &Context, (PVOID*)&FatDirEntry);
             }
+            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+            {
+                _SEH2_YIELD(return TRUE);
+            }
+            _SEH2_END;
 
             FatDirEntry += Index % FAT_ENTRIES_PER_PAGE;
             FileOffset.QuadPart += PAGE_SIZE;
@@ -125,10 +130,15 @@ FATXIsDirectoryEmpty(
                 CcUnpinData(Context);
             }
 
-            if (!CcMapData(Fcb->FileObject, &FileOffset, sizeof(FATX_DIR_ENTRY), TRUE, &Context, (PVOID*)&FatXDirEntry))
+            _SEH2_TRY
+            {
+                CcMapData(Fcb->FileObject, &FileOffset, sizeof(FATX_DIR_ENTRY), TRUE, &Context, (PVOID*)&FatXDirEntry);
+            }
+            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
             {
-                return TRUE;
+                _SEH2_YIELD(return TRUE);
             }
+            _SEH2_END;
 
             FatXDirEntry += Index % FATX_ENTRIES_PER_PAGE;
             FileOffset.QuadPart += PAGE_SIZE;
@@ -201,12 +211,22 @@ FATGetNextDirEntry(
             CcUnpinData(*pContext);
         }
 
-        if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
-            !CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
+        if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart)
         {
             *pContext = NULL;
             return STATUS_NO_MORE_ENTRIES;
         }
+
+        _SEH2_TRY
+        {
+            CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage);
+        }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+        {
+            *pContext = NULL;
+            _SEH2_YIELD(return STATUS_NO_MORE_ENTRIES);
+        }
+        _SEH2_END;
     }
 
     fatDirEntry = (PFAT_DIR_ENTRY)(*pPage) + DirContext->DirIndex % FAT_ENTRIES_PER_PAGE;
@@ -232,13 +252,23 @@ FATGetNextDirEntry(
                 CcUnpinData(*pContext);
                 FileOffset.u.LowPart -= PAGE_SIZE;
 
-                if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
-                    !CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
+                if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart)
                 {
                     *pContext = NULL;
                     return STATUS_NO_MORE_ENTRIES;
                 }
 
+                _SEH2_TRY
+                {
+                    CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage);
+                }
+                _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+                {
+                    *pContext = NULL;
+                    _SEH2_YIELD(return STATUS_NO_MORE_ENTRIES);
+                }
+                _SEH2_END;
+
                 fatDirEntry = (PFAT_DIR_ENTRY)(*pPage) + DirContext->DirIndex % FAT_ENTRIES_PER_PAGE;
                 longNameEntry = (slot*) fatDirEntry;
             }
@@ -259,13 +289,23 @@ FATGetNextDirEntry(
                 CcUnpinData(*pContext);
                 FileOffset.u.LowPart += PAGE_SIZE;
 
-                if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
-                   !CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
+                if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart)
                 {
                     *pContext = NULL;
                     return STATUS_NO_MORE_ENTRIES;
                 }
 
+                _SEH2_TRY
+                {
+                    CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage);
+                }
+                _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+                {
+                    *pContext = NULL;
+                    _SEH2_YIELD(return STATUS_NO_MORE_ENTRIES);
+                }
+                _SEH2_END;
+
                 fatDirEntry = (PFAT_DIR_ENTRY)*pPage;
                 longNameEntry = (slot*) *pPage;
             }
@@ -379,13 +419,23 @@ FATGetNextDirEntry(
             CcUnpinData(*pContext);
             FileOffset.u.LowPart += PAGE_SIZE;
 
-            if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
-                !CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
+            if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart)
             {
                 *pContext = NULL;
                 return STATUS_NO_MORE_ENTRIES;
             }
 
+            _SEH2_TRY
+            {
+                CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage);
+            }
+            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+            {
+                *pContext = NULL;
+                _SEH2_YIELD(return STATUS_NO_MORE_ENTRIES);
+            }
+            _SEH2_END;
+
             fatDirEntry = (PFAT_DIR_ENTRY)*pPage;
             longNameEntry = (slot*) *pPage;
         }
@@ -467,12 +517,22 @@ FATXGetNextDirEntry(
             CcUnpinData(*pContext);
         }
         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))
+        if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart)
         {
             *pContext = NULL;
             return STATUS_NO_MORE_ENTRIES;
         }
+
+        _SEH2_TRY
+        {
+            CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage);
+        }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+        {
+            *pContext = NULL;
+            _SEH2_YIELD(return STATUS_NO_MORE_ENTRIES);
+        }
+        _SEH2_END;
     }
 
     fatxDirEntry = (PFATX_DIR_ENTRY)(*pPage) + DirIndex % FATX_ENTRIES_PER_PAGE;
@@ -500,12 +560,23 @@ FATXGetNextDirEntry(
         {
             CcUnpinData(*pContext);
             FileOffset.u.LowPart += PAGE_SIZE;
-            if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
-                !CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
+            if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart)
             {
                 *pContext = NULL;
                 return STATUS_NO_MORE_ENTRIES;
             }
+
+            _SEH2_TRY
+            {
+                CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage);
+            }
+            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+            {
+                *pContext = NULL;
+                _SEH2_YIELD(return STATUS_NO_MORE_ENTRIES);
+            }
+            _SEH2_END;
+
             fatxDirEntry = (PFATX_DIR_ENTRY)*pPage;
         }
         else