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))
return STATUS_INVALID_PARAMETER;
}
+ if (RequestedOptions & FILE_DELETE_ON_CLOSE)
+ {
+ return STATUS_CANNOT_DELETE;
+ }
+
pFcb = DeviceExt->VolumeFcb;
if (pFcb->OpenHandleCount == 0)
{
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))
{
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;
}
}
}