/// <summary> /// Starts a pass thru thread. /// </summary> /// <param name="filter">The filter.</param> /// <param name="waitHandles">The wait handles.</param> /// <param name="networkAdapters">The network adapters.</param> /// <param name="waitHandlesManualResetEvents">The wait handles manual reset events.</param> private static void PassThruThread(NdisApi filter, WaitHandle[] waitHandles, IReadOnlyList <NetworkAdapter> networkAdapters, IReadOnlyList <ManualResetEvent> waitHandlesManualResetEvents) { var ndisApiHelper = new NdisApiHelper(); var ethPackets = ndisApiHelper.CreateEthMRequest(); while (true) { var handle = WaitHandle.WaitAny(waitHandles); ethPackets.AdapterHandle = networkAdapters[handle].Handle; while (filter.ReadPackets(ref ethPackets)) { var packets = ethPackets.Packets; for (int i = 0; i < ethPackets.PacketsCount; i++) { var ethPacket = packets[i].GetEthernetPacket(ndisApiHelper); if (ethPacket.PayloadPacket is IPv4Packet iPv4Packet) { if (iPv4Packet.PayloadPacket is TcpPacket tcpPacket) { Console.WriteLine($"{iPv4Packet.SourceAddress}:{tcpPacket.SourcePort} -> {iPv4Packet.DestinationAddress}:{tcpPacket.DestinationPort}."); } } } filter.SendPackets(ref ethPackets); ethPackets.PacketsCount = 0; } waitHandlesManualResetEvents[handle].Reset(); } }