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;
}