Huw Davies : iphlpapi: Implement GetTcpTable2() and GetTcp6Table2().
Alexandre Julliard
julliard at winehq.org
Tue Aug 17 16:26:51 CDT 2021
Module: wine
Branch: master
Commit: f535ab7197e41e1e1301d032f862094da9559000
URL: https://source.winehq.org/git/wine.git/?a=commit;h=f535ab7197e41e1e1301d032f862094da9559000
Author: Huw Davies <huw at codeweavers.com>
Date: Tue Aug 17 09:27:16 2021 +0100
iphlpapi: Implement GetTcpTable2() and GetTcp6Table2().
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/iphlpapi/iphlpapi_main.c | 76 +++++++++++++++++++++++++++++++++----------
1 file changed, 58 insertions(+), 18 deletions(-)
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index 5595088e093..65a72379e60 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -2870,6 +2870,8 @@ DWORD WINAPI GetTcpStatisticsEx( MIB_TCPSTATS *stats, DWORD family )
return err;
}
+#define TCP_TABLE2 ~0u /* Internal tcp table for GetTcp(6)Table2() */
+
static DWORD tcp_table_id( ULONG table_class )
{
switch (table_class)
@@ -2887,6 +2889,7 @@ static DWORD tcp_table_id( ULONG table_class )
case TCP_TABLE_BASIC_ALL:
case TCP_TABLE_OWNER_PID_ALL:
case TCP_TABLE_OWNER_MODULE_ALL:
+ case TCP_TABLE2:
return NSI_TCP_ALL_TABLE;
default:
@@ -2920,6 +2923,11 @@ static DWORD tcp_table_size( ULONG family, ULONG table_class, DWORD row_count, D
return (family == WS_AF_INET) ? FIELD_OFFSET(MIB_TCPTABLE_OWNER_MODULE, table[row_count]) :
FIELD_OFFSET(MIB_TCP6TABLE_OWNER_MODULE, table[row_count]);
+ case TCP_TABLE2:
+ *row_size = (family == WS_AF_INET) ? sizeof(MIB_TCPROW2) : sizeof(MIB_TCP6ROW2);
+ return (family == WS_AF_INET) ? FIELD_OFFSET(MIB_TCPTABLE2, table[row_count]) :
+ FIELD_OFFSET(MIB_TCP6TABLE2, table[row_count]);
+
default:
ERR( "unhandled class %u\n", table_class );
return 0;
@@ -2975,6 +2983,18 @@ static void tcp_row_fill( void *table, DWORD num, ULONG family, ULONG table_clas
memset( row->OwningModuleInfo + 1, 0, sizeof(row->OwningModuleInfo) - sizeof(row->OwningModuleInfo[0]) );
return;
}
+ case TCP_TABLE2:
+ {
+ MIB_TCPROW2 *row = ((MIB_TCPTABLE2 *)table)->table + num;
+ row->dwState = dyn->state;
+ row->dwLocalAddr = key->local.Ipv4.sin_addr.WS_s_addr;
+ row->dwLocalPort = key->local.Ipv4.sin_port;
+ row->dwRemoteAddr = key->remote.Ipv4.sin_addr.WS_s_addr;
+ row->dwRemotePort = key->remote.Ipv4.sin_port;
+ row->dwOwningPid = stat->pid;
+ row->dwOffloadState = 0; /* FIXME */
+ return;
+ }
default:
ERR( "Unknown class %d\n", table_class );
return;
@@ -3031,6 +3051,20 @@ static void tcp_row_fill( void *table, DWORD num, ULONG family, ULONG table_clas
memset( row->OwningModuleInfo + 1, 0, sizeof(row->OwningModuleInfo) - sizeof(row->OwningModuleInfo[0]) );
return;
}
+ case TCP_TABLE2:
+ {
+ MIB_TCP6ROW2 *row = ((MIB_TCP6TABLE2 *)table)->table + num;
+ memcpy( &row->LocalAddr, &key->local.Ipv6.sin6_addr, sizeof(row->LocalAddr) );
+ row->dwLocalScopeId = key->local.Ipv6.sin6_scope_id;
+ row->dwLocalPort = key->local.Ipv6.sin6_port;
+ memcpy( &row->RemoteAddr, &key->remote.Ipv6.sin6_addr, sizeof(row->RemoteAddr) );
+ row->dwRemoteScopeId = key->remote.Ipv6.sin6_scope_id;
+ row->dwRemotePort = key->remote.Ipv6.sin6_port;
+ row->State = dyn->state;
+ row->dwOwningPid = stat->pid;
+ row->dwOffloadState = 0; /* FIXME */
+ return;
+ }
default:
ERR( "Unknown class %d\n", table_class );
return;
@@ -3079,6 +3113,12 @@ static int tcp6_row_owner_cmp( const void *a, const void *b )
return RtlUshortByteSwap( rowA->dwRemotePort ) - RtlUshortByteSwap( rowB->dwRemotePort );
}
+/*************************************************************************************
+ * get_extended_tcp_table
+ *
+ * Implementation of GetExtendedTcpTable() which additionally handles TCP_TABLE2
+ * corresponding to GetTcp(6)Table2()
+ */
DWORD get_extended_tcp_table( void *table, DWORD *size, BOOL sort, ULONG family, ULONG table_class )
{
DWORD err, count, needed, i, num = 0, row_size = 0;
@@ -3182,6 +3222,24 @@ ULONG WINAPI GetTcp6Table( MIB_TCP6TABLE *table, ULONG *size, BOOL sort )
return get_extended_tcp_table( table, size, sort, WS_AF_INET6, TCP_TABLE_BASIC_ALL );
}
+/******************************************************************
+ * GetTcpTable2 (IPHLPAPI.@)
+ */
+ULONG WINAPI GetTcpTable2( MIB_TCPTABLE2 *table, ULONG *size, BOOL sort )
+{
+ TRACE( "table %p, size %p, sort %d\n", table, size, sort );
+ return get_extended_tcp_table( table, size, sort, WS_AF_INET, TCP_TABLE2 );
+}
+
+/******************************************************************
+ * GetTcp6Table2 (IPHLPAPI.@)
+ */
+ULONG WINAPI GetTcp6Table2( MIB_TCP6TABLE2 *table, ULONG *size, BOOL sort )
+{
+ TRACE( "table %p, size %p, sort %d\n", table, size, sort );
+ return get_extended_tcp_table( table, size, sort, WS_AF_INET6, TCP_TABLE2 );
+}
+
/******************************************************************
* GetUdpTable (IPHLPAPI.@)
*
@@ -3812,24 +3870,6 @@ DWORD WINAPI PfBindInterfaceToIPAddress(INTERFACE_HANDLE interface, PFADDRESSTYP
return ERROR_CALL_NOT_IMPLEMENTED;
}
-/******************************************************************
- * GetTcpTable2 (IPHLPAPI.@)
- */
-ULONG WINAPI GetTcpTable2(PMIB_TCPTABLE2 table, PULONG size, BOOL order)
-{
- FIXME("pTcpTable2 %p, pdwSize %p, bOrder %d: stub\n", table, size, order);
- return ERROR_NOT_SUPPORTED;
-}
-
-/******************************************************************
- * GetTcp6Table2 (IPHLPAPI.@)
- */
-ULONG WINAPI GetTcp6Table2(PMIB_TCP6TABLE2 table, PULONG size, BOOL order)
-{
- FIXME("pTcp6Table2 %p, size %p, order %d: stub\n", table, size, order);
- return ERROR_NOT_SUPPORTED;
-}
-
/******************************************************************
* ConvertInterfaceAliasToLuid (IPHLPAPI.@)
*/
More information about the wine-cvs
mailing list