diff --git a/drivers/filesystems/fastfat/cleanup.c b/drivers/filesystems/fastfat/cleanup.c index 0a12fd70f82..580ed807a37 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); + ClearFlag(pFcb->Flags, FCB_CACHE_INITIALIZED); ObDereferenceObject(tmpFileObject); } diff --git a/drivers/filesystems/fastfat/fcb.c b/drivers/filesystems/fastfat/fcb.c index f96a3178ba1..f6734a675e9 100644 --- a/drivers/filesystems/fastfat/fcb.c +++ b/drivers/filesystems/fastfat/fcb.c @@ -313,10 +313,24 @@ vfatReleaseFCB( while (pFCB) { + ULONG RefCount; + ASSERT(pFCB != pVCB->VolumeFcb); ASSERT(pFCB->RefCount > 0); - pFCB->RefCount--; - if (pFCB->RefCount == 0) + RefCount = --pFCB->RefCount; + + if (RefCount == 1 && BooleanFlagOn(pFCB->Flags, FCB_CACHE_INITIALIZED)) + { + PFILE_OBJECT tmpFileObject; + tmpFileObject = pFCB->FileObject; + + pFCB->FileObject = NULL; + CcUninitializeCacheMap(tmpFileObject, NULL, NULL); + ClearFlag(pFCB->Flags, FCB_CACHE_INITIALIZED); + ObDereferenceObject(tmpFileObject); + } + + if (RefCount == 0) { ASSERT(pFCB->OpenHandleCount == 0); tmpFcb = pFCB->parentFcb; @@ -623,7 +637,7 @@ vfatFCBInitializeCacheFromVolume( _SEH2_END; vfatGrabFCB(vcb, fcb); - fcb->Flags |= FCB_CACHE_INITIALIZED; + SetFlag(fcb->Flags, FCB_CACHE_INITIALIZED); return STATUS_SUCCESS; }