diff options
| author | Odd Stranne <odd@mullvad.net> | 2018-04-26 16:01:00 +0200 |
|---|---|---|
| committer | Odd Stranne <odd@mullvad.net> | 2018-06-18 08:45:12 +0200 |
| commit | 0107dc9c1c5b4ff630991a031ce528697967686e (patch) | |
| tree | 4882ce9969e93622433c312164740664402627a2 | |
| parent | 3d6735a6b8bcdaee5d7736e343b3c7e92ec0ffca (diff) | |
| download | mullvadvpn-0107dc9c1c5b4ff630991a031ce528697967686e.tar.xz mullvadvpn-0107dc9c1c5b4ff630991a031ce528697967686e.zip | |
Add finishing touch for Alpha version
| -rw-r--r-- | windns/src/dnstest/dnstest.cpp | bin | 2544 -> 8556 bytes | |||
| -rw-r--r-- | windns/src/dnstest/dnstest.vcxproj | 28 | ||||
| -rw-r--r-- | windns/src/dnstest/dnstest.vcxproj.filters | 52 | ||||
| -rw-r--r-- | windns/src/windns/dnsconfig.cpp | 18 | ||||
| -rw-r--r-- | windns/src/windns/dnsconfig.h | 20 | ||||
| -rw-r--r-- | windns/src/windns/netconfighelpers.cpp | 33 | ||||
| -rw-r--r-- | windns/src/windns/netconfighelpers.h | 13 | ||||
| -rw-r--r-- | windns/src/windns/windns.cpp | 13 | ||||
| -rw-r--r-- | windns/src/windns/windns.vcxproj | 22 | ||||
| -rw-r--r-- | windns/src/windns/windns.vcxproj.filters | 30 | ||||
| -rw-r--r-- | windns/src/windns/windnscontext.cpp | 92 | ||||
| -rw-r--r-- | windns/src/windns/windnscontext.h | 22 | ||||
| -rw-r--r-- | windns/windns.sln | 1 |
13 files changed, 275 insertions, 69 deletions
diff --git a/windns/src/dnstest/dnstest.cpp b/windns/src/dnstest/dnstest.cpp Binary files differindex 641d2f0af5..76ae8615a4 100644 --- a/windns/src/dnstest/dnstest.cpp +++ b/windns/src/dnstest/dnstest.cpp diff --git a/windns/src/dnstest/dnstest.vcxproj b/windns/src/dnstest/dnstest.vcxproj index bcd81ccc23..4e8b9776a6 100644 --- a/windns/src/dnstest/dnstest.vcxproj +++ b/windns/src/dnstest/dnstest.vcxproj @@ -106,7 +106,7 @@ <SubSystem>Console</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalLibraryDirectories>$(SolutionDir)bin\$(Platform)-$(Configuration)\</AdditionalLibraryDirectories> - <AdditionalDependencies>libcommon.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>windns.lib;libcommon.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> @@ -125,7 +125,7 @@ <SubSystem>Console</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalLibraryDirectories>$(SolutionDir)bin\$(Platform)-$(Configuration)\</AdditionalLibraryDirectories> - <AdditionalDependencies>libcommon.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>windns.lib;libcommon.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> @@ -148,7 +148,7 @@ <OptimizeReferences>true</OptimizeReferences> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalLibraryDirectories>$(SolutionDir)bin\$(Platform)-$(Configuration)\</AdditionalLibraryDirectories> - <AdditionalDependencies>libcommon.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>windns.lib;libcommon.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> @@ -171,26 +171,38 @@ <OptimizeReferences>true</OptimizeReferences> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalLibraryDirectories>$(SolutionDir)bin\$(Platform)-$(Configuration)\</AdditionalLibraryDirectories> - <AdditionalDependencies>libcommon.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>windns.lib;libcommon.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemGroup> <ClInclude Include="..\windns\comhelpers.h" /> - <ClInclude Include="..\windns\dnsconfiguration.h" /> - <ClInclude Include="..\windns\dnshelpers.h" /> + <ClInclude Include="..\windns\configmanager.h" /> + <ClInclude Include="..\windns\consoletracesink.h" /> + <ClInclude Include="..\windns\dnsconfig.h" /> + <ClInclude Include="..\windns\dnsreverter.h" /> + <ClInclude Include="..\windns\netconfigeventsink.h" /> + <ClInclude Include="..\windns\netconfighelpers.h" /> <ClInclude Include="..\windns\wmi\connection.h" /> + <ClInclude Include="..\windns\wmi\eventsink.h" /> <ClInclude Include="..\windns\wmi\iconnection.h" /> <ClInclude Include="..\windns\wmi\methodcall.h" /> + <ClInclude Include="..\windns\wmi\notification.h" /> <ClInclude Include="..\windns\wmi\resultset.h" /> <ClInclude Include="stdafx.h" /> <ClInclude Include="targetver.h" /> </ItemGroup> <ItemGroup> <ClCompile Include="..\windns\comhelpers.cpp" /> - <ClCompile Include="..\windns\dnsconfiguration.cpp" /> - <ClCompile Include="..\windns\dnshelpers.cpp" /> + <ClCompile Include="..\windns\configmanager.cpp" /> + <ClCompile Include="..\windns\consoletracesink.cpp" /> + <ClCompile Include="..\windns\dnsconfig.cpp" /> + <ClCompile Include="..\windns\dnsreverter.cpp" /> + <ClCompile Include="..\windns\netconfigeventsink.cpp" /> + <ClCompile Include="..\windns\netconfighelpers.cpp" /> <ClCompile Include="..\windns\wmi\connection.cpp" /> + <ClCompile Include="..\windns\wmi\eventsink.cpp" /> <ClCompile Include="..\windns\wmi\methodcall.cpp" /> + <ClCompile Include="..\windns\wmi\notification.cpp" /> <ClCompile Include="..\windns\wmi\resultset.cpp" /> <ClCompile Include="dnstest.cpp" /> <ClCompile Include="stdafx.cpp"> diff --git a/windns/src/dnstest/dnstest.vcxproj.filters b/windns/src/dnstest/dnstest.vcxproj.filters index 74501f75a4..07cecae9a7 100644 --- a/windns/src/dnstest/dnstest.vcxproj.filters +++ b/windns/src/dnstest/dnstest.vcxproj.filters @@ -33,16 +33,34 @@ <ClInclude Include="..\windns\wmi\resultset.h"> <Filter>other files</Filter> </ClInclude> - <ClInclude Include="..\windns\dnsconfiguration.h"> - <Filter>other files</Filter> - </ClInclude> <ClInclude Include="..\windns\wmi\methodcall.h"> <Filter>other files</Filter> </ClInclude> <ClInclude Include="..\windns\comhelpers.h"> <Filter>other files</Filter> </ClInclude> - <ClInclude Include="..\windns\dnshelpers.h"> + <ClInclude Include="..\windns\configmanager.h"> + <Filter>other files</Filter> + </ClInclude> + <ClInclude Include="..\windns\dnsconfig.h"> + <Filter>other files</Filter> + </ClInclude> + <ClInclude Include="..\windns\consoletracesink.h"> + <Filter>other files</Filter> + </ClInclude> + <ClInclude Include="..\windns\wmi\eventsink.h"> + <Filter>other files</Filter> + </ClInclude> + <ClInclude Include="..\windns\netconfigeventsink.h"> + <Filter>other files</Filter> + </ClInclude> + <ClInclude Include="..\windns\netconfighelpers.h"> + <Filter>other files</Filter> + </ClInclude> + <ClInclude Include="..\windns\wmi\notification.h"> + <Filter>other files</Filter> + </ClInclude> + <ClInclude Include="..\windns\dnsreverter.h"> <Filter>other files</Filter> </ClInclude> </ItemGroup> @@ -59,16 +77,34 @@ <ClCompile Include="..\windns\wmi\resultset.cpp"> <Filter>other files</Filter> </ClCompile> - <ClCompile Include="..\windns\dnsconfiguration.cpp"> - <Filter>other files</Filter> - </ClCompile> <ClCompile Include="..\windns\wmi\methodcall.cpp"> <Filter>other files</Filter> </ClCompile> <ClCompile Include="..\windns\comhelpers.cpp"> <Filter>other files</Filter> </ClCompile> - <ClCompile Include="..\windns\dnshelpers.cpp"> + <ClCompile Include="..\windns\configmanager.cpp"> + <Filter>other files</Filter> + </ClCompile> + <ClCompile Include="..\windns\dnsconfig.cpp"> + <Filter>other files</Filter> + </ClCompile> + <ClCompile Include="..\windns\consoletracesink.cpp"> + <Filter>other files</Filter> + </ClCompile> + <ClCompile Include="..\windns\wmi\eventsink.cpp"> + <Filter>other files</Filter> + </ClCompile> + <ClCompile Include="..\windns\netconfigeventsink.cpp"> + <Filter>other files</Filter> + </ClCompile> + <ClCompile Include="..\windns\netconfighelpers.cpp"> + <Filter>other files</Filter> + </ClCompile> + <ClCompile Include="..\windns\wmi\notification.cpp"> + <Filter>other files</Filter> + </ClCompile> + <ClCompile Include="..\windns\dnsreverter.cpp"> <Filter>other files</Filter> </ClCompile> </ItemGroup> diff --git a/windns/src/windns/dnsconfig.cpp b/windns/src/windns/dnsconfig.cpp index ae0c3ffc2f..5a7ca42096 100644 --- a/windns/src/windns/dnsconfig.cpp +++ b/windns/src/windns/dnsconfig.cpp @@ -1,20 +1,20 @@ #include "stdafx.h" -#include "dnsconfiguration.h" +#include "dnsconfig.h" #include "windns/comhelpers.h" -DnsConfiguration::DnsConfiguration(CComPtr<IWbemClassObject> instance) +DnsConfig::DnsConfig(CComPtr<IWbemClassObject> instance) { - m_configId = dnshelpers::GetId(instance); + m_configId = nchelpers::GetConfigId(instance); m_interfaceIndex = ComGetPropertyAlways(instance, L"InterfaceIndex").uintVal; - m_servers = dnshelpers::GetServers(instance); + m_servers = nchelpers::GetDnsServers(instance); } -std::vector<std::wstring> *DnsConfiguration::servers() const +const std::vector<std::wstring> *DnsConfig::servers() const { return m_servers.get(); } -void DnsConfiguration::update(CComPtr<IWbemClassObject> instance) -{ - m_servers = dnshelpers::GetServers(instance); -} +//void DnsConfig::update(CComPtr<IWbemClassObject> instance) +//{ +// m_servers = nchelpers::GetDnsServers(instance); +//} diff --git a/windns/src/windns/dnsconfig.h b/windns/src/windns/dnsconfig.h index 1477d96a95..bb9a841c8e 100644 --- a/windns/src/windns/dnsconfig.h +++ b/windns/src/windns/dnsconfig.h @@ -1,6 +1,6 @@ #pragma once -#include "windns/dnshelpers.h" +#include "windns/netconfighelpers.h" #include <cstdint> #include <string> #include <vector> @@ -8,17 +8,17 @@ #include <atlbase.h> #include <wbemidl.h> -class DnsConfiguration +class DnsConfig { public: // instance = Win32_NetworkAdapterConfiguration. - DnsConfiguration(CComPtr<IWbemClassObject> instance); + DnsConfig(CComPtr<IWbemClassObject> instance); - DnsConfiguration(const DnsConfiguration &) = delete; - DnsConfiguration &operator=(const DnsConfiguration &) = delete; - DnsConfiguration(DnsConfiguration &&) = default; - DnsConfiguration &operator=(DnsConfiguration &&) = default; + DnsConfig(const DnsConfig &) = delete; + DnsConfig &operator=(const DnsConfig &) = delete; + DnsConfig(DnsConfig &&) = default; + DnsConfig &operator=(DnsConfig &&) = default; const std::wstring &id() const { @@ -30,13 +30,13 @@ public: return m_interfaceIndex; } - std::vector<std::wstring> *servers() const; + const std::vector<std::wstring> *servers() const; - void update(CComPtr<IWbemClassObject> instance); +// void update(CComPtr<IWbemClassObject> instance); private: std::wstring m_configId; uint32_t m_interfaceIndex; - dnshelpers::OptionalStringList m_servers; + nchelpers::OptionalStringList m_servers; }; diff --git a/windns/src/windns/netconfighelpers.cpp b/windns/src/windns/netconfighelpers.cpp index a23ffc5cef..f95dd39ee4 100644 --- a/windns/src/windns/netconfighelpers.cpp +++ b/windns/src/windns/netconfighelpers.cpp @@ -1,16 +1,17 @@ #include "stdafx.h" -#include "dnshelpers.h" +#include "netconfighelpers.h" #include "comhelpers.h" +#include "wmi/methodcall.h" -namespace dnshelpers +namespace nchelpers { -std::wstring GetId(CComPtr<IWbemClassObject> instance) +std::wstring GetConfigId(CComPtr<IWbemClassObject> instance) { return ComConvertString(V_BSTR(&ComGetPropertyAlways(instance, L"SettingID"))); } -OptionalStringList GetServers(CComPtr<IWbemClassObject> instance) +OptionalStringList GetDnsServers(CComPtr<IWbemClassObject> instance) { OptionalStringList result; @@ -27,4 +28,28 @@ OptionalStringList GetServers(CComPtr<IWbemClassObject> instance) return result; } +void SetDnsServers(wmi::IConnection &connection, CComPtr<IWbemClassObject> instance, + const std::vector<std::wstring> *servers) +{ + wmi::MethodCall methodCall; + + if (nullptr == servers) + { + methodCall.addNullArgument(L"DNSServerSearchOrder", VT_ARRAY | VT_BSTR); + } + else + { + auto comServers = ComConvertIntoStringArray(*servers); + methodCall.addArgument(L"DNSServerSearchOrder", ComPackageStringArray(comServers)); + } + + auto status = methodCall.invoke(connection, instance, L"SetDNSServerSearchOrder"); + + // + // TODO check status, (type? expected value?) + // + + return; +} + } diff --git a/windns/src/windns/netconfighelpers.h b/windns/src/windns/netconfighelpers.h index 036fb032b1..6949eced7e 100644 --- a/windns/src/windns/netconfighelpers.h +++ b/windns/src/windns/netconfighelpers.h @@ -1,20 +1,25 @@ #pragma once +#include "wmi/iconnection.h" #include <string> #include <memory> #include <vector> #include <atlbase.h> #include <wbemidl.h> -namespace dnshelpers +namespace nchelpers { // instance = Win32_NetworkAdapterConfiguration -std::wstring GetId(CComPtr<IWbemClassObject> instance); +std::wstring GetConfigId(CComPtr<IWbemClassObject> instance); using OptionalStringList = std::unique_ptr<std::vector<std::wstring> >; // instance = Win32_NetworkAdapterConfiguration -OptionalStringList GetServers(CComPtr<IWbemClassObject> instance); +OptionalStringList GetDnsServers(CComPtr<IWbemClassObject> instance); -}
\ No newline at end of file +// instance = Win32_NetworkAdapterConfiguration +void SetDnsServers(wmi::IConnection &connection, CComPtr<IWbemClassObject> instance, + const std::vector<std::wstring> *servers); + +} diff --git a/windns/src/windns/windns.cpp b/windns/src/windns/windns.cpp index 47d5d53b1f..7a9977951f 100644 --- a/windns/src/windns/windns.cpp +++ b/windns/src/windns/windns.cpp @@ -95,6 +95,19 @@ WinDns_Set( try { + // + // TODO: This is a temporary hack to enable alpha version. Review. + // + + delete g_Context; + g_Context = nullptr; + + g_Context = new WinDnsContext; + + // + // Onwards. + // + return g_Context->set(MakeStringArray(servers, numServers), g_ErrorSink, g_ErrorContext); } catch (std::exception &err) diff --git a/windns/src/windns/windns.vcxproj b/windns/src/windns/windns.vcxproj index 9005a07f8f..6554ca06ce 100644 --- a/windns/src/windns/windns.vcxproj +++ b/windns/src/windns/windns.vcxproj @@ -176,22 +176,34 @@ </ItemDefinitionGroup> <ItemGroup> <ClInclude Include="comhelpers.h" /> - <ClInclude Include="dnsconfiguration.h" /> - <ClInclude Include="dnshelpers.h" /> + <ClInclude Include="configmanager.h" /> + <ClInclude Include="consoletracesink.h" /> + <ClInclude Include="dnsconfig.h" /> + <ClInclude Include="dnsreverter.h" /> + <ClInclude Include="itracesink.h" /> + <ClInclude Include="macroargument.h" /> + <ClInclude Include="netconfigeventsink.h" /> + <ClInclude Include="netconfighelpers.h" /> <ClInclude Include="stdafx.h" /> <ClInclude Include="targetver.h" /> <ClInclude Include="windns.h" /> <ClInclude Include="windnscontext.h" /> <ClInclude Include="wmi\connection.h" /> + <ClInclude Include="wmi\eventsink.h" /> <ClInclude Include="wmi\iconnection.h" /> <ClInclude Include="wmi\methodcall.h" /> + <ClInclude Include="wmi\notification.h" /> <ClInclude Include="wmi\resultset.h" /> </ItemGroup> <ItemGroup> <ClCompile Include="comhelpers.cpp" /> + <ClCompile Include="configmanager.cpp" /> + <ClCompile Include="consoletracesink.cpp" /> <ClCompile Include="dllmain.cpp" /> - <ClCompile Include="dnsconfiguration.cpp" /> - <ClCompile Include="dnshelpers.cpp" /> + <ClCompile Include="dnsconfig.cpp" /> + <ClCompile Include="dnsreverter.cpp" /> + <ClCompile Include="netconfigeventsink.cpp" /> + <ClCompile Include="netconfighelpers.cpp" /> <ClCompile Include="stdafx.cpp"> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> @@ -201,7 +213,9 @@ <ClCompile Include="windns.cpp" /> <ClCompile Include="windnscontext.cpp" /> <ClCompile Include="wmi\connection.cpp" /> + <ClCompile Include="wmi\eventsink.cpp" /> <ClCompile Include="wmi\methodcall.cpp" /> + <ClCompile Include="wmi\notification.cpp" /> <ClCompile Include="wmi\resultset.cpp" /> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> diff --git a/windns/src/windns/windns.vcxproj.filters b/windns/src/windns/windns.vcxproj.filters index da2337c7ce..2e7658c7a7 100644 --- a/windns/src/windns/windns.vcxproj.filters +++ b/windns/src/windns/windns.vcxproj.filters @@ -14,12 +14,24 @@ </ClInclude> <ClInclude Include="windns.h" /> <ClInclude Include="windnscontext.h" /> - <ClInclude Include="dnsconfiguration.h" /> <ClInclude Include="wmi\methodcall.h"> <Filter>wmi</Filter> </ClInclude> <ClInclude Include="comhelpers.h" /> - <ClInclude Include="dnshelpers.h" /> + <ClInclude Include="configmanager.h" /> + <ClInclude Include="dnsconfig.h" /> + <ClInclude Include="itracesink.h" /> + <ClInclude Include="consoletracesink.h" /> + <ClInclude Include="wmi\eventsink.h"> + <Filter>wmi</Filter> + </ClInclude> + <ClInclude Include="netconfigeventsink.h" /> + <ClInclude Include="netconfighelpers.h" /> + <ClInclude Include="macroargument.h" /> + <ClInclude Include="wmi\notification.h"> + <Filter>wmi</Filter> + </ClInclude> + <ClInclude Include="dnsreverter.h" /> </ItemGroup> <ItemGroup> <ClCompile Include="dllmain.cpp" /> @@ -32,12 +44,22 @@ </ClCompile> <ClCompile Include="windns.cpp" /> <ClCompile Include="windnscontext.cpp" /> - <ClCompile Include="dnsconfiguration.cpp" /> <ClCompile Include="wmi\methodcall.cpp"> <Filter>wmi</Filter> </ClCompile> <ClCompile Include="comhelpers.cpp" /> - <ClCompile Include="dnshelpers.cpp" /> + <ClCompile Include="configmanager.cpp" /> + <ClCompile Include="dnsconfig.cpp" /> + <ClCompile Include="consoletracesink.cpp" /> + <ClCompile Include="wmi\eventsink.cpp"> + <Filter>wmi</Filter> + </ClCompile> + <ClCompile Include="netconfigeventsink.cpp" /> + <ClCompile Include="netconfighelpers.cpp" /> + <ClCompile Include="wmi\notification.cpp"> + <Filter>wmi</Filter> + </ClCompile> + <ClCompile Include="dnsreverter.cpp" /> </ItemGroup> <ItemGroup> <Filter Include="wmi"> diff --git a/windns/src/windns/windnscontext.cpp b/windns/src/windns/windnscontext.cpp index 404c16f5e1..c7cc10c4b9 100644 --- a/windns/src/windns/windnscontext.cpp +++ b/windns/src/windns/windnscontext.cpp @@ -1,28 +1,102 @@ #include "stdafx.h" #include "windnscontext.h" #include "wmi/connection.h" -#include <process.h> +#include "netconfigeventsink.h" +#include "dnsreverter.h" WinDnsContext::WinDnsContext() { - // Create WMI connection and keep it around? + m_connection = std::make_shared<wmi::Connection>(wmi::Connection::Namespace::Cimv2); } -bool WinDnsContext::set(const std::vector<std::wstring> &servers, WinDnsErrorSink errorSink, void *errorContext) +bool WinDnsContext::set(const std::vector<std::wstring> &servers, WinDnsErrorSink /*errorSink*/, void * /*errorContext*/) { - ThreadArguments args; + m_configManager = std::make_shared<ConfigManager>(servers); - args.errorSink = errorSink; - args.errorContext = errorContext; + // + // See test app for details. + // + // Discover all active interface configurations. + // -// _beginthreadex(nullptr, 0, ) + auto resultSet = m_connection->query(L"SELECT * from Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"); + while (resultSet.advance()) + { + auto config = DnsConfig(resultSet.result()); + m_configManager->updateConfig(std::move(config)); + } + // + // Register interface configuration monitoring. + // - return false; + auto eventSink = std::make_shared<NetConfigEventSink>(m_connection, m_configManager); + auto eventSinkWrapper = CComPtr<wmi::EventSink>(new wmi::EventSink(eventSink)); + + m_notification = std::make_unique<wmi::Notification>(m_connection, eventSinkWrapper); + + m_notification->activate + ( + L"SELECT * " + L"FROM __InstanceModificationEvent " + L"WITHIN 1 " + L"WHERE TargetInstance ISA 'Win32_NetworkAdapterConfiguration'" + L"AND TargetInstance.IPEnabled = True" + ); + + // + // Apply our DNS settings + // + + { + ConfigManager::Mutex mutex(*m_configManager); + + m_configManager->processConfigs([&](const DnsConfig &config) + { + std::wstringstream ss; + + ss << L"SELECT * FROM Win32_NetworkAdapterConfiguration " + << L"WHERE SettingID = '" << config.id() << L"'"; + + auto resultSet = m_connection->query(ss.str().c_str()); + + if (resultSet.advance()) + { + auto activeConfig = resultSet.result(); + nchelpers::SetDnsServers(*m_connection, activeConfig, &servers); + } + + // Continue with the next interface configuration. + return true; + }); + } + + return true; } bool WinDnsContext::reset() { - return false; + if (nullptr == m_notification) + { + return true; + } + + m_notification->deactivate(); + + // + // Revert configs + // Safe to do without a mutex guarding the config manager + // + + DnsReverter dnsReverter; + + m_configManager->processConfigs([&](const DnsConfig &config) + { + dnsReverter.revert(*m_connection, config); + + return true; + }); + + return true; } diff --git a/windns/src/windns/windnscontext.h b/windns/src/windns/windnscontext.h index 57d00ff530..086969cc76 100644 --- a/windns/src/windns/windnscontext.h +++ b/windns/src/windns/windnscontext.h @@ -1,8 +1,12 @@ #pragma once #include "windns.h" +#include "wmi/connection.h" +#include "wmi/notification.h" +#include "configmanager.h" #include <vector> #include <string> +#include <memory> class WinDnsContext { @@ -10,18 +14,18 @@ public: WinDnsContext(); + // TODO: Review. + ~WinDnsContext() + { + reset(); + } + bool set(const std::vector<std::wstring> &servers, WinDnsErrorSink errorSink, void *errorContext); bool reset(); -// static unsigned monitoringThread() - private: - struct ThreadArguments - { - WinDnsContext *instance; - WinDnsErrorSink errorSink; - void *errorContext; - }; - + std::shared_ptr<wmi::Connection> m_connection; + std::shared_ptr<ConfigManager> m_configManager; + std::unique_ptr<wmi::Notification> m_notification; }; diff --git a/windns/windns.sln b/windns/windns.sln index 58f8ea0578..40de60ad14 100644 --- a/windns/windns.sln +++ b/windns/windns.sln @@ -12,6 +12,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "windns", "src\windns\windns EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dnstest", "src\dnstest\dnstest.vcxproj", "{1476A8B9-4A9E-4358-8744-A350CB97E152}" ProjectSection(ProjectDependencies) = postProject + {A5344205-FC37-4572-9C63-8564ECC410AC} = {A5344205-FC37-4572-9C63-8564ECC410AC} {B52E2D10-A94A-4605-914A-2DCEF6A757EF} = {B52E2D10-A94A-4605-914A-2DCEF6A757EF} EndProjectSection EndProject |
