for details see https://bugs.winehq.org/show_bug.cgi?id=56065 This change adds an implementation of Win32 API function GetAnycastIpAddressTable() that is used by Adoptium OpenJDK 21 and later to initialize Secure Random Generator. This implementation does not return real information, it just says "no entries found".
-- v7: iphlpapi: try to hammer out linux compilation in winehq gitlab
From: Rastislav Stanik gitlab@rastos.org
This change adds an implementation of Win32 API function GetAnycastIpAddressTable() that does not return real information, it just says "no entries found".
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56065 --- dlls/iphlpapi/iphlpapi.spec | 2 +- dlls/iphlpapi/iphlpapi_main.c | 16 ++++++++++++++++ include/netioapi.h | 13 +++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/dlls/iphlpapi/iphlpapi.spec b/dlls/iphlpapi/iphlpapi.spec index ef2c576947d..dcc15a2753e 100644 --- a/dlls/iphlpapi/iphlpapi.spec +++ b/dlls/iphlpapi/iphlpapi.spec @@ -73,7 +73,7 @@ @ stdcall GetAdaptersAddresses( long long ptr ptr ptr ) @ stdcall GetAdaptersInfo( ptr ptr ) #@ stub GetAnycastIpAddressEntry -#@ stub GetAnycastIpAddressTable +@ stdcall GetAnycastIpAddressTable( long ptr ) @ stdcall GetBestInterface( long ptr ) @ stdcall GetBestInterfaceEx( ptr ptr ) @ stub GetBestInterfaceFromStack diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c index 9c7582b71fb..275ae1e9553 100644 --- a/dlls/iphlpapi/iphlpapi_main.c +++ b/dlls/iphlpapi/iphlpapi_main.c @@ -3597,6 +3597,22 @@ static void unicast_row_fill( MIB_UNICASTIPADDRESS_ROW *row, USHORT fam, void *k row->CreationTimeStamp.QuadPart = stat->creation_time; }
+DWORD WINAPI GetAnycastIpAddressTable(ADDRESS_FAMILY family, MIB_ANYCASTIPADDRESS_TABLE **table) +{ + DWORD size; + FIXME( "(%u, %p) stub\n", family, table ); + + if (!table || (family != AF_INET && family != AF_INET6 && family != AF_UNSPEC)) + return ERROR_INVALID_PARAMETER; + + size = FIELD_OFFSET(MIB_ANYCASTIPADDRESS_TABLE, Table[0]); + *table = heap_alloc( size ); + if (!*table) return ERROR_NOT_ENOUGH_MEMORY; + (*table)->NumEntries = 0; + return NO_ERROR; +} + + DWORD WINAPI GetUnicastIpAddressEntry(MIB_UNICASTIPADDRESS_ROW *row) { struct nsi_ipv4_unicast_key key4; diff --git a/include/netioapi.h b/include/netioapi.h index 8c1491f9efa..24b4f42d645 100644 --- a/include/netioapi.h +++ b/include/netioapi.h @@ -166,12 +166,25 @@ typedef struct _MIB_UNICASTIPADDRESS_ROW LARGE_INTEGER CreationTimeStamp; } MIB_UNICASTIPADDRESS_ROW, *PMIB_UNICASTIPADDRESS_ROW;
+typedef struct _MIB_ANYCASTIPADDRESS_ROW { + SOCKADDR_INET Address; + NET_LUID InterfaceLuid; + NET_IFINDEX InterfaceIndex; + SCOPE_ID ScopeId; +} MIB_ANYCASTIPADDRESS_ROW, *PMIB_ANYCASTIPADDRESS_ROW; + typedef struct _MIB_UNICASTIPADDRESS_TABLE { ULONG NumEntries; MIB_UNICASTIPADDRESS_ROW Table[1]; } MIB_UNICASTIPADDRESS_TABLE, *PMIB_UNICASTIPADDRESS_TABLE;
+typedef struct _MIB_ANYCASTIPADDRESS_TABLE +{ + ULONG NumEntries; + MIB_ANYCASTIPADDRESS_ROW Table[ANY_SIZE]; +} MIB_ANYCASTIPADDRESS_TABLE, *PMIB_ANYCASTIPADDRESS_TABLE; + typedef struct _IP_ADDRESS_PREFIX { SOCKADDR_INET Prefix;
From: Rastislav Stanik git@rastos.org
We allocate slighly more than actually needed (sizeof(NumEntries)) but it makes the compiler shut up --- dlls/iphlpapi/iphlpapi_main.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c index 275ae1e9553..b1e9af9840e 100644 --- a/dlls/iphlpapi/iphlpapi_main.c +++ b/dlls/iphlpapi/iphlpapi_main.c @@ -3599,20 +3599,16 @@ static void unicast_row_fill( MIB_UNICASTIPADDRESS_ROW *row, USHORT fam, void *k
DWORD WINAPI GetAnycastIpAddressTable(ADDRESS_FAMILY family, MIB_ANYCASTIPADDRESS_TABLE **table) { - DWORD size; FIXME( "(%u, %p) stub\n", family, table ); - if (!table || (family != AF_INET && family != AF_INET6 && family != AF_UNSPEC)) return ERROR_INVALID_PARAMETER;
- size = FIELD_OFFSET(MIB_ANYCASTIPADDRESS_TABLE, Table[0]); - *table = heap_alloc( size ); + *table = heap_alloc_zero(sizeof(MIB_ANYCASTIPADDRESS_TABLE)); if (!*table) return ERROR_NOT_ENOUGH_MEMORY; (*table)->NumEntries = 0; return NO_ERROR; }
- DWORD WINAPI GetUnicastIpAddressEntry(MIB_UNICASTIPADDRESS_ROW *row) { struct nsi_ipv4_unicast_key key4;
From: Rastislav Stanik git@rastos.org
--- dlls/iphlpapi/iphlpapi_main.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c index b1e9af9840e..433129d900b 100644 --- a/dlls/iphlpapi/iphlpapi_main.c +++ b/dlls/iphlpapi/iphlpapi_main.c @@ -3603,9 +3603,12 @@ DWORD WINAPI GetAnycastIpAddressTable(ADDRESS_FAMILY family, MIB_ANYCASTIPADDRES if (!table || (family != AF_INET && family != AF_INET6 && family != AF_UNSPEC)) return ERROR_INVALID_PARAMETER;
- *table = heap_alloc_zero(sizeof(MIB_ANYCASTIPADDRESS_TABLE)); - if (!*table) return ERROR_NOT_ENOUGH_MEMORY; - (*table)->NumEntries = 0; + MIB_ANYCASTIPADDRESS_TABLE *tbl= heap_alloc_zero(sizeof(MIB_ANYCASTIPADDRESS_TABLE)); + if (!tbl) return ERROR_NOT_ENOUGH_MEMORY; + { + tbl->NumEntries = 0; + *table=tbl; + } return NO_ERROR; }