diff --git a/drivers/filesystems/fastfat/cleanup.c b/drivers/filesystems/fastfat/cleanup.c
index 0a12fd7..900f690 100644
--- a/drivers/filesystems/fastfat/cleanup.c
+++ b/drivers/filesystems/fastfat/cleanup.c
@@ -107,6 +107,7 @@ VfatCleanupFile(
                 {
                     pFcb->FileObject = NULL;
                     CcUninitializeCacheMap(tmpFileObject, NULL, NULL);
+                    pFcb->Flags &= ~FCB_CACHE_INITIALIZED;
                     ObDereferenceObject(tmpFileObject);
                 }
 
diff --git a/drivers/filesystems/fastfat/close.c b/drivers/filesystems/fastfat/close.c
index b4e5fda..b99f057 100644
--- a/drivers/filesystems/fastfat/close.c
+++ b/drivers/filesystems/fastfat/close.c
@@ -46,7 +46,7 @@ VfatCloseFile(
         DPRINT("Volume\n");
         FileObject->FsContext2 = NULL;
     }
-    else
+    else if (!vfatFCBIsDirectory(pFcb) || (pFcb->Flags & FCB_CACHE_INITIALIZED))
     {
         vfatReleaseFCB(DeviceExt, pFcb);
     }
diff --git a/drivers/filesystems/fastfat/fcb.c b/drivers/filesystems/fastfat/fcb.c
index 4a103b0..379fc2f 100644
--- a/drivers/filesystems/fastfat/fcb.c
+++ b/drivers/filesystems/fastfat/fcb.c
@@ -310,13 +310,25 @@ vfatReleaseFCB(
 
     while (pFCB)
     {
+        ULONG RefCount;
+
         ASSERT(pFCB != pVCB->VolumeFcb);
         ASSERT(pFCB->RefCount > 0);
-        pFCB->RefCount--;
-        if (pFCB->RefCount == 0)
+        RefCount = --pFCB->RefCount;
+
+        if (RefCount == 0)
         {
             ASSERT(pFCB->OpenHandleCount == 0);
             tmpFcb = pFCB->parentFcb;
+
+            if (pFCB->Flags & FCB_CACHE_INITIALIZED)
+            {
+                CcUninitializeCacheMap(pFCB->FileObject, NULL, NULL);
+                pFCB->Flags &= ~FCB_CACHE_INITIALIZED;
+                ObDereferenceObject(pFCB->FileObject);
+                pFCB->FileObject = NULL;
+            }
+
             vfatDelFCBFromTable(pVCB, pFCB);
             vfatDestroyFCB(pFCB);
         }
@@ -324,6 +336,7 @@ vfatReleaseFCB(
         {
             tmpFcb = NULL;
         }
+
         pFCB = tmpFcb;
     }
 }
@@ -619,7 +632,6 @@ vfatFCBInitializeCacheFromVolume(
     }
     _SEH2_END;
 
-    vfatGrabFCB(vcb, fcb);
     fcb->Flags |= FCB_CACHE_INITIALIZED;
     return STATUS_SUCCESS;
 }
