r9218: make the winreg library code handle arbitrary paths more efficiently
authorAndrew Tridgell <tridge@samba.org>
Mon, 8 Aug 2005 22:29:44 +0000 (22:29 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:31:32 +0000 (13:31 -0500)
and more conveniently (caller doesn't need to know the hive names now)

source/scripting/libjs/winreg.js
testprogs/ejs/winreg.js

index 129cfe08986abe5394dd7c5912b6e82ddde692df..703b8da2a724b1085e6e9ddbf56209cfce40b802 100644 (file)
@@ -42,29 +42,48 @@ function winreg_open_path(reg, path)
        var list = new Object();
 
        list.length = 0;
+
+       /* cope with a leading slash */
+       if (components[0] == '') {
+               for (i=0;i<(components.length-1);i++) {
+                       components[i] = components[i+1];
+               }
+               components.length--;
+       }
        
+       if (components.length == 0) {
+               return undefined;
+       }
+
        var handle = winreg_open_hive(reg, components[0]);
        if (handle == undefined) {
                return undefined;
        }
 
-       for (i=1;i<components.length;i++) {
-               io = irpcObj();
-               io.input.handle  = handle;
-               io.input.keyname = components[i];
-               io.input.unknown = 0;
-               io.input.access_mask = reg.SEC_FLAG_MAXIMUM_ALLOWED;
-               var status = reg.winreg_OpenKey(io);
-               if (!status.is_ok) {
-                       return undefined;
-               }
-               if (io.output.result != "WERR_OK") {
-                       return undefined;
-               }
+       if (components.length == 1) {
+               return handle;
+       }
 
-               handle = io.output.handle;
+       var hpath = components[1];
+
+       for (i=2;i<components.length;i++) {
+               hpath = hpath + "\\" + components[i];
        }
-       return handle;
+
+       io = irpcObj();
+       io.input.handle  = handle;
+       io.input.keyname = hpath;
+       io.input.unknown = 0;
+       io.input.access_mask = reg.SEC_FLAG_MAXIMUM_ALLOWED;
+       var status = reg.winreg_OpenKey(io);
+       if (!status.is_ok) {
+               return undefined;
+       }
+       if (io.output.result != "WERR_OK") {
+               return undefined;
+       }
+       
+       return io.output.handle;
 }
 
 /*
@@ -76,6 +95,10 @@ function winreg_enum_path(reg, path)
 {
        var list = new Object();
        list.length = 0;
+
+       if (path == null || path == "\\" || path == "") {
+               return new Array("HKLM", "HKU");
+       }
        
        handle = winreg_open_path(reg, path);
        if (handle == undefined) {
@@ -106,7 +129,6 @@ function winreg_enum_path(reg, path)
                if (out.result != "WERR_OK") {
                        return list;
                }
-
                list[list.length] = out.out_name.name;
                list.length++;
        }
index 831528b05cb48f5a5f309e684ed4d91737b182f0..22b20739f2792de244c10e38d238658f9bb9a766 100755 (executable)
@@ -13,15 +13,15 @@ ok = GetOptions(ARGV, options,
                "POPT_COMMON_SAMBA",
                "POPT_COMMON_CREDENTIALS");
 if (ok == false) {
-   println("Failed to parse options: " + options.ERROR);
-   return -1;
+       println("Failed to parse options: " + options.ERROR);
+       return -1;
 }
 
 libinclude("base.js");
 
-if (options.ARGV.length != 1) {
-   println("Usage: winreg.js <BINDING>");
-   return -1;
+if (options.ARGV.length < 1) {
+       println("Usage: winreg.js <BINDING>");
+       return -1;
 }
 var binding = options.ARGV[0];
 reg = winreg_init();
@@ -30,8 +30,8 @@ security_init(reg);
 print("Connecting to " + binding + "\n");
 status = reg.connect(binding);
 if (status.is_ok != true) {
-   print("Failed to connect to " + binding + " - " + status.errstr + "\n");
-   return -1;
+       print("Failed to connect to " + binding + " - " + status.errstr + "\n");
+       return -1;
 }
 
 function list_path(path) {
@@ -41,18 +41,25 @@ function list_path(path) {
                return;
        }
        for (i=0;i<list.length;i++) {
-               var npath = path + "\\" + list[i];
+               var npath;
+               if (path) {
+                       npath = path + "\\" + list[i];
+               } else {
+                       npath = list[i];
+               }
                println(npath);
                list_path(npath);
        }
 }
 
-var trees = new Array("HKCR", "HKLM", "HKPD", "HKU");
+var root;
 
-for (i=0;i<trees.length;i++) {
-       printf("Listing tree '%s'\n", trees[i]);
-       list_path(trees[i]);
+if (options.ARGV.length > 1) {
+       root = options.ARGV[1];
+} else {
+       root = '';
 }
 
-print("All OK\n");
+printf("Listing registry tree '%s'\n", root);
+list_path(root);
 return 0;