diff options
| author | Odd Stranne <odd@mullvad.net> | 2018-08-31 21:56:25 +0200 |
|---|---|---|
| committer | Odd Stranne <odd@mullvad.net> | 2018-09-04 13:06:33 +0200 |
| commit | d1bfd9cf3c52dea98261377f96e9b4864d861c06 (patch) | |
| tree | abfd72736b9f4a3b4e57eed91e420c3562140cba /windows/nsis-plugins/src/driverlogic/context.cpp | |
| parent | 93e0e780f7e9db0aa3919e55b58979ab07f8e6b6 (diff) | |
| download | mullvadvpn-d1bfd9cf3c52dea98261377f96e9b4864d861c06.tar.xz mullvadvpn-d1bfd9cf3c52dea98261377f96e9b4864d861c06.zip | |
Add logging in 'driverlogic' plugin
Diffstat (limited to 'windows/nsis-plugins/src/driverlogic/context.cpp')
| -rw-r--r-- | windows/nsis-plugins/src/driverlogic/context.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/windows/nsis-plugins/src/driverlogic/context.cpp b/windows/nsis-plugins/src/driverlogic/context.cpp index d2481e3e67..9c003b440c 100644 --- a/windows/nsis-plugins/src/driverlogic/context.cpp +++ b/windows/nsis-plugins/src/driverlogic/context.cpp @@ -4,6 +4,7 @@ #include <libcommon/wmi/connection.h> #include <libcommon/wmi/resultset.h> #include <libcommon/wmi/wmi.h> +#include <log/log.h> #include <vector> #include <stdexcept> #include <algorithm> @@ -26,6 +27,81 @@ std::vector<std::wstring> BlockToRows(const std::wstring &textBlock) return common::string::Tokenize(textBlock, L"\r\n"); } +void LogAllAdapters(wmi::Connection &connection) +{ + auto resultset = connection.query(L"SELECT * from Win32_NetworkAdapter"); + + struct NetworkAdapter + { + size_t interfaceIndex; + std::wstring manufacturer; + std::wstring name; + std::wstring pnpDeviceId; + std::wstring alias; + }; + + std::vector<NetworkAdapter> adapters; + + // + // Find all adapters and extract the most important data. + // + + auto StringOrNa = [](const _variant_t &variant) + { + if (VT_BSTR == V_VT(&variant)) + { + return std::wstring(V_BSTR(&variant)); + } + + return std::wstring(L"n/a"); + }; + + while(resultset.advance()) + { + auto interfaceIndex = wmi::WmiGetPropertyAlways(resultset.result(), L"InterfaceIndex"); + auto manufacturer = wmi::WmiGetProperty(resultset.result(), L"Manufacturer"); + auto name = wmi::WmiGetProperty(resultset.result(), L"Name"); + auto pnpDeviceId = wmi::WmiGetProperty(resultset.result(), L"PNPDeviceID"); + auto alias = wmi::WmiGetProperty(resultset.result(), L"NetConnectionID"); + + NetworkAdapter adapter; + + adapter.interfaceIndex = static_cast<size_t>(V_UI8(&interfaceIndex)); + adapter.manufacturer = StringOrNa(manufacturer); + adapter.name = StringOrNa(name); + adapter.pnpDeviceId = StringOrNa(pnpDeviceId); + adapter.alias = StringOrNa(alias); + + adapters.emplace_back(adapter); + } + + // + // Flatten the adapter information so we can log it more easily. + // + + std::vector<std::wstring> details; + + for (const auto &adapter : adapters) + { + details.emplace_back(L"Adapter"); + + { + std::wstringstream ss; + + ss << L" InterfaceIndex: " << adapter.interfaceIndex; + + details.emplace_back(ss.str()); + } + + details.emplace_back(std::wstring(L" Manufacturer: ").append(adapter.manufacturer)); + details.emplace_back(std::wstring(L" Name: ").append(adapter.name)); + details.emplace_back(std::wstring(L" PnpDeviceId: ").append(adapter.pnpDeviceId)); + details.emplace_back(std::wstring(L" Alias: ").append(adapter.alias)); + } + + PluginLogWithDetails(L"Adapters known to WMI", details); +} + } // anonymous namespace Context::BaselineStatus Context::establishBaseline(const std::wstring &textBlock) @@ -123,6 +199,9 @@ std::wstring Context::GetNicAlias(const std::wstring &name) if (false == resultset.advance()) { + PluginLog(std::wstring(L"WMI query failed for adapter: ").append(name)); + LogAllAdapters(connection); + throw std::runtime_error("Unable to look up virtual adapter using WMI"); } |
