blob: 129cfe08986abe5394dd7c5912b6e82ddde692df (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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;
}
|