On Thu, Jul 01, 2021 at 09:27:08AM +0100, Huw Davies wrote:
diff --git a/dlls/nsiproxy.sys/ndis.c b/dlls/nsiproxy.sys/ndis.c index 8e5eccbbf23..647fd650cd3 100644 --- a/dlls/nsiproxy.sys/ndis.c +++ b/dlls/nsiproxy.sys/ndis.c @@ -515,6 +515,75 @@ static NTSTATUS ifinfo_get_all_parameters( const void *key, DWORD key_size, void return status; }
+static NTSTATUS ifinfo_get_rw_parameter( struct if_entry *entry, void *data, DWORD data_size, DWORD data_offset ) +{ + switch (data_offset) + { + case FIELD_OFFSET( struct nsi_ndis_ifinfo_rw, alias ): + { + IF_COUNTED_STRING *str = (IF_COUNTED_STRING *)data; + if (data_size != sizeof(*str)) return STATUS_INVALID_PARAMETER; + if_counted_string_init( str, entry->if_name ); + return STATUS_SUCCESS; + } + default: + FIXME( "Offset %#x not handled\n", data_offset ); + } + + return STATUS_INVALID_PARAMETER; +} + +static NTSTATUS ifinfo_get_static_parameter( struct if_entry *entry, void *data, DWORD data_size, DWORD data_offset ) +{ + switch (data_offset) + { + case FIELD_OFFSET( struct nsi_ndis_ifinfo_static, if_index ): + if (data_size != sizeof(DWORD)) return STATUS_INVALID_PARAMETER; + *(DWORD *)data = entry->if_index; + return STATUS_SUCCESS; + + case FIELD_OFFSET( struct nsi_ndis_ifinfo_static, if_guid ): + if (data_size != sizeof(GUID)) return STATUS_INVALID_PARAMETER; + *(GUID *)data = entry->if_guid; + return STATUS_SUCCESS; + + default: + FIXME( "Offset %#x not handled\n", data_offset ); + } + return STATUS_INVALID_PARAMETER; +}
I should add, that while this doesn't look particularly scalable, I think these should be the only parameters that iphlpapi will need from this table. In addition, the only other use of NsiGetParameter() that I've come across will be for a single parameter in the index -> luid table [1]. So bearing that in mind, I decided to keep it simple and not implement a more generic solution. Huw. [1] Essentially these are all used to implement the some of the ConvertInterface*() functions.