[ros-diffs] [pschweitzer] 37980: Continue basic implementation of VfatSetRenameInformation Have a look to bug #3900

pschweitzer at svn.reactos.org pschweitzer at svn.reactos.org
Tue Dec 9 20:16:24 CET 2008


Author: pschweitzer
Date: Tue Dec  9 13:16:23 2008
New Revision: 37980

URL: http://svn.reactos.org/svn/reactos?rev=37980&view=rev
Log:
Continue basic implementation of VfatSetRenameInformation
Have a look to bug #3900

Modified:
    branches/pierre-fsd/drivers/filesystems/fastfat/finfo.c

Modified: branches/pierre-fsd/drivers/filesystems/fastfat/finfo.c
URL: http://svn.reactos.org/svn/reactos/branches/pierre-fsd/drivers/filesystems/fastfat/finfo.c?rev=37980&r1=37979&r2=37980&view=diff
==============================================================================
--- branches/pierre-fsd/drivers/filesystems/fastfat/finfo.c [iso-8859-1] (original)
+++ branches/pierre-fsd/drivers/filesystems/fastfat/finfo.c [iso-8859-1] Tue Dec  9 13:16:23 2008
@@ -752,24 +752,64 @@
 VfatSetRenameInformation(PVFAT_IRP_CONTEXT IrpContext)
 {
   PIRP Irp;
+  NTSTATUS Status;
   PVFATFCB FCB, NewFCB;
   PIO_STACK_LOCATION Stack;
+  PDEVICE_EXTENSION DeviceExt;
   PFILE_OBJECT FileObject, NewFileObject;
+  BOOLEAN ReplaceIfExists, ChangeCaseOnly = FALSE;
+  UNICODE_STRING UpcasedPathName, UpcasedNewPathName;
 
   DPRINT1("VfatSetRenameInformation is stubplemented!\n");
 
   Irp = IrpContext->Irp;
   Stack = IoGetCurrentIrpStackLocation(Irp);
 
+  DeviceExt = IrpContext->DeviceExt;
+
   FileObject = IrpContext->FileObject;
   FCB = FileObject->FsContext;
 
   NewFileObject = Stack->Parameters.SetFile.FileObject;
+  ReplaceIfExists = Stack->Parameters.SetFile.ReplaceIfExists;
   NewFCB = NewFileObject->FsContext;
 
-  if (FsRtlAreNamesEqual(&(FCB->LongNameU), &(NewFCB->LongNameU), FALSE, NULL))
-  {
-    return STATUS_SUCCESS;
+  /* Don't allow root directory rename */
+  if (vfatFCBIsRoot(FCB))
+  {
+    return STATUS_INVALID_PARAMETER;
+  }
+
+  /* FIXME: Don't let RTL lib allocate memory, do it from kernel ! */
+  Status = RtlUpcaseUnicodeString(&UpcasedPathName, &(FCB->PathNameU), TRUE);
+  if (!NT_SUCCESS(Status))
+  {
+    return Status;
+  }
+  Status = RtlUpcaseUnicodeString(&UpcasedNewPathName, &(NewFCB->PathNameU), TRUE);
+  if (!NT_SUCCESS(Status))
+  {
+    return Status;
+  }
+
+  if ((FCB->parentFcb) == (NewFCB->parentFcb))
+  {
+    /* Run a quick test to know if new and old filenames are the same */
+    if (FsRtlAreNamesEqual(&(FCB->LongNameU), &(NewFCB->LongNameU), FALSE, NULL))
+    {
+      return STATUS_SUCCESS;
+    }
+
+    /* Check both filenames to see if it's only a change case rename */
+    if (FsRtlAreNamesEqual(&(FCB->LongNameU), &(NewFCB->LongNameU), TRUE, NULL))
+    {
+      ChangeCaseOnly = TRUE;
+    }
+  }
+
+  if (vfatGrabFCBFromTable(DeviceExt, &(NewFCB->PathNameU)) && !ReplaceIfExists)
+  {
+    return STATUS_OBJECT_NAME_COLLISION;
   }
 
   return STATUS_NOT_IMPLEMENTED;



More information about the Ros-diffs mailing list