From: Bruno Jesus <00cpxxx@gmail.com> Subject: [PATCH 4/4] iphlpapi: Stub more IP_ADAPTER_UNICAST_ADDRESS fields in GetAdaptersAddresses Message-Id: Date: Thu, 16 Apr 2015 01:25:44 -0300 DirectPlay8 loops the interfaces looking for a suitable network card, to check which is good it looks for this specific fields. Fixes bug https://bugs.winehq.org/show_bug.cgi?id=20041 --- dlls/iphlpapi/iphlpapi_main.c | 40 ++++++++++++++++++++++++++++++++++------ dlls/iphlpapi/tests/iphlpapi.c | 3 --- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c index 513cbce..3eaefab 100644 --- a/dlls/iphlpapi/iphlpapi_main.c +++ b/dlls/iphlpapi/iphlpapi_main.c @@ -784,6 +784,31 @@ static PMIB_IPFORWARDROW findIPv4Gateway(DWORD index, return row; } +static void fill_unicast_addr_data(IP_ADAPTER_ADDRESSES *aa, IP_ADAPTER_UNICAST_ADDRESS *ua) +{ + /* Actually this information should be read somewhere from the system + * but it doesn't matter much for the bugs found so far. + * This information is required for DirectPlay8 games. */ + if (aa->IfType != IF_TYPE_SOFTWARE_LOOPBACK) + { + ua->PrefixOrigin = IpPrefixOriginDhcp; + ua->SuffixOrigin = IpSuffixOriginDhcp; + } + else + { + ua->PrefixOrigin = IpPrefixOriginManual; + ua->SuffixOrigin = IpSuffixOriginManual; + } + + /* The address is not duplicated in the network */ + ua->DadState = IpDadStatePreferred; + + /* Some address life time values, required even for non-dhcp addresses */ + ua->ValidLifetime = 60000; + ua->PreferredLifetime = 60000; + ua->LeaseLifetime = 60000; +} + static ULONG adapterAddressesFromIndex(ULONG family, ULONG flags, IF_INDEX index, IP_ADAPTER_ADDRESSES *aa, ULONG *size) { @@ -884,6 +909,13 @@ static ULONG adapterAddressesFromIndex(ULONG family, ULONG flags, IF_INDEX index TRACE("%s: %d IPv4 addresses, %d IPv6 addresses:\n", name, num_v4addrs, num_v6addrs); + + buflen = MAX_INTERFACE_PHYSADDR; + getInterfacePhysicalByIndex(index, &buflen, aa->PhysicalAddress, &type); + aa->PhysicalAddressLength = buflen; + aa->IfType = typeFromMibType(type); + aa->ConnectionType = connectionTypeFromMibType(type); + if (num_v4_gateways) { PMIB_IPFORWARDROW adapterRow; @@ -930,6 +962,7 @@ static ULONG adapterAddressesFromIndex(ULONG family, ULONG flags, IF_INDEX index sa->sin_port = 0; TRACE("IPv4 %d/%d: %s\n", i + 1, num_v4addrs, debugstr_ipv4(&sa->sin_addr.S_un.S_addr, addr_buf)); + fill_unicast_addr_data(aa, ua); ptr += ua->u.s.Length + ua->Address.iSockaddrLength; if (i < num_v4addrs - 1) @@ -967,6 +1000,7 @@ static ULONG adapterAddressesFromIndex(ULONG family, ULONG flags, IF_INDEX index memcpy(sa, v6addrs[i].lpSockaddr, sizeof(*sa)); TRACE("IPv6 %d/%d: %s\n", i + 1, num_v6addrs, debugstr_ipv6(sa, addr_buf)); + fill_unicast_addr_data(aa, ua); ptr += ua->u.s.Length + ua->Address.iSockaddrLength; if (i < num_v6addrs - 1) @@ -1071,12 +1105,6 @@ static ULONG adapterAddressesFromIndex(ULONG family, ULONG flags, IF_INDEX index } } - buflen = MAX_INTERFACE_PHYSADDR; - getInterfacePhysicalByIndex(index, &buflen, aa->PhysicalAddress, &type); - aa->PhysicalAddressLength = buflen; - aa->IfType = typeFromMibType(type); - aa->ConnectionType = connectionTypeFromMibType(type); - getInterfaceMtuByName(name, &aa->Mtu); getInterfaceStatusByName(name, &status); diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c index 377aadf..58fb843 100644 --- a/dlls/iphlpapi/tests/iphlpapi.c +++ b/dlls/iphlpapi/tests/iphlpapi.c @@ -1360,10 +1360,8 @@ static void test_GetAdaptersAddresses(void) ua = aa->FirstUnicastAddress; while (ua) { -todo_wine ok(ua->PrefixOrigin != IpPrefixOriginOther, "bad address config value %d\n", ua->PrefixOrigin); -todo_wine ok(ua->SuffixOrigin != IpSuffixOriginOther, "bad address config value %d\n", ua->PrefixOrigin); /* Address configured manually or from DHCP server? */ @@ -1375,7 +1373,6 @@ todo_wine ok(ua->LeaseLifetime, "expected non-zero\n"); } /* Is the address ok in the network (not duplicated)? */ -todo_wine ok(ua->DadState != IpDadStateInvalid && ua->DadState != IpDadStateDuplicate, "bad address duplication value %d\n", ua->DadState); trace("\tLength: %u\n", S(U(*ua)).Length); -- 2.1.4