https://git.reactos.org/?p=reactos.git;a=commitdiff;h=559297fe818147587aa00…
commit 559297fe818147587aa00a6062ebf0bee2e091f2
Author: Pierre Schweitzer <pierre(a)reactos.org>
AuthorDate: Tue Nov 27 22:38:21 2018 +0100
Commit: Pierre Schweitzer <pierre(a)reactos.org>
CommitDate: Tue Nov 27 23:12:56 2018 +0100
[IPHLPAPI] Implement getOwnerModUdpTable() and getOwnerModTcpTable()
These allow to enumerate UDP and TCP connections with module information
---
dll/win32/iphlpapi/ipstats_reactos.c | 122 +++++++++++++++++++++++++++++++++++
1 file changed, 122 insertions(+)
diff --git a/dll/win32/iphlpapi/ipstats_reactos.c b/dll/win32/iphlpapi/ipstats_reactos.c
index 8c1c842c9c..f26c43a4fe 100644
--- a/dll/win32/iphlpapi/ipstats_reactos.c
+++ b/dll/win32/iphlpapi/ipstats_reactos.c
@@ -761,6 +761,67 @@ PMIB_UDPTABLE_OWNER_PID getOwnerUdpTable(void)
return IpOwnerUdpTable;
}
+PMIB_UDPTABLE_OWNER_MODULE getOwnerModUdpTable(void)
+{
+ DWORD numEntities, returnSize;
+ TDIEntityID *entitySet;
+ HANDLE tcpFile;
+ int i, totalNumber, TmpIdx, CurrIdx = 0;
+ NTSTATUS status;
+ PMIB_UDPTABLE_OWNER_MODULE IpOwnerModUdpTable = NULL;
+ PMIB_UDPROW_OWNER_MODULE AdapterOwnerModUdpTable = NULL;
+
+ TRACE("called.\n");
+
+ totalNumber = getNumUdpEntries();
+
+ status = openTcpFile( &tcpFile, FILE_READ_DATA );
+ if( !NT_SUCCESS(status) ) {
+ ERR("openTcpFile returned 0x%08lx\n", status);
+ return 0;
+ }
+
+ IpOwnerModUdpTable = HeapAlloc
+ ( GetProcessHeap(), 0,
+ sizeof(DWORD) + (sizeof(MIB_UDPROW_OWNER_MODULE) * totalNumber) );
+ if (!IpOwnerModUdpTable) {
+ closeTcpFile(tcpFile);
+ return NULL;
+ }
+
+ status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities );
+
+ for( i = 0; i < numEntities; i++ ) {
+ if( entitySet[i].tei_entity == CL_TL_ENTITY &&
+ hasArp( tcpFile, &entitySet[i] ) ) {
+
+ status = tdiGetSetOfThings( tcpFile,
+ INFO_CLASS_PROTOCOL,
+ INFO_TYPE_PROVIDER,
+ IP_SPECIFIC_MODULE_ENTRY_ID,
+ CL_TL_ENTITY,
+ entitySet[i].tei_instance,
+ 0,
+ sizeof(MIB_UDPROW_OWNER_MODULE),
+ (PVOID *)&AdapterOwnerModUdpTable,
+ &returnSize );
+
+ if( status == STATUS_SUCCESS ) {
+ for( TmpIdx = 0; TmpIdx < returnSize; TmpIdx++, CurrIdx++ )
+ IpOwnerModUdpTable->table[CurrIdx] =
AdapterOwnerModUdpTable[TmpIdx];
+ tdiFreeThingSet( AdapterOwnerModUdpTable );
+ }
+ }
+ }
+
+ closeTcpFile( tcpFile );
+
+ tdiFreeThingSet( entitySet );
+ IpOwnerModUdpTable->dwNumEntries = CurrIdx;
+
+ return IpOwnerModUdpTable;
+}
+
DWORD getNumTcpEntries(void)
{
DWORD numEntities;
@@ -931,3 +992,64 @@ PMIB_TCPTABLE_OWNER_PID getOwnerTcpTable(void)
return IpOwnerTcpTable;
}
+
+PMIB_TCPTABLE_OWNER_MODULE getOwnerModTcpTable(void)
+{
+ DWORD numEntities, returnSize;
+ TDIEntityID *entitySet;
+ HANDLE tcpFile;
+ int i, totalNumber, TmpIdx, CurrIdx = 0;
+ NTSTATUS status;
+ PMIB_TCPTABLE_OWNER_MODULE IpOwnerModTcpTable = NULL;
+ PMIB_TCPROW_OWNER_MODULE AdapterOwnerModTcpTable = 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;
+ }
+
+ IpOwnerModTcpTable = HeapAlloc
+ ( GetProcessHeap(), 0,
+ sizeof(DWORD) + (sizeof(PMIB_TCPROW_OWNER_MODULE) * totalNumber) );
+ if (!IpOwnerModTcpTable) {
+ closeTcpFile(tcpFile);
+ return NULL;
+ }
+
+ status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities );
+
+ for( i = 0; i < numEntities; i++ ) {
+ if( entitySet[i].tei_entity == CO_TL_ENTITY &&
+ hasArp( tcpFile, &entitySet[i] ) ) {
+
+ status = tdiGetSetOfThings( tcpFile,
+ INFO_CLASS_PROTOCOL,
+ INFO_TYPE_PROVIDER,
+ IP_SPECIFIC_MODULE_ENTRY_ID,
+ CO_TL_ENTITY,
+ entitySet[i].tei_instance,
+ 0,
+ sizeof(PMIB_TCPROW_OWNER_MODULE),
+ (PVOID *)&AdapterOwnerModTcpTable,
+ &returnSize );
+
+ if( status == STATUS_SUCCESS ) {
+ for( TmpIdx = 0; TmpIdx < returnSize; TmpIdx++, CurrIdx++ )
+ IpOwnerModTcpTable->table[CurrIdx] =
AdapterOwnerModTcpTable[TmpIdx];
+ tdiFreeThingSet( AdapterOwnerModTcpTable );
+ }
+ }
+ }
+
+ closeTcpFile( tcpFile );
+
+ tdiFreeThingSet( entitySet );
+ IpOwnerModTcpTable->dwNumEntries = CurrIdx;
+
+ return IpOwnerModTcpTable;
+}