150
* Network control panel helpers
158
static list<panel_reg> network_registry;
159
typedef list<panel_reg>::const_iterator network_registry_iterator;
161
#define NETWORK_CONNECTIONS_KEY \
162
"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}"
164
static void get_network_registry(void)
167
HKEY network_connections_key;
171
if (network_registry.size() > 0)
174
status = RegOpenKeyEx(
176
NETWORK_CONNECTIONS_KEY,
179
&network_connections_key);
181
if (status != ERROR_SUCCESS)
186
char connection_string[256];
190
const char name_string[] = "Name";
192
len = sizeof (enum_name);
193
status = RegEnumKeyEx(
194
network_connections_key,
202
if (status != ERROR_SUCCESS)
205
snprintf (connection_string, sizeof(connection_string),
206
"%s\\%s\\Connection",
207
NETWORK_CONNECTIONS_KEY, enum_name);
209
status = RegOpenKeyEx(
216
if (status == ERROR_SUCCESS) {
217
len = sizeof (name_data);
218
status = RegQueryValueEx(
226
if (status == ERROR_SUCCESS && name_type == REG_SZ) {
230
network_registry.push_back(pr);
232
RegCloseKey (connection_key);
237
RegCloseKey (network_connections_key);
240
const char *ether_name_to_guid(const char *name)
242
get_network_registry();
244
for (network_registry_iterator it = network_registry.begin(); it != network_registry.end(); it++) {
245
if (strcmp((*it).name.c_str(), name) == 0)
246
return (*it).guid.c_str();
252
const char *ether_guid_to_name(const char *guid)
254
get_network_registry();
256
for (network_registry_iterator it = network_registry.begin(); it != network_registry.end(); it++) {
257
if (strcmp((*it).guid.c_str(), guid) == 0)
258
return (*it).name.c_str();
266
* Get TAP-Win32 adapters
269
#define ADAPTER_KEY "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}"
271
#define TAP_COMPONENT_ID "tap0801"
273
const char *ether_tap_devices(void)
280
status = RegOpenKeyEx(
287
if (status != ERROR_SUCCESS)
290
list<string> devices;
294
char unit_string[256];
296
char component_id_string[] = "ComponentId";
297
char component_id[256];
298
char net_cfg_instance_id_string[] = "NetCfgInstanceId";
299
char net_cfg_instance_id[256];
302
len = sizeof (enum_name);
303
status = RegEnumKeyEx(
312
if (status != ERROR_SUCCESS)
315
snprintf (unit_string, sizeof(unit_string), "%s\\%s",
316
ADAPTER_KEY, enum_name);
318
status = RegOpenKeyEx(
325
if (status == ERROR_SUCCESS) {
326
len = sizeof (component_id);
327
status = RegQueryValueEx(
332
(BYTE *)component_id,
335
if (status == ERROR_SUCCESS && data_type == REG_SZ) {
336
len = sizeof (net_cfg_instance_id);
337
status = RegQueryValueEx(
339
net_cfg_instance_id_string,
342
(BYTE *)net_cfg_instance_id,
345
if (status == ERROR_SUCCESS && data_type == REG_SZ) {
346
if (!strcmp (component_id, TAP_COMPONENT_ID))
347
devices.push_back(net_cfg_instance_id);
350
RegCloseKey (unit_key);
355
RegCloseKey (adapter_key);
360
// The result is a '\0' separated list of strings
361
list<string>::const_iterator it;
363
for (it = devices.begin(); it != devices.end(); it++)
364
len += (*it).length() + 1;
366
char *names = (char *)malloc(len);
369
for (it = devices.begin(); it != devices.end(); it++) {
370
len = (*it).length();
371
strcpy(p, (*it).c_str());