https://git.reactos.org/?p=reactos.git;a=commitdiff;h=678204790cc57ebf74d60…
commit 678204790cc57ebf74d60791c869b3957dd003a9
Author: Pierre Schweitzer <pierre(a)reactos.org>
AuthorDate: Sun Nov 18 16:00:54 2018 +0100
Commit: Pierre Schweitzer <pierre(a)reactos.org>
CommitDate: Sun Nov 18 16:30:45 2018 +0100
[IPHLPAPI] Implement getNumTcpEntries() and getTcpTable()
CORE-5401
---
dll/win32/iphlpapi/ipstats_reactos.c | 104 ++++++++++++++++++++++++++++++++++-
1 file changed, 102 insertions(+), 2 deletions(-)
diff --git a/dll/win32/iphlpapi/ipstats_reactos.c b/dll/win32/iphlpapi/ipstats_reactos.c
index a886931a8b..d8ca932d9d 100644
--- a/dll/win32/iphlpapi/ipstats_reactos.c
+++ b/dll/win32/iphlpapi/ipstats_reactos.c
@@ -649,10 +649,110 @@ PMIB_UDPTABLE getUdpTable(void)
DWORD getNumTcpEntries(void)
{
- return getNumWithOneHeader("/proc/net/tcp");
+ DWORD numEntities;
+ TDIEntityID *entitySet = NULL;
+ HANDLE tcpFile;
+ int i, totalNumber = 0;
+ NTSTATUS status;
+ PMIB_TCPROW IpTcpTable = NULL;
+ DWORD returnSize;
+
+ TRACE("called.\n");
+
+ status = openTcpFile( &tcpFile, FILE_READ_DATA );
+ if( !NT_SUCCESS(status) ) {
+ ERR("openTcpFile returned 0x%08lx\n", status);
+ return 0;
+ }
+
+ status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities );
+
+ for( i = 0; i < numEntities; i++ ) {
+ if( isInterface( &entitySet[i] ) &&
+ hasArp( tcpFile, &entitySet[i] ) ) {
+
+ status = tdiGetSetOfThings( tcpFile,
+ INFO_CLASS_PROTOCOL,
+ INFO_TYPE_PROVIDER,
+ IP_MIB_ARPTABLE_ENTRY_ID,
+ CO_TL_ENTITY,
+ entitySet[i].tei_instance,
+ 0,
+ sizeof(MIB_TCPROW),
+ (PVOID *)&IpTcpTable,
+ &returnSize );
+
+ if( status == STATUS_SUCCESS ) totalNumber += returnSize;
+ if( IpTcpTable ) {
+ tdiFreeThingSet( IpTcpTable );
+ IpTcpTable = NULL;
+ }
+ }
+ }
+
+ closeTcpFile( tcpFile );
+ if( IpTcpTable ) tdiFreeThingSet( IpTcpTable );
+ if( entitySet ) tdiFreeThingSet( entitySet );
+ return totalNumber;
}
PMIB_TCPTABLE getTcpTable(void)
{
- return 0;
+ DWORD numEntities, returnSize;
+ TDIEntityID *entitySet;
+ HANDLE tcpFile;
+ int i, totalNumber, TmpIdx, CurrIdx = 0;
+ NTSTATUS status;
+ PMIB_TCPTABLE IpTcpTable = NULL;
+ PMIB_TCPROW AdapterTcpTable = NULL;
+
+ TRACE("called.\n");
+
+ totalNumber = getNumTcpEntries();
+
+ status = openTcpFile( &tcpFile, FILE_READ_DATA );
+ if( !NT_SUCCESS(status) ) {
+ ERR("openTcpFile returned 0x%08lx\n", status);
+ return 0;
+ }
+
+ IpTcpTable = HeapAlloc
+ ( GetProcessHeap(), 0,
+ sizeof(DWORD) + (sizeof(MIB_TCPROW) * totalNumber) );
+ if (!IpTcpTable) {
+ closeTcpFile(tcpFile);
+ return NULL;
+ }
+
+ status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities );
+
+ for( i = 0; i < numEntities; i++ ) {
+ if( isInterface( &entitySet[i] ) &&
+ hasArp( tcpFile, &entitySet[i] ) ) {
+
+ status = tdiGetSetOfThings( tcpFile,
+ INFO_CLASS_PROTOCOL,
+ INFO_TYPE_PROVIDER,
+ IP_MIB_ARPTABLE_ENTRY_ID,
+ CO_TL_ENTITY,
+ entitySet[i].tei_instance,
+ 0,
+ sizeof(MIB_TCPROW),
+ (PVOID *)&AdapterTcpTable,
+ &returnSize );
+
+ if( status == STATUS_SUCCESS ) {
+ for( TmpIdx = 0; TmpIdx < returnSize; TmpIdx++, CurrIdx++ )
+ IpTcpTable->table[CurrIdx] = AdapterTcpTable[TmpIdx];
+ tdiFreeThingSet( AdapterTcpTable );
+ }
+ }
+ }
+
+ closeTcpFile( tcpFile );
+
+ tdiFreeThingSet( entitySet );
+ IpTcpTable->dwNumEntries = CurrIdx;
+
+ return IpTcpTable;
}