code: def send(self, packet, recalculate_checksum=True):
          
          if recalculate_checksum:
              packet.recalculate_checksums()
  
          send_len = c_uint(0)
          if PY2:
              # .from_buffer(memoryview) does not work on PY2
              buff = bytearray(packet.raw)
          else:
              buff = packet.raw
          buff = (c_char * len(packet.raw)).from_buffer(buff)
          windivert_dll.WinDivertSend(self._handle, buff, len(packet.raw), byref(packet.wd_addr),
                                      byref(send_len))
          return send_len
docs: Injects a packet into the network stack.
          Recalculates the checksum before sending unless recalculate_checksum=False is passed.
  
          The injected packet may be one received from recv(), or a modified version, or a completely new packet.
          Injected packets can be captured and diverted again by other WinDivert handles with lower priorities.
  
          The remapped function is WinDivertSend::
  
              BOOL WinDivertSend(
                  __in HANDLE handle,
                  __in PVOID pPacket,
                  __in UINT packetLen,
                  __in PWINDIVERT_ADDRESS pAddr,
                  __out_opt UINT *sendLen
              );
  
          For more info on the C call visit: http://reqrypt.org/windivert-doc.html#divert_send
  
          :return: The return value is the number of bytes actually sent.