Index: create.c =================================================================== --- drivers/filesystems/fastfat/create.c (revision 67478) +++ drivers/filesystems/fastfat/create.c (working copy) @@ -353,6 +353,7 @@ PUNICODE_STRING PathNameU, PFILE_OBJECT FileObject, ULONG RequestedDisposition, + ULONG RequestedOptions, PVFATFCB *ParentFcb) { PVFATFCB Fcb; @@ -417,6 +418,23 @@ return STATUS_ACCESS_DENIED; } + if ((*Fcb->Attributes & FILE_ATTRIBUTE_READONLY) && + (RequestedOptions & FILE_DELETE_ON_CLOSE)) + { + vfatReleaseFCB(DeviceExt, Fcb); + return STATUS_CANNOT_DELETE; + } + + if ((vfatFCBIsRoot(Fcb) || + (Fcb->LongNameU.Length == sizeof(WCHAR) && Fcb->LongNameU.Buffer[0] == L'.') || + (Fcb->LongNameU.Length == 2 * sizeof(WCHAR) && Fcb->LongNameU.Buffer[0] == L'.' && Fcb->LongNameU.Buffer[1] == L'.')) && + (RequestedOptions & FILE_DELETE_ON_CLOSE)) + { + // we cannot delete a '.', '..' or the root directory + vfatReleaseFCB(DeviceExt, Fcb); + return STATUS_CANNOT_DELETE; + } + DPRINT("Attaching FCB to fileObject\n"); Status = vfatAttachFCBToFileObject(DeviceExt, Fcb, FileObject); if (!NT_SUCCESS(Status)) @@ -502,6 +520,11 @@ return STATUS_INVALID_PARAMETER; } + if (RequestedOptions & FILE_DELETE_ON_CLOSE) + { + return STATUS_CANNOT_DELETE; + } + pFcb = DeviceExt->VolumeFcb; if (pFcb->OpenHandleCount == 0) @@ -579,7 +602,7 @@ /* Try opening the file. */ if (!OpenTargetDir) { - Status = VfatOpenFile(DeviceExt, &PathNameU, FileObject, RequestedDisposition, &ParentFcb); + Status = VfatOpenFile(DeviceExt, &PathNameU, FileObject, RequestedDisposition, RequestedOptions, &ParentFcb); } else { @@ -806,7 +829,8 @@ { if (Stack->Parameters.Create.SecurityContext->DesiredAccess & FILE_WRITE_DATA || RequestedDisposition == FILE_OVERWRITE || - RequestedDisposition == FILE_OVERWRITE_IF) + RequestedDisposition == FILE_OVERWRITE_IF || + (RequestedOptions & FILE_DELETE_ON_CLOSE)) { if (!MmFlushImageSection(&pFcb->SectionObjectPointers, MmFlushForWrite)) { @@ -814,7 +838,8 @@ DPRINT1("%d %d %d\n", Stack->Parameters.Create.SecurityContext->DesiredAccess & FILE_WRITE_DATA, RequestedDisposition == FILE_OVERWRITE, RequestedDisposition == FILE_OVERWRITE_IF); VfatCloseFile (DeviceExt, FileObject); - return STATUS_SHARING_VIOLATION; + return (RequestedOptions & FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE + : STATUS_SHARING_VIOLATION; } } } @@ -903,6 +928,11 @@ &pFcb->FCBShareAccess); } + if (RequestedOptions & FILE_DELETE_ON_CLOSE) + { + pFcb->Flags |= FCB_DELETE_PENDING; + } + if (Irp->IoStatus.Information == FILE_CREATED) { FsRtlNotifyFullReportChange(DeviceExt->NotifySync, Index: finfo.c =================================================================== --- drivers/filesystems/fastfat/finfo.c (revision 67478) +++ drivers/filesystems/fastfat/finfo.c (working copy) @@ -350,7 +350,7 @@ (FCB->LongNameU.Length == 2 * sizeof(WCHAR) && FCB->LongNameU.Buffer[0] == L'.' && FCB->LongNameU.Buffer[1] == L'.')) { // we cannot delete a '.', '..' or the root directory - return STATUS_ACCESS_DENIED; + return STATUS_CANNOT_DELETE; }