2 Copyright Paul Lin 2003. Copyright 2006 Bojan Resnik.
3 Distributed under the Boost Software License, Version 1.0. (See accompanying
4 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 # if defined( OS_NT ) || defined( OS_CYGWIN )
17 # define WIN32_LEAN_AND_MEAN
20 # define MAX_REGISTRY_DATA_LENGTH 4096
21 # define MAX_REGISTRY_KEYNAME_LENGTH 256
22 # define MAX_REGISTRY_VALUENAME_LENGTH 16384
30 static const KeyMap dlRootKeys[] = {
31 { "HKLM", HKEY_LOCAL_MACHINE },
32 { "HKCU", HKEY_CURRENT_USER },
33 { "HKCR", HKEY_CLASSES_ROOT },
34 { "HKEY_LOCAL_MACHINE", HKEY_LOCAL_MACHINE },
35 { "HKEY_CURRENT_USER", HKEY_CURRENT_USER },
36 { "HKEY_CLASSES_ROOT", HKEY_CLASSES_ROOT },
40 static HKEY get_key(char const** path)
44 for (p = dlRootKeys; p->name; ++p)
46 int n = strlen(p->name);
47 if (!strncmp(*path,p->name,n))
49 if ((*path)[n] == '\\' || (*path)[n] == 0)
61 builtin_system_registry(
65 char const* path = lol_get(frame->args, 0)->string;
67 HKEY key = get_key(&path);
71 && ERROR_SUCCESS == RegOpenKeyEx(key, path, 0, KEY_QUERY_VALUE, &key)
75 BYTE data[MAX_REGISTRY_DATA_LENGTH];
76 DWORD len = sizeof(data);
77 LIST const* const field = lol_get(frame->args, 1);
80 RegQueryValueEx(key, field ? field->string : 0, 0, &type, data, &len) )
92 (len = ExpandEnvironmentStrings(
93 (LPCSTR)data, expanded->value, expanded->capacity))
96 string_reserve(expanded, len);
98 expanded->size = len - 1;
100 result = list_new( result, newstr(expanded->value) );
101 string_free( expanded );
109 for (s = (char*)data; *s; s += strlen(s) + 1)
110 result = list_new( result, newstr(s) );
118 sprintf( buf, "%u", *(PDWORD)data );
119 result = list_new( result, newstr(buf) );
124 result = list_new( result, newstr((char*)data) );
133 static LIST* get_subkey_names(HKEY key, char const* path)
137 if ( ERROR_SUCCESS ==
138 RegOpenKeyEx(key, path, 0, KEY_ENUMERATE_SUB_KEYS, &key)
141 char name[MAX_REGISTRY_KEYNAME_LENGTH];
142 DWORD name_size = sizeof(name);
144 FILETIME last_write_time;
147 ERROR_SUCCESS == RegEnumKeyEx(
148 key, index, name, &name_size, 0, 0, 0, &last_write_time);
150 name_size = sizeof(name)
154 result = list_append(result, list_new(0, newstr(name)));
163 static LIST* get_value_names(HKEY key, char const* path)
167 if ( ERROR_SUCCESS == RegOpenKeyEx(key, path, 0, KEY_QUERY_VALUE, &key) )
169 char name[MAX_REGISTRY_VALUENAME_LENGTH];
170 DWORD name_size = sizeof(name);
174 ERROR_SUCCESS == RegEnumValue(
175 key, index, name, &name_size, 0, 0, 0, 0);
177 name_size = sizeof(name)
181 result = list_append(result, list_new(0, newstr(name)));
191 builtin_system_registry_names(
195 char const* path = lol_get(frame->args, 0)->string;
196 char const* result_type = lol_get(frame->args, 1)->string;
198 HKEY key = get_key(&path);
200 if ( !strcmp(result_type, "subkeys") )
201 return get_subkey_names(key, path);
202 if ( !strcmp(result_type, "values") )
203 return get_value_names(key, path);