Signed-off-by: Huw Davies huw@codeweavers.com --- dlls/nsi/tests/nsi.c | 23 +++++++++++++++++------ dlls/nsiproxy.sys/ndis.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 6 deletions(-)
diff --git a/dlls/nsi/tests/nsi.c b/dlls/nsi/tests/nsi.c index 35ca0bb07c9..207d3941c0d 100644 --- a/dlls/nsi/tests/nsi.c +++ b/dlls/nsi/tests/nsi.c @@ -66,9 +66,7 @@ static void test_nsi_api( void )
err = NsiGetAllParameters( 1, &NPI_MS_NDIS_MODULEID, NSI_NDIS_IFINFO_TABLE, luid_tbl + i, sizeof(*luid_tbl), &get_rw, rw_size, &get_dyn, sizeof(get_dyn), &get_stat, sizeof(get_stat) ); -todo_wine ok( !err, "got %d\n", err ); - if (err) break; /* test a selection of members */ ok( IsEqualGUID( &get_rw.network_guid, &rw->network_guid ), "mismatch\n" ); ok( get_rw.alias.Length == rw->alias.Length, "mismatch\n" ); @@ -115,7 +113,9 @@ todo_wine err = NsiGetParameter( 1, &NPI_MS_NDIS_MODULEID, NSI_NDIS_IFINFO_TABLE, luid_tbl + i, sizeof(*luid_tbl), NSI_PARAM_TYPE_RW, &get_rw.alias, sizeof(get_rw.alias), FIELD_OFFSET(struct nsi_ndis_ifinfo_rw, alias) ); +todo_wine ok( !err, "got %d\n", err ); + if (err) continue; ok( get_rw.alias.Length == rw->alias.Length, "mismatch\n" ); ok( !memcmp( get_rw.alias.String, rw->alias.String, rw->alias.Length ), "mismatch\n" );
@@ -257,11 +257,11 @@ static void test_ndis_ifinfo( void ) { DWORD rw_sizes[] = { FIELD_OFFSET(struct nsi_ndis_ifinfo_rw, name2), FIELD_OFFSET(struct nsi_ndis_ifinfo_rw, unk), sizeof(struct nsi_ndis_ifinfo_rw) }; - struct nsi_ndis_ifinfo_rw *rw_tbl; - struct nsi_ndis_ifinfo_dynamic *dyn_tbl, *dyn_tbl_2; - struct nsi_ndis_ifinfo_static *stat_tbl; + struct nsi_ndis_ifinfo_rw *rw_tbl, rw_get; + struct nsi_ndis_ifinfo_dynamic *dyn_tbl, *dyn_tbl_2, dyn_get; + struct nsi_ndis_ifinfo_static *stat_tbl, stat_get; DWORD err, count, i, rw_size; - NET_LUID *luid_tbl, *luid_tbl_2; + NET_LUID *luid_tbl, *luid_tbl_2, luid_get; MIB_IF_TABLE2 *table;
/* Contents of GetIfTable2() keyed by luids */ @@ -356,6 +356,17 @@ static void test_ndis_ifinfo( void ) /* OutQLen */ winetest_pop_context(); } + err = NsiGetAllParameters( 1, &NPI_MS_NDIS_MODULEID, NSI_NDIS_IFINFO_TABLE, luid_tbl, sizeof(*luid_tbl), + &rw_get, rw_size, &dyn_get, sizeof(dyn_get), + &stat_get, sizeof(stat_get) ); + ok( !err, "got %d\n", err ); + ok( IsEqualGUID( &stat_tbl[0].if_guid, &stat_get.if_guid ), "mismatch\n" ); + + luid_get.Value = ~0u; + err = NsiGetAllParameters( 1, &NPI_MS_NDIS_MODULEID, NSI_NDIS_IFINFO_TABLE, &luid_get, sizeof(luid_get), + &rw_get, rw_size, &dyn_get, sizeof(dyn_get), + &stat_get, sizeof(stat_get) ); + ok( err == ERROR_FILE_NOT_FOUND, "got %d\n", err );
FreeMibTable( table ); NsiFreeTable( luid_tbl_2, NULL, dyn_tbl_2, NULL ); diff --git a/dlls/nsiproxy.sys/ndis.c b/dlls/nsiproxy.sys/ndis.c index 356a32635a3..8e5eccbbf23 100644 --- a/dlls/nsiproxy.sys/ndis.c +++ b/dlls/nsiproxy.sys/ndis.c @@ -118,6 +118,16 @@ static struct if_entry *find_entry_from_index( DWORD index ) return NULL; }
+static struct if_entry *find_entry_from_luid( const NET_LUID *luid ) +{ + struct if_entry *entry; + + LIST_FOR_EACH_ENTRY( entry, &if_list, struct if_entry, entry ) + if (entry->if_luid.Value == luid->Value) return entry; + + return NULL; +} + #if defined (SIOCGIFHWADDR) && defined (HAVE_STRUCT_IFREQ_IFR_HWADDR) static NTSTATUS if_get_physical( const char *name, DWORD *type, IF_PHYSICAL_ADDRESS *phys_addr ) { @@ -479,6 +489,32 @@ static NTSTATUS ifinfo_enumerate_all( void *key_data, DWORD key_size, void *rw_d return status; }
+static NTSTATUS ifinfo_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 ) +{ + struct if_entry *entry; + NTSTATUS status = STATUS_OBJECT_NAME_NOT_FOUND; + + 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 ); + + EnterCriticalSection( &if_list_cs ); + + update_if_table(); + + entry = find_entry_from_luid( (const NET_LUID *)key ); + if (entry) + { + ifinfo_fill_entry( entry, NULL, rw_data, dynamic_data, static_data ); + status = STATUS_SUCCESS; + } + + LeaveCriticalSection( &if_list_cs ); + + return status; +} + static const struct module_table tables[] = { { @@ -488,6 +524,7 @@ static const struct module_table tables[] = sizeof(struct nsi_ndis_ifinfo_dynamic), sizeof(struct nsi_ndis_ifinfo_static) }, ifinfo_enumerate_all, + ifinfo_get_all_parameters, }, { ~0u } };