[1/2] iphlpapi: Add GetUnicastIpAddressEntry implementation (try 3)

Bruno Jesus 00cpxxx at gmail.com
Mon Feb 6 19:34:33 CST 2017


On Sun, Feb 5, 2017 at 7:25 PM, André Hentschel <nerv at dawncrow.de> wrote:
> Signed-off-by: André Hentschel <nerv at dawncrow.de>
> ---
>
>
> For https://bugs.winehq.org/show_bug.cgi?id=41753
> try 2: Many thanks to Bruno and Hans for the feedback!
> try 3: Proper patch numbering

Thanks for the new patch ;-)
I'm testing it now and I just have some doubts.

>  dlls/iphlpapi/iphlpapi.spec   |  2 +-
>  dlls/iphlpapi/iphlpapi_main.c | 69 +++++++++++++++++++++++++++++++++++++++++++
>  include/netioapi.h            | 17 +++++++++++
>  include/ws2def.h              | 13 ++++++++
>  include/ws2ipdef.h            |  7 +++++
>  5 files changed, 107 insertions(+), 1 deletion(-)
>
> diff --git a/dlls/iphlpapi/iphlpapi.spec b/dlls/iphlpapi/iphlpapi.spec
> index 500267c..1a1f8f7 100644
> --- a/dlls/iphlpapi/iphlpapi.spec
> +++ b/dlls/iphlpapi/iphlpapi.spec
> @@ -147,7 +147,7 @@
>  @ stub GetUdpStatsFromStack
>  @ stdcall GetUdpTable( ptr ptr long )
>  @ stub GetUdpTableFromStack
> -#@ stub GetUnicastIpAddressEntry
> +@ stdcall GetUnicastIpAddressEntry( ptr )
>  #@ stub GetUnicastIpAddressTable
>  @ stdcall GetUniDirectionalAdapterInfo( ptr ptr )
>  @ stdcall Icmp6CreateFile()
> diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
> index 1daf54d..cfa5d9d 100644
> --- a/dlls/iphlpapi/iphlpapi_main.c
> +++ b/dlls/iphlpapi/iphlpapi_main.c
> @@ -2467,6 +2467,75 @@ DWORD WINAPI GetExtendedUdpTable(PVOID pUdpTable, PDWORD pdwSize, BOOL bOrder,
>      return ret;
>  }
>
> +DWORD WINAPI GetUnicastIpAddressEntry(MIB_UNICASTIPADDRESS_ROW *row)
> +{
> +    char buf[MAX_ADAPTER_NAME], *name;
> +    DWORD ret = ERROR_FILE_NOT_FOUND;
> +    IP_ADAPTER_ADDRESSES *aa, *ptr;
> +    ULONG size = 0;
> +
> +    TRACE("%p\n", row);
> +
> +    if (!row)
> +        return ERROR_INVALID_PARAMETER;
> +
> +    if ((!(name = getInterfaceNameByIndex( row->InterfaceIndex, buf )) &&
> +         !(name = getInterfaceNameByIndex( row->InterfaceLuid.Info.NetLuidIndex, buf ))))
> +        return ERROR_FILE_NOT_FOUND;

The second test for row->InterfaceLuid.Info.NetLuidIndex is really
necessary? Because if I remove it the tests don't fail.

Actually this is the main point, if I remove the whole if and add a
ret = ERROR_FILE_NOT_FOUND before the for (like it was in v1) the
tests also pass.

> +    ret = GetAdaptersAddresses(row->Address.si_family, 0, NULL, NULL, &size);
> +    if (ret != ERROR_BUFFER_OVERFLOW)
> +        return ret;
> +    if (!(ptr = HeapAlloc(GetProcessHeap(), 0, size)))
> +        return ERROR_OUTOFMEMORY;
> +    if ((ret = GetAdaptersAddresses(row->Address.si_family, 0, NULL, ptr, &size)))
> +    {
> +        HeapFree(GetProcessHeap(), 0, ptr);
> +        return ret;
> +    }
> +
> +    for (aa = ptr; aa; aa = aa->Next)
> +    {
> +        IP_ADAPTER_UNICAST_ADDRESS *ua;
> +
> +        if (aa->u.s.IfIndex != row->InterfaceIndex)
> +            continue;
> +
> +        ret = ERROR_NOT_FOUND;
> +
> +        ua = aa->FirstUnicastAddress;
> +        while (ua)
> +        {
> +            SOCKADDR_INET *uaaddr = (SOCKADDR_INET *)ua->Address.lpSockaddr;
> +
> +            if ((row->Address.si_family == WS_AF_INET6 && !memcmp(&row->Address.Ipv6.sin6_addr, &uaaddr->Ipv6.sin6_addr, sizeof(row->Address.Ipv6.sin6_addr))) ||
> +                (row->Address.si_family == WS_AF_INET  && !memcmp(&row->Address.Ipv4.sin_addr,  &uaaddr->Ipv4.sin_addr,  sizeof(row->Address.Ipv4.sin_addr))))

I forgot this in v1 but this line is also too long, sorry. By the way,
what about comparing the ipv4 directly (Ipv4.sin_addr.S_un.S_addr ==)?



More information about the wine-devel mailing list