📄 csdn_文档中心_开发基于windows2000-xp的防火墙.htm
字号:
<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> </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> 开发基于Windows2000/XP的防火墙</B> 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> 网络 防火墙</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> <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>下载 <A
href="http://www.codeproject.com/internet/drvfltip/DrvFltIp_source.zip">DownLoadSource</A>
<A
href="http://www.codeproject.com/internet/drvfltip/FirewallFHK_src.zip">DownLoadFireWallApplication</A></FONT></P>
<P><FONT face=黑体 size=6>介绍</FONT><BR>
如果你决定为Linux系统开发一个防火墙,你将会找到好多相关的信息及各式免费代码。但当人们想要</P>
<P>在Windows平台上开发防火墙时可就有点困难了,就那么可怜的一点点资料信息,至于免费代码,几乎是不</P>
<P>可能的。<BR> 所以我决定写这篇关于在Windows
2000/XP平台上开发一个简单功能的防火墙文章去帮助那些个对这方</P>
<P>面有兴趣的人。<BR> <BR><FONT face=黑体
size=6>背景<BR></FONT> 微软公司在它发布的Windows 2000
DDK中,已经包含了一个新的网络驱动类:Filter-Hook Driver。</P>
<P>用它你可以建立过滤所有通信的接口。<BR> <BR><FONT face=黑体><FONT
size=6>Filter-Hook Driver</FONT><BR></FONT>
正如我刚才所说的,Filter-Hook Driver是在微软的Windows 2000 DDK中被引入进来。但实际上它并</P>
<P>不是一个新的网络驱动类,它只是一个IP过滤功能的驱动。<BR> 事实上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> <BR><FONT face=黑体
size=6>建立核心模式驱动<BR></FONT> Filter-Hook
Driver是一个核心模式驱动,因此我们将要建立一个核心模式的驱动程序。但这篇文章</P>
<P>不是“教你在5分钟内如何开发核心驱动程序”的指南,所以我将假设读者已据有以上知识。<BR>
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>
我建议你用一个程序来生成典型的核心驱动程序框架,因此你只须在里面填上你的功能代码既可,比</P>
<P>如我就用了 <A
href="http://www.codeproject.com/userItems/quicksys.asp">QuickSYS</A>
来生成我的例子工程。<BR> 你将看到我自己产现的驱动结构,如下代码所示:</P>
<P><FONT face="Courier New">NTSTATUS DriverEntry(IN PDRIVER_OBJECT
DriverObject,
<BR>
IN PUNICODE_STRING RegistryPath)<BR>{<BR><BR>
<SPAN class=cpp-comment><FONT
color=#3cc472>//....</FONT></SPAN><BR><BR>
dprintf(<SPAN class=cpp-string>"DrvFltIp.SYS: entering
DriverEntry\n"</SPAN>);<BR><BR> <SPAN
class=cpp-comment><FONT color=#3cc472>//we have to create the
device</FONT></SPAN><BR>
RtlInitUnicodeString(&deviceNameUnicodeString,
NT_DEVICE_NAME);<BR><BR> ntStatus =
IoCreateDevice(DriverObject,<BR>
<SPAN
class=cpp-literal>0</SPAN>,<BR>
&deviceNameUnicodeString,
<BR>
FILE_DEVICE_DRVFLTIP,<BR>
<SPAN
class=cpp-literal>0</SPAN>,<BR>
FALSE,<BR>
&deviceObject);<BR><BR><BR><BR> <SPAN
class=cpp-keyword>if</SPAN> ( NT_SUCCESS(ntStatus)
)<BR> {
<BR> <FONT
color=#3cc472><SPAN class=cpp-comment>// Create a symbolic link that
Win32 apps can specify to gain
access</SPAN><BR></FONT>
<SPAN class=cpp-comment><FONT color=#3cc472>// to this
driver/device</FONT></SPAN><BR>
RtlInitUnicodeString(&deviceLinkUnicodeString,
DOS_DEVICE_NAME);<BR><BR>
ntStatus = IoCreateSymbolicLink(&deviceLinkUnicodeString,
<BR>
&deviceNameUnicodeString);<BR><BR>
<FONT color=#3cc472><SPAN
class=cpp-comment>//....</SPAN><BR><BR>
<SPAN class=cpp-comment>// Create dispatch points for device
control, create,
close.</SPAN><BR></FONT><BR>
DriverObject->MajorFunction[IRP_MJ_CREATE]
=<BR>
DriverObject->MajorFunction[IRP_MJ_CLOSE]
=<BR>
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
DrvDispatch;<BR>
DriverObject->DriverUnload
= DrvUnload;<BR> }<BR><BR> <SPAN
class=cpp-keyword>if</SPAN> ( !NT_SUCCESS(ntStatus)
)<BR>
{<BR> dprintf(<SPAN
class=cpp-string>"Error in initialization.
Unloading..."</SPAN>);<BR>
<BR>
DrvUnload(DriverObject);<BR>
}<BR><BR> <SPAN class=cpp-keyword>return</SPAN>
ntStatus;<BR>}<BR><BR>NTSTATUS DrvDispatch(IN PDEVICE_OBJECT
DeviceObject, IN PIRP Irp)<BR>{<BR><BR> <FONT
color=#3cc472> <SPAN class=cpp-comment>//
....</SPAN></FONT><BR><BR> <SPAN
class=cpp-keyword>switch</SPAN>
(irpStack->MajorFunction)<BR>
{<BR> <SPAN class=cpp-keyword>case</SPAN>
IRP_MJ_CREATE:<BR><BR>
dprintf(<SPAN class=cpp-string>"DrvFltIp.SYS:
IRP_MJ_CREATE\n"</SPAN>);<BR><BR>
<SPAN class=cpp-keyword>break</SPAN>;<BR><BR>
<SPAN class=cpp-keyword>case</SPAN>
IRP_MJ_CLOSE:<BR><BR>
dprintf(<SPAN class=cpp-string>"DrvFltIp.SYS:
IRP_MJ_CLOSE\n"</SPAN>);<BR><BR>
<SPAN class=cpp-keyword>break</SPAN>;<BR><BR>
<SPAN class=cpp-keyword>case</SPAN>
IRP_MJ_DEVICE_CONTROL:<BR><BR>
dprintf(<SPAN class=cpp-string>"DrvFltIp.SYS:
IRP_MJ_DEVICE_CONTROL\n"</SPAN>);<BR><BR>
ioControlCode =
irpStack->Parameters.DeviceIoControl.IoControlCode;<BR><BR>
<SPAN class=cpp-keyword>switch</SPAN>
(ioControlCode)<BR>
{<BR> <SPAN
class=cpp-comment><FONT color=#3cc472>// ioctl code to start
filtering</FONT></SPAN><BR>
<SPAN class=cpp-keyword>case</SPAN>
START_IP_HOOK:<BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -