HostDnsServiceWin.cpp revision 3f2299591cfeb8a37a3578bef9c44c1790860948
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync/* -*- indent-tabs-mode: nil; -*- */
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <VBox/com/string.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <VBox/com/ptr.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include "../HostDnsService.h"
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <iprt/assert.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <iprt/err.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <Windows.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsyncstatic HKEY g_hKeyTcpipParameters;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsyncHostDnsServiceWin::HostDnsServiceWin()
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync RegOpenKeyEx(HKEY_LOCAL_MACHINE,
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync TEXT("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters"),
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync 0, KEY_READ, &g_hKeyTcpipParameters);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync}
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsyncHostDnsServiceWin::~HostDnsServiceWin()
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync if (!g_hKeyTcpipParameters)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync {
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync RegCloseKey(g_hKeyTcpipParameters);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync g_hKeyTcpipParameters = 0;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync }
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync}
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsyncHRESULT HostDnsServiceWin::init()
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HRESULT hrc = HostDnsMonitor::init(aParent);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync AssertComRCReturn(hrc, hrc);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync hrc = update();
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync AssertComRCReturn(hrc, hrc);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync return S_OK;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync}
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsyncHRESULT HostDnsServiceWin::update()
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync HRESULT hrc;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync DWORD regIndex;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync BYTE abDomain[256];
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync BYTE abNameServers[256];
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync BYTE abSearchList[256];
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync regIndex = 0;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync do {
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync CHAR keyName[256];
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync DWORD cbKeyName = 256;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync DWORD keyType = 0;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync BYTE keyData[1024];
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync DWORD cbKeyData = 1024;
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync hrc = RegEnumValueA(g_hKeyTcpipParameters, regIndex, keyName, &cbKeyName, 0,
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync &keyType, keyData, &cbKeyData);
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync if ( hrc == ERROR_SUCCESS
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync || hrc == ERROR_MORE_DATA)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync {
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync if ( RTStrICmp("Domain", keyName) == 0
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cbKeyData > 1
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cbKeyData < 256)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync memcpy(abDomain, keyData, cbKeyData);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync else if ( RTStrICmp("DhcpDomain", keyName) == 0
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cbKeyData > 1
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && abDomain[0] == 0
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cbKeyData < 256)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync memcpy(abDomain, keyData, cbKeyData);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync else if ( RTStrICmp("NameServer", keyName) == 0
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cbKeyData > 1
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cbKeyData < 256)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync memcpy(abNameServers, keyData, cbKeyData);
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync else if ( RTStrICmp("DhcpNameServer", keyName) == 0
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cbKeyData > 1
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && abNameServers[0] == 0
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cbKeyData < 256)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync memcpy(abNameServers, keyData, cbKeyData);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync else if ( RTStrICmp("SearchList", keyName) == 0
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cbKeyData > 1
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cbKeyData < 256)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync memcpy(abSearchList, keyData, cbKeyData);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync }
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync regIndex++;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync } while (hrc != ERROR_NO_MORE_ITEMS);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync /* OK, now parse and update DNS structures. */
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync /* domain name */
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HostDnsInformation info;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync info.domain = static_cast<char*>(abDomain);
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync /* server list */
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync strList2List(info.servers, static_cast<char *>(abNameServers));
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync /* search list */
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync strList2List(info.searchList, static_cast<char *>(abSearchList));
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync setInfo(info);
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync return S_OK;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync}
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsyncvoid HostDnsServiceWin::strList2List(std::vector<std::string>& lst, char *strLst)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync char *next, *current;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync char address[512];
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync AssertPtrReturnVoid(strLst);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync if (strlen(strLst) == 0)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync return;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync current = strLst;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync do {
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync RT_ZERO(address);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync next = RTStrStr(current, " ");
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync if (next)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync strncpy(address, current, next - current);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync else
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync strcpy(address, current);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync lst.push_back(std::string(address));
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync current = next + 1;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync } while(next);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync}