captive_file_move(): Compatibility with ntfs.sys of NT-5.1sp1
authorshort <>
Wed, 30 Apr 2003 05:56:18 +0000 (05:56 +0000)
committershort <>
Wed, 30 Apr 2003 05:56:18 +0000 (05:56 +0000)
src/libcaptive/client/file.c

index a7e8568..610b954 100644 (file)
@@ -719,69 +719,38 @@ GnomeVFSResult errvfsresult;
 GnomeVFSResult captive_file_move(CaptiveFileObject *captive_file_object_old,const gchar *pathname_new,gboolean force_replace)
 {
 NTSTATUS err;
-FILE_RENAME_INFORMATION FileRenameInformation_struct;
+FILE_RENAME_INFORMATION *FileRenameInformation_structp;
 IO_STATUS_BLOCK file_IoStatusBlock;
 GnomeVFSResult errvfsresult;
-gchar *pathname_new_dirname,*pathname_new_basename;
-CaptiveDirectoryObject *captive_target_directory_object;
-FILE_OBJECT *target_dir_FileObject;
-UNICODE_STRING *target_dir_FileObject_FileName_UnicodeString_local;
-BOOLEAN errboolean;
+OBJECT_ATTRIBUTES pathname_new_ObjectAttributes;
 
        g_return_val_if_fail(captive_file_object_old!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(captive_file_object_old->file_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(pathname_new!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
-       pathname_new_dirname=g_path_get_dirname(pathname_new);
-       pathname_new_basename=g_path_get_basename(pathname_new);
-
-       errvfsresult=captive_directory_new_open(&captive_target_directory_object,pathname_new_dirname);
-       if (errvfsresult!=GNOME_VFS_OK)
-               goto err_free_pathnames;
-
-       err=ObReferenceObjectByHandle(
-                       captive_target_directory_object->dir_Handle,    /* Handle */
-                       (FILE_ADD_FILE | FILE_ADD_SUBDIRECTORY),        /* DesiredAccess */
-                       IoFileObjectType,       /* ObjectType */
-                       KernelMode,     /* AccessMode */
-                       (PVOID *)&target_dir_FileObject,        /* Object */
-                       NULL);  /* HandleInfo */
-       if (!NT_SUCCESS(err)) {
-               g_assert_not_reached();
-               errvfsresult=GNOME_VFS_ERROR_GENERIC;
-               goto err_close_captive_target_directory_object;
-               }
-
-       /* Supply only the 'basename' to 'target_dir_FileObject->FileName'
-        * as the directory is fully determined by its other attributes.
-        */
-       target_dir_FileObject_FileName_UnicodeString_local=captive_utf8_to_UnicodeString_alloca(pathname_new_basename);
-       errboolean=RtlCreateUnicodeString(&target_dir_FileObject->FileName,
-                       target_dir_FileObject_FileName_UnicodeString_local->Buffer);
-       g_assert(errboolean==TRUE);
-
-       ObDereferenceObject(target_dir_FileObject);
+       errvfsresult=captive_ObjectAttributes_init(pathname_new,&pathname_new_ObjectAttributes);
+       g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult);
 
-       FileRenameInformation_struct.Replace=force_replace;
-       FileRenameInformation_struct.RootDir=captive_target_directory_object->dir_Handle;       /* ->'target_dir_FileObject' */
-       FileRenameInformation_struct.FileNameLength=0;  /* provided by 'FileRenameInformation_struct.RootDir' */
+       FileRenameInformation_structp=
+                       g_alloca(sizeof(*FileRenameInformation_structp)+pathname_new_ObjectAttributes.ObjectName->MaximumLength);
+       FileRenameInformation_structp->Replace=force_replace;
+       FileRenameInformation_structp->RootDir=0;       /* AFAIK never set by orig W32 */
+       FileRenameInformation_structp->FileNameLength=pathname_new_ObjectAttributes.ObjectName->Length;
+       memcpy(FileRenameInformation_structp->FileName,pathname_new_ObjectAttributes.ObjectName->Buffer,
+                       pathname_new_ObjectAttributes.ObjectName->MaximumLength);
 
        err=NtSetInformationFile(
                        captive_file_object_old->file_Handle,   /* FileHandle */
                        &file_IoStatusBlock,    /* IoStatusBlock */
-                       &FileRenameInformation_struct,  /* FileInformation */
-                       sizeof(FileRenameInformation_struct),   /* Length */
+                       FileRenameInformation_structp,  /* FileInformation */
+                       sizeof(*FileRenameInformation_structp)+pathname_new_ObjectAttributes.ObjectName->MaximumLength, /* Length */
                        FileRenameInformation); /* FileInformationClass */
        if (GNOME_VFS_OK!=(errvfsresult=captive_NTSTATUS_to_GnomeVFSResult(err)))
-               goto err_close_captive_target_directory_object;
+               goto err_free_ObjectAttributes;
        g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC);
 
-
-err_close_captive_target_directory_object:
-       g_object_unref(captive_target_directory_object);
-err_free_pathnames:
-       g_free(pathname_new_dirname);
-       g_free(pathname_new_basename);
+err_free_ObjectAttributes:
+       g_free(pathname_new_ObjectAttributes.ObjectName);       /* left from captive_file_uri_parent_init() */
 
        return errvfsresult;
 }