r9159: abstract the winreg js functions into a nice library interface
[jra/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         var handle = winreg_open_hive(reg, components[0]);
47         if (handle == undefined) {
48                 return undefined;
49         }
50
51         for (i=1;i<components.length;i++) {
52                 io = irpcObj();
53                 io.input.handle  = handle;
54                 io.input.keyname = components[i];
55                 io.input.unknown = 0;
56                 io.input.access_mask = reg.SEC_FLAG_MAXIMUM_ALLOWED;
57                 var status = reg.winreg_OpenKey(io);
58                 if (!status.is_ok) {
59                         return undefined;
60                 }
61                 if (io.output.result != "WERR_OK") {
62                         return undefined;
63                 }
64
65                 handle = io.output.handle;
66         }
67         return handle;
68 }
69
70 /*
71         return a list of keys for a winreg server given a path
72         usage:
73            list = winreg_enum_path(reg, path);
74 */
75 function winreg_enum_path(reg, path)
76 {
77         var list = new Object();
78         list.length = 0;
79         
80         handle = winreg_open_path(reg, path);
81         if (handle == undefined) {
82                 return undefined;
83         }
84
85         var io = irpcObj();
86         var wtime = new Object();
87         wtime.low  = 2147483647;
88         wtime.high = 2147483647;
89         var keyname = new Object();
90         keyname.unknown  = 522;
91         keyname.key_name = NULL;
92
93         io.input.handle            = handle;
94         io.input.key_name_len      = 0;
95         io.input.unknown           = 1044;
96         io.input.in_name           = keyname;
97         io.input.class             = "";
98         io.input.last_changed_time = wtime;
99         
100         var idx = 0;
101         for (idx=0;idx >= 0;idx++) {
102                 io.input.enum_index        = idx;
103                 var status = reg.winreg_EnumKey(io);
104                 if (!status.is_ok) return;
105                 var out = io.output;
106                 if (out.result != "WERR_OK") {
107                         return list;
108                 }
109
110                 list[list.length] = out.out_name.name;
111                 list.length++;
112         }
113
114         return list;
115 }