summaryrefslogtreecommitdiff
path: root/source4/scripting/libjs
diff options
context:
space:
mode:
Diffstat (limited to 'source4/scripting/libjs')
-rw-r--r--source4/scripting/libjs/winreg.js54
1 files changed, 38 insertions, 16 deletions
diff --git a/source4/scripting/libjs/winreg.js b/source4/scripting/libjs/winreg.js
index 129cfe0898..703b8da2a7 100644
--- a/source4/scripting/libjs/winreg.js
+++ b/source4/scripting/libjs/winreg.js
@@ -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++;
}