X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=tools%2Fvirt-win-reg;h=4c9308addec312c779285e17aa672a5d9438935f;hb=f0c28b391c2ca6d8be4b7b7313042a6b3eb4dc8c;hp=ed298fbc6b393d268fb4d0fb905bf37bd33acf4d;hpb=641ccab6c3b17f1c94676eab99e8baa9cddf5a0b;p=libguestfs.git diff --git a/tools/virt-win-reg b/tools/virt-win-reg index ed298fb..4c9308a 100755 --- a/tools/virt-win-reg +++ b/tools/virt-win-reg @@ -20,15 +20,14 @@ use warnings; use strict; use Sys::Guestfs; -use Sys::Guestfs::Lib qw(open_guest get_partitions resolve_windows_path - inspect_all_partitions inspect_partition - inspect_operating_systems mount_operating_system); +use Sys::Guestfs::Lib qw(open_guest); use Win::Hivex; use Win::Hivex::Regedit qw(reg_import reg_export); use Pod::Usage; use Getopt::Long; use File::Temp qw/tempdir/; +use File::Basename; use Locale::TextDomain 'libguestfs'; =encoding utf8 @@ -288,23 +287,23 @@ $g->launch (); warn "inspecting guest ..." if $debug; -# List of possible filesystems. -my @partitions = get_partitions ($g); - -# Now query each one to build up a picture of what's in it. -my %fses = - inspect_all_partitions ($g, \@partitions, - use_windows_registry => 0); - -my $oses = inspect_operating_systems ($g, \%fses); - -my @roots = keys %$oses; -die __"multiboot operating systems are not supported by virt-win-reg" if @roots > 1; -my $root_dev = $roots[0]; +my @roots = $g->inspect_os (); +if (@roots == 0) { + die __x("{prog}: No operating system could be detected inside this disk image.\n\nThis may be because the file is not a disk image, or is not a virtual machine\nimage, or because the OS type is not understood by libguestfs.\n\nIf you feel this is an error, please file a bug report including as much\ninformation about the disk image as possible.\n", + prog => basename ($0)); +} +if (@roots > 1) { + die __x("{prog}: multiboot operating systems are not supported.\n", + prog => basename ($0)) +} +my %fses = $g->inspect_get_mountpoints ($roots[0]); +my @fses = sort { length $a <=> length $b } keys %fses; +my $mountopts = $merge ? "" : "ro"; +foreach (@fses) { + $g->mount_options ($mountopts, $fses{$_}, $_); +} -my $os = $oses->{$root_dev}; -my $ro = $merge ? 0 : 1; -mount_operating_system ($g, $os, $ro); +my $systemroot = $g->inspect_get_windows_systemroot ($roots[0]); # Create a working directory to store the downloaded registry files. my $tmpdir = tempdir (CLEANUP => 1); @@ -437,7 +436,6 @@ sub download_hive local $_; my $hivename = shift; - my $systemroot = $os->{root}->{systemroot} || "/windows"; my $winfile_before = "$systemroot/system32/config/$hivename"; my $winfile; eval { $winfile = $g->case_sensitive_path ($winfile_before); }; @@ -460,7 +458,6 @@ sub upload_hive local $_; my $hivename = shift; - my $systemroot = $os->{root}->{systemroot} || "/windows"; my $winfile_before = "$systemroot/system32/config/$hivename"; my $winfile; eval { $winfile = $g->case_sensitive_path ($winfile_before); };