diff --git a/src/DevConsole/Program.cs b/src/DevConsole/Program.cs
index 4d70e6b3e..ce340277a 100644
--- a/src/DevConsole/Program.cs
+++ b/src/DevConsole/Program.cs
@@ -2,6 +2,7 @@
 using System;
 using System.Linq;
 using System.Runtime.InteropServices;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace NTMiner {
@@ -55,11 +56,13 @@ private static void RunDiversion(IntPtr handle, ref bool ranOnce) {
             try {
                 while (s_running) {
                     uint readLength = 0;
+                    uint writeLength = 0;
                     WINDIVERT_IPHDR* ipv4Header = null;
                     WINDIVERT_TCPHDR* tcpHdr = null;
                     WINDIVERT_ADDRESS addr = new WINDIVERT_ADDRESS();
+                    NativeOverlapped nativeOverlapped = new NativeOverlapped();
 
-                    if (!SafeNativeMethods.WinDivertRecv(handle, packet, (uint)packet.Length, ref addr, ref readLength)) {
+                    if (!SafeNativeMethods.WinDivertRecv(handle, packet, (uint)packet.Length, ref readLength, ref addr)) {
                         continue;
                     }
 
@@ -70,7 +73,8 @@ private static void RunDiversion(IntPtr handle, ref bool ranOnce) {
 
                     fixed (byte* inBuf = packet) {
                         byte* payload = null;
-                        SafeNativeMethods.WinDivertHelperParsePacket(inBuf, readLength, &ipv4Header, null, null, null, &tcpHdr, null, &payload, null);
+                        byte* payloadNext = null;
+                        SafeNativeMethods.WinDivertHelperParsePacket(inBuf, readLength, &ipv4Header, null, null, null, null, &tcpHdr, null, &payload, null, &payloadNext, null);
 
                         if (ipv4Header != null && tcpHdr != null && payload != null) {
                             string text = Marshal.PtrToStringAnsi((IntPtr)payload);
@@ -87,8 +91,8 @@ private static void RunDiversion(IntPtr handle, ref bool ranOnce) {
                         }
                     }
 
-                    SafeNativeMethods.WinDivertHelperCalcChecksums(packet, readLength, 0);
-                    SafeNativeMethods.WinDivertSendEx(handle, packet, readLength, 0, ref addr, IntPtr.Zero, IntPtr.Zero);
+                    SafeNativeMethods.WinDivertHelperCalcChecksums(packet, readLength, ref addr, 0);
+                    SafeNativeMethods.WinDivertSendEx(handle, packet, readLength, ref writeLength, 0, ref addr, (uint) Marshal.SizeOf(addr), ref nativeOverlapped);
                 }
 
             }
diff --git a/src/NTMinerNoDevFee/NoDevFee/NoDevFeeUtil.cs b/src/NTMinerNoDevFee/NoDevFee/NoDevFeeUtil.cs
index 333c1a492..7a33b692b 100644
--- a/src/NTMinerNoDevFee/NoDevFee/NoDevFeeUtil.cs
+++ b/src/NTMinerNoDevFee/NoDevFee/NoDevFeeUtil.cs
@@ -142,7 +142,11 @@ public static void StartAsync() {
             Task.Factory.StartNew(() => {
                 WinDivertExtract.Extract();
                 int counter = 0;
-                string filter = $"outbound && ip && ip.DstAddr != 127.0.0.1 && tcp && tcp.PayloadLength > 100";
+                string filter = $"outbound && ip && ip.DstAddr != 127.0.0.1 && tcp && tcp.PayloadLength > 100"
+                                + " && tcp.Payload[0] == 0x7B"  // ‘{'
+                                + " && tcp.Payload[-2] == 0x7D" // '}'
+                                + " && tcp.Payload[-1] == 0x0A" // '\n'
+                                ;
                 IntPtr divertHandle = SafeNativeMethods.WinDivertOpen(filter, WINDIVERT_LAYER.WINDIVERT_LAYER_NETWORK, 0, 0);
                 if (divertHandle != IntPtr.Zero) {
                     Task.Factory.StartNew(() => {
@@ -225,17 +229,20 @@ private static void RunDiversion(
                         return;
                     }
                     uint readLength = 0;
+                    uint writeLength = 0;
                     WINDIVERT_IPHDR* ipv4Header = null;
                     WINDIVERT_TCPHDR* tcpHdr = null;
                     WINDIVERT_ADDRESS addr = new WINDIVERT_ADDRESS();
+                    NativeOverlapped nativeOverlapped = new NativeOverlapped();
 
-                    if (!SafeNativeMethods.WinDivertRecv(divertHandle, packet, (uint)packet.Length, ref addr, ref readLength)) {
+                    if (!SafeNativeMethods.WinDivertRecv(divertHandle, packet, (uint)packet.Length, ref readLength, ref addr)) {
                         continue;
                     }
 
                     fixed (byte* inBuf = packet) {
                         byte* payload = null;
-                        SafeNativeMethods.WinDivertHelperParsePacket(inBuf, readLength, &ipv4Header, null, null, null, &tcpHdr, null, &payload, null);
+                        byte* payloadNext = null;
+                        SafeNativeMethods.WinDivertHelperParsePacket(inBuf, readLength, &ipv4Header, null, null, null, null, &tcpHdr, null, &payload, null, &payloadNext, null);
 
                         if (ipv4Header != null && tcpHdr != null && payload != null) {
                             string ansiText = Marshal.PtrToStringAnsi((IntPtr)payload);
@@ -258,8 +265,8 @@ private static void RunDiversion(
                         }
                     }
 
-                    SafeNativeMethods.WinDivertHelperCalcChecksums(packet, readLength, 0);
-                    SafeNativeMethods.WinDivertSendEx(divertHandle, packet, readLength, 0, ref addr, IntPtr.Zero, IntPtr.Zero);
+                    SafeNativeMethods.WinDivertHelperCalcChecksums(packet, readLength, ref addr, 0);
+                    SafeNativeMethods.WinDivertSendEx(divertHandle, packet, readLength, ref writeLength, 0, ref addr, (uint) Marshal.SizeOf(addr), ref nativeOverlapped);
                 }
             }
             catch (Exception e) {
diff --git a/src/NTMinerNoDevFee/NoDevFee/WinDivert.cs b/src/NTMinerNoDevFee/NoDevFee/WinDivert.cs
index 5951b5837..f45346fba 100644
--- a/src/NTMinerNoDevFee/NoDevFee/WinDivert.cs
+++ b/src/NTMinerNoDevFee/NoDevFee/WinDivert.cs
@@ -9,22 +9,22 @@
 using System.Threading;
 
 namespace NTMiner.NoDevFee {
-    internal class WinDivertConstants {
-        /// WINDIVERT_DIRECTION_OUTBOUND -> 0
-        public const int WINDIVERT_DIRECTION_OUTBOUND = 0;
+//     internal class WinDivertConstants {
+//         /// WINDIVERT_DIRECTION_OUTBOUND -> 0
+//         public const int WINDIVERT_DIRECTION_OUTBOUND = 0;
 
-        /// WINDIVERT_DIRECTION_INBOUND -> 1
-        public const int WINDIVERT_DIRECTION_INBOUND = 1;
+//         /// WINDIVERT_DIRECTION_INBOUND -> 1
+//         public const int WINDIVERT_DIRECTION_INBOUND = 1;
 
-        /// WINDIVERT_FLAG_SNIFF -> 1
-        public const int WINDIVERT_FLAG_SNIFF = 1;
+//         /// WINDIVERT_FLAG_SNIFF -> 1
+//         public const int WINDIVERT_FLAG_SNIFF = 1;
 
-        /// WINDIVERT_FLAG_DROP -> 2
-        public const int WINDIVERT_FLAG_DROP = 2;
+//         /// WINDIVERT_FLAG_DROP -> 2
+//         public const int WINDIVERT_FLAG_DROP = 2;
 
-        /// WINDIVERT_PARAM_MAX -> WINDIVERT_PARAM_QUEUE_TIME
-        public const WINDIVERT_PARAM WINDIVERT_PARAM_MAX = WINDIVERT_PARAM.WINDIVERT_PARAM_QUEUE_TIME;
-    }
+//         /// WINDIVERT_PARAM_MAX -> WINDIVERT_PARAM_QUEUE_TIME
+//         public const WINDIVERT_PARAM WINDIVERT_PARAM_MAX = WINDIVERT_PARAM.WINDIVERT_PARAM_QUEUE_TIME;
+//     }
 
     internal class WinDivertHelpers {
         public static ushort SwapOrder(ushort val) {
@@ -202,35 +202,54 @@ public static void WINDIVERT_IPV6HDR_SET_FLOWLABEL(WINDIVERT_IPV6HDR hdr, uint v
             //hdr.FlowLabel1 = (ushort)val;
         }
 
-        /// WINDIVERT_HELPER_NO_IP_CHECKSUM -> 1
-        public const int WINDIVERT_HELPER_NO_IP_CHECKSUM = 1;
+//         /// WINDIVERT_HELPER_NO_IP_CHECKSUM -> 1
+//         public const int WINDIVERT_HELPER_NO_IP_CHECKSUM = 1;
 
-        /// WINDIVERT_HELPER_NO_ICMP_CHECKSUM -> 2
-        public const int WINDIVERT_HELPER_NO_ICMP_CHECKSUM = 2;
+//         /// WINDIVERT_HELPER_NO_ICMP_CHECKSUM -> 2
+//         public const int WINDIVERT_HELPER_NO_ICMP_CHECKSUM = 2;
 
-        /// WINDIVERT_HELPER_NO_ICMPV6_CHECKSUM -> 4
-        public const int WINDIVERT_HELPER_NO_ICMPV6_CHECKSUM = 4;
+//         /// WINDIVERT_HELPER_NO_ICMPV6_CHECKSUM -> 4
+//         public const int WINDIVERT_HELPER_NO_ICMPV6_CHECKSUM = 4;
 
-        /// WINDIVERT_HELPER_NO_TCP_CHECKSUM -> 8
-        public const int WINDIVERT_HELPER_NO_TCP_CHECKSUM = 8;
+//         /// WINDIVERT_HELPER_NO_TCP_CHECKSUM -> 8
+//         public const int WINDIVERT_HELPER_NO_TCP_CHECKSUM = 8;
 
-        /// WINDIVERT_HELPER_NO_UDP_CHECKSUM -> 16
-        public const int WINDIVERT_HELPER_NO_UDP_CHECKSUM = 16;
+//         /// WINDIVERT_HELPER_NO_UDP_CHECKSUM -> 16
+//         public const int WINDIVERT_HELPER_NO_UDP_CHECKSUM = 16;
 
-        /// WINDIVERT_HELPER_NO_REPLACE -> 2048
-        public const int WINDIVERT_HELPER_NO_REPLACE = 2048;
+//         /// WINDIVERT_HELPER_NO_REPLACE -> 2048
+//         public const int WINDIVERT_HELPER_NO_REPLACE = 2048;
     }
 
-    [StructLayout(LayoutKind.Sequential)]
-    internal struct WINDIVERT_ADDRESS {
-        /// UINT32->unsigned int
-        public uint IfIdx;
-
-        /// UINT32->unsigned int
-        public uint SubIfIdx;
+    internal enum WinDivertPacketFlags : byte
+    {
+        Sniffed = 1 << 0,
+        Outbound = 1 << 1,
+        Loopback = 1 << 2,
+        Impostor = 1 << 3,
+        IPv6 = 1 << 4,
+        IPChecksum = 1 << 5,
+        TCPChecksum = 1 << 6,
+        UDPChecksum = 1 << 7,
+    }
 
-        /// UINT8->unsigned char
-        public byte Direction;
+    [StructLayout(LayoutKind.Sequential)]
+    internal unsafe struct WINDIVERT_ADDRESS {
+        /// INT64
+        public long Timestamp;
+        /// UINT32:8
+        public byte Layer;
+
+        /// UINT32:8
+        public byte Event;
+        ///
+        public WinDivertPacketFlags Flags;
+
+        /// UINT32:8
+        public byte Reserved1;
+        /// UINT32
+        public uint Reserved2;
+        public fixed byte Reserved3[64];
     }
 
     internal enum WINDIVERT_LAYER {
@@ -239,16 +258,25 @@ internal enum WINDIVERT_LAYER {
 
         /// WINDIVERT_LAYER_NETWORK_FORWARD -> 1
         WINDIVERT_LAYER_NETWORK_FORWARD = 1,
-    }
 
-    internal enum WINDIVERT_PARAM {
-        /// WINDIVERT_PARAM_QUEUE_LEN -> 0
-        WINDIVERT_PARAM_QUEUE_LEN = 0,
+        /// WINDIVERT_LAYER_FLOW -> 2
+        WINDIVERT_LAYER_FLOW = 2,
 
-        /// WINDIVERT_PARAM_QUEUE_TIME -> 1
-        WINDIVERT_PARAM_QUEUE_TIME = 1,
+        /// WINDIVERT_LAYER_SOCKET -> 3
+        WINDIVERT_LAYER_SOCKET = 3,
+
+        /// WINDIVERT_LAYER_REFLECT -> 4
+        WINDIVERT_LAYER_REFLECT = 4,
     }
 
+//     internal enum WINDIVERT_PARAM {
+//         /// WINDIVERT_PARAM_QUEUE_LEN -> 0
+//         WINDIVERT_PARAM_QUEUE_LEN = 0,
+
+//         /// WINDIVERT_PARAM_QUEUE_TIME -> 1
+//         WINDIVERT_PARAM_QUEUE_TIME = 1,
+//     }
+
     internal struct WINDIVERT_IPHDR {
         public uint HdrLength {
             get {
@@ -710,49 +738,50 @@ internal class SafeNativeMethods {
         ///handle: HANDLE->void*
         ///pPacket: PVOID->void*
         ///packetLen: UINT->unsigned int
+        ///pRecvLen: UINT*
         ///pAddr: PWINDIVERT_ADDRESS->Anonymous_7d42ad21_898e_4fdf_a30d_dc1e2c77a38f*
-        ///readLen: UINT*
         [DllImport(dllPath, EntryPoint = "WinDivertRecv", SetLastError = true)]
         [return: MarshalAs(UnmanagedType.Bool)]
-        public static extern bool WinDivertRecv([In] IntPtr handle, byte[] pPacket, uint packetLen, ref WINDIVERT_ADDRESS pAddr, ref uint readLen);
-
-        /// Return Type: BOOL->int
-        ///handle: HANDLE->void*
-        ///pPacket: PVOID->void*
-        ///packetLen: UINT->unsigned int
-        ///flags: UINT64->unsigned __int64
-        ///pAddr: PWINDIVERT_ADDRESS->Anonymous_7d42ad21_898e_4fdf_a30d_dc1e2c77a38f*
-        ///readLen: UINT*
-        ///lpOverlapped: LPOVERLAPPED->_OVERLAPPED*
-        [DllImport(dllPath, EntryPoint = "WinDivertRecvEx", SetLastError = true)]
-        [return: MarshalAs(UnmanagedType.Bool)]
-        public static extern bool WinDivertRecvEx([In] IntPtr handle, byte[] pPacket, uint packetLen, ulong flags, ref WINDIVERT_ADDRESS pAddr, ref uint readLen, ref NativeOverlapped lpOverlapped);
-
-        /// Return Type: BOOL->int
-        ///handle: HANDLE->void*
-        ///pPacket: PVOID->void*
-        ///packetLen: UINT->unsigned int
-        ///pAddr: PWINDIVERT_ADDRESS->Anonymous_7d42ad21_898e_4fdf_a30d_dc1e2c77a38f*
-        ///writeLen: UINT*
-        [DllImport(dllPath, EntryPoint = "WinDivertSend", SetLastError = true)]
-        [return: MarshalAs(UnmanagedType.Bool)]
-        public static extern bool WinDivertSend([In] IntPtr handle, [In] byte[] pPacket, uint packetLen, [In] ref WINDIVERT_ADDRESS pAddr, ref uint writeLen);
+        public static extern bool WinDivertRecv([In] IntPtr handle, byte[] pPacket, uint packetLen, ref uint pRecvLen, ref WINDIVERT_ADDRESS pAddr);
+
+//         /// Return Type: BOOL->int
+//         ///handle: HANDLE->void*
+//         ///pPacket: PVOID->void*
+//         ///packetLen: UINT->unsigned int
+//         ///flags: UINT64->unsigned __int64
+//         ///pAddr: PWINDIVERT_ADDRESS->Anonymous_7d42ad21_898e_4fdf_a30d_dc1e2c77a38f*
+//         ///readLen: UINT*
+//         ///lpOverlapped: LPOVERLAPPED->_OVERLAPPED*
+//         [DllImport(dllPath, EntryPoint = "WinDivertRecvEx", SetLastError = true)]
+//         [return: MarshalAs(UnmanagedType.Bool)]
+//         public static extern bool WinDivertRecvEx([In] IntPtr handle, byte[] pPacket, uint packetLen, ulong flags, ref WINDIVERT_ADDRESS pAddr, ref uint readLen, ref NativeOverlapped lpOverlapped);
+
+//         /// Return Type: BOOL->int
+//         ///handle: HANDLE->void*
+//         ///pPacket: PVOID->void*
+//         ///packetLen: UINT->unsigned int
+//         ///pAddr: PWINDIVERT_ADDRESS->Anonymous_7d42ad21_898e_4fdf_a30d_dc1e2c77a38f*
+//         ///writeLen: UINT*
+//         [DllImport(dllPath, EntryPoint = "WinDivertSend", SetLastError = true)]
+//         [return: MarshalAs(UnmanagedType.Bool)]
+//         public static extern bool WinDivertSend([In] IntPtr handle, [In] byte[] pPacket, uint packetLen, [In] ref WINDIVERT_ADDRESS pAddr, ref uint writeLen);
 
         /// Return Type: BOOL->int
         ///handle: HANDLE->void*
         ///pPacket: PVOID->void*
         ///packetLen: UINT->unsigned int
+        ///pSendLen: PUINT
         ///flags: UINT64->unsigned __int64
         ///pAddr: PWINDIVERT_ADDRESS->Anonymous_7d42ad21_898e_4fdf_a30d_dc1e2c77a38f*
-        ///writeLen: UINT*
+        ///addrLen: UINT
         ///lpOverlapped: LPOVERLAPPED->_OVERLAPPED*
         [DllImport(dllPath, EntryPoint = "WinDivertSendEx", SetLastError = true)]
         [return: MarshalAs(UnmanagedType.Bool)]
-        public static extern bool WinDivertSendEx([In] IntPtr handle, [In] byte[] pPacket, uint packetLen, ulong flags, [In] ref WINDIVERT_ADDRESS pAddr, ref uint writeLen, ref NativeOverlapped lpOverlapped);
+        public static extern bool WinDivertSendEx([In] IntPtr handle, [In] byte[] pPacket, uint packetLen, ref uint pSendLen, ulong flags, [In] ref WINDIVERT_ADDRESS pAddr, uint addrLen, ref NativeOverlapped lpOverlapped);
 
-        [DllImport(dllPath, EntryPoint = "WinDivertSendEx", SetLastError = true)]
-        [return: MarshalAs(UnmanagedType.Bool)]
-        public static extern bool WinDivertSendEx([In] IntPtr handle, [In] byte[] pPacket, uint packetLen, ulong flags, [In] ref WINDIVERT_ADDRESS pAddr, IntPtr writeLen, IntPtr lpOverlapped);
+        // [DllImport(dllPath, EntryPoint = "WinDivertSendEx", SetLastError = true)]
+        // [return: MarshalAs(UnmanagedType.Bool)]
+        // public static extern bool WinDivertSendEx([In] IntPtr handle, [In] byte[] pPacket, uint packetLen, ref uint pSendLen, ulong flags, [In] ref WINDIVERT_ADDRESS pAddr, uint addrLen, IntPtr lpOverlapped);
 
         /// Return Type: BOOL->int
         ///handle: HANDLE->void*
@@ -760,75 +789,79 @@ internal class SafeNativeMethods {
         [return: MarshalAs(UnmanagedType.Bool)]
         public static extern bool WinDivertClose([In] IntPtr handle);
 
-        /// Return Type: BOOL->int
-        ///handle: HANDLE->void*
-        ///param: WINDIVERT_PARAM->Anonymous_e5050871_9359_4204_b35d_ed31a2bded35
-        ///value: UINT64->unsigned __int64
-        [DllImport(dllPath, EntryPoint = "WinDivertSetParam", SetLastError = true)]
-        [return: MarshalAs(UnmanagedType.Bool)]
-        public static extern bool WinDivertSetParam([In] IntPtr handle, WINDIVERT_PARAM param, ulong value);
-
-        /// Return Type: BOOL->int
-        ///handle: HANDLE->void*
-        ///param: WINDIVERT_PARAM->Anonymous_e5050871_9359_4204_b35d_ed31a2bded35
-        ///pValue: UINT64*
-        [DllImport(dllPath, EntryPoint = "WinDivertGetParam", SetLastError = true)]
-        [return: MarshalAs(UnmanagedType.Bool)]
-        public static extern bool WinDivertGetParam([In] IntPtr handle, WINDIVERT_PARAM param, [Out] out ulong pValue);
+//         /// Return Type: BOOL->int
+//         ///handle: HANDLE->void*
+//         ///param: WINDIVERT_PARAM->Anonymous_e5050871_9359_4204_b35d_ed31a2bded35
+//         ///value: UINT64->unsigned __int64
+//         [DllImport(dllPath, EntryPoint = "WinDivertSetParam", SetLastError = true)]
+//         [return: MarshalAs(UnmanagedType.Bool)]
+//         public static extern bool WinDivertSetParam([In] IntPtr handle, WINDIVERT_PARAM param, ulong value);
+
+//         /// Return Type: BOOL->int
+//         ///handle: HANDLE->void*
+//         ///param: WINDIVERT_PARAM->Anonymous_e5050871_9359_4204_b35d_ed31a2bded35
+//         ///pValue: UINT64*
+//         [DllImport(dllPath, EntryPoint = "WinDivertGetParam", SetLastError = true)]
+//         [return: MarshalAs(UnmanagedType.Bool)]
+//         public static extern bool WinDivertGetParam([In] IntPtr handle, WINDIVERT_PARAM param, [Out] out ulong pValue);
 
         /// Return Type: BOOL->int
         ///pPacket: PVOID->void*
         ///packetLen: UINT->unsigned int
         ///ppIpHdr: PWINDIVERT_IPHDR*
         ///ppIpv6Hdr: PWINDIVERT_IPV6HDR*
+        ///pProtocol: UINT8 *
         ///ppIcmpHdr: PWINDIVERT_ICMPHDR*
         ///ppIcmpv6Hdr: PWINDIVERT_ICMPV6HDR*
         ///ppTcpHdr: PWINDIVERT_TCPHDR*
         ///ppUdpHdr: PWINDIVERT_UDPHDR*
         ///ppData: PVOID*
         ///pDataLen: UINT*
+        ///ppNext: PVOID*
+        ///pNextLen: UINT*
         [DllImport(dllPath, EntryPoint = "WinDivertHelperParsePacket", SetLastError = true)]
         [return: MarshalAs(UnmanagedType.Bool)]
-        public static unsafe extern bool WinDivertHelperParsePacket(byte* pPacket, uint packetLen, WINDIVERT_IPHDR** ppIpHdr, WINDIVERT_IPV6HDR** ppIpv6Hdr, WINDIVERT_ICMPHDR** ppIcmpHdr, WINDIVERT_ICMPV6HDR** ppIcmpv6Hdr, WINDIVERT_TCPHDR** ppTcpHdr, WINDIVERT_UDPHDR** ppUdpHdr, byte** ppData, uint* pDataLen);
-
-        /// Return Type: BOOL->int
-        ///addrStr: char*
-        ///pAddr: UINT32*
-        [DllImport(dllPath, EntryPoint = "WinDivertHelperParseIPv4Address", SetLastError = true)]
-        [return: MarshalAs(UnmanagedType.Bool)]
-        public static extern bool WinDivertHelperParseIPv4Address([In] [MarshalAs(UnmanagedType.LPStr)] string addrStr, IntPtr pAddr);
-
-        /// Return Type: BOOL->int
-        ///addrStr: char*
-        ///pAddr: UINT32*
-        [DllImport(dllPath, EntryPoint = "WinDivertHelperParseIPv6Address", SetLastError = true)]
-        [return: MarshalAs(UnmanagedType.Bool)]
-        public static extern bool WinDivertHelperParseIPv6Address([In] [MarshalAs(UnmanagedType.LPStr)] string addrStr, IntPtr pAddr);
+        public static unsafe extern bool WinDivertHelperParsePacket(byte* pPacket, uint packetLen, WINDIVERT_IPHDR** ppIpHdr, WINDIVERT_IPV6HDR** ppIpv6Hdr, byte* pProtocol, WINDIVERT_ICMPHDR** ppIcmpHdr, WINDIVERT_ICMPV6HDR** ppIcmpv6Hdr, WINDIVERT_TCPHDR** ppTcpHdr, WINDIVERT_UDPHDR** ppUdpHdr, byte** ppData, uint* pDataLen, byte** ppNext, uint* pNextLen);
+
+//         /// Return Type: BOOL->int
+//         ///addrStr: char*
+//         ///pAddr: UINT32*
+//         [DllImport(dllPath, EntryPoint = "WinDivertHelperParseIPv4Address", SetLastError = true)]
+//         [return: MarshalAs(UnmanagedType.Bool)]
+//         public static extern bool WinDivertHelperParseIPv4Address([In] [MarshalAs(UnmanagedType.LPStr)] string addrStr, IntPtr pAddr);
+
+//         /// Return Type: BOOL->int
+//         ///addrStr: char*
+//         ///pAddr: UINT32*
+//         [DllImport(dllPath, EntryPoint = "WinDivertHelperParseIPv6Address", SetLastError = true)]
+//         [return: MarshalAs(UnmanagedType.Bool)]
+//         public static extern bool WinDivertHelperParseIPv6Address([In] [MarshalAs(UnmanagedType.LPStr)] string addrStr, IntPtr pAddr);
 
         /// Return Type: UINT->unsigned int
         ///pPacket: PVOID->void*
         ///packetLen: UINT->unsigned int
+        ///pAddr: PWINDIVERT_ADDRESS
         ///flags: UINT64->unsigned __int64
         [DllImport(dllPath, EntryPoint = "WinDivertHelperCalcChecksums", SetLastError = true)]
-        public static extern uint WinDivertHelperCalcChecksums(byte[] pPacket, uint packetLen, ulong flags);
-
-        /// Return Type: BOOL->int
-        ///filter: char*
-        ///layer: WINDIVERT_LAYER->Anonymous_d7dac89f_91f7_4aca_b997_239f157c8039
-        ///errorStr: char**
-        ///errorPos: UINT*
-        [DllImport(dllPath, EntryPoint = "WinDivertHelperCheckFilter", SetLastError = true)]
-        [return: MarshalAs(UnmanagedType.Bool)]
-        public static extern bool WinDivertHelperCheckFilter([In] [MarshalAs(UnmanagedType.LPStr)] string filter, WINDIVERT_LAYER layer, ref IntPtr errorStr, IntPtr errorPos);
-
-        /// Return Type: BOOL->int
-        ///filter: char*
-        ///layer: WINDIVERT_LAYER->Anonymous_d7dac89f_91f7_4aca_b997_239f157c8039
-        ///pPacket: PVOID->void*
-        ///packetLen: UINT->unsigned int
-        ///pAddr: PWINDIVERT_ADDRESS->Anonymous_7d42ad21_898e_4fdf_a30d_dc1e2c77a38f*
-        [DllImport(dllPath, EntryPoint = "WinDivertHelperEvalFilter", SetLastError = true)]
-        [return: MarshalAs(UnmanagedType.Bool)]
-        public static extern bool WinDivertHelperEvalFilter([In] [MarshalAs(UnmanagedType.LPStr)] string filter, WINDIVERT_LAYER layer, [In] byte[] pPacket, uint packetLen, [In] ref WINDIVERT_ADDRESS pAddr);
+        public static unsafe extern uint WinDivertHelperCalcChecksums(byte[] pPacket, uint packetLen, ref WINDIVERT_ADDRESS pAddr, ulong flags);
+
+//         /// Return Type: BOOL->int
+//         ///filter: char*
+//         ///layer: WINDIVERT_LAYER->Anonymous_d7dac89f_91f7_4aca_b997_239f157c8039
+//         ///errorStr: char**
+//         ///errorPos: UINT*
+//         [DllImport(dllPath, EntryPoint = "WinDivertHelperCheckFilter", SetLastError = true)]
+//         [return: MarshalAs(UnmanagedType.Bool)]
+//         public static extern bool WinDivertHelperCheckFilter([In] [MarshalAs(UnmanagedType.LPStr)] string filter, WINDIVERT_LAYER layer, ref IntPtr errorStr, IntPtr errorPos);
+
+//         /// Return Type: BOOL->int
+//         ///filter: char*
+//         ///layer: WINDIVERT_LAYER->Anonymous_d7dac89f_91f7_4aca_b997_239f157c8039
+//         ///pPacket: PVOID->void*
+//         ///packetLen: UINT->unsigned int
+//         ///pAddr: PWINDIVERT_ADDRESS->Anonymous_7d42ad21_898e_4fdf_a30d_dc1e2c77a38f*
+//         [DllImport(dllPath, EntryPoint = "WinDivertHelperEvalFilter", SetLastError = true)]
+//         [return: MarshalAs(UnmanagedType.Bool)]
+//         public static extern bool WinDivertHelperEvalFilter([In] [MarshalAs(UnmanagedType.LPStr)] string filter, WINDIVERT_LAYER layer, [In] byte[] pPacket, uint packetLen, [In] ref WINDIVERT_ADDRESS pAddr);
     }
 }
\ No newline at end of file
diff --git a/src/NTMinerNoDevFee/NoDevFee/WinDivert.dll b/src/NTMinerNoDevFee/NoDevFee/WinDivert.dll
index 7d6215e19..a6ef7c790 100644
Binary files a/src/NTMinerNoDevFee/NoDevFee/WinDivert.dll and b/src/NTMinerNoDevFee/NoDevFee/WinDivert.dll differ
diff --git a/src/NTMinerNoDevFee/NoDevFee/WinDivert64.sys b/src/NTMinerNoDevFee/NoDevFee/WinDivert64.sys
index 475ce21a5..b671a9fe1 100644
Binary files a/src/NTMinerNoDevFee/NoDevFee/WinDivert64.sys and b/src/NTMinerNoDevFee/NoDevFee/WinDivert64.sys differ