Module: wine Branch: master Commit: ebf5b23ccb2be6a1d44de7c35e7c1df662136a8f URL: http://source.winehq.org/git/wine.git/?a=commit;h=ebf5b23ccb2be6a1d44de7c35e...
Author: André Hentschel nerv@dawncrow.de Date: Thu May 25 16:15:21 2017 +0200
iphlpapi: Add partial implementation of GetIfTable2Ex.
Signed-off-by: André Hentschel nerv@dawncrow.de Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/iphlpapi/iphlpapi.spec | 2 +- dlls/iphlpapi/iphlpapi_main.c | 21 +++++++++++++++++---- dlls/iphlpapi/tests/iphlpapi.c | 33 +++++++++++++++++++++++++++++++++ include/netioapi.h | 6 ++++++ 4 files changed, 57 insertions(+), 5 deletions(-)
diff --git a/dlls/iphlpapi/iphlpapi.spec b/dlls/iphlpapi/iphlpapi.spec index 4e5970c..fee9960 100644 --- a/dlls/iphlpapi/iphlpapi.spec +++ b/dlls/iphlpapi/iphlpapi.spec @@ -92,7 +92,7 @@ #@ stub GetIfStackTable @ stdcall GetIfTable( ptr ptr long ) @ stdcall GetIfTable2( ptr ) -#@ stub GetIfTable2Ex +@ stdcall GetIfTable2Ex( long ptr ) @ stub GetIfTableFromStack @ stub GetIgmpList @ stdcall GetInterfaceInfo( ptr ptr ) diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c index c592a90..d0e13e4 100644 --- a/dlls/iphlpapi/iphlpapi_main.c +++ b/dlls/iphlpapi/iphlpapi_main.c @@ -1852,17 +1852,21 @@ DWORD WINAPI GetIfTable(PMIB_IFTABLE pIfTable, PULONG pdwSize, BOOL bOrder) }
/****************************************************************** - * GetIfTable2 (IPHLPAPI.@) + * GetIfTable2Ex (IPHLPAPI.@) */ -DWORD WINAPI GetIfTable2( MIB_IF_TABLE2 **table ) +DWORD WINAPI GetIfTable2Ex( MIB_IF_TABLE_LEVEL level, MIB_IF_TABLE2 **table ) { DWORD i, nb_interfaces, size = sizeof(MIB_IF_TABLE2); InterfaceIndexTable *index_table; MIB_IF_TABLE2 *ret;
- TRACE( "table %p\n", table ); + TRACE( "level %u, table %p\n", level, table );
- if (!table) return ERROR_INVALID_PARAMETER; + if (!table || level > MibIfTableRaw) + return ERROR_INVALID_PARAMETER; + + if (level != MibIfTableNormal) + FIXME("level %u not fully supported\n", level);
if ((nb_interfaces = get_interface_indices( FALSE, NULL )) > 1) size += (nb_interfaces - 1) * sizeof(MIB_IF_ROW2); @@ -1890,6 +1894,15 @@ DWORD WINAPI GetIfTable2( MIB_IF_TABLE2 **table ) }
/****************************************************************** + * GetIfTable2 (IPHLPAPI.@) + */ +DWORD WINAPI GetIfTable2( MIB_IF_TABLE2 **table ) +{ + TRACE( "table %p\n", table ); + return GetIfTable2Ex(MibIfTableNormal, table); +} + +/****************************************************************** * GetInterfaceInfo (IPHLPAPI.@) * * Get a list of network interface adapters. diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c index 3369f78..d8c319e 100644 --- a/dlls/iphlpapi/tests/iphlpapi.c +++ b/dlls/iphlpapi/tests/iphlpapi.c @@ -58,6 +58,7 @@ static DWORD (WINAPI *pGetIfEntry2)(PMIB_IF_ROW2); static DWORD (WINAPI *pGetFriendlyIfIndex)(DWORD); static DWORD (WINAPI *pGetIfTable)(PMIB_IFTABLE,PULONG,BOOL); static DWORD (WINAPI *pGetIfTable2)(PMIB_IF_TABLE2*); +static DWORD (WINAPI *pGetIfTable2Ex)(MIB_IF_TABLE_LEVEL,PMIB_IF_TABLE2*); static DWORD (WINAPI *pGetIpForwardTable)(PMIB_IPFORWARDTABLE,PULONG,BOOL); static DWORD (WINAPI *pGetIpNetTable)(PMIB_IPNETTABLE,PULONG,BOOL); static DWORD (WINAPI *pGetInterfaceInfo)(PIP_INTERFACE_INFO,PULONG); @@ -110,6 +111,7 @@ static void loadIPHlpApi(void) pGetFriendlyIfIndex = (void *)GetProcAddress(hLibrary, "GetFriendlyIfIndex"); pGetIfTable = (void *)GetProcAddress(hLibrary, "GetIfTable"); pGetIfTable2 = (void *)GetProcAddress(hLibrary, "GetIfTable2"); + pGetIfTable2Ex = (void *)GetProcAddress(hLibrary, "GetIfTable2Ex"); pGetIpForwardTable = (void *)GetProcAddress(hLibrary, "GetIpForwardTable"); pGetIpNetTable = (void *)GetProcAddress(hLibrary, "GetIpNetTable"); pGetInterfaceInfo = (void *)GetProcAddress(hLibrary, "GetInterfaceInfo"); @@ -2023,6 +2025,36 @@ static void test_GetIfTable2(void) pFreeMibTable( table ); }
+static void test_GetIfTable2Ex(void) +{ + DWORD ret; + MIB_IF_TABLE2 *table; + + if (!pGetIfTable2Ex) + { + win_skip( "GetIfTable2Ex not available\n" ); + return; + } + + table = NULL; + ret = pGetIfTable2Ex( MibIfTableNormal, &table ); + ok( ret == NO_ERROR, "got %u\n", ret ); + ok( table != NULL, "table not set\n" ); + pFreeMibTable( table ); + + table = NULL; + ret = pGetIfTable2Ex( MibIfTableRaw, &table ); + ok( ret == NO_ERROR, "got %u\n", ret ); + ok( table != NULL, "table not set\n" ); + pFreeMibTable( table ); + + table = NULL; + ret = pGetIfTable2Ex( 2, &table ); + ok( ret == ERROR_INVALID_PARAMETER, "got %u\n", ret ); + ok( !table, "table should not be set\n" ); + pFreeMibTable( table ); +} + static void test_GetUnicastIpAddressEntry(void) { IP_ADAPTER_ADDRESSES *aa, *ptr; @@ -2208,6 +2240,7 @@ START_TEST(iphlpapi) test_interface_identifier_conversion(); test_GetIfEntry2(); test_GetIfTable2(); + test_GetIfTable2Ex(); test_GetUnicastIpAddressEntry(); test_GetUnicastIpAddressTable(); freeIPHlpApi(); diff --git a/include/netioapi.h b/include/netioapi.h index cabfe9e..4f5f671 100644 --- a/include/netioapi.h +++ b/include/netioapi.h @@ -21,6 +21,12 @@
#include <ntddndis.h>
+typedef enum _MIB_IF_TABLE_LEVEL +{ + MibIfTableNormal, + MibIfTableRaw +} MIB_IF_TABLE_LEVEL, *PMIB_IF_TABLE_LEVEL; + typedef enum _MIB_NOTIFICATION_TYPE { MibParameterNotification,