[Libguestfs] [PATCH 1/1] hivexregedit: add --max-depth option for exports

Michael Meyer mmeyer at datto.com
Fri Dec 29 19:30:49 UTC 2017


---
 perl/lib/Win/Hivex/Regedit.pm | 14 ++++++++++++--
 regedit/hivexregedit          | 18 +++++++++++++++++-
 2 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/perl/lib/Win/Hivex/Regedit.pm b/perl/lib/Win/Hivex/Regedit.pm
index 355699e..34426f1 100644
--- a/perl/lib/Win/Hivex/Regedit.pm
+++ b/perl/lib/Win/Hivex/Regedit.pm
@@ -487,11 +487,12 @@ sub reg_export
 {
     my $h = shift;
     my $key = shift;
+    my $fh = shift;
 
     my $node = _node_lookup ($h, $key);
     croak "$key: path not found in this hive" unless $node;
 
-    reg_export_node ($h, $node, @_);
+    reg_export_node ($h, $node, $fh, 0, @_);
 }
 
 =head2 reg_export_node
@@ -510,8 +511,17 @@ sub reg_export_node
     my $h = shift;
     my $node = shift;
     my $fh = shift;
+    my $depth = shift;
     my %params = @_;
 
+    my $max_depth = $params{max_depth};
+    if (defined $max_depth && $max_depth >= 0) {
+        # Check if we've gone deep enough
+        if ($depth >= $max_depth) {
+            return;
+        }
+    }
+
     confess "reg_export_node: \$node parameter was undef" unless defined $node;
 
     # Get the canonical path of this node.
@@ -622,7 +632,7 @@ sub reg_export_node
     }
 
     @children = sort { $h->node_name ($a) cmp $h->node_name ($b) } @children;
-    reg_export_node ($h, $_, $fh, @_) foreach @children;
+    reg_export_node ($h, $_, $fh, $depth + 1, @_) foreach @children;
 }
 
 # Escape " and \ when printing keys.
diff --git a/regedit/hivexregedit b/regedit/hivexregedit
index cd49063..737450d 100755
--- a/regedit/hivexregedit
+++ b/regedit/hivexregedit
@@ -259,6 +259,20 @@ Use heuristics to tolerate certain levels of corruption within hives.
 This is unsafe but may allow to export/merge valid keys/values in an
 othewise corrupted hive.
 
+=cut
+
+my $max_depth;
+
+=item B<--max-depth> depth
+
+Limits the recursion depth of the export. For example, an export
+with a max depth of 1 will only include values directly under the
+specified key/prefix. A max depth of 0 will return no values.
+
+Exports include all child keys by default (fully recursive),
+which may take a while if the registry hive is large / bloated.
+This behavior can also be achieved by providing a negative max depth.
+
 =back
 
 =cut
@@ -271,6 +285,7 @@ GetOptions ("help|?" => \$help,
             "encoding=s" => \$encoding,
             "unsafe-printable-strings" => \$unsafe_printable_strings,
             "unsafe" => \$unsafe,
+            "max-depth=i" => \$max_depth,
     ) or pod2usage (2);
 pod2usage (1) if $help;
 
@@ -332,7 +347,8 @@ if ($merge) {                   # --merge (reg_import)
     reg_export ($h, $key, \*STDOUT,
                 prefix => $prefix,
                 unsafe_printable_strings => $unsafe_printable_strings,
-                unsafe => $unsafe);
+                unsafe => $unsafe,
+                max_depth => $max_depth);
 }
 
 =head1 SEE ALSO
-- 
2.14.3 (Apple Git-98)




More information about the Libguestfs mailing list