iphlpapi: Add GetUnicastIpAddressEntry implementation.

Signed-off-by: André Hentschel <nerv@dawncrow.de>
Signed-off-by: Bruno Jesus <00cpxxx@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
oldstable
André Hentschel 2017-02-10 18:30:13 +01:00 committed by Alexandre Julliard
parent 0e49e0541f
commit ccdbceeefc
5 changed files with 105 additions and 1 deletions

View File

@ -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()

View File

@ -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.@)
*

View File

@ -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 */

View File

@ -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;

View File

@ -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
*/