diff --git a/reactos/drivers/filesystems/fastfat/cleanup.c b/reactos/drivers/filesystems/fastfat/cleanup.c index 388f43d9f4f..07e2eb51470 100644 --- a/reactos/drivers/filesystems/fastfat/cleanup.c +++ b/reactos/drivers/filesystems/fastfat/cleanup.c @@ -24,6 +24,7 @@ VfatCleanupFile( PVFAT_IRP_CONTEXT IrpContext) { PVFATFCB pFcb; + PVFATCCB pCcb; PDEVICE_EXTENSION DeviceExt = IrpContext->DeviceExt; PFILE_OBJECT FileObject = IrpContext->FileObject; @@ -58,6 +59,12 @@ VfatCleanupFile( 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), diff --git a/reactos/drivers/filesystems/fastfat/create.c b/reactos/drivers/filesystems/fastfat/create.c index 96f9a1865c2..363580471e9 100644 --- a/reactos/drivers/filesystems/fastfat/create.c +++ b/reactos/drivers/filesystems/fastfat/create.c @@ -394,6 +394,7 @@ VfatCreateFile( ULONG RequestedDisposition, RequestedOptions; PVFATFCB pFcb = NULL; PVFATFCB ParentFcb = NULL; + PVFATCCB pCcb = NULL; PWCHAR c, last; BOOLEAN PagingFileCreate; BOOLEAN Dots; @@ -657,6 +658,12 @@ VfatCreateFile( } } + pCcb = FileObject->FsContext2; + if (BooleanFlagOn(RequestedOptions, FILE_DELETE_ON_CLOSE)) + { + pCcb->Flags |= CCB_DELETE_ON_CLOSE; + } + pFcb->OpenHandleCount++; DeviceExt->OpenHandleCount++; } @@ -906,6 +913,12 @@ VfatCreateFile( &pFcb->FCBShareAccess); } + pCcb = FileObject->FsContext2; + if (BooleanFlagOn(RequestedOptions, FILE_DELETE_ON_CLOSE)) + { + pCcb->Flags |= CCB_DELETE_ON_CLOSE; + } + if (Irp->IoStatus.Information == FILE_CREATED) { FsRtlNotifyFullReportChange(DeviceExt->NotifySync, diff --git a/reactos/drivers/filesystems/fastfat/vfat.h b/reactos/drivers/filesystems/fastfat/vfat.h index 7887945e220..e53ca82f7cd 100644 --- a/reactos/drivers/filesystems/fastfat/vfat.h +++ b/reactos/drivers/filesystems/fastfat/vfat.h @@ -486,9 +486,12 @@ typedef struct _VFATFCB ULONG LastOffset; } VFATFCB, *PVFATFCB; +#define CCB_DELETE_ON_CLOSE 0x0001 + typedef struct _VFATCCB { LARGE_INTEGER CurrentByteOffset; + ULONG Flags; /* for DirectoryControl */ ULONG Entry; /* for DirectoryControl */