summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--windns/src/dnstest/dnstest.cppbin2544 -> 8556 bytes
-rw-r--r--windns/src/dnstest/dnstest.vcxproj28
-rw-r--r--windns/src/dnstest/dnstest.vcxproj.filters52
-rw-r--r--windns/src/windns/dnsconfig.cpp18
-rw-r--r--windns/src/windns/dnsconfig.h20
-rw-r--r--windns/src/windns/netconfighelpers.cpp33
-rw-r--r--windns/src/windns/netconfighelpers.h13
-rw-r--r--windns/src/windns/windns.cpp13
-rw-r--r--windns/src/windns/windns.vcxproj22
-rw-r--r--windns/src/windns/windns.vcxproj.filters30
-rw-r--r--windns/src/windns/windnscontext.cpp92
-rw-r--r--windns/src/windns/windnscontext.h22
-rw-r--r--windns/windns.sln1
13 files changed, 275 insertions, 69 deletions
diff --git a/windns/src/dnstest/dnstest.cpp b/windns/src/dnstest/dnstest.cpp
index 641d2f0af5..76ae8615a4 100644
--- a/windns/src/dnstest/dnstest.cpp
+++ b/windns/src/dnstest/dnstest.cpp
Binary files differ
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