NtSetInformationFile(): FileRenameInformation: Fixed missing fields
authorshort <>
Mon, 3 Feb 2003 14:27:54 +0000 (14:27 +0000)
committershort <>
Mon, 3 Feb 2003 14:27:54 +0000 (14:27 +0000)
 - fill in: SetFile.FileObject,SetFile.u.d.ReplaceIfExists,SetFile.u.d.AdvanceOnly

ntoskrnl/io/file.c

index 8cdf925..e40bb09 100644 (file)
@@ -217,6 +217,7 @@ NtSetInformationFile(HANDLE FileHandle,
    NTSTATUS Status;
    PVOID SystemBuffer;
    IO_STATUS_BLOCK IoSB;
+   FILE_OBJECT *RootDir_FileObject = NULL;
    
    assert(IoStatusBlock != NULL)
    assert(FileInformation != NULL)
@@ -276,9 +277,34 @@ NtSetInformationFile(HANDLE FileHandle,
    StackPtr->DeviceObject = DeviceObject;
    StackPtr->FileObject = FileObject;
    
+   StackPtr->Parameters.SetFile.Length = Length;
    StackPtr->Parameters.SetFile.FileInformationClass =
      FileInformationClass;
-   StackPtr->Parameters.SetFile.Length = Length;
+   switch (FileInformationClass)
+     {
+       case FileRenameInformation:
+         if (!((FILE_RENAME_INFORMATION *)FileInformation)->RootDir)
+          StackPtr->Parameters.SetFile.FileObject=NULL;
+        else
+          {
+            /*  Get the file object from the file handle  */
+            Status = ObReferenceObjectByHandle(((FILE_RENAME_INFORMATION *)FileInformation)->RootDir,
+                                               (FILE_ADD_FILE | FILE_ADD_SUBDIRECTORY),
+                                               IoFileObjectType,
+                                               KernelMode,     /* FIXME: or UserMode ? */
+                                               (PVOID *)&RootDir_FileObject,
+                                               NULL);
+            if (!NT_SUCCESS(Status))
+              {
+                 return Status;
+              }
+            StackPtr->Parameters.SetFile.FileObject=RootDir_FileObject;
+          }
+        StackPtr->Parameters.SetFile.u.d.ReplaceIfExists=((FILE_RENAME_INFORMATION *)FileInformation)->Replace;
+        StackPtr->Parameters.SetFile.u.d.AdvanceOnly=FALSE;
+        break;
+       default:;
+     }
    
    /*
     * Pass the IRP to the FSD (and wait for
@@ -300,6 +326,8 @@ NtSetInformationFile(HANDLE FileHandle,
      {
        *IoStatusBlock = IoSB;
      }
+   if (RootDir_FileObject != NULL)
+     ObDereferenceObject(RootDir_FileObject);
    ExFreePool(SystemBuffer);
  
    return Status;