2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync * Host DNS listener for Windows.
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync * Copyright (C) 2014 Oracle Corporation
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync * available from http://www.virtualbox.org. This file is free software;
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync * you can redistribute it and/or modify it under the terms of the GNU
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync * General Public License (GPL) as published by the Free Software
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync LogRel(("HostDnsServiceWin: failed to open key Tcpip\\Parameters (error %d)\n", lrc));
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync LogRel(("HostDnsServiceWin: failed to create event (error %d)\n", GetLastError()));
a6ecd30c53f19c918ea045fa0cc632a68584e7a8vboxsyncHRESULT HostDnsServiceWin::init(VirtualBox *virtualbox)
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsyncstatic inline int registerNotification(const HKEY& hKey, HANDLE& hEvent)
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync ("Failed to register event on the key. Please debug me!"),
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync dwReady = WaitForMultipleObjects(DATA_MAX_EVENT, m->haDataEvent,
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync if (dwReady == WAIT_OBJECT_0 + DATA_SHUTDOWN_EVENT)
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync if (dwReady == WAIT_OBJECT_0 + DATA_DNS_UPDATE_EVENT)
0fb953df159d21121359ff648e0ad4c3cb55a1cbvboxsync * Registry updates for multiple values are not atomic, so
0fb953df159d21121359ff648e0ad4c3cb55a1cbvboxsync * wait a bit to avoid racing and reading partial update.
0fb953df159d21121359ff648e0ad4c3cb55a1cbvboxsync delay.QuadPart = -2 * 1000 * 1000 * 10LL; /* relative: 2s */
0fb953df159d21121359ff648e0ad4c3cb55a1cbvboxsync BOOL ok = SetWaitableTimer(m->haDataEvent[DATA_TIMER], &delay,
0fb953df159d21121359ff648e0ad4c3cb55a1cbvboxsync LogRel(("HostDnsServiceWin: failed to arm timer (error %d)\n", GetLastError()));
0fb953df159d21121359ff648e0ad4c3cb55a1cbvboxsync LogRel(("HostDnsServiceWin: WaitForMultipleObjects failed: error %d\n", GetLastError()));
0fb953df159d21121359ff648e0ad4c3cb55a1cbvboxsync LogRel(("HostDnsServiceWin: WaitForMultipleObjects unexpected return value %d\n", dwReady));
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsyncvoid vappend(std::vector<std::string> &v, const std::string &s, char sep = ' ')
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync if (std::find(v.cbegin(), v.cend(), substr) != v.cend())
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync std::string strSearchList; /* NB: comma separated, no spaces */
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync lrc = RegEnumValueA(m->hKeyTcpipParameters, regIndex,
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync if (lrc == ERROR_MORE_DATA) /* buffer too small; handle? */
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync LogRel(("HostDnsServiceWin: RegEnumValue error %d\n", (int)lrc));
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync if (cbKeyData > 0 && keyData[cbKeyData - 1] == '\0')
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync --cbKeyData; /* don't count trailing NUL if present */
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync Log2(("... DhcpDomain=\"%s\"\n", strDhcpDomain.c_str()));
2d38607d73f5000c2e0913e1a896a8478a5fa1d7vboxsync Log2(("... SearchList=\"%s\"\n", strSearchList.c_str()));
1c4e90385ee797af9a47c1e4c5e727865a813bc5vboxsync * When name servers are configured statically it seems that the
1c4e90385ee797af9a47c1e4c5e727865a813bc5vboxsync * value of Tcpip\Parameters\NameServer is NOT set, inly interface
1c4e90385ee797af9a47c1e4c5e727865a813bc5vboxsync * specific NameServer value is (which triggers notification for
1c4e90385ee797af9a47c1e4c5e727865a813bc5vboxsync * us to pick up the change). Fortunately, DnsApi seems to do the
1c4e90385ee797af9a47c1e4c5e727865a813bc5vboxsync * right thing there.
1c4e90385ee797af9a47c1e4c5e727865a813bc5vboxsync // NB: must be set on input it seems, despite docs' claim to the contrary.
1c4e90385ee797af9a47c1e4c5e727865a813bc5vboxsync RTStrPrintf(szAddrStr, sizeof(szAddrStr), "%RTnaipv4", pIp4Array->AddrArray[i]);