diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-08-06 01:09:27 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:31:25 -0500 |
commit | 772d58066dd074b961b39fcdfc01bc956b193cb5 (patch) | |
tree | 56c7022982cd9a603955b9ea906962f98a01d761 | |
parent | c56befeb62daaa76b085af2aede4ae8de26fbba6 (diff) | |
download | samba-772d58066dd074b961b39fcdfc01bc956b193cb5.tar.gz samba-772d58066dd074b961b39fcdfc01bc956b193cb5.tar.bz2 samba-772d58066dd074b961b39fcdfc01bc956b193cb5.zip |
r9159: abstract the winreg js functions into a nice library interface
(This used to be commit 5e398700627fb2c16bf39b9c851f640f5412c7d4)
-rw-r--r-- | source4/scripting/libjs/winreg.js | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/source4/scripting/libjs/winreg.js b/source4/scripting/libjs/winreg.js new file mode 100644 index 0000000000..129cfe0898 --- /dev/null +++ b/source4/scripting/libjs/winreg.js @@ -0,0 +1,115 @@ +/* + winreg rpc utility functions + Copyright Andrew Tridgell 2005 + released under the GNU GPL v2 or later +*/ + + +/* + open a hive +*/ +function winreg_open_hive(reg, hive) +{ + var io = irpcObj(); + io.input.system_name = NULL; + io.input.access_required = reg.SEC_FLAG_MAXIMUM_ALLOWED; + var status; + if (hive == "HKLM") { + status = reg.winreg_OpenHKLM(io); + } else if (hive == "HKCR") { + status = reg.winreg_OpenHKCR(io); + } else if (hive == "HKPD") { + status = reg.winreg_OpenHKPD(io); + } else if (hive == "HKU") { + status = reg.winreg_OpenHKU(io); + } else { + println("Unknown hive " + hive); + return undefined; + } + if (!status.is_ok) { + return undefined; + } + return io.output.handle; +} + +/* + open a handle to a path +*/ +function winreg_open_path(reg, path) +{ + var s = string_init(); + var i, components = s.split('\\', path); + var list = new Object(); + + list.length = 0; + + 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; + } + + handle = io.output.handle; + } + return handle; +} + +/* + return a list of keys for a winreg server given a path + usage: + list = winreg_enum_path(reg, path); +*/ +function winreg_enum_path(reg, path) +{ + var list = new Object(); + list.length = 0; + + handle = winreg_open_path(reg, path); + if (handle == undefined) { + return undefined; + } + + var io = irpcObj(); + var wtime = new Object(); + wtime.low = 2147483647; + wtime.high = 2147483647; + var keyname = new Object(); + keyname.unknown = 522; + keyname.key_name = NULL; + + io.input.handle = handle; + io.input.key_name_len = 0; + io.input.unknown = 1044; + io.input.in_name = keyname; + io.input.class = ""; + io.input.last_changed_time = wtime; + + var idx = 0; + for (idx=0;idx >= 0;idx++) { + io.input.enum_index = idx; + var status = reg.winreg_EnumKey(io); + if (!status.is_ok) return; + var out = io.output; + if (out.result != "WERR_OK") { + return list; + } + + list[list.length] = out.out_name.name; + list.length++; + } + + return list; +} |