Hans Leidekker : iphlpapi: Implement GetIfEntry2.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jul 22 13:40:40 CDT 2015


Module: wine
Branch: master
Commit: 991474da4636430706e3e61b99b4e624e6d62ebd
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=991474da4636430706e3e61b99b4e624e6d62ebd

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Wed Jul 22 14:28:05 2015 +0200

iphlpapi: Implement GetIfEntry2.

---

 dlls/iphlpapi/iphlpapi.spec    |  2 +-
 dlls/iphlpapi/iphlpapi_main.c  | 52 ++++++++++++++++++++++++++++++
 dlls/iphlpapi/tests/iphlpapi.c | 73 ++++++++++++++++++++++++++++++++++--------
 3 files changed, 113 insertions(+), 14 deletions(-)

diff --git a/dlls/iphlpapi/iphlpapi.spec b/dlls/iphlpapi/iphlpapi.spec
index aa7c7f0..d98d5c0 100644
--- a/dlls/iphlpapi/iphlpapi.spec
+++ b/dlls/iphlpapi/iphlpapi.spec
@@ -87,7 +87,7 @@
 @ stdcall GetIcmpStatistics( ptr )
 @ stub GetIcmpStatsFromStack
 @ stdcall GetIfEntry( ptr )
-#@ stub GetIfEntry2
+@ stdcall GetIfEntry2( ptr )
 @ stub GetIfEntryFromStack
 #@ stub GetIfStackTable
 @ stdcall GetIfTable( ptr ptr long )
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index b6e2a07..b6ab612 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -51,6 +51,7 @@
 #include "ipstats.h"
 #include "ipifcons.h"
 #include "fltdefs.h"
+#include "ifdef.h"
 #include "netioapi.h"
 
 #include "wine/debug.h"
@@ -1685,6 +1686,57 @@ DWORD WINAPI GetIfEntry(PMIB_IFROW pIfRow)
   return ret;
 }
 
+/******************************************************************
+ *    GetIfEntry2 (IPHLPAPI.@)
+ */
+DWORD WINAPI GetIfEntry2( MIB_IF_ROW2 *row2 )
+{
+    DWORD ret, len = sizeof(row2->Description)/sizeof(row2->Description[0]);
+    char buf[MAX_ADAPTER_NAME], *name;
+    MIB_IFROW row;
+
+    TRACE("%p\n", row2);
+
+    if (!row2 || (!(name = getInterfaceNameByIndex( row2->InterfaceIndex, buf )) &&
+                  !(name = getInterfaceNameByIndex( row2->InterfaceLuid.Info.NetLuidIndex, buf ))))
+    {
+        return ERROR_INVALID_PARAMETER;
+    }
+    if ((ret = getInterfaceEntryByName( name, &row ))) return ret;
+    if ((ret = getInterfaceStatsByName( name, &row ))) return ret;
+
+    memset( row2, 0, sizeof(*row2) );
+    row2->InterfaceLuid.Info.Reserved     = 0;
+    row2->InterfaceLuid.Info.NetLuidIndex = row.dwIndex;
+    row2->InterfaceLuid.Info.IfType       = row.dwType;
+    row2->InterfaceIndex                  = row.dwIndex;
+    row2->InterfaceGuid.Data1             = row.dwIndex;
+    row2->Type                            = row.dwType;
+    row2->Mtu                             = row.dwMtu;
+    MultiByteToWideChar( CP_UNIXCP, 0, (const char *)row.bDescr, -1, row2->Description, len );
+    row2->PhysicalAddressLength           = row.dwPhysAddrLen;
+    memcpy( &row2->PhysicalAddress, &row.bPhysAddr, row.dwPhysAddrLen );
+    memcpy( &row2->PermanentPhysicalAddress, &row.bPhysAddr, row.dwPhysAddrLen );
+    row2->OperStatus                      = IfOperStatusUp;
+    row2->AdminStatus                     = NET_IF_ADMIN_STATUS_UP;
+    row2->MediaConnectState               = MediaConnectStateConnected;
+    row2->ConnectionType                  = NET_IF_CONNECTION_DEDICATED;
+
+    /* stats */
+    row2->InOctets        = row.dwInOctets;
+    row2->InUcastPkts     = row.dwInUcastPkts;
+    row2->InNUcastPkts    = row.dwInNUcastPkts;
+    row2->InDiscards      = row.dwInDiscards;
+    row2->InErrors        = row.dwInErrors;
+    row2->InUnknownProtos = row.dwInUnknownProtos;
+    row2->OutOctets       = row.dwOutOctets;
+    row2->OutUcastPkts    = row.dwOutUcastPkts;
+    row2->OutNUcastPkts   = row.dwOutNUcastPkts;
+    row2->OutDiscards     = row.dwOutDiscards;
+    row2->OutErrors       = row.dwOutErrors;
+
+    return NO_ERROR;
+}
 
 static int IfTableSorter(const void *a, const void *b)
 {
diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c
index 30e75b7..fc91142 100644
--- a/dlls/iphlpapi/tests/iphlpapi.c
+++ b/dlls/iphlpapi/tests/iphlpapi.c
@@ -41,6 +41,7 @@
 #include "ws2tcpip.h"
 #include "iphlpapi.h"
 #include "iprtrmib.h"
+#include "netioapi.h"
 #include "wine/test.h"
 #include <stdio.h>
 #include <stdlib.h>
@@ -52,6 +53,7 @@ static HMODULE hLibrary = NULL;
 static DWORD (WINAPI *pGetNumberOfInterfaces)(PDWORD);
 static DWORD (WINAPI *pGetIpAddrTable)(PMIB_IPADDRTABLE,PULONG,BOOL);
 static DWORD (WINAPI *pGetIfEntry)(PMIB_IFROW);
+static DWORD (WINAPI *pGetIfEntry2)(PMIB_IF_ROW2);
 static DWORD (WINAPI *pGetFriendlyIfIndex)(DWORD);
 static DWORD (WINAPI *pGetIfTable)(PMIB_IFTABLE,PULONG,BOOL);
 static DWORD (WINAPI *pGetIpForwardTable)(PMIB_IPFORWARDTABLE,PULONG,BOOL);
@@ -97,6 +99,7 @@ static void loadIPHlpApi(void)
     pGetNumberOfInterfaces = (void *)GetProcAddress(hLibrary, "GetNumberOfInterfaces");
     pGetIpAddrTable = (void *)GetProcAddress(hLibrary, "GetIpAddrTable");
     pGetIfEntry = (void *)GetProcAddress(hLibrary, "GetIfEntry");
+    pGetIfEntry2 = (void *)GetProcAddress(hLibrary, "GetIfEntry2");
     pGetFriendlyIfIndex = (void *)GetProcAddress(hLibrary, "GetFriendlyIfIndex");
     pGetIfTable = (void *)GetProcAddress(hLibrary, "GetIfTable");
     pGetIpForwardTable = (void *)GetProcAddress(hLibrary, "GetIpForwardTable");
@@ -1643,12 +1646,33 @@ static void test_CreateSortedAddressPairs(void)
     pFreeMibTable( pair );
 }
 
+static DWORD get_interface_index(void)
+{
+    DWORD size = 0, ret = 0;
+    IP_ADAPTER_ADDRESSES *buf, *aa;
+
+    if (pGetAdaptersAddresses( AF_UNSPEC, 0, NULL, NULL, &size ) != ERROR_BUFFER_OVERFLOW)
+        return 0;
+
+    buf = HeapAlloc( GetProcessHeap(), 0, size );
+    pGetAdaptersAddresses( AF_UNSPEC, 0, NULL, buf, &size );
+    for (aa = buf; aa; aa = aa->Next)
+    {
+        if (aa->IfType == IF_TYPE_ETHERNET_CSMACD)
+        {
+            ret = aa->IfIndex;
+            break;
+        }
+    }
+    HeapFree( GetProcessHeap(), 0, buf );
+    return ret;
+}
+
 static void test_interface_identifier_conversion(void)
 {
-    DWORD ret, size;
+    DWORD ret;
     NET_LUID luid;
     GUID guid;
-    IP_ADAPTER_ADDRESSES *buf, *aa;
     SIZE_T len;
     WCHAR nameW[IF_MAX_STRING_SIZE + 1];
     char nameA[IF_MAX_STRING_SIZE + 1];
@@ -1659,15 +1683,7 @@ static void test_interface_identifier_conversion(void)
         win_skip( "ConvertInterfaceIndexToLuid not available\n" );
         return;
     }
-
-    size = 0;
-    ret = pGetAdaptersAddresses( AF_UNSPEC, 0, NULL, NULL, &size );
-    if (ret != ERROR_BUFFER_OVERFLOW) return;
-
-    buf = HeapAlloc( GetProcessHeap(), 0, size );
-    pGetAdaptersAddresses( AF_UNSPEC, 0, NULL, buf, &size );
-    for (aa = buf; aa; aa = aa->Next) { if (aa->IfType == IF_TYPE_ETHERNET_CSMACD) break; }
-    if (aa->IfType != IF_TYPE_ETHERNET_CSMACD)
+    if (!(index = get_interface_index()))
     {
         skip( "no suitable interface found\n" );
         return;
@@ -1685,7 +1701,7 @@ static void test_interface_identifier_conversion(void)
     ok( !luid.Info.IfType, "got %u\n", luid.Info.IfType );
 
     memset( &luid, 0, sizeof(luid) );
-    ret = pConvertInterfaceIndexToLuid( aa->IfIndex, &luid );
+    ret = pConvertInterfaceIndexToLuid( index, &luid );
     ok( !ret, "got %u\n", ret );
     ok( !luid.Info.Reserved, "got %x\n", luid.Info.Reserved );
     ok( luid.Info.NetLuidIndex, "got %u\n", luid.Info.NetLuidIndex );
@@ -1817,8 +1833,38 @@ static void test_interface_identifier_conversion(void)
     ok( !luid.Info.Reserved, "got %x\n", luid.Info.Reserved );
     ok( luid.Info.NetLuidIndex, "got %u\n", luid.Info.NetLuidIndex );
     ok( luid.Info.IfType == IF_TYPE_ETHERNET_CSMACD, "got %u\n", luid.Info.IfType );
+}
 
-    HeapFree( GetProcessHeap(), 0, buf );
+static void test_GetIfEntry2(void)
+{
+    DWORD ret;
+    MIB_IF_ROW2 row;
+    NET_IFINDEX index;
+
+    if (!pGetIfEntry2)
+    {
+        win_skip( "GetIfEntry2 not available\n" );
+        return;
+    }
+    if (!(index = get_interface_index()))
+    {
+        skip( "no suitable interface found\n" );
+        return;
+    }
+
+    ret = pGetIfEntry2( NULL );
+    ok( ret == ERROR_INVALID_PARAMETER, "got %u\n", ret );
+
+    memset( &row, 0, sizeof(row) );
+    ret = pGetIfEntry2( &row );
+    ok( ret == ERROR_INVALID_PARAMETER, "got %u\n", ret );
+
+    memset( &row, 0, sizeof(row) );
+    row.InterfaceIndex = index;
+    ret = pGetIfEntry2( &row );
+    ok( ret == NO_ERROR, "got %u\n", ret );
+    ok( row.InterfaceIndex == index, "got %u\n", index );
+    ok( row.InterfaceLuid.Info.NetLuidIndex, "got %u\n", index );
 }
 
 START_TEST(iphlpapi)
@@ -1842,6 +1888,7 @@ START_TEST(iphlpapi)
     test_GetExtendedUdpTable();
     test_CreateSortedAddressPairs();
     test_interface_identifier_conversion();
+    test_GetIfEntry2();
     freeIPHlpApi();
   }
 }




More information about the wine-cvs mailing list