1
0
mirror of https://github.com/samba-team/samba.git synced 2025-04-27 06:50:24 +03:00
Andrew Tridgell 924b3cc953 r9218: make the winreg library code handle arbitrary paths more efficiently
and more conveniently (caller doesn't need to know the hive names now)
(This used to be commit dadd7e22fb439f7b18c429a95c75902e4741ba8d)
2007-10-10 13:31:32 -05:00

138 lines
2.7 KiB
JavaScript

/*
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;
/* 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;
}
if (components.length == 1) {
return handle;
}
var hpath = components[1];
for (i=2;i<components.length;i++) {
hpath = hpath + "\\" + components[i];
}
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;
}
/*
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;
if (path == null || path == "\\" || path == "") {
return new Array("HKLM", "HKU");
}
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;
}