PVFAT_IRP_CONTEXT IrpContext)
{
PVFATFCB pFcb;
+ PVFATCCB pCcb;
+ BOOLEAN IsVolume;
PDEVICE_EXTENSION DeviceExt = IrpContext->DeviceExt;
PFILE_OBJECT FileObject = IrpContext->FileObject;
if (!pFcb)
return STATUS_SUCCESS;
- if (BooleanFlagOn(pFcb->Flags, FCB_IS_VOLUME))
+ IsVolume = BooleanFlagOn(pFcb->Flags, FCB_IS_VOLUME);
+ if (IsVolume)
{
pFcb->OpenHandleCount--;
return STATUS_PENDING;
}
+ pCcb = FileObject->FsContext2;
+ if (BooleanFlagOn(pCcb->Flags, CCB_DELETE_ON_CLOSE))
+ {
+ pFcb->Flags |= FCB_DELETE_PENDING;
+ }
+
/* Notify about the cleanup */
FsRtlNotifyCleanup(IrpContext->DeviceExt->NotifySync,
&(IrpContext->DeviceExt->NotifyList),
if (BooleanFlagOn(pFcb->Flags, FCB_IS_DIRTY))
{
- VfatUpdateEntry (pFcb);
+ VfatUpdateEntry (pFcb, vfatVolumeIsFatX(DeviceExt));
}
if (BooleanFlagOn(pFcb->Flags, FCB_DELETE_PENDING) &&
pFcb->OpenHandleCount == 0)
{
if (vfatFCBIsDirectory(pFcb) &&
- !VfatIsDirectoryEmpty(pFcb))
+ !VfatIsDirectoryEmpty(DeviceExt, pFcb))
{
pFcb->Flags &= ~FCB_DELETE_PENDING;
}
pFcb->PathNameU.Length - pFcb->LongNameU.Length,
NULL,
NULL,
- VfatIsDirectoryEmpty(pFcb) ?
+ vfatFCBIsDirectory(pFcb) ?
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME,
FILE_ACTION_REMOVED,
NULL);
}
#ifdef ENABLE_SWAPOUT
- if (BooleanFlagOn(DeviceExt->Flags, VCB_DISMOUNT_PENDING))
+ if (IsVolume && BooleanFlagOn(DeviceExt->Flags, VCB_DISMOUNT_PENDING))
{
VfatCheckForDismount(DeviceExt, FALSE);
}