static int get_device_guid(char *name, int name_size, char *actual_name, int actual_name_size) { HKEY control_net_key; DWORD len; int i, found = -1; char enum_name[256]; char connection_string[256]; HKEY connection_key; char name_data[256]; DWORD name_type; const char name_string[] = "Name"; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, NETWORK_CONNECTIONS_KEY, 0, KEY_READ, &control_net_key) != ERROR_SUCCESS) { printm("Error opening registry key: %s\n", NETWORK_CONNECTIONS_KEY); return -1; } for(i = 0; found < 0; i++) { len = sizeof(enum_name); if(RegEnumKeyEx(control_net_key, i, enum_name, &len, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) { printm("Error enumerating registry subkeys of key: %s\n", NETWORK_CONNECTIONS_KEY); break; } snprintf(connection_string, sizeof(connection_string), "%s\\%s\\Connection", NETWORK_CONNECTIONS_KEY, enum_name); if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, connection_string, 0, KEY_READ, &connection_key) != ERROR_SUCCESS) continue; len = sizeof(name_data); if(!(RegQueryValueEx(connection_key, name_string, NULL, &name_type, (BYTE *)name_data, &len) != ERROR_SUCCESS || name_type != REG_SZ || is_tap_win32_dev(enum_name) != 0)) { printm("Found TAP device named '%s'\n", name_data); snprintf(name, name_size, "%s", enum_name); if(actual_name) snprintf(actual_name, actual_name_size, "\"%s\"", name_data); found = i; } RegCloseKey(connection_key); } RegCloseKey(control_net_key); return(found < 0 ? -1 : 0); }
static int get_device_guid( char *name, int name_size, char *actual_name, int actual_name_size, struct Except* eh) { LONG status; HKEY control_net_key; DWORD len; WinFail_check(eh, ( RegOpenKeyEx(HKEY_LOCAL_MACHINE, NETWORK_CONNECTIONS_KEY, 0, KEY_READ, &control_net_key) )); int stop = 0; for (int i = 0; !stop; i++) { char enum_name[256]; char connection_string[256]; HKEY connKey; char name_data[256]; DWORD name_type; const char name_string[] = "Name"; len = sizeof (enum_name); status = RegEnumKeyEx(control_net_key, i, enum_name, &len, NULL, NULL, NULL, NULL); if (status == ERROR_NO_MORE_ITEMS) { break; } else if (status != ERROR_SUCCESS) { WinFail_fail(eh, "RegEnumKeyEx() failed", status); } if (len != CString_strlen(NETWORK_ADAPTER_GUID)) { // extranious directory, eg: "Descriptions" continue; } snprintf(connection_string, sizeof(connection_string), "%s\\%s\\Connection", NETWORK_CONNECTIONS_KEY, enum_name); WinFail_check(eh, ( RegOpenKeyEx(HKEY_LOCAL_MACHINE, connection_string, 0, KEY_READ, &connKey) )); // In Windows 10, some interface keys don't have names. We should keep // going and treat those interfaces as having empty string names. len = sizeof (name_data); status = RegQueryValueEx(connKey, name_string, NULL, &name_type, (uint8_t*)name_data, &len); if (status == ERROR_FILE_NOT_FOUND) { // The interface has no name. strncpy(name_data, "", sizeof (name_data)); } else if (status != ERROR_SUCCESS) { WinFail_fail(eh, "RegQueryValueEx() for interface name failed", status); } else { if (name_type != REG_SZ) { // Someone named an interface with a non-string WinFail_fail(eh, "RegQueryValueEx() name_type != REG_SZ", status); } } if (is_tap_win32_dev(enum_name)) { snprintf(name, name_size, "%s", enum_name); if (actual_name) { if (CString_strcmp(actual_name, "") != 0) { if (CString_strcmp(name_data, actual_name) != 0) { RegCloseKey (connKey); ++i; continue; } } else { snprintf(actual_name, actual_name_size, "%s", name_data); } } stop = 1; } RegCloseKey(connKey); } RegCloseKey (control_net_key); if (stop == 0) { return -1; } return 0; }
static int get_device_guid( char *name, int name_size, char *actual_name, int actual_name_size) { LONG status; HKEY control_net_key; DWORD len; int i = 0; int stop = 0; status = RegOpenKeyEx( HKEY_LOCAL_MACHINE, NETWORK_CONNECTIONS_KEY, 0, KEY_READ, &control_net_key); if (status != ERROR_SUCCESS) { return -1; } while (!stop) { char enum_name[256]; char connection_string[256]; HKEY connection_key; char name_data[256]; DWORD name_type; const char name_string[] = "Name"; len = sizeof (enum_name); status = RegEnumKeyEx( control_net_key, i, enum_name, &len, NULL, NULL, NULL, NULL); if (status == ERROR_NO_MORE_ITEMS) break; else if (status != ERROR_SUCCESS) { return -1; } snprintf(connection_string, sizeof(connection_string), "%s\\%s\\Connection", NETWORK_CONNECTIONS_KEY, enum_name); status = RegOpenKeyEx( HKEY_LOCAL_MACHINE, connection_string, 0, KEY_READ, &connection_key); if (status == ERROR_SUCCESS) { len = sizeof (name_data); status = RegQueryValueEx( connection_key, name_string, NULL, &name_type, (LPBYTE)name_data, &len); if (status != ERROR_SUCCESS || name_type != REG_SZ) { return -1; } else { if (is_tap_win32_dev(enum_name)) { snprintf(name, name_size, "%s", enum_name); if (actual_name) { if (strcmp(actual_name, "") != 0) { if (strcmp(name_data, actual_name) != 0) { RegCloseKey (connection_key); ++i; continue; } } else { snprintf(actual_name, actual_name_size, "%s", name_data); } } stop = 1; } } RegCloseKey (connection_key); } ++i; } RegCloseKey (control_net_key); if (stop == 0) return -1; return 0; }
co_rc_t get_device_guid( char *name, int name_size, char *actual_name, int actual_name_size) { LONG status; HKEY control_net_key; DWORD len; int i = 0; int stop = 0; status = RegOpenKeyEx( HKEY_LOCAL_MACHINE, NETWORK_CONNECTIONS_KEY, 0, KEY_READ, &control_net_key); if (status != ERROR_SUCCESS) { printf("Error opening registry key: %s", NETWORK_CONNECTIONS_KEY); return CO_RC(ERROR); } while (!stop) { char enum_name[256]; char connection_string[256]; HKEY connection_key; char name_data[256]; DWORD name_type; const char name_string[] = "Name"; len = sizeof (enum_name); status = RegEnumKeyEx( control_net_key, i, enum_name, &len, NULL, NULL, NULL, NULL); if (status == ERROR_NO_MORE_ITEMS) break; else if (status != ERROR_SUCCESS) { printf("Error enumerating registry subkeys of key: %s", NETWORK_CONNECTIONS_KEY); return CO_RC(ERROR); } snprintf(connection_string, sizeof(connection_string), "%s\\%s\\Connection", NETWORK_CONNECTIONS_KEY, enum_name); status = RegOpenKeyEx( HKEY_LOCAL_MACHINE, connection_string, 0, KEY_READ, &connection_key); if (status == ERROR_SUCCESS) { len = sizeof (name_data); status = RegQueryValueEx( connection_key, name_string, NULL, &name_type, name_data, &len); if (status != ERROR_SUCCESS || name_type != REG_SZ) { co_terminal_print("colinux-net-daemon: error opening registry key: %s\\%s\\%s", NETWORK_CONNECTIONS_KEY, connection_string, name_string); return CO_RC(ERROR); } else { if (is_tap_win32_dev(enum_name)) { co_terminal_print("colinux-net-daemon: found TAP device named \"%s\"\n", name_data); stop = 1; snprintf(name, name_size, "%s", enum_name); if (actual_name) { if (*actual_name) { /* verify given name */ if (strcmp(name_data, actual_name) != 0) { stop = 0; } } else { /* name is not given */ snprintf(actual_name, actual_name_size, "%s", name_data); } } } } RegCloseKey (connection_key); } ++i; } RegCloseKey (control_net_key); if (stop == 0) return CO_RC(ERROR); return CO_RC(OK); }