2 Copyright Paul Lin 2003. Copyright 2006 Bojan Resnik.
3 Distributed under the Boost Software License, Version 1.0. (See accompanying
4 file LICENSE.txt or copy at https://www.bfgroup.xyz/b2/LICENSE.txt)
9 # if defined( OS_NT ) || defined( OS_CYGWIN )
15 # include "jam_strings.h"
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 size_t n
= strlen(p
->name
);
47 if (!strncmp(*path
,p
->name
,n
))
49 if ((*path
)[n
] == '\\' || (*path
)[n
] == 0)
60 LIST
* builtin_system_registry( FRAME
* frame
, int flags
)
62 char const* path
= object_str( list_front( lol_get(frame
->args
, 0) ) );
64 HKEY key
= get_key(&path
);
68 && ERROR_SUCCESS
== RegOpenKeyExA(key
, path
, 0, KEY_QUERY_VALUE
, &key
)
72 BYTE data
[MAX_REGISTRY_DATA_LENGTH
];
73 DWORD len
= sizeof(data
);
74 LIST
* const field
= lol_get(frame
->args
, 1);
77 RegQueryValueExA(key
, field
? object_str( list_front( field
) ) : 0, 0, &type
, data
, &len
) )
89 (len
= ExpandEnvironmentStringsA(
90 (LPCSTR
)data
, expanded
->value
, (DWORD
)expanded
->capacity
))
91 > DWORD(expanded
->capacity
)
93 string_reserve(expanded
, len
);
95 expanded
->size
= len
- 1;
97 result
= list_push_back( result
, object_new(expanded
->value
) );
98 string_free( expanded
);
106 for (s
= (char*)data
; *s
; s
+= strlen(s
) + 1)
107 result
= list_push_back( result
, object_new(s
) );
115 sprintf( buf
, "%lu", *(PDWORD
)data
);
116 result
= list_push_back( result
, object_new(buf
) );
121 result
= list_push_back( result
, object_new( (const char *)data
) );
130 static LIST
* get_subkey_names(HKEY key
, char const* path
)
134 if ( ERROR_SUCCESS
==
135 RegOpenKeyExA(key
, path
, 0, KEY_ENUMERATE_SUB_KEYS
, &key
)
138 char name
[MAX_REGISTRY_KEYNAME_LENGTH
];
139 DWORD name_size
= sizeof(name
);
141 FILETIME last_write_time
;
144 ERROR_SUCCESS
== RegEnumKeyExA(
145 key
, index
, name
, &name_size
, 0, 0, 0, &last_write_time
);
147 name_size
= sizeof(name
)
151 result
= list_append(result
, list_new(object_new(name
)));
160 static LIST
* get_value_names(HKEY key
, char const* path
)
164 if ( ERROR_SUCCESS
== RegOpenKeyExA(key
, path
, 0, KEY_QUERY_VALUE
, &key
) )
166 char name
[MAX_REGISTRY_VALUENAME_LENGTH
];
167 DWORD name_size
= sizeof(name
);
171 ERROR_SUCCESS
== RegEnumValueA(
172 key
, index
, name
, &name_size
, 0, 0, 0, 0);
174 name_size
= sizeof(name
)
178 result
= list_append(result
, list_new(object_new(name
)));
187 LIST
* builtin_system_registry_names( FRAME
* frame
, int flags
)
189 char const* path
= object_str( list_front( lol_get(frame
->args
, 0) ) );
190 char const* result_type
= object_str( list_front( lol_get(frame
->args
, 1) ) );
192 HKEY key
= get_key(&path
);
194 if ( !strcmp(result_type
, "subkeys") )
195 return get_subkey_names(key
, path
);
196 if ( !strcmp(result_type
, "values") )
197 return get_value_names(key
, path
);