65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Vista 的 Windows 筛选平台 API 的防火墙

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.32/5 (19投票s)

2008年9月2日

CPOL

2分钟阅读

viewsIcon

125831

downloadIcon

7378

关于使用 Vista 的 Windows 筛选平台编写简单防火墙的文章

引言

Windows Vista 包含一个全新且改进的包过滤引擎,称为 Windows 过滤平台 (WFP)。 至今,Windows 2000/XP/2003 为我们提供了用于实现简单防火墙或包过滤应用程序的包过滤 API。 然而,这些包过滤 API 在 Vista 中已被弃用,转而采用 WFP。 因此,本文档将展示如何使用 WFP API 来编写防火墙!

Windows 过滤平台 API

以下是我们将在编写防火墙时使用的一些 WFP API

  • FwpmEngineOpen0 - 此 API 用于与 Windows 包过滤引擎建立会话。
  • FwpmSubLayerAdd0 - 此 API 向包过滤引擎添加一个新的子层。
  • FwpmFilterAdd0 - 此 API 向子层添加过滤器(规则)。 这类似于 PfAddFiltersToInterface API。
  • FwpmFilterDeleteById0 - 此 API 从子层删除现有的过滤器。
  • FwpmSubLayerDeleteByKey0 - 此 API 删除由 FwpmSubLayerAdd0 添加的子层。
  • FwpmEngineClose0 - 此 API 关闭由 FwpmEngineOpen0 打开的会话。

以下是使用上述 API 编写防火墙的步骤

  • 使用 FwpmEngineOpen0 创建会话。
  • 使用 FwpmSubLayerAdd0 添加一个子层。
  • 现在,使用 FwpmFilterAdd0 添加过滤器。 如果您有“n”个过滤器,则需要调用此 API “n”次。

完成了! 现在,检查您是否可以通过 Web 浏览器访问被阻止的 IP 地址。

Using the Code

本文档包含一个示例类 (PacketFilter 类),它封装了 WFP API。 类的声明如下所示

class PacketFilter
{
private:
    // Firewall engine handle.
    HANDLE m_hEngineHandle;

    // Firewall sublayer GUID.
    GUID m_subLayerGUID;

    // List of filters.
    IPFILTERINFOLIST m_lstFilters;

    // Method to get byte array format and hex format IP address from string format.
    bool ParseIPAddrString( char* szIpAddr, UINT nStrLen, 
        BYTE* pbHostOrdr, UINT nByteLen, ULONG& uHexAddr );

    // Method to create/delete packet filter interface.
    DWORD CreateDeleteInterface( bool bCreate );

    // Method to bind/unbind to/from packet filter interface.
    DWORD BindUnbindInterface( bool bBind );

    // Method to add/remove filter.
    DWORD AddRemoveFilter( bool bAdd );

public:
    // Constructor.
    PacketFilter();

    // Destructor.
    ~PacketFilter();

    // Method to add IP addresses to m_lstFilters list.
    void AddToBlockList( char* szIpAddrToBlock );

    // Method to start packet filter.
    BOOL StartFirewall();

    // Method to stop packet filter.
    BOOL StopFirewall();
};

按照以下步骤在您的应用程序中使用 PacketFilter

  • 实例化 PacketFilter 类的一个对象。
  • 使用 public 方法 PacketFilter::AddToBlockList 添加要阻止的 IP 地址。
  • 使用 PacketFilter::StartFirewall public 方法启动防火墙。
  • 最后,通过调用 PacketFilter::Stopfirewall public 方法终止防火墙。

注意事项

您需要 Windows SDK 2008(可在 此处 下载)才能开发使用 Windows 过滤平台的应用程序。
Visual C++ 6.0 与 Windows SDK 2008 不兼容。

历史

  • 2008 年 8 月 31 日:初始发布
© . All rights reserved.