summaryrefslogtreecommitdiffhomepage
path: root/windows/driverlogic/src/driverlogic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'windows/driverlogic/src/driverlogic.cpp')
-rw-r--r--windows/driverlogic/src/driverlogic.cpp47
1 files changed, 46 insertions, 1 deletions
diff --git a/windows/driverlogic/src/driverlogic.cpp b/windows/driverlogic/src/driverlogic.cpp
index 663436a7fd..acc601811b 100644
--- a/windows/driverlogic/src/driverlogic.cpp
+++ b/windows/driverlogic/src/driverlogic.cpp
@@ -666,6 +666,48 @@ void CreateNetDevice(const std::wstring &hardwareId, const std::optional<std::ws
}
}
+std::wstring FindFreeAdapterAlias(const std::set<NetworkAdapter> &adapters, const std::wstring &baseName)
+{
+ if (adapters.empty())
+ {
+ return baseName;
+ }
+
+ auto findByAlias = [](const std::set<NetworkAdapter> &adapters, const std::wstring &alias)
+ {
+ const auto it = std::find_if(adapters.begin(), adapters.end(), [&alias](const NetworkAdapter &candidate)
+ {
+ return 0 == _wcsicmp(candidate.alias.c_str(), alias.c_str());
+ });
+
+ return it;
+ };
+
+ const auto foundAdapter = findByAlias(adapters, baseName);
+
+ if (adapters.end() == foundAdapter)
+ {
+ return baseName;
+ }
+
+ for (auto i = 1; i < 100; ++i)
+ {
+ std::wstringstream ss;
+
+ ss << baseName << L"-" << i;
+
+ const auto alias = ss.str();
+ const auto nextAdapter = findByAlias(adapters, alias);
+
+ if (adapters.end() == nextAdapter)
+ {
+ return alias;
+ }
+ }
+
+ THROW_ERROR("Cannot find an unused adapter alias")
+}
+
std::optional<NetworkAdapter> FindAdapterByAlias(const std::set<NetworkAdapter> &tapAdapters, const std::wstring &baseName)
{
if (tapAdapters.empty())
@@ -881,9 +923,12 @@ int HandleWintunCommands(int argc, const wchar_t *argv[])
requestGuid = &guidObject;
}
+ const auto adapters = GetNetworkAdapters(std::nullopt);
+ const auto freeAdapterName = FindFreeAdapterAlias(adapters, adapter);
+
const auto handle = wintun.createAdapter(
pool,
- adapter,
+ freeAdapterName.c_str(),
requestGuid,
nullptr
);