Skip to content

Filter table doesn't work #7

@f1Lthz4

Description

@f1Lthz4

I cloned this repo to play with a demo
Implemented a function to set up a filter table

private static unsafe void SetupFilterTable(NdisApi api) {
  //api.ResetPacketFilterTable();
  var table = api.CreateStaticFilterTable(256);

  var udpOut = new STATIC_FILTER();
  udpOut.m_Adapter = 0;
  udpOut.m_ValidFields = STATIC_FILTER_FIELDS.NETWORK_LAYER_VALID | STATIC_FILTER_FIELDS.TRANSPORT_LAYER_VALID;
  udpOut.m_FilterAction = FILTER_PACKET_ACTION.FILTER_PACKET_REDIRECT;
  udpOut.m_dwDirectionFlags = PACKET_FLAG.PACKET_FLAG_ON_SEND;

  udpOut.m_NetworkFilter.m_dwUnionSelector = FILTER_SELECT_FLAGS.IPV4;
  udpOut.m_NetworkFilter.m_IPv4.m_ValidFields = IP_V4_FILTER_FIELDS.IP_V4_FILTER_PROTOCOL;
  udpOut.m_NetworkFilter.m_IPv4.m_Protocol = (byte) ProtocolType.Udp;

  udpOut.m_TransportFilter.m_dwUnionSelector = FILTER_SELECT_FLAGS.TCPUDP;
  udpOut.m_TransportFilter.m_TcpUdp.m_ValidFields = TCPUDP_FILTER_FIELDS.TCPUDP_DEST_PORT;
  udpOut.m_TransportFilter.m_TcpUdp.m_DestPort.m_StartRange = 1234;
  udpOut.m_TransportFilter.m_TcpUdp.m_DestPort.m_EndRange = 1234;

  var udpIn = new STATIC_FILTER();
  udpIn.m_Adapter = 0;
  udpIn.m_ValidFields = STATIC_FILTER_FIELDS.NETWORK_LAYER_VALID | STATIC_FILTER_FIELDS.TRANSPORT_LAYER_VALID;
  udpIn.m_FilterAction = FILTER_PACKET_ACTION.FILTER_PACKET_REDIRECT;
  udpIn.m_dwDirectionFlags = PACKET_FLAG.PACKET_FLAG_ON_RECEIVE;

  udpIn.m_NetworkFilter.m_dwUnionSelector = FILTER_SELECT_FLAGS.IPV4;
  udpIn.m_NetworkFilter.m_IPv4.m_ValidFields = IP_V4_FILTER_FIELDS.IP_V4_FILTER_PROTOCOL;
  udpIn.m_NetworkFilter.m_IPv4.m_Protocol = (byte) ProtocolType.Udp;

  udpIn.m_TransportFilter.m_dwUnionSelector = FILTER_SELECT_FLAGS.TCPUDP;
  udpIn.m_TransportFilter.m_TcpUdp.m_ValidFields = TCPUDP_FILTER_FIELDS.TCPUDP_SRC_PORT;
  udpIn.m_TransportFilter.m_TcpUdp.m_SourcePort.m_StartRange = 1234;
  udpIn.m_TransportFilter.m_TcpUdp.m_SourcePort.m_EndRange = 1234;

  var pass = new STATIC_FILTER();
  pass.m_Adapter = 0;
  pass.m_ValidFields = 0;
  pass.m_FilterAction = FILTER_PACKET_ACTION.FILTER_PACKET_PASS;
  pass.m_dwDirectionFlags = PACKET_FLAG.PACKET_FLAG_ON_SEND | PACKET_FLAG.PACKET_FLAG_ON_RECEIVE;

  table->SetStaticFilters(new[] {
    udpOut,
    udpIn,
    pass
  });
  api.SetPacketFilterTable(*table);
}

After running the following code I get to see the contents of the table with a debugger

var api = NdisApi.Open();
SetupFilterTable(api);
if (api.GetPacketFilterTable(out var table))
  var filters = table.GetStaticFilters();
}

Debugger shows that the only correct static filter set up is the first one, other two have shifted/corrupted values

Am I doing something wrong or does this problem belong to ndisapi.net library?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions