⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csdn_文档中心_开发基于windows2000-xp的防火墙.htm

📁 csdn10年中间经典帖子
💻 HTM
📖 第 1 页 / 共 4 页
字号:
  <TR>
    <TD align=middle bgColor=#fafafa class=td1 vAlign=top width=150><BR>
      <SCRIPT 
src="CSDN_文档中心_开发基于Windows2000-XP的防火墙.files/microsoft.js"></SCRIPT>
    </TD>
    <TD align=middle width=620>
      <TABLE bgColor=#eeeeee border=0 cellPadding=0 cellSpacing=0 width=600>
        <TBODY>
        <TR bgColor=#ffffff>
          <TD align=middle height=10 width=50></TD>
          <TD align=right><A href="http://www.csdn.net/">CSDN</A> - <A 
            href="http://www.csdn.net/develop/">文档中心</A> - <FONT 
            color=#003399>Visual C++</FONT>&nbsp;&nbsp;&nbsp;&nbsp; </TD></TR>
        <TR>
          <TD align=middle height=5></TD>
          <TD align=middle width=500></TD></TR>
        <TR>
          <TD align=middle bgColor=#003399 height=10><FONT 
            color=#ffffff>标题</FONT></TD>
          <TD><B>&nbsp;&nbsp;&nbsp;&nbsp;开发基于Windows2000/XP的防火墙</B>&nbsp;&nbsp;&nbsp;&nbsp;zgce(翻译) 
          </TD></TR>
        <TR>
          <TD align=middle height=5></TD>
          <TD align=middle width=500></TD></TR>
        <TR>
          <TD align=middle bgColor=#003399><FONT color=#ffffff>关键字</FONT></TD>
          <TD width=500>&nbsp;&nbsp;&nbsp;&nbsp;网络 防火墙</TD></TR>
        <TR>
          <TD align=middle height=5></TD>
          <TD align=middle width=500></TD></TR>
        <TR>
          <TD align=middle bgColor=#003399 height=10><FONT 
            color=#ffffff>出处</FONT></TD>
          <TD height=10>&nbsp;&nbsp;&nbsp;&nbsp;<A 
            href="http://www.codeproject.com/internet/drvfltip.asp">http://www.codeproject.com/internet/drvfltip.asp</A></TD></TR>
        <TR>
          <TD align=middle height=10></TD>
          <TD height=10></TD></TR></TBODY></TABLE><!--文章说明信息结束//-->
      <TABLE border=0 width=600>
        <TBODY>
        <TR>
          <TD align=left><BR>
            <P><FONT face=宋体 size=3><IMG align=baseline alt="" border=0 hspace=0 
            src="CSDN_文档中心_开发基于Windows2000-XP的防火墙.files/CSDN_Dev_Image_2004-4-121109151.jpg"></FONT></P>
            <P><FONT face=宋体 size=3>下载&nbsp; <A 
            href="http://www.codeproject.com/internet/drvfltip/DrvFltIp_source.zip">DownLoadSource</A>&nbsp;&nbsp;&nbsp; 
            <A 
            href="http://www.codeproject.com/internet/drvfltip/FirewallFHK_src.zip">DownLoadFireWallApplication</A></FONT></P>
            <P><FONT face=黑体 size=6>介绍</FONT><BR>&nbsp;&nbsp;&nbsp; 
            如果你决定为Linux系统开发一个防火墙,你将会找到好多相关的信息及各式免费代码。但当人们想要</P>
            <P>在Windows平台上开发防火墙时可就有点困难了,就那么可怜的一点点资料信息,至于免费代码,几乎是不</P>
            <P>可能的。<BR>&nbsp;&nbsp;&nbsp; 所以我决定写这篇关于在Windows 
            2000/XP平台上开发一个简单功能的防火墙文章去帮助那些个对这方</P>
            <P>面有兴趣的人。<BR>&nbsp;<BR><FONT face=黑体 
            size=6>背景<BR></FONT>&nbsp;&nbsp;&nbsp; 微软公司在它发布的Windows 2000 
            DDK中,已经包含了一个新的网络驱动类:Filter-Hook Driver。</P>
            <P>用它你可以建立过滤所有通信的接口。<BR>&nbsp;<BR><FONT face=黑体><FONT 
            size=6>Filter-Hook Driver</FONT><BR></FONT>&nbsp;&nbsp;&nbsp; 
            正如我刚才所说的,Filter-Hook Driver是在微软的Windows 2000 DDK中被引入进来。但实际上它并</P>
            <P>不是一个新的网络驱动类,它只是一个IP过滤功能的驱动。<BR>&nbsp;&nbsp;&nbsp; 事实上Filter-Hook 
            Driver不是一个网络驱动类,它是属于核心驱模型。在这个Filter-Hook Driver</P>
            <P>中我们只实现了一个回调函数,我们只是在Filter-Hook Driver中注册这个回调函数。当我们实现并注册</P>
            <P>好回调函数后,IP过滤驱动就会在数据包到达和发送的时候调用它。<BR>我们把实现步骤归纳为如下几步:<BR>1、建立一个Filter-Hook 
            Driver。在这里你必须建立一个核心模式驱动,你将任选名字,DOS名字以及其</P>
            <P>它一些个属性,不一定是必须的,但我建议你这样做。<BR>2、如果我们想安装过滤功能,首先我们必须得到一个IP过滤驱动的指针。这便是第二步。<BR>3、我们已经得到了指针,现在我们能正确的安装我们的过滤功能函数。我们将发送一个特定的IPR,里面</P>
            <P>将包括我们的过滤函数的指针。<BR>4、过滤包!!!<BR>5、当我们完成过滤后,我们必须注销过滤功能函数。我们可以注册一个空指针来替换我们的过滤函数指针</P>
            <P>。<BR>哦,就上面五个步骤,看起来似乎很简单,但是我如何生成一个核心模式驱动呢?如何得到IP过滤驱动的</P>
            <P>指针呢?如何…………,稍等一下,我将会解释上面所有的步骤并列出源码例子。<BR>&nbsp;<BR><FONT face=黑体 
            size=6>建立核心模式驱动<BR></FONT>&nbsp;&nbsp;&nbsp; Filter-Hook 
            Driver是一个核心模式驱动,因此我们将要建立一个核心模式的驱动程序。但这篇文章</P>
            <P>不是“教你在5分钟内如何开发核心驱动程序”的指南,所以我将假设读者已据有以上知识。<BR>&nbsp;&nbsp;&nbsp; 
            Filter-Hook驱动据有一个典型的核心驱动结构。<BR>1、我们将为驱动程序建立一个典型的驱动入口(DriverEntry),为IRP设置标准分发例程(Dispatch, 
            load, </P>
            <P>unload, 
            Create...),为方便与应用程序通讯建立一个符号连接。<BR>2、标准分发例程将管理IRP。在你开使编写代码前,我建议你先建立IOCTL以便应用程序来操纵驱动。在我</P>
            <P>的例子里,我实现了4个IOCTL编码:START_IP_HOOK(注册一个过滤功能函数),STOP_IP_HOOK(注销过滤功</P>
            <P>能函数),ADD_FILTER(安装一个新的过滤规则),CLEAR_FILTER(清空所有过滤规则)<BR>3、为了我们的驱动,我们必须实现一个或更多的过滤功能函数。<BR>&nbsp;&nbsp;&nbsp; 
            我建议你用一个程序来生成典型的核心驱动程序框架,因此你只须在里面填上你的功能代码既可,比</P>
            <P>如我就用了 <A 
            href="http://www.codeproject.com/userItems/quicksys.asp">QuickSYS</A> 
            来生成我的例子工程。<BR>&nbsp;&nbsp;&nbsp; 你将看到我自己产现的驱动结构,如下代码所示:</P>
            <P><FONT face="Courier New">NTSTATUS DriverEntry(IN PDRIVER_OBJECT 
            DriverObject, 
            <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            IN PUNICODE_STRING RegistryPath)<BR>{<BR><BR>&nbsp;&nbsp;&nbsp; 
            <SPAN class=cpp-comment><FONT 
            color=#3cc472>//....</FONT></SPAN><BR><BR>&nbsp;&nbsp;&nbsp; 
            dprintf(<SPAN class=cpp-string>"DrvFltIp.SYS: entering 
            DriverEntry\n"</SPAN>);<BR><BR>&nbsp;&nbsp;&nbsp; <SPAN 
            class=cpp-comment><FONT color=#3cc472>//we have to create the 
            device</FONT></SPAN><BR>&nbsp;&nbsp;&nbsp; 
            RtlInitUnicodeString(&amp;deviceNameUnicodeString, 
            NT_DEVICE_NAME);<BR><BR>&nbsp;&nbsp;&nbsp; ntStatus = 
            IoCreateDevice(DriverObject,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <SPAN 
            class=cpp-literal>0</SPAN>,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            &amp;deviceNameUnicodeString, 
            <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            FILE_DEVICE_DRVFLTIP,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <SPAN 
            class=cpp-literal>0</SPAN>,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            FALSE,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            &amp;deviceObject);<BR><BR><BR><BR>&nbsp;&nbsp;&nbsp; <SPAN 
            class=cpp-keyword>if</SPAN> ( NT_SUCCESS(ntStatus) 
            )<BR>&nbsp;&nbsp;&nbsp; { 
            <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT 
            color=#3cc472><SPAN class=cpp-comment>// Create a symbolic link that 
            Win32 apps can specify to gain 
            access</SPAN><BR></FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <SPAN class=cpp-comment><FONT color=#3cc472>// to this 
            driver/device</FONT></SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            RtlInitUnicodeString(&amp;deviceLinkUnicodeString, 
            DOS_DEVICE_NAME);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            ntStatus = IoCreateSymbolicLink(&amp;deviceLinkUnicodeString, 
            <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            &amp;deviceNameUnicodeString);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <FONT color=#3cc472><SPAN 
            class=cpp-comment>//....</SPAN><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <SPAN class=cpp-comment>// Create dispatch points for device 
            control, create, 
            close.</SPAN><BR></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            DriverObject-&gt;MajorFunction[IRP_MJ_CREATE]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            =<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            DriverObject-&gt;MajorFunction[IRP_MJ_CLOSE]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            =<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            DriverObject-&gt;MajorFunction[IRP_MJ_DEVICE_CONTROL] = 
            DrvDispatch;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            DriverObject-&gt;DriverUnload&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            = DrvUnload;<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; <SPAN 
            class=cpp-keyword>if</SPAN> ( !NT_SUCCESS(ntStatus) 
            )<BR>&nbsp;&nbsp;&nbsp; 
            {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dprintf(<SPAN 
            class=cpp-string>"Error in initialization. 
            Unloading..."</SPAN>);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            DrvUnload(DriverObject);<BR>&nbsp;&nbsp;&nbsp; 
            }<BR><BR>&nbsp;&nbsp;&nbsp; <SPAN class=cpp-keyword>return</SPAN> 
            ntStatus;<BR>}<BR><BR>NTSTATUS DrvDispatch(IN PDEVICE_OBJECT 
            DeviceObject, IN PIRP Irp)<BR>{<BR><BR>&nbsp;&nbsp;&nbsp;<FONT 
            color=#3cc472> <SPAN class=cpp-comment>// 
            ....</SPAN></FONT><BR><BR>&nbsp;&nbsp;&nbsp; <SPAN 
            class=cpp-keyword>switch</SPAN> 
            (irpStack-&gt;MajorFunction)<BR>&nbsp;&nbsp;&nbsp; 
            {<BR>&nbsp;&nbsp;&nbsp; <SPAN class=cpp-keyword>case</SPAN> 
            IRP_MJ_CREATE:<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            dprintf(<SPAN class=cpp-string>"DrvFltIp.SYS: 
            IRP_MJ_CREATE\n"</SPAN>);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <SPAN class=cpp-keyword>break</SPAN>;<BR><BR>&nbsp;&nbsp;&nbsp; 
            <SPAN class=cpp-keyword>case</SPAN> 
            IRP_MJ_CLOSE:<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            dprintf(<SPAN class=cpp-string>"DrvFltIp.SYS: 
            IRP_MJ_CLOSE\n"</SPAN>);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <SPAN class=cpp-keyword>break</SPAN>;<BR><BR>&nbsp;&nbsp;&nbsp; 
            <SPAN class=cpp-keyword>case</SPAN> 
            IRP_MJ_DEVICE_CONTROL:<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            dprintf(<SPAN class=cpp-string>"DrvFltIp.SYS: 
            IRP_MJ_DEVICE_CONTROL\n"</SPAN>);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            ioControlCode = 
            irpStack-&gt;Parameters.DeviceIoControl.IoControlCode;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <SPAN class=cpp-keyword>switch</SPAN> 
            (ioControlCode)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN 
            class=cpp-comment><FONT color=#3cc472>// ioctl code to start 
            filtering</FONT></SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <SPAN class=cpp-keyword>case</SPAN> 
            START_IP_HOOK:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -