NtSetInformationFile()/FileRenameInformation:
authorshort <>
Wed, 30 Apr 2003 05:57:35 +0000 (05:57 +0000)
committershort <>
Wed, 30 Apr 2003 05:57:35 +0000 (05:57 +0000)
  Compatibility with ntfs.sys of NT-5.1sp1

ntoskrnl/io/file.c

index e40bb09..5888a62 100644 (file)
@@ -203,6 +203,10 @@ IoQueryFileInformation(IN PFILE_OBJECT FileObject,
 
 #endif /* LIBCAPTIVE */
 
+#define OBJ_KERNEL_HANDLE 0x00000200
+#define IO_FORCE_ACCESS_CHECK 0x1
+#define IO_NO_PARAMETER_CHECKING 0x100
+
 NTSTATUS STDCALL
 NtSetInformationFile(HANDLE FileHandle,
                     PIO_STATUS_BLOCK IoStatusBlock,
@@ -218,6 +222,7 @@ NtSetInformationFile(HANDLE FileHandle,
    PVOID SystemBuffer;
    IO_STATUS_BLOCK IoSB;
    FILE_OBJECT *RootDir_FileObject = NULL;
+   HANDLE RootDir_FileHandle;
    
    assert(IoStatusBlock != NULL)
    assert(FileInformation != NULL)
@@ -282,27 +287,62 @@ NtSetInformationFile(HANDLE FileHandle,
      FileInformationClass;
    switch (FileInformationClass)
      {
-       case FileRenameInformation:
-         if (!((FILE_RENAME_INFORMATION *)FileInformation)->RootDir)
-          StackPtr->Parameters.SetFile.FileObject=NULL;
-        else
+       case FileRenameInformation: {
+FILE_RENAME_INFORMATION *RenameInformation=(FILE_RENAME_INFORMATION *)FileInformation;
+OBJECT_ATTRIBUTES file_ObjectAttributes;
+UNICODE_STRING file_ObjectAttributes_ObjectName_UnicodeString;
+IO_STATUS_BLOCK file_IoStatusBlock;
+
+        /* Create target 'StackPtr->Parameters.SetFile.FileObject'
+         * by a special way below to open the target directory
+         * from the given full pathname by 'SL_OPEN_TARGET_DIRECTORY'.
+         */
+        RtlInitUnicodeString(&file_ObjectAttributes_ObjectName_UnicodeString, RenameInformation->FileName);
+        InitializeObjectAttributes(
+            &file_ObjectAttributes,    /* InitializedAttributes */
+            &file_ObjectAttributes_ObjectName_UnicodeString,   /* ObjectName */
+            OBJ_KERNEL_HANDLE | (0/* FIXME: when to use it? */ ? 0x2000/* FIXME: meaning? */ : 0),     /* Attributes */
+            RenameInformation->RootDir,        /* RootDirectory */
+            NULL);     /* SecurityDescriptor; ignored */
+        Status=IoCreateFile(
+            &RootDir_FileHandle,       /* FileHandle */
+            FILE_ADD_FILE | 0x100000/* FIXME: meaning? */,     /* DesiredAccess */
+            &file_ObjectAttributes,    /* ObjectAttributes */
+            &file_IoStatusBlock,       /* IoStatusBlock */
+            NULL,      /* AllocationSize; ignored for open */
+            0, /* FileAttributes; ignored for open */
+            FILE_SHARE_READ|FILE_SHARE_WRITE,  /* ShareAccess; 0 means exclusive */
+            FILE_OPEN, /* CreateDisposition */
+            FILE_OPEN_FOR_BACKUP_INTENT/* FIXME: why? meaning? */,     /* CreateOptions */
+            NULL,      /* EaBuffer */
+            0, /* EaLength */
+            CreateFileTypeNone,        /* CreateFileType */
+            NULL,      /* ExtraCreateParameters */
+            IO_NO_PARAMETER_CHECKING|IO_FORCE_ACCESS_CHECK|SL_OPEN_TARGET_DIRECTORY);  /* Options */
+        if (!NT_SUCCESS(Status))
           {
-            /*  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;
+             return Status;
           }
-        StackPtr->Parameters.SetFile.u.d.ReplaceIfExists=((FILE_RENAME_INFORMATION *)FileInformation)->Replace;
+
+        /*  Get the file object from the file handle  */
+        Status = ObReferenceObjectByHandle(RootDir_FileHandle,
+                                    (FILE_ADD_FILE | (0/* FIXME: when? */ ? FILE_ADD_SUBDIRECTORY : 0)),
+                                    IoFileObjectType,
+                                    KernelMode,
+                                    (PVOID *)&RootDir_FileObject,
+                                    NULL);
+        if (!NT_SUCCESS(Status))
+          {
+             NtClose(RootDir_FileHandle);      /* errors ignored */
+             return Status;
+          }
+        /* 'StackPtr->FileObject' should be the source file,
+         * 'StackPtr->Parameters.SetFile.FileObject' should be the target directory.
+         */
+        StackPtr->Parameters.SetFile.FileObject=RootDir_FileObject;
+        StackPtr->Parameters.SetFile.u.d.ReplaceIfExists=RenameInformation->Replace;
         StackPtr->Parameters.SetFile.u.d.AdvanceOnly=FALSE;
-        break;
+        break;
        default:;
      }
    
@@ -327,7 +367,10 @@ NtSetInformationFile(HANDLE FileHandle,
        *IoStatusBlock = IoSB;
      }
    if (RootDir_FileObject != NULL)
-     ObDereferenceObject(RootDir_FileObject);
+     {
+       NtClose(RootDir_FileHandle);    /* errors ignored */
+       ObDereferenceObject(RootDir_FileObject);
+     }
    ExFreePool(SystemBuffer);
  
    return Status;