WindivertDotnet异步

This commit is contained in:
陈国伟 2022-10-13 12:28:18 +08:00
parent d976cf58e5
commit aa99fdafac
3 changed files with 14 additions and 20 deletions

View File

@ -60,8 +60,6 @@ namespace FastGithub.PacketIntercept.Dns
/// <returns></returns>
public async Task InterceptAsync(CancellationToken cancellationToken)
{
await Task.Yield();
using var divert = new WinDivert(filter, WinDivertLayer.Network);
cancellationToken.Register(d =>
{
@ -69,16 +67,16 @@ namespace FastGithub.PacketIntercept.Dns
DnsFlushResolverCache();
}, divert);
var addr = new WinDivertAddress();
using var packet = new WinDivertPacket();
using var addr = new WinDivertAddress();
DnsFlushResolverCache();
while (cancellationToken.IsCancellationRequested == false)
{
divert.Recv(packet, ref addr);
await divert.RecvAsync(packet, addr);
try
{
this.ModifyDnsPacket(packet, ref addr);
this.ModifyDnsPacket(packet, addr);
}
catch (Exception ex)
{
@ -86,7 +84,7 @@ namespace FastGithub.PacketIntercept.Dns
}
finally
{
divert.Send(packet, ref addr);
await divert.SendAsync(packet, addr);
}
}
}
@ -96,7 +94,7 @@ namespace FastGithub.PacketIntercept.Dns
/// </summary>
/// <param name="packet"></param>
/// <param name="addr"></param>
unsafe private void ModifyDnsPacket(WinDivertPacket packet, ref WinDivertAddress addr)
unsafe private void ModifyDnsPacket(WinDivertPacket packet, WinDivertAddress addr)
{
var result = packet.GetParseResult();
var requestPayload = result.DataSpan.ToArray();
@ -164,7 +162,7 @@ namespace FastGithub.PacketIntercept.Dns
addr.Flags ^= WinDivertAddressFlag.Outbound;
}
packet.CalcChecksums(ref addr);
packet.CalcChecksums(addr);
this.logger.LogInformation($"{domain}->{loopback}");
}

View File

@ -7,7 +7,7 @@
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="DNS" Version="7.0.0" />
<PackageReference Include="WindivertDotnet" Version="1.0.0-beta2" />
<PackageReference Include="WindivertDotnet" Version="1.0.0-rc3" />
</ItemGroup>
<ItemGroup>

View File

@ -50,8 +50,6 @@ namespace FastGithub.PacketIntercept.Tcp
return;
}
await Task.Yield();
using var divert = new WinDivert(this.filter, WinDivertLayer.Network, 0, WinDivertFlag.None);
if (Socket.OSSupportsIPv4)
{
@ -63,16 +61,14 @@ namespace FastGithub.PacketIntercept.Tcp
}
cancellationToken.Register(d => ((WinDivert)d!).Dispose(), divert);
var addr = new WinDivertAddress();
using var packet = new WinDivertPacket();
using var addr = new WinDivertAddress();
while (cancellationToken.IsCancellationRequested == false)
{
addr.Clear();
divert.Recv(packet, ref addr);
await divert.RecvAsync(packet, addr);
try
{
this.ModifyTcpPacket(packet, ref addr);
this.ModifyTcpPacket(packet, addr);
}
catch (Exception ex)
{
@ -80,7 +76,7 @@ namespace FastGithub.PacketIntercept.Tcp
}
finally
{
divert.Send(packet, ref addr);
await divert.SendAsync(packet, addr);
}
}
}
@ -90,7 +86,7 @@ namespace FastGithub.PacketIntercept.Tcp
/// </summary>
/// <param name="packet"></param>
/// <param name="addr"></param>
unsafe private void ModifyTcpPacket(WinDivertPacket packet, ref WinDivertAddress addr)
unsafe private void ModifyTcpPacket(WinDivertPacket packet, WinDivertAddress addr)
{
var result = packet.GetParseResult();
if (result.IPV4Header != null && result.IPV4Header->SrcAddr.Equals(IPAddress.Loopback) == false)
@ -111,7 +107,7 @@ namespace FastGithub.PacketIntercept.Tcp
result.TcpHeader->SrcPort = oldServerPort;
}
addr.Flags |= WinDivertAddressFlag.Impostor;
packet.CalcChecksums(ref addr);
packet.CalcChecksums(addr);
}
}
}