Module: wine Branch: master Commit: 4c7c7d07d4dd30b0751c7ad0bbc1db5577807b72 URL: https://source.winehq.org/git/wine.git/?a=commit;h=4c7c7d07d4dd30b0751c7ad0b...
Author: Huw Davies huw@codeweavers.com Date: Tue Jul 20 08:43:25 2021 +0100
nsiproxy: Implement IP unicast get_all_parameters.
Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/nsi/tests/nsi.c | 14 +++++++++---- dlls/nsiproxy.sys/ip.c | 39 ++++++++++++++++++++++++++++++++++++ dlls/nsiproxy.sys/ndis.c | 21 +++++++++++++++++++ dlls/nsiproxy.sys/nsiproxy_private.h | 1 + 4 files changed, 71 insertions(+), 4 deletions(-)
diff --git a/dlls/nsi/tests/nsi.c b/dlls/nsi/tests/nsi.c index 3408dfae58f..c07653c2ede 100644 --- a/dlls/nsi/tests/nsi.c +++ b/dlls/nsi/tests/nsi.c @@ -415,11 +415,11 @@ static void test_ip_unicast( int family ) { DWORD rw_sizes[] = { FIELD_OFFSET(struct nsi_ip_unicast_rw, unk[0]), FIELD_OFFSET(struct nsi_ip_unicast_rw, unk[1]), sizeof(struct nsi_ip_unicast_rw) }; - struct nsi_ipv4_unicast_key *key_tbl, *key4; + struct nsi_ipv4_unicast_key *key_tbl, *key4, get_key; struct nsi_ipv6_unicast_key *key6; - struct nsi_ip_unicast_rw *rw_tbl, *rw; - struct nsi_ip_unicast_dynamic *dyn_tbl, *dyn; - struct nsi_ip_unicast_static *stat_tbl, *stat; + struct nsi_ip_unicast_rw *rw_tbl, *rw, get_rw; + struct nsi_ip_unicast_dynamic *dyn_tbl, *dyn, get_dyn; + struct nsi_ip_unicast_static *stat_tbl, *stat, get_stat; MIB_UNICASTIPADDRESS_TABLE *table; const NPI_MODULEID *mod = (family == AF_INET) ? &NPI_MS_IPV4_MODULEID : &NPI_MS_IPV6_MODULEID; DWORD err, count, i, rw_size, key_size = (family == AF_INET) ? sizeof(*key4) : sizeof(*key6); @@ -475,6 +475,12 @@ todo_wine winetest_pop_context(); }
+ get_key.luid.Value = ~0u; + get_key.addr.s_addr = 0; + err = NsiGetAllParameters( 1, &NPI_MS_IPV4_MODULEID, NSI_IP_UNICAST_TABLE, &get_key, sizeof(get_key), + &get_rw, rw_size, &get_dyn, sizeof(get_dyn), &get_stat, sizeof(get_stat) ); + ok( err == ERROR_NOT_FOUND, "got %d\n", err ); + FreeMibTable( table ); NsiFreeTable( key_tbl, rw_tbl, dyn_tbl, stat_tbl ); winetest_pop_context(); diff --git a/dlls/nsiproxy.sys/ip.c b/dlls/nsiproxy.sys/ip.c index d5fcc689fc4..ab1b6294bea 100644 --- a/dlls/nsiproxy.sys/ip.c +++ b/dlls/nsiproxy.sys/ip.c @@ -180,6 +180,43 @@ static NTSTATUS ip_unicast_enumerate_all( void *key_data, DWORD key_size, void * return status; }
+static NTSTATUS ip_unicast_get_all_parameters( const void *key, DWORD key_size, void *rw_data, DWORD rw_size, + void *dynamic_data, DWORD dynamic_size, + void *static_data, DWORD static_size ) +{ + int family = (key_size == sizeof(struct nsi_ipv4_unicast_key)) ? AF_INET : AF_INET6; + NTSTATUS status = STATUS_NOT_FOUND; + const struct nsi_ipv6_unicast_key *key6 = key; + const struct nsi_ipv4_unicast_key *key4 = key; + struct ifaddrs *addrs, *entry; + const char *unix_name; + + TRACE( "%p %d %p %d %p %d %p %d\n", key, key_size, rw_data, rw_size, dynamic_data, dynamic_size, + static_data, static_size ); + + if (!convert_luid_to_unix_name( &key6->luid, &unix_name )) return STATUS_NOT_FOUND; + + if (getifaddrs( &addrs )) return STATUS_NO_MORE_ENTRIES; + + for (entry = addrs; entry; entry = entry->ifa_next) + { + if (!entry->ifa_addr || entry->ifa_addr->sa_family != family) continue; + if (strcmp( entry->ifa_name, unix_name )) continue; + + if (family == AF_INET && + memcmp( &key4->addr, &((struct sockaddr_in *)entry->ifa_addr)->sin_addr, sizeof(key4->addr) )) continue; + if (family == AF_INET6 && + memcmp( &key6->addr, &((struct sockaddr_in6 *)entry->ifa_addr)->sin6_addr, sizeof(key6->addr) )) continue; + + unicast_fill_entry( entry, NULL, rw_data, dynamic_data, static_data ); + status = STATUS_SUCCESS; + break; + } + + freeifaddrs( addrs ); + return status; +} + static struct module_table ipv4_tables[] = { { @@ -189,6 +226,7 @@ static struct module_table ipv4_tables[] = sizeof(struct nsi_ip_unicast_dynamic), sizeof(struct nsi_ip_unicast_static) }, ip_unicast_enumerate_all, + ip_unicast_get_all_parameters, }, { ~0u @@ -210,6 +248,7 @@ static struct module_table ipv6_tables[] = sizeof(struct nsi_ip_unicast_dynamic), sizeof(struct nsi_ip_unicast_static) }, ip_unicast_enumerate_all, + ip_unicast_get_all_parameters, }, { ~0u diff --git a/dlls/nsiproxy.sys/ndis.c b/dlls/nsiproxy.sys/ndis.c index b08d5bbcc79..40a60e45c46 100644 --- a/dlls/nsiproxy.sys/ndis.c +++ b/dlls/nsiproxy.sys/ndis.c @@ -634,6 +634,27 @@ BOOL convert_unix_name_to_luid( const char *unix_name, NET_LUID *luid ) return ret; }
+BOOL convert_luid_to_unix_name( const NET_LUID *luid, const char **unix_name ) +{ + struct if_entry *entry; + BOOL ret = FALSE; + + EnterCriticalSection( &if_list_cs ); + + update_if_table(); + + LIST_FOR_EACH_ENTRY( entry, &if_list, struct if_entry, entry ) + if (entry->if_luid.Value == luid->Value) + { + *unix_name = entry->if_unix_name; + ret = TRUE; + + } + LeaveCriticalSection( &if_list_cs ); + + return ret; +} + static const struct module_table tables[] = { { diff --git a/dlls/nsiproxy.sys/nsiproxy_private.h b/dlls/nsiproxy.sys/nsiproxy_private.h index 1c62a3df038..0f6e7b05c59 100644 --- a/dlls/nsiproxy.sys/nsiproxy_private.h +++ b/dlls/nsiproxy.sys/nsiproxy_private.h @@ -22,6 +22,7 @@ NTSTATUS nsi_enumerate_all_ex( struct nsi_enumerate_all_ex *params ) DECLSPEC_HI NTSTATUS nsi_get_all_parameters_ex( struct nsi_get_all_parameters_ex *params ) DECLSPEC_HIDDEN; NTSTATUS nsi_get_parameter_ex( struct nsi_get_parameter_ex *params ) DECLSPEC_HIDDEN;
+BOOL convert_luid_to_unix_name( const NET_LUID *luid, const char **unix_name ) DECLSPEC_HIDDEN; BOOL convert_unix_name_to_luid( const char *unix_name, NET_LUID *luid ) DECLSPEC_HIDDEN;
struct module_table