VirtualBox

Changeset 58885 in vbox


Ignore:
Timestamp:
Nov 26, 2015 2:32:40 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
104375
Message:

Main/Network: fall-back address mask extraction mode for compatibility with Windows XP (bugref:7973)

Location:
trunk/src/VBox/Main
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/Makefile.kmk

    r58874 r58885  
    302302endif
    303303VBoxSVC_DEFS.win += VBOX_COM_OUTOFPROC_MODULE
    304 VBoxSVC_DEFS.win += _WIN32_WINNT=0x0600
     304VBoxSVC_DEFS.win += _WIN32_WINNT=0x0510
    305305# Try to load and use libhal at runtime for probing removable media
    306306# VBoxSVC_DEFS.linux += VBOX_USE_LIBHAL
  • trunk/src/VBox/Main/src-server/win/NetIf-win.cpp

    r58874 r58885  
    16171617#endif
    16181618
     1619static void netIfFillInfoWithAddressesXp(PNETIFINFO pInfo, PIP_ADAPTER_ADDRESSES pAdapter)
     1620{
     1621    PIP_ADAPTER_UNICAST_ADDRESS pAddr;
     1622    bool fIPFound = false;
     1623    bool fIPv6Found = false;
     1624    for (pAddr = pAdapter->FirstUnicastAddress; pAddr; pAddr = pAddr->Next)
     1625    {
     1626        switch (pAddr->Address.lpSockaddr->sa_family)
     1627        {
     1628            case AF_INET:
     1629                if (!fIPFound)
     1630                {
     1631                    fIPFound = true;
     1632                    memcpy(&pInfo->IPAddress,
     1633                           &((struct sockaddr_in *)pAddr->Address.lpSockaddr)->sin_addr.s_addr,
     1634                           sizeof(pInfo->IPAddress));
     1635                }
     1636                break;
     1637            case AF_INET6:
     1638                if (!fIPv6Found)
     1639                {
     1640                    fIPv6Found = true;
     1641                    memcpy(&pInfo->IPv6Address,
     1642                           ((struct sockaddr_in6 *)pAddr->Address.lpSockaddr)->sin6_addr.s6_addr,
     1643                           sizeof(pInfo->IPv6Address));
     1644                }
     1645                break;
     1646        }
     1647    }
     1648    PIP_ADAPTER_PREFIX pPrefix;
     1649    ULONG uPrefixLenV4 = 0;
     1650    ULONG uPrefixLenV6 = 0;
     1651    for (pPrefix = pAdapter->FirstPrefix; pPrefix && !(uPrefixLenV4 && uPrefixLenV6); pPrefix = pPrefix->Next)
     1652    {
     1653        switch (pPrefix->Address.lpSockaddr->sa_family)
     1654        {
     1655            case AF_INET:
     1656                if (!uPrefixLenV4)
     1657                {
     1658                    ULONG ip = ((PSOCKADDR_IN)(pPrefix->Address.lpSockaddr))->sin_addr.s_addr;
     1659                    netIfLog(("netIfFillInfoWithAddressesXp: prefix=%RTnaipv4 len=%u\n", ip, pPrefix->PrefixLength));
     1660                    if (   pPrefix->PrefixLength < sizeof(pInfo->IPNetMask) * 8
     1661                        && pPrefix->PrefixLength > 0
     1662                        && (ip & 0xF0) < 224)
     1663                    {
     1664                        uPrefixLenV4 = pPrefix->PrefixLength;
     1665                        ASMBitSetRange(&pInfo->IPNetMask, 0, pPrefix->PrefixLength);
     1666                    }
     1667                    else
     1668                        netIfLog(("netIfFillInfoWithAddressesXp: Unexpected IPv4 prefix length of %d\n",
     1669                             pPrefix->PrefixLength));
     1670                }
     1671                break;
     1672            case AF_INET6:
     1673                if (!uPrefixLenV6)
     1674                {
     1675                    PBYTE ipv6 = ((PSOCKADDR_IN6)(pPrefix->Address.lpSockaddr))->sin6_addr.s6_addr;
     1676                    netIfLog(("netIfFillInfoWithAddressesXp: prefix=%RTnaipv6 len=%u\n",
     1677                              ipv6, pPrefix->PrefixLength));
     1678                    if (   pPrefix->PrefixLength < sizeof(pInfo->IPv6NetMask) * 8
     1679                        && pPrefix->PrefixLength > 0
     1680                        && ipv6[0] != 0xFF)
     1681                    {
     1682                        uPrefixLenV6 = pPrefix->PrefixLength;
     1683                        ASMBitSetRange(&pInfo->IPv6NetMask, 0, pPrefix->PrefixLength);
     1684                    }
     1685                    else
     1686                        netIfLog(("netIfFillInfoWithAddressesXp: Unexpected IPv6 prefix length of %d\n",
     1687                             pPrefix->PrefixLength));
     1688                }
     1689                break;
     1690        }
     1691    }
     1692    netIfLog(("netIfFillInfoWithAddressesXp: %RTnaipv4/%u\n",
     1693              pInfo->IPAddress, uPrefixLenV4));
     1694    netIfLog(("netIfFillInfoWithAddressesXp: %RTnaipv6/%u\n",
     1695              &pInfo->IPv6Address, uPrefixLenV6));
     1696}
     1697
    16191698static void netIfFillInfoWithAddresses(PNETIFINFO pInfo, PIP_ADAPTER_ADDRESSES pAdapter)
    16201699{
     
    16301709    for (pAddr = pAdapter->FirstUnicastAddress; pAddr; pAddr = pAddr->Next)
    16311710    {
    1632         switch (pAddr->Address.lpSockaddr->sa_family)
     1711        if (pAddr->Length < sizeof(IP_ADAPTER_UNICAST_ADDRESS_LH))
     1712        {
     1713            netIfLog(("netIfFillInfoWithAddresses: unicast address is too small (%u < %u), fall back to XP implementation\n",
     1714                      pAddr->Length, sizeof(IP_ADAPTER_UNICAST_ADDRESS_LH)));
     1715            return netIfFillInfoWithAddressesXp(pInfo, pAdapter);
     1716        }
     1717        PIP_ADAPTER_UNICAST_ADDRESS_LH pAddrLh = (PIP_ADAPTER_UNICAST_ADDRESS_LH)pAddr;
     1718        switch (pAddrLh->Address.lpSockaddr->sa_family)
    16331719        {
    16341720            case AF_INET:
     
    16371723                    fIPFound = true;
    16381724                    memcpy(&pInfo->IPAddress,
    1639                            &((struct sockaddr_in *)pAddr->Address.lpSockaddr)->sin_addr.s_addr,
     1725                           &((struct sockaddr_in *)pAddrLh->Address.lpSockaddr)->sin_addr.s_addr,
    16401726                           sizeof(pInfo->IPAddress));
    1641                     if (pAddr->OnLinkPrefixLength > 32)
    1642                         netIfLog(("netIfFillInfoWithAddresses: Invalid IPv4 prefix length of %d\n", pAddr->OnLinkPrefixLength));
     1727                    if (pAddrLh->OnLinkPrefixLength > 32)
     1728                        netIfLog(("netIfFillInfoWithAddresses: Invalid IPv4 prefix length of %d\n", pAddrLh->OnLinkPrefixLength));
    16431729                    else
    1644                         ASMBitSetRange(&pInfo->IPNetMask, 0, pAddr->OnLinkPrefixLength);
     1730                        ASMBitSetRange(&pInfo->IPNetMask, 0, pAddrLh->OnLinkPrefixLength);
    16451731                }
    16461732                break;
     
    16501736                    fIPv6Found = true;
    16511737                    memcpy(&pInfo->IPv6Address,
    1652                            ((struct sockaddr_in6 *)pAddr->Address.lpSockaddr)->sin6_addr.s6_addr,
     1738                           ((struct sockaddr_in6 *)pAddrLh->Address.lpSockaddr)->sin6_addr.s6_addr,
    16531739                           sizeof(pInfo->IPv6Address));
    1654                     if (pAddr->OnLinkPrefixLength > 128)
    1655                         netIfLog(("netIfFillInfoWithAddresses: Invalid IPv6 prefix length of %d\n", pAddr->OnLinkPrefixLength));
     1740                    if (pAddrLh->OnLinkPrefixLength > 128)
     1741                        netIfLog(("netIfFillInfoWithAddresses: Invalid IPv6 prefix length of %d\n", pAddrLh->OnLinkPrefixLength));
    16561742                    else
    1657                         ASMBitSetRange(&pInfo->IPv6NetMask, 0, pAddr->OnLinkPrefixLength);
     1743                        ASMBitSetRange(&pInfo->IPv6NetMask, 0, pAddrLh->OnLinkPrefixLength);
    16581744                }
    16591745                break;
    16601746        }
    16611747    }
    1662 }
     1748    netIfLog(("netIfFillInfoWithAddresses: %RTnaipv4/%u\n",
     1749              pInfo->IPAddress, ASMBitFirstClear(&pInfo->IPNetMask, sizeof(RTNETADDRIPV4)*8)));
     1750    netIfLog(("netIfFillInfoWithAddresses: %RTnaipv6/%u\n",
     1751              &pInfo->IPv6Address, composeIPv6PrefixLenghFromAddress(&pInfo->IPv6NetMask)));
     1752}
     1753
     1754#if (NTDDI_VERSION >= NTDDI_VISTA)
     1755#define NETIF_GAA_FLAGS GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST
     1756#else /* (NTDDI_VERSION < NTDDI_VISTA) */
     1757#define NETIF_GAA_FLAGS GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST
     1758#endif /* (NTDDI_VERSION < NTDDI_VISTA) */
    16631759
    16641760int NetIfList(std::list<ComObjPtr<HostNetworkInterface> > &list)
     
    16711767    if (!pAddresses)
    16721768        return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
    1673     DWORD dwRc = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, pAddresses, &uBufLen);
     1769    DWORD dwRc = GetAdaptersAddresses(AF_UNSPEC, NETIF_GAA_FLAGS, NULL, pAddresses, &uBufLen);
    16741770    for (int tries = 0; tries < 3 && dwRc == ERROR_BUFFER_OVERFLOW; ++tries)
    16751771    {
     
    16791775        if (!pAddresses)
    16801776            return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
    1681         dwRc = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, pAddresses, &uBufLen);
     1777        dwRc = GetAdaptersAddresses(AF_UNSPEC, NETIF_GAA_FLAGS, NULL, pAddresses, &uBufLen);
    16821778    }
    16831779    if (dwRc != NO_ERROR)
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette