r9218: make the winreg library code handle arbitrary paths more efficiently
[kai/samba.git] / source4 / scripting / libjs / winreg.js
1 /*
2         winreg rpc utility functions 
3         Copyright Andrew Tridgell 2005
4         released under the GNU GPL v2 or later
5 */      
6
7
8 /*
9   open a hive
10 */
11 function winreg_open_hive(reg, hive)
12 {
13         var io = irpcObj();
14         io.input.system_name = NULL;
15         io.input.access_required = reg.SEC_FLAG_MAXIMUM_ALLOWED;
16         var status;
17         if (hive == "HKLM") {
18                 status = reg.winreg_OpenHKLM(io);
19         } else if (hive == "HKCR") {
20                 status = reg.winreg_OpenHKCR(io);
21         } else if (hive == "HKPD") {
22                 status = reg.winreg_OpenHKPD(io);
23         } else if (hive == "HKU") {
24                 status = reg.winreg_OpenHKU(io);
25         } else {
26                 println("Unknown hive " + hive);
27                 return undefined;
28         }
29         if (!status.is_ok) {
30                 return undefined;
31         }
32         return io.output.handle;
33 }
34
35 /*
36   open a handle to a path
37 */
38 function winreg_open_path(reg, path)
39 {
40         var s = string_init();
41         var i, components = s.split('\\', path);
42         var list = new Object();
43
44         list.length = 0;
45
46         /* cope with a leading slash */
47         if (components[0] == '') {
48                 for (i=0;i<(components.length-1);i++) {
49                         components[i] = components[i+1];
50                 }
51                 components.length--;
52         }
53         
54         if (components.length == 0) {
55                 return undefined;
56         }
57
58         var handle = winreg_open_hive(reg, components[0]);
59         if (handle == undefined) {
60                 return undefined;
61         }
62
63         if (components.length == 1) {
64                 return handle;
65         }
66
67         var hpath = components[1];
68
69         for (i=2;i<components.length;i++) {
70                 hpath = hpath + "\\" + components[i];
71         }
72
73         io = irpcObj();
74         io.input.handle  = handle;
75         io.input.keyname = hpath;
76         io.input.unknown = 0;
77         io.input.access_mask = reg.SEC_FLAG_MAXIMUM_ALLOWED;
78         var status = reg.winreg_OpenKey(io);
79         if (!status.is_ok) {
80                 return undefined;
81         }
82         if (io.output.result != "WERR_OK") {
83                 return undefined;
84         }
85         
86         return io.output.handle;
87 }
88
89 /*
90         return a list of keys for a winreg server given a path
91         usage:
92            list = winreg_enum_path(reg, path);
93 */
94 function winreg_enum_path(reg, path)
95 {
96         var list = new Object();
97         list.length = 0;
98
99         if (path == null || path == "\\" || path == "") {
100                 return new Array("HKLM", "HKU");
101         }
102         
103         handle = winreg_open_path(reg, path);
104         if (handle == undefined) {
105                 return undefined;
106         }
107
108         var io = irpcObj();
109         var wtime = new Object();
110         wtime.low  = 2147483647;
111         wtime.high = 2147483647;
112         var keyname = new Object();
113         keyname.unknown  = 522;
114         keyname.key_name = NULL;
115
116         io.input.handle            = handle;
117         io.input.key_name_len      = 0;
118         io.input.unknown           = 1044;
119         io.input.in_name           = keyname;
120         io.input.class             = "";
121         io.input.last_changed_time = wtime;
122         
123         var idx = 0;
124         for (idx=0;idx >= 0;idx++) {
125                 io.input.enum_index        = idx;
126                 var status = reg.winreg_EnumKey(io);
127                 if (!status.is_ok) return;
128                 var out = io.output;
129                 if (out.result != "WERR_OK") {
130                         return list;
131                 }
132                 list[list.length] = out.out_name.name;
133                 list.length++;
134         }
135
136         return list;
137 }