=?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: iphlpapi: Add GetUnicastIpAddressEntry implementation.

Alexandre Julliard julliard at winehq.org
Mon Feb 13 15:24:39 CST 2017


Module: wine
Branch: master
Commit: ccdbceeefc196999a698fc1842d4f1bff651ec22
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ccdbceeefc196999a698fc1842d4f1bff651ec22

Author: André Hentschel <nerv at dawncrow.de>
Date:   Fri Feb 10 18:30:13 2017 +0100

iphlpapi: Add GetUnicastIpAddressEntry implementation.

Signed-off-by: André Hentschel <nerv at dawncrow.de>
Signed-off-by: Bruno Jesus <00cpxxx at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/iphlpapi/iphlpapi.spec   |  2 +-
 dlls/iphlpapi/iphlpapi_main.c | 67 +++++++++++++++++++++++++++++++++++++++++++
 include/netioapi.h            | 17 +++++++++++
 include/ws2def.h              | 13 +++++++++
 include/ws2ipdef.h            |  7 +++++
 5 files changed, 105 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..12767c3 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -2467,6 +2467,73 @@ DWORD WINAPI GetExtendedUdpTable(PVOID pUdpTable, PDWORD pdwSize, BOOL bOrder,
     return ret;
 }
 
+DWORD WINAPI GetUnicastIpAddressEntry(MIB_UNICASTIPADDRESS_ROW *row)
+{
+    IP_ADAPTER_ADDRESSES *aa, *ptr;
+    ULONG size = 0;
+    DWORD ret;
+
+    TRACE("%p\n", row);
+
+    if (!row)
+        return ERROR_INVALID_PARAMETER;
+
+    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;
+    }
+
+    ret = ERROR_FILE_NOT_FOUND;
+    for (aa = ptr; aa; aa = aa->Next)
+    {
+        IP_ADAPTER_UNICAST_ADDRESS *ua;
+
+        if (aa->u.s.IfIndex != row->InterfaceIndex &&
+            memcmp(&aa->Luid, &row->InterfaceLuid, sizeof(row->InterfaceLuid)))
+            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(uaaddr->Ipv6.sin6_addr))) ||
+                (row->Address.si_family == WS_AF_INET &&
+                 row->Address.Ipv4.sin_addr.S_un.S_addr == uaaddr->Ipv4.sin_addr.S_un.S_addr))
+            {
+                memcpy(&row->InterfaceLuid, &aa->Luid, sizeof(aa->Luid));
+                row->InterfaceIndex     = aa->u.s.IfIndex;
+                row->PrefixOrigin       = ua->PrefixOrigin;
+                row->SuffixOrigin       = ua->SuffixOrigin;
+                row->ValidLifetime      = ua->ValidLifetime;
+                row->PreferredLifetime  = ua->PreferredLifetime;
+                row->OnLinkPrefixLength = ua->OnLinkPrefixLength;
+                row->SkipAsSource       = 0;
+                row->DadState           = ua->DadState;
+                if (row->Address.si_family == WS_AF_INET6)
+                    row->ScopeId.u.Value  = row->Address.Ipv6.sin6_scope_id;
+                else
+                    row->ScopeId.u.Value  = 0;
+                NtQuerySystemTime(&row->CreationTimeStamp);
+                HeapFree(GetProcessHeap(), 0, ptr);
+                return NO_ERROR;
+            }
+            ua = ua->Next;
+        }
+    }
+    HeapFree(GetProcessHeap(), 0, ptr);
+
+    return ret;
+}
+
 /******************************************************************
  *    GetUniDirectionalAdapterInfo (IPHLPAPI.@)
  *
diff --git a/include/netioapi.h b/include/netioapi.h
index 0357431..0e777c7 100644
--- a/include/netioapi.h
+++ b/include/netioapi.h
@@ -82,6 +82,22 @@ typedef struct _MIB_IF_TABLE2
     MIB_IF_ROW2 Table[1];
 } MIB_IF_TABLE2, *PMIB_IF_TABLE2;
 
+typedef struct _MIB_UNICASTIPADDRESS_ROW
+{
+    SOCKADDR_INET       Address;
+    NET_LUID            InterfaceLuid;
+    NET_IFINDEX         InterfaceIndex;
+    NL_PREFIX_ORIGIN    PrefixOrigin;
+    NL_SUFFIX_ORIGIN    SuffixOrigin;
+    ULONG               ValidLifetime;
+    ULONG               PreferredLifetime;
+    UINT8               OnLinkPrefixLength;
+    BOOLEAN             SkipAsSource;
+    NL_DAD_STATE        DadState;
+    SCOPE_ID            ScopeId;
+    LARGE_INTEGER       CreationTimeStamp;
+} MIB_UNICASTIPADDRESS_ROW, *PMIB_UNICASTIPADDRESS_ROW;
+
 DWORD WINAPI ConvertInterfaceGuidToLuid(const GUID*,NET_LUID*);
 DWORD WINAPI ConvertInterfaceIndexToLuid(NET_IFINDEX,NET_LUID*);
 DWORD WINAPI ConvertInterfaceLuidToGuid(const NET_LUID*,GUID*);
@@ -92,5 +108,6 @@ DWORD WINAPI ConvertInterfaceNameToLuidA(const char*,NET_LUID*);
 DWORD WINAPI ConvertInterfaceNameToLuidW(const WCHAR*,NET_LUID*);
 void WINAPI FreeMibTable(void*);
 DWORD WINAPI GetIfEntry2(MIB_IF_ROW2*);
+DWORD WINAPI GetUnicastIpAddressEntry(MIB_UNICASTIPADDRESS_ROW*);
 
 #endif /* __WINE_NETIOAPI_H */
diff --git a/include/ws2def.h b/include/ws2def.h
index cbd6f74..fa21c06 100644
--- a/include/ws2def.h
+++ b/include/ws2def.h
@@ -27,6 +27,8 @@
 #define WS(x)    x
 #endif
 
+typedef USHORT ADDRESS_FAMILY;
+
 #ifndef __CSADDR_DEFINED__
 #define __CSADDR_DEFINED__
 
@@ -78,6 +80,17 @@ typedef enum {
     ScopeLevelGlobal       = 14
 } SCOPE_LEVEL;
 
+typedef struct
+{
+    union {
+        struct {
+            ULONG Zone  : 28;
+            ULONG Level : 4;
+        } DUMMYSTRUCTNAME;
+        ULONG Value;
+    } DUMMYUNIONNAME;
+} SCOPE_ID, *PSCOPE_ID;
+
 typedef struct _WSABUF
 {
     ULONG len;
diff --git a/include/ws2ipdef.h b/include/ws2ipdef.h
index ca47caa..e13cf6e 100644
--- a/include/ws2ipdef.h
+++ b/include/ws2ipdef.h
@@ -135,6 +135,13 @@ typedef struct WS(sockaddr_in6_pair)
     PSOCKADDR_IN6 DestinationAddress;
 } SOCKADDR_IN6_PAIR, *PSOCKADDR_IN6_PAIR;
 
+typedef union _SOCKADDR_INET
+{
+    SOCKADDR_IN     Ipv4;
+    SOCKADDR_IN6    Ipv6;
+    ADDRESS_FAMILY  si_family;
+} SOCKADDR_INET, *PSOCKADDR_INET;
+
 /*
  * Multicast group information
  */




More information about the wine-cvs mailing list