Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6022035
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 23, 20262026-05-23T03:48:02+00:00 2026-05-23T03:48:02+00:00

I am attempting to pinvoke PFCreateInterface in C# for a packet filtering app. However,

  • 0

I am attempting to pinvoke PFCreateInterface in C# for a packet filtering app. However, the example on pinvoke.net seems inadequately documented. For starters, once StartPacketFilter() in main is called, how can i remove the packet filter programatically without closing the app? Also, i’m also quite confused about the format of the packet string.
I.e hostsToBlock[0] = "67.77.87.97,255.255.255.255,0"; //blocks all traffic on any port to/from 67.77.87.97

How would i go about blocking a remote port of 6980 across all ips?

The pinvoke codes are as follows :

/// <summary>
/// IP packet filter management wrapper for Iphlpapi.dll (Win 2000/XP)
/// </summary>
/// 
public class IpPacketFilter
{
    [DllImport("iphlpapi.dll", EntryPoint = "PfBindInterfaceToIPAddress")]
    public static extern int PfBindInterfaceToIPAddress(
                                    IntPtr Interface_handle,
                                    PFADDRESSTYPE pfatType,
                                    ref int ip_address
                                    );


    [DllImport("iphlpapi.dll", EntryPoint = "PfCreateInterface")]
    public static extern int PfCreateInterface(
                                    int dwName,
                                    PFFORWARD_ACTION inAction,
                                    PFFORWARD_ACTION outAction,
                                    bool UseLog,
                                    bool MustBeUnique,
                                    ref IntPtr ppInterface
                                    );

    //////


    ////

    [DllImport("iphlpapi.dll", EntryPoint = "PfAddFiltersToInterface")]
    public static extern int PfAddFiltersToInterface(
                                    IntPtr interface_handle,
                                    int cInFilters,
                                    [MarshalAsAttribute(UnmanagedType.Struct)] 
                                    ref PPF_FILTER_DESCRIPTOR pfiltIn,
                                    int cOutFilters,
                                    [MarshalAsAttribute(UnmanagedType.Struct)]
                                    ref PPF_FILTER_DESCRIPTOR pfiltOut,
                                    [MarshalAsAttribute(UnmanagedType.Struct)]
                                     ref PPF_FILTER_DESCRIPTOR pfHandle
                                    );

}


 public unsafe struct PPF_FILTER_DESCRIPTOR
{
    public FILTER_FLAGS dwFilterFlags;
    public int dwRule;
    public PFADDRESSTYPE pfatType;

    public int* SrcAddr;
    public int* SrcMask;
    public int* DstAddr;
    public int* DstMask;

    public PROTOCOL dwProtocol;
    public int fLateBound;
    public int wSrcPort;
    public int wDstPort;
    public int wSrcPortHighRange;
    public int wDstPortHighRange;
}
public enum PFFORWARD_ACTION : int
{
    PF_ACTION_FORWARD = 0,
    PF_ACTION_DROP
}

public enum PFADDRESSTYPE : int
{
    PF_IPV4,
    PF_IPV6
}
public  enum PROTOCOL : int
{
    ANY = 0x00,
    ICMP = 0x01,
    TCP = 0x06,
    UDP = 0x11
}

public  enum FILTER_FLAGS : int
{
    FD_FLAGS = 0x1
}

class Program
{

internal const int FALSE = 0;
internal const int TRUE = 1;


static void Main(string[] args)
{
    string[] hostsToBlock = new string[2];
    hostsToBlock[0] = "67.77.87.97,255.255.255.255,0";    //blocks all traffic on any port to/from 67.77.87.97
    hostsToBlock[1] = "0.0.0.0,0.0.0.0,29000";        //blocks all traffic on port 29000, in and out
    StartPacketFilter(hostsToBlock);
}

internal static int lIpFromString(string sIpAddress)
{
    int lIp = 0;
    try
    {
        string[] octets = sIpAddress.Split(new string[] { "." }, StringSplitOptions.None);

        if (octets.Length != 4)
            return 0;

        for (int i = 0; i < 4; i++)
            lIp |= (int.Parse(octets[i]) << (i * 8));
    }
    catch { }
    return lIp;
}

internal static string[] GetLocalIpAddresses()
{
    IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
    string[] localIpAddresses = new string[host.AddressList.Length];
    for (int i = 0; i < host.AddressList.Length; i++)
    {
        localIpAddresses[i] = host.AddressList[i].ToString();
    }
    return localIpAddresses;
}

internal static bool StartPacketFilter(string[] hosts)
{
    string[] localIpAddresses = GetLocalIpAddresses();
    if (localIpAddresses == null)
        return false;

    foreach (string localAddress in localIpAddresses)
    {
        int result;
        IntPtr interfaceHandle = new IntPtr();

        //convert the string IP to an unsigned int for p/invoke
        int lLocalIp = lIpFromString(localAddress);

        //create a filter interface in the tcp/ip stack
        result = IpPacketFilter.PfCreateInterface(0, PFFORWARD_ACTION.PF_ACTION_FORWARD, PFFORWARD_ACTION.PF_ACTION_FORWARD, false, true, ref interfaceHandle);
        if (result != 0)
            return false;

        //bind interface to an ip address
        result = IpPacketFilter.PfBindInterfaceToIPAddress(interfaceHandle, PFADDRESSTYPE.PF_IPV4, ref lLocalIp);
        if (result != 0)
            return false;

        foreach (string targetHost in hosts)
        {
            IntPtr filterHandle = new IntPtr();
            string[] hostDetail = targetHost.Split(new string[] { "," }, StringSplitOptions.None);
            if (hostDetail != null && hostDetail.Length == 3)
            {
                //build the filter structure
                PPF_FILTER_DESCRIPTOR filter = new PPF_FILTER_DESCRIPTOR();
                filter.dwFilterFlags = FILTER_FLAGS.FD_FLAGS;
                filter.dwRule = FALSE;
                filter.pfatType = PFADDRESSTYPE.PF_IPV4;
                filter.dwProtocol = PROTOCOL.TCP;

                int iSrcAddr = lLocalIp;
                int iSrcMask = lIpFromString("255.255.255.255");
                filter.wSrcPort = 0;
                filter.wSrcPortHighRange = 0;

                int iDstAddr = lIpFromString(hostDetail[0]);
                int iDstMask = lIpFromString(hostDetail[1]);
                filter.wDstPort = int.Parse(hostDetail[2]);
                filter.wDstPortHighRange = int.Parse(hostDetail[2]);

                unsafe
                {
                    filter.SrcAddr = &iSrcAddr;
                    filter.DstAddr = &iDstAddr;
                    filter.SrcMask = &iSrcMask;
                    filter.DstMask = &iDstMask;
                }
                // add filter to interface (both inbound and outbound)
                result = IpPacketFilter.PfAddFiltersToInterface(interfaceHandle, 1, ref filter, 1, ref filter, ref filter);

                if (result != 0)
                    return false;
            }
        }
    }
    return true;
}

}

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-23T03:48:02+00:00Added an answer on May 23, 2026 at 3:48 am

    After a quick search, I found this: PfRemoveFiltersFromInterface. This seems to do exactly what your asking for.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Attempting to use the data series from this example no longer passes the JSONLint
Attempting to use asp.net mvc's Action Result of File. So it would seem that
Attempting to get LocationUpdates in my Service, however, it doesnt ever seem to fire
Attempting to use a custom hex color for my css triangle (border). However since
Attempting to learn functional C#, I ported Dustin Campbell's fibonacci example to C#3. My
Attempting the most basic example of Knockout.js possible on their documentation page: http://knockoutjs.com/documentation/observables.html Looks
Attempting to import a TextProperty, similar to another Stack Overflow question (http://stackoverflow.com/questions/3434090/app-engine-badvalueerror-on-bulk-data-upload-textproperty-being-construed-as-s) After adding
attempting a first Blackberry App. It will display diary data (eventually). I'm just trying
Attempting to insert an escape character into a table results in a warning. For
Attempting to print out a list of values from 2 different variables that are

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.