Commit 0b5a6c70 authored by Huw Davies's avatar Huw Davies Committed by Alexandre Julliard

iphlpapi: Implement IfGetEntry2Ex() on top of nsi.

parent f41f028c
......@@ -89,6 +89,7 @@
@ stub GetIcmpStatsFromStack
@ stdcall GetIfEntry( ptr )
@ stdcall GetIfEntry2( ptr )
@ stdcall GetIfEntry2Ex( long ptr )
@ stub GetIfEntryFromStack
#@ stub GetIfStackTable
@ stdcall GetIfTable( ptr ptr long )
......
......@@ -1778,61 +1778,6 @@ DWORD WINAPI GetIfEntry(PMIB_IFROW pIfRow)
return ret;
}
/******************************************************************
* GetIfEntry2 (IPHLPAPI.@)
*/
DWORD WINAPI GetIfEntry2( MIB_IF_ROW2 *row2 )
{
DWORD ret;
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->InterfaceIndex = row.dwIndex;
ConvertInterfaceIndexToLuid( row2->InterfaceIndex, &row2->InterfaceLuid );
ConvertInterfaceLuidToGuid( &row2->InterfaceLuid, &row2->InterfaceGuid );
row2->Type = row.dwType;
row2->Mtu = row.dwMtu;
MultiByteToWideChar( CP_UNIXCP, 0, (const char *)row.bDescr, -1, row2->Description, ARRAY_SIZE(row2->Description) );
MultiByteToWideChar( CP_UNIXCP, 0, (const char *)row.bDescr, -1, row2->Alias, ARRAY_SIZE(row2->Alias) );
row2->PhysicalAddressLength = row.dwPhysAddrLen;
memcpy( &row2->PhysicalAddress, &row.bPhysAddr, row.dwPhysAddrLen );
memcpy( &row2->PermanentPhysicalAddress, &row.bPhysAddr, row.dwPhysAddrLen );
row2->OperStatus = row.dwOperStatus == MIB_IF_OPER_STATUS_OPERATIONAL ? IfOperStatusUp : IfOperStatusDown;
row2->AdminStatus = NET_IF_ADMIN_STATUS_UP;
row2->MediaConnectState = MediaConnectStateConnected;
row2->ConnectionType = NET_IF_CONNECTION_DEDICATED;
row2->TransmitLinkSpeed = row2->ReceiveLinkSpeed = row.dwSpeed;
row2->AccessType = (row2->Type == MIB_IF_TYPE_LOOPBACK) ? NET_IF_ACCESS_LOOPBACK : NET_IF_ACCESS_BROADCAST;
row2->InterfaceAndOperStatusFlags.ConnectorPresent = row2->Type != MIB_IF_TYPE_LOOPBACK;
row2->InterfaceAndOperStatusFlags.HardwareInterface = row2->Type != MIB_IF_TYPE_LOOPBACK;
/* 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)
{
int ret;
......@@ -1983,6 +1928,43 @@ static void if_row2_fill( MIB_IF_ROW2 *row, struct nsi_ndis_ifinfo_rw *rw, struc
}
/******************************************************************
* GetIfEntry2Ex (IPHLPAPI.@)
*/
DWORD WINAPI GetIfEntry2Ex( MIB_IF_TABLE_LEVEL level, MIB_IF_ROW2 *row )
{
DWORD err;
struct nsi_ndis_ifinfo_rw rw;
struct nsi_ndis_ifinfo_dynamic dyn;
struct nsi_ndis_ifinfo_static stat;
TRACE( "(%d, %p)\n", level, row );
if (level != MibIfTableNormal) FIXME( "level %u not fully supported\n", level );
if (!row) return ERROR_INVALID_PARAMETER;
if (!row->InterfaceLuid.Value)
{
if (!row->InterfaceIndex) return ERROR_INVALID_PARAMETER;
err = ConvertInterfaceIndexToLuid( row->InterfaceIndex, &row->InterfaceLuid );
if (err) return err;
}
err = NsiGetAllParameters( 1, &NPI_MS_NDIS_MODULEID, NSI_NDIS_IFINFO_TABLE,
&row->InterfaceLuid, sizeof(row->InterfaceLuid),
&rw, sizeof(rw), &dyn, sizeof(dyn), &stat, sizeof(stat) );
if (!err) if_row2_fill( row, &rw, &dyn, &stat );
return err;
}
/******************************************************************
* GetIfEntry2 (IPHLPAPI.@)
*/
DWORD WINAPI GetIfEntry2( MIB_IF_ROW2 *row )
{
return GetIfEntry2Ex( MibIfTableNormal, row );
}
/******************************************************************
* GetIfTable2Ex (IPHLPAPI.@)
*/
DWORD WINAPI GetIfTable2Ex( MIB_IF_TABLE_LEVEL level, MIB_IF_TABLE2 **table )
......
......@@ -53,9 +53,6 @@
static HMODULE hLibrary = NULL;
static DWORD (WINAPI *pAllocateAndGetTcpExTableFromStack)(void**,BOOL,HANDLE,DWORD,DWORD);
static DWORD (WINAPI *pGetIfEntry2)(PMIB_IF_ROW2);
static DWORD (WINAPI *pGetIfTable2)(PMIB_IF_TABLE2*);
static DWORD (WINAPI *pGetIfTable2Ex)(MIB_IF_TABLE_LEVEL,PMIB_IF_TABLE2*);
static DWORD (WINAPI *pGetTcp6Table)(PMIB_TCP6TABLE,PDWORD,BOOL);
static DWORD (WINAPI *pGetUdp6Table)(PMIB_UDP6TABLE,PDWORD,BOOL);
static DWORD (WINAPI *pGetUnicastIpAddressEntry)(MIB_UNICASTIPADDRESS_ROW*);
......@@ -64,7 +61,6 @@ static DWORD (WINAPI *pGetExtendedTcpTable)(PVOID,PDWORD,BOOL,ULONG,TCP_TABLE_CL
static DWORD (WINAPI *pGetExtendedUdpTable)(PVOID,PDWORD,BOOL,ULONG,UDP_TABLE_CLASS,ULONG);
static DWORD (WINAPI *pCreateSortedAddressPairs)(const PSOCKADDR_IN6,ULONG,const PSOCKADDR_IN6,ULONG,ULONG,
PSOCKADDR_IN6_PAIR*,ULONG*);
static void (WINAPI *pFreeMibTable)(void*);
static DWORD (WINAPI *pConvertLengthToIpv4Mask)(ULONG,ULONG*);
static DWORD (WINAPI *pParseNetworkString)(const WCHAR*,DWORD,NET_ADDRESS_INFO*,USHORT*,BYTE*);
static DWORD (WINAPI *pNotifyUnicastIpAddressChange)(ADDRESS_FAMILY, PUNICAST_IPADDRESS_CHANGE_CALLBACK,
......@@ -76,9 +72,6 @@ static void loadIPHlpApi(void)
hLibrary = LoadLibraryA("iphlpapi.dll");
if (hLibrary) {
pAllocateAndGetTcpExTableFromStack = (void *)GetProcAddress(hLibrary, "AllocateAndGetTcpExTableFromStack");
pGetIfEntry2 = (void *)GetProcAddress(hLibrary, "GetIfEntry2");
pGetIfTable2 = (void *)GetProcAddress(hLibrary, "GetIfTable2");
pGetIfTable2Ex = (void *)GetProcAddress(hLibrary, "GetIfTable2Ex");
pGetTcp6Table = (void *)GetProcAddress(hLibrary, "GetTcp6Table");
pGetUdp6Table = (void *)GetProcAddress(hLibrary, "GetUdp6Table");
pGetUnicastIpAddressEntry = (void *)GetProcAddress(hLibrary, "GetUnicastIpAddressEntry");
......@@ -86,7 +79,6 @@ static void loadIPHlpApi(void)
pGetExtendedTcpTable = (void *)GetProcAddress(hLibrary, "GetExtendedTcpTable");
pGetExtendedUdpTable = (void *)GetProcAddress(hLibrary, "GetExtendedUdpTable");
pCreateSortedAddressPairs = (void *)GetProcAddress(hLibrary, "CreateSortedAddressPairs");
pFreeMibTable = (void *)GetProcAddress(hLibrary, "FreeMibTable");
pConvertLengthToIpv4Mask = (void *)GetProcAddress(hLibrary, "ConvertLengthToIpv4Mask");
pParseNetworkString = (void *)GetProcAddress(hLibrary, "ParseNetworkString");
pNotifyUnicastIpAddressChange = (void *)GetProcAddress(hLibrary, "NotifyUnicastIpAddressChange");
......@@ -1576,7 +1568,7 @@ static void test_CreateSortedAddressPairs(void)
ok( pair_count >= 1, "got %u\n", pair_count );
ok( pair[0].SourceAddress != NULL, "src address not set\n" );
ok( pair[0].DestinationAddress != NULL, "dst address not set\n" );
pFreeMibTable( pair );
FreeMibTable( pair );
dst[1].sin6_family = AF_INET6;
dst[1].sin6_addr.u.Word[5] = 0xffff;
......@@ -1593,7 +1585,7 @@ static void test_CreateSortedAddressPairs(void)
ok( pair[0].DestinationAddress != NULL, "dst address not set\n" );
ok( pair[1].SourceAddress != NULL, "src address not set\n" );
ok( pair[1].DestinationAddress != NULL, "dst address not set\n" );
pFreeMibTable( pair );
FreeMibTable( pair );
}
static DWORD get_interface_index(void)
......@@ -1862,27 +1854,22 @@ static void test_GetIfEntry2(void)
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 );
ret = GetIfEntry2( NULL );
ok( ret == ERROR_INVALID_PARAMETER, "got %u\n", ret );
memset( &row, 0, sizeof(row) );
ret = pGetIfEntry2( &row );
ret = GetIfEntry2( &row );
ok( ret == ERROR_INVALID_PARAMETER, "got %u\n", ret );
memset( &row, 0, sizeof(row) );
row.InterfaceIndex = index;
ret = pGetIfEntry2( &row );
ret = GetIfEntry2( &row );
ok( ret == NO_ERROR, "got %u\n", ret );
ok( row.InterfaceIndex == index, "got %u\n", index );
}
......@@ -1892,17 +1879,11 @@ static void test_GetIfTable2(void)
DWORD ret;
MIB_IF_TABLE2 *table;
if (!pGetIfTable2)
{
win_skip( "GetIfTable2 not available\n" );
return;
}
table = NULL;
ret = pGetIfTable2( &table );
ret = GetIfTable2( &table );
ok( ret == NO_ERROR, "got %u\n", ret );
ok( table != NULL, "table not set\n" );
pFreeMibTable( table );
FreeMibTable( table );
}
static void test_GetIfTable2Ex(void)
......@@ -1910,35 +1891,29 @@ 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 );
ret = GetIfTable2Ex( MibIfTableNormal, &table );
ok( ret == NO_ERROR, "got %u\n", ret );
ok( table != NULL, "table not set\n" );
pFreeMibTable( table );
FreeMibTable( table );
table = NULL;
ret = pGetIfTable2Ex( MibIfTableRaw, &table );
ret = GetIfTable2Ex( MibIfTableRaw, &table );
ok( ret == NO_ERROR, "got %u\n", ret );
ok( table != NULL, "table not set\n" );
pFreeMibTable( table );
FreeMibTable( table );
table = NULL;
ret = pGetIfTable2Ex( MibIfTableNormalWithoutStatistics, &table );
ret = GetIfTable2Ex( MibIfTableNormalWithoutStatistics, &table );
ok( ret == NO_ERROR || broken(ret == ERROR_INVALID_PARAMETER), "got %u\n", ret );
ok( table != NULL || broken(!table), "table not set\n" );
pFreeMibTable( table );
FreeMibTable( table );
table = NULL;
ret = pGetIfTable2Ex( 3, &table );
ret = GetIfTable2Ex( 3, &table );
ok( ret == ERROR_INVALID_PARAMETER, "got %u\n", ret );
ok( !table, "table should not be set\n" );
pFreeMibTable( table );
FreeMibTable( table );
}
static void test_GetUnicastIpAddressEntry(void)
......@@ -2070,12 +2045,12 @@ static void test_GetUnicastIpAddressTable(void)
ret = pGetUnicastIpAddressTable(AF_INET, &table);
ok( ret == NO_ERROR, "got %u\n", ret );
trace("GetUnicastIpAddressTable(AF_INET): NumEntries %u\n", table->NumEntries);
pFreeMibTable(table);
FreeMibTable( table );
ret = pGetUnicastIpAddressTable(AF_INET6, &table);
ok( ret == NO_ERROR, "got %u\n", ret );
trace("GetUnicastIpAddressTable(AF_INET6): NumEntries %u\n", table->NumEntries);
pFreeMibTable(table);
FreeMibTable( table );
ret = pGetUnicastIpAddressTable(AF_UNSPEC, &table);
ok( ret == NO_ERROR, "got %u\n", ret );
......@@ -2099,7 +2074,7 @@ static void test_GetUnicastIpAddressTable(void)
trace("CreationTimeStamp: %08x%08x\n", table->Table[i].CreationTimeStamp.HighPart, table->Table[i].CreationTimeStamp.LowPart);
}
pFreeMibTable(table);
FreeMibTable( table );
}
static void test_ConvertLengthToIpv4Mask(void)
......
......@@ -251,7 +251,9 @@ DWORD WINAPI ConvertInterfaceNameToLuidW(const WCHAR*,NET_LUID*);
DWORD WINAPI ConvertLengthToIpv4Mask(ULONG,ULONG*);
void WINAPI FreeMibTable(void*);
DWORD WINAPI GetIfEntry2(MIB_IF_ROW2*);
DWORD WINAPI GetIfEntry2Ex(MIB_IF_TABLE_LEVEL,MIB_IF_ROW2*);
DWORD WINAPI GetIfTable2(MIB_IF_TABLE2**);
DWORD WINAPI GetIfTable2Ex(MIB_IF_TABLE_LEVEL,MIB_IF_TABLE2**);
DWORD WINAPI GetIpInterfaceTable(ADDRESS_FAMILY,MIB_IPINTERFACE_TABLE**);
DWORD WINAPI GetUnicastIpAddressEntry(MIB_UNICASTIPADDRESS_ROW*);
PCHAR WINAPI if_indextoname(NET_IFINDEX,PCHAR);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment