https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3da13042eafa553f9f624f...
commit 3da13042eafa553f9f624f2dcf414c28359092ca Author: Joachim Henze joachim.henze@reactos.org AuthorDate: Thu Jul 6 18:23:17 2023 +0200 Commit: GitHub noreply@github.com CommitDate: Thu Jul 6 18:23:17 2023 +0200
[NETSTAT] Less heap allocations (#5409)
- Avoid the heap in ShowIpStatistics() and ShowIcmpStatistics() to simplify the code, inspired by how we do it in ShowTcpStatistics() and ShowUdpStatistics() already - Strip 2 Captain-Obvious-Comments
For the record: Retrieving ICMP-stats and IP-stats does not work properly in ReactOS yet, neither with nor without my fix. Lower layers are most likely wrong still somehow. But netstat itself can properly obtain ICMP-stats and IP-stats in Windows already. --- base/applications/network/netstat/netstat.c | 84 ++++++++++++----------------- 1 file changed, 35 insertions(+), 49 deletions(-)
diff --git a/base/applications/network/netstat/netstat.c b/base/applications/network/netstat/netstat.c index c4449add815..22ab9385c09 100644 --- a/base/applications/network/netstat/netstat.c +++ b/base/applications/network/netstat/netstat.c @@ -6,7 +6,7 @@ */ /* * TODO: - * implement -b, -t and -v + * implement -b, -t, -v * clean up GetIpHostName */
@@ -58,9 +58,6 @@ VOID DoFormatMessage(DWORD ErrorCode) NULL, ErrorCode, LANG_USER_DEFAULT); }
-/* - * Display table header - */ VOID DisplayTableHeader(VOID) { ConResPuts(StdOut, IDS_ACTIVE_CONNECT); @@ -166,9 +163,6 @@ StopParsingAndShowUsageHelp: return TRUE; }
-/* - * Simulate Microsofts netstat utility output - */ BOOL DisplayOutput(VOID) { if (bNoOptions) @@ -239,84 +233,76 @@ BOOL DisplayOutput(VOID)
VOID ShowIpStatistics(VOID) { - PMIB_IPSTATS pIpStats; + MIB_IPSTATS IpStats; DWORD dwRetVal;
- pIpStats = (MIB_IPSTATS*)HeapAlloc(GetProcessHeap(), 0, sizeof(MIB_IPSTATS)); - - if ((dwRetVal = GetIpStatistics(pIpStats)) == NO_ERROR) + if ((dwRetVal = GetIpStatistics(&IpStats)) == NO_ERROR) { ConResPuts(StdOut, IDS_IP4_STAT_HEADER); - ConResPrintf(StdOut, IDS_IP_PACK_REC, pIpStats->dwInReceives); - ConResPrintf(StdOut, IDS_IP_HEAD_REC_ERROR, pIpStats->dwInHdrErrors); - ConResPrintf(StdOut, IDS_IP_ADDR_REC_ERROR, pIpStats->dwInAddrErrors); - ConResPrintf(StdOut, IDS_IP_DATAG_FWD, pIpStats->dwForwDatagrams); - ConResPrintf(StdOut, IDS_IP_UNKNOWN_PRO_REC, pIpStats->dwInUnknownProtos); - ConResPrintf(StdOut, IDS_IP_REC_PACK_DISCARD, pIpStats->dwInDiscards); - ConResPrintf(StdOut, IDS_IP_REC_PACK_DELIVER, pIpStats->dwInDelivers); - ConResPrintf(StdOut, IDS_IP_OUT_REQUEST, pIpStats->dwOutRequests); - ConResPrintf(StdOut, IDS_IP_ROUTE_DISCARD, pIpStats->dwRoutingDiscards); - ConResPrintf(StdOut, IDS_IP_DISCARD_OUT_PACK, pIpStats->dwOutDiscards); - ConResPrintf(StdOut, IDS_IP_OUT_PACKET_NO_ROUTE, pIpStats->dwOutNoRoutes); - ConResPrintf(StdOut, IDS_IP_REASSEMBLE_REQUIRED, pIpStats->dwReasmReqds); - ConResPrintf(StdOut, IDS_IP_REASSEMBLE_SUCCESS, pIpStats->dwReasmOks); - ConResPrintf(StdOut, IDS_IP_REASSEMBLE_FAILURE, pIpStats->dwReasmFails); - ConResPrintf(StdOut, IDS_IP_DATAG_FRAG_SUCCESS, pIpStats->dwFragOks); - ConResPrintf(StdOut, IDS_IP_DATAG_FRAG_FAILURE, pIpStats->dwFragFails); - ConResPrintf(StdOut, IDS_IP_DATAG_FRAG_CREATE, pIpStats->dwFragCreates); + ConResPrintf(StdOut, IDS_IP_PACK_REC, IpStats.dwInReceives); + ConResPrintf(StdOut, IDS_IP_HEAD_REC_ERROR, IpStats.dwInHdrErrors); + ConResPrintf(StdOut, IDS_IP_ADDR_REC_ERROR, IpStats.dwInAddrErrors); + ConResPrintf(StdOut, IDS_IP_DATAG_FWD, IpStats.dwForwDatagrams); + ConResPrintf(StdOut, IDS_IP_UNKNOWN_PRO_REC, IpStats.dwInUnknownProtos); + ConResPrintf(StdOut, IDS_IP_REC_PACK_DISCARD, IpStats.dwInDiscards); + ConResPrintf(StdOut, IDS_IP_REC_PACK_DELIVER, IpStats.dwInDelivers); + ConResPrintf(StdOut, IDS_IP_OUT_REQUEST, IpStats.dwOutRequests); + ConResPrintf(StdOut, IDS_IP_ROUTE_DISCARD, IpStats.dwRoutingDiscards); + ConResPrintf(StdOut, IDS_IP_DISCARD_OUT_PACK, IpStats.dwOutDiscards); + ConResPrintf(StdOut, IDS_IP_OUT_PACKET_NO_ROUTE, IpStats.dwOutNoRoutes); + ConResPrintf(StdOut, IDS_IP_REASSEMBLE_REQUIRED, IpStats.dwReasmReqds); + ConResPrintf(StdOut, IDS_IP_REASSEMBLE_SUCCESS, IpStats.dwReasmOks); + ConResPrintf(StdOut, IDS_IP_REASSEMBLE_FAILURE, IpStats.dwReasmFails); + ConResPrintf(StdOut, IDS_IP_DATAG_FRAG_SUCCESS, IpStats.dwFragOks); + ConResPrintf(StdOut, IDS_IP_DATAG_FRAG_FAILURE, IpStats.dwFragFails); + ConResPrintf(StdOut, IDS_IP_DATAG_FRAG_CREATE, IpStats.dwFragCreates); } else { DoFormatMessage(dwRetVal); } - - HeapFree(GetProcessHeap(), 0, pIpStats); }
VOID ShowIcmpStatistics(VOID) { - PMIB_ICMP pIcmpStats; + MIB_ICMP IcmpStats; DWORD dwRetVal;
- pIcmpStats = (MIB_ICMP*)HeapAlloc(GetProcessHeap(), 0, sizeof(MIB_ICMP)); - - if ((dwRetVal = GetIcmpStatistics(pIcmpStats)) == NO_ERROR) + if ((dwRetVal = GetIcmpStatistics(&IcmpStats)) == NO_ERROR) { ConResPuts(StdOut, IDS_ICMP4_STAT_HEADER); ConResPuts(StdOut, IDS_ICMP_THEADER); ConResPrintf(StdOut, IDS_ICMP_MSG, - pIcmpStats->stats.icmpInStats.dwMsgs, pIcmpStats->stats.icmpOutStats.dwMsgs); + IcmpStats.stats.icmpInStats.dwMsgs, IcmpStats.stats.icmpOutStats.dwMsgs); ConResPrintf(StdOut, IDS_ICMP_ERROR, - pIcmpStats->stats.icmpInStats.dwErrors, pIcmpStats->stats.icmpOutStats.dwErrors); + IcmpStats.stats.icmpInStats.dwErrors, IcmpStats.stats.icmpOutStats.dwErrors); ConResPrintf(StdOut, IDS_ICMP_DEST_UNREACH, - pIcmpStats->stats.icmpInStats.dwDestUnreachs, pIcmpStats->stats.icmpOutStats.dwDestUnreachs); + IcmpStats.stats.icmpInStats.dwDestUnreachs, IcmpStats.stats.icmpOutStats.dwDestUnreachs); ConResPrintf(StdOut, IDS_ICMP_TIME_EXCEED, - pIcmpStats->stats.icmpInStats.dwTimeExcds, pIcmpStats->stats.icmpOutStats.dwTimeExcds); + IcmpStats.stats.icmpInStats.dwTimeExcds, IcmpStats.stats.icmpOutStats.dwTimeExcds); ConResPrintf(StdOut, IDS_ICMP_PARAM_PROBLEM, - pIcmpStats->stats.icmpInStats.dwParmProbs, pIcmpStats->stats.icmpOutStats.dwParmProbs); + IcmpStats.stats.icmpInStats.dwParmProbs, IcmpStats.stats.icmpOutStats.dwParmProbs); ConResPrintf(StdOut, IDS_ICMP_SRC_QUENCHES, - pIcmpStats->stats.icmpInStats.dwSrcQuenchs, pIcmpStats->stats.icmpOutStats.dwSrcQuenchs); + IcmpStats.stats.icmpInStats.dwSrcQuenchs, IcmpStats.stats.icmpOutStats.dwSrcQuenchs); ConResPrintf(StdOut, IDS_ICMP_REDIRECT, - pIcmpStats->stats.icmpInStats.dwRedirects, pIcmpStats->stats.icmpOutStats.dwRedirects); + IcmpStats.stats.icmpInStats.dwRedirects, IcmpStats.stats.icmpOutStats.dwRedirects); ConResPrintf(StdOut, IDS_ICMP_ECHO, - pIcmpStats->stats.icmpInStats.dwEchos, pIcmpStats->stats.icmpOutStats.dwEchos); + IcmpStats.stats.icmpInStats.dwEchos, IcmpStats.stats.icmpOutStats.dwEchos); ConResPrintf(StdOut, IDS_ICMP_ECHO_REPLY, - pIcmpStats->stats.icmpInStats.dwEchoReps, pIcmpStats->stats.icmpOutStats.dwEchoReps); + IcmpStats.stats.icmpInStats.dwEchoReps, IcmpStats.stats.icmpOutStats.dwEchoReps); ConResPrintf(StdOut, IDS_ICMP_TIMESTAMP, - pIcmpStats->stats.icmpInStats.dwTimestamps, pIcmpStats->stats.icmpOutStats.dwTimestamps); + IcmpStats.stats.icmpInStats.dwTimestamps, IcmpStats.stats.icmpOutStats.dwTimestamps); ConResPrintf(StdOut, IDS_ICMP_TIMESTAMP_REPLY, - pIcmpStats->stats.icmpInStats.dwTimestampReps, pIcmpStats->stats.icmpOutStats.dwTimestampReps); + IcmpStats.stats.icmpInStats.dwTimestampReps, IcmpStats.stats.icmpOutStats.dwTimestampReps); ConResPrintf(StdOut, IDS_ICMP_ADDRESSS_MASK, - pIcmpStats->stats.icmpInStats.dwAddrMasks, pIcmpStats->stats.icmpOutStats.dwAddrMasks); + IcmpStats.stats.icmpInStats.dwAddrMasks, IcmpStats.stats.icmpOutStats.dwAddrMasks); ConResPrintf(StdOut, IDS_ICMP_ADDRESSS_MASK_REPLY, - pIcmpStats->stats.icmpInStats.dwAddrMaskReps, pIcmpStats->stats.icmpOutStats.dwAddrMaskReps); + IcmpStats.stats.icmpInStats.dwAddrMaskReps, IcmpStats.stats.icmpOutStats.dwAddrMaskReps); } else { DoFormatMessage(dwRetVal); } - - HeapFree(GetProcessHeap(), 0, pIcmpStats); }
VOID ShowTcpStatistics(VOID)