Changeset 58885 in vbox
- Timestamp:
- Nov 26, 2015 2:32:40 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 104375
- Location:
- trunk/src/VBox/Main
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/Makefile.kmk
r58874 r58885 302 302 endif 303 303 VBoxSVC_DEFS.win += VBOX_COM_OUTOFPROC_MODULE 304 VBoxSVC_DEFS.win += _WIN32_WINNT=0x0 600304 VBoxSVC_DEFS.win += _WIN32_WINNT=0x0510 305 305 # Try to load and use libhal at runtime for probing removable media 306 306 # VBoxSVC_DEFS.linux += VBOX_USE_LIBHAL -
trunk/src/VBox/Main/src-server/win/NetIf-win.cpp
r58874 r58885 1617 1617 #endif 1618 1618 1619 static 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 1619 1698 static void netIfFillInfoWithAddresses(PNETIFINFO pInfo, PIP_ADAPTER_ADDRESSES pAdapter) 1620 1699 { … … 1630 1709 for (pAddr = pAdapter->FirstUnicastAddress; pAddr; pAddr = pAddr->Next) 1631 1710 { 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) 1633 1719 { 1634 1720 case AF_INET: … … 1637 1723 fIPFound = true; 1638 1724 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, 1640 1726 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)); 1643 1729 else 1644 ASMBitSetRange(&pInfo->IPNetMask, 0, pAddr ->OnLinkPrefixLength);1730 ASMBitSetRange(&pInfo->IPNetMask, 0, pAddrLh->OnLinkPrefixLength); 1645 1731 } 1646 1732 break; … … 1650 1736 fIPv6Found = true; 1651 1737 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, 1653 1739 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)); 1656 1742 else 1657 ASMBitSetRange(&pInfo->IPv6NetMask, 0, pAddr ->OnLinkPrefixLength);1743 ASMBitSetRange(&pInfo->IPv6NetMask, 0, pAddrLh->OnLinkPrefixLength); 1658 1744 } 1659 1745 break; 1660 1746 } 1661 1747 } 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) */ 1663 1759 1664 1760 int NetIfList(std::list<ComObjPtr<HostNetworkInterface> > &list) … … 1671 1767 if (!pAddresses) 1672 1768 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); 1674 1770 for (int tries = 0; tries < 3 && dwRc == ERROR_BUFFER_OVERFLOW; ++tries) 1675 1771 { … … 1679 1775 if (!pAddresses) 1680 1776 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); 1682 1778 } 1683 1779 if (dwRc != NO_ERROR)
Note:
See TracChangeset
for help on using the changeset viewer.