From: Bruno Jesus <00cpxxx@gmail.com> Subject: iphlpapi: Set 0.0.0.0 as the IP and mask of disconnected interfaces Message-Id: Date: Thu, 15 Jan 2015 10:13:34 -0200 Superseeds 108610. In Windows if the eth cable is disconnected the interface returns 0.0.0.0, when it's connected and using DHCP but no DHCP server is found it returns an APIPA [1] address. In our case it's simpler to assume that an IP less interface is a disconnected interface. Fixes bug https://bugs.winehq.org/show_bug.cgi?id=32205 [1] http://www.webopedia.com/TERM/A/APIPA.html diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c index 59f3593..d2f36fe 100644 --- a/dlls/iphlpapi/iphlpapi_main.c +++ b/dlls/iphlpapi/iphlpapi_main.c @@ -604,6 +604,12 @@ DWORD WINAPI GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen) } } } + /* If no IP was found it probably means that the interface is not + * configured. In this case we have to return a zeroed IP and mask. */ + if (firstIPAddr) { + strcpy(ptr->IpAddressList.IpAddress.String, "0.0.0.0"); + strcpy(ptr->IpAddressList.IpMask.String, "0.0.0.0"); + } /* Find first router through this interface, which we'll assume * is the default gateway for this adapter */ for (i = 0; i < routeTable->dwNumEntries; i++) diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c index b2d81c0..14bbc5d 100644 --- a/dlls/iphlpapi/tests/iphlpapi.c +++ b/dlls/iphlpapi/tests/iphlpapi.c @@ -1118,12 +1118,20 @@ static void testGetAdaptersInfo(void) if (apiReturn == ERROR_NO_DATA) ; /* no adapter's, that's okay */ else if (apiReturn == ERROR_BUFFER_OVERFLOW) { - PIP_ADAPTER_INFO buf = HeapAlloc(GetProcessHeap(), 0, len); + PIP_ADAPTER_INFO ptr, buf = HeapAlloc(GetProcessHeap(), 0, len); apiReturn = pGetAdaptersInfo(buf, &len); ok(apiReturn == NO_ERROR, "GetAdaptersInfo(buf, &dwSize) returned %d, expected NO_ERROR\n", apiReturn); + ptr = buf; + while (ptr) { + ok(ptr->IpAddressList.IpAddress.String[0], "A valid IP must be present\n"); + ok(ptr->IpAddressList.IpMask.String[0], "A valid mask must be present\n"); + trace("Adapter '%s', IP %s, Mask %s\n", ptr->AdapterName, + ptr->IpAddressList.IpAddress.String, ptr->IpAddressList.IpMask.String); + ptr = ptr->Next; + } HeapFree(GetProcessHeap(), 0, buf); } }