Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16497766
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:57:07

下载本文示例代码
天极IT资讯短信服务 电脑小技巧 function check4() { if (dn.mobile.value.length!=11) { alert("手机号码不正确!"); dn.mobile.focus(); return false; } return true; } 资费:包月5元手机: 介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。   下载本文源代码  介绍  如果你决定开发LINUX下的防火墙,你会找到很多免费的信息与源代码。但如果开发WINDOWS平台下的防火墙会有点困难,找到相关信息与代码都简直是不可能的任务。  因此我决定写这篇文章介绍在WINDOWS 2000/XP下开发防火墙的简单方法。  背景  在WINDOWS 2000 DDK中,微软包含了称为Filter-Hook Driver的新型网络驱动。你可以使用它来过滤所有进出接口的数据。  因为关于此的文档很少并没有代码,我把使用它的成功方法写入文章,希望帮助你理解这种简单的方法。  Filter-Hook 驱动  像我刚才所说的,在Microsoft Windows 2000 DDK中介绍了Filter-Hook Driver, 事实上,它不是一种新的网络驱动,它只是扩展了IP过滤驱动(IP Filter Driver)的功能。  实际上,Filter-Hook Driver并不是网络驱动,它是一种内核模式驱动(Kernel Mode Driver). 大致上是这样的:在Filter-Hook Driver中我们提供回调函数(callback),然后使用IP Filter Driver注册回调函数。这样当数据包发送和接收时,IP Filter Driver会调用回调函数。那么我们到底该如何实现这些步骤呢?总结如下:  1) 建立Filter-Hook Driver.我们必须建立内核模式驱动,你可以选择名称,DOS名称和其它驱动特性,这些不是必须的,但我建议使用描述名称。  2) 如果我们要安装过滤函数,首先我们必须得到指向IP Filter Driver的指针,这是第二步。  3) 我们已经取得了指针,现在我们可以通过发送特殊的IRP来安装过滤函数,该"消息"传递的数据包含了过滤函数的指针。  4) 过滤数据包!!!  5) 当我们想结束过滤,我们必须撤销过滤函数。这通过传递null指针作为过滤函数指针来实现。  哦,只有五个步骤,这看起来非常容易,但...如何生成内核模式驱动?如何得到IP Filter Driver指针,如何..... 是的,请稍等,我现在将解释这些步骤并提供源代码:P  创建内核模式驱动(Kernel Mode Driver)  Filter-Hook Driver属于内核模式驱动,因此我们要创建内核模式驱动。这篇文章不是“如何仅用5分钟开发内核模式驱动” 这样的指南,因此我假设读者已经有了关于此的相关知识。  Filter-Hook Driver结构是典型的内核模式驱动的结构:  1) 一个创建设备的驱动程序入口,为通讯创建符号连接和处理IRPs(分派,加载,卸载,创建...)的标准例程。  2)在标准例程里管理IRPs.在开始编码前,我建议先思考一下哪些IOCTL你需要从设备驱动中暴露给应用程序。 在我的例子中,我实现了四个IOCTL代码:START_IP_HOOK(注册过滤函数),STOP_IP_HOOK(注销过滤函数), ADD_FILTER(安装新的过滤规则),CLEAR_FILTER(清除所有规则).  3)对于我们的驱动,我们必须实现多个用于过滤的函数。  我推荐你使用工具程序来产生内核驱动基本框架,这样你只需往里添加代码。例如,我在工程中使用的是QuickSYS。  下面是驱动结构的实现代码: NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath){//....dprintf("DrvFltIp.SYS: entering DriverEntry\n");//我们必须创建设备RtlInitUnicodeString(&deviceNameUnicodeString, NT_DEVICE_NAME);ntStatus = IoCreateDevice(DriverObject,0,&deviceNameUnicodeString, FILE_DEVICE_DRVFLTIP,0,FALSE,&deviceObject);if ( NT_SUCCESS(ntStatus) ){ // 创建符号连接使win32应用程序可以处理驱动与设备RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);ntStatus = IoCreateSymbolicLink(&deviceLinkUnicodeString, &deviceNameUnicodeString);//....// 创建用于控制、创建、关闭的dispatch指针DriverObject->MajorFunction[IRP_MJ_CREATE] =DriverObject->MajorFunction[IRP_MJ_CLOSE] =DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DrvDispatch;DriverObject->DriverUnload = DrvUnload;}if ( !NT_SUCCESS(ntStatus) ){dprintf("Error in initialization. Unloading...");DrvUnload(DriverObject);}return ntStatus;}NTSTATUS DrvDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){// ....switch (irpStack->MajorFunction){case IRP_MJ_CREATE:dprintf("DrvFltIp.SYS: IRP_MJ_CREATE\n");break;case IRP_MJ_CLOSE:dprintf("DrvFltIp.SYS: IRP_MJ_CLOSE\n");break;case IRP_MJ_DEVICE_CONTROL:dprintf("DrvFltIp.SYS: IRP_MJ_DEVICE_CONTROL\n");ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;switch (ioControlCode){// 启动过滤的ioctl代码case START_IP_HOOK:{SetFilterFunction(cbFilterFunction);break;}// 关闭过滤的ioctlcase STOP_IP_HOOK:{SetFilterFunction(NULL);break;}// 添加过滤规则的ioctlcase ADD_FILTER:{if(inputBufferLength == sizeof(IPFilter)){IPFilter *nf;nf = (IPFilter *)ioBuffer;AddFilterToList(nf);}break;}// 释放过滤规则列表的ioctlcase CLEAR_FILTER:{ClearFilterList();break;}default:Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;dprintf("DrvFltIp.SYS: unknown IRP_MJ_DEVICE_CONTROL\n");break;}break;}ntStatus = Irp->IoStatus.Status;IoCompleteRequest(Irp, IO_NO_INCREMENT);// 我们不会有未决的操作,所以总是返回状态码return ntStatus;}VOID DrvUnload(IN PDRIVER_OBJECT DriverObject){UNICODE_STRING deviceLinkUnicodeString;dprintf("DrvFltIp.SYS: Unloading\n");SetFilterFunction(NULL);// 释放所有资源ClearFilterList();// 删除符号连接RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);IoDeleteSymbolicLink(&deviceLinkUnicodeString);// 删除设备对象IoDeleteDevice(DriverObject->DeviceObject);}  我们已经编写了驱动的主代码,下面我们继续实现Filter-Hook Driver zmbbs=1;共2页。 1 2 : 天极IT资讯短信服务 电脑小技巧 function check4() { if (dn.mobile.value.length!=11) { alert("手机号码不正确!"); dn.mobile.focus(); return false; } return true; } 资费:包月5元手机: 介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。   下载本文源代码  介绍  如果你决定开发LINUX下的防火墙,你会找到很多免费的信息与源代码。但如果开发WINDOWS平台下的防火墙会有点困难,找到相关信息与代码都简直是不可能的任务。  因此我决定写这篇文章介绍在WINDOWS 2000/XP下开发防火墙的简单方法。  背景  在WINDOWS 2000 DDK中,微软包含了称为Filter-Hook Driver的新型网络驱动。你可以使用它来过滤所有进出接口的数据。  因为关于此的文档很少并没有代码,我把使用它的成功方法写入文章,希望帮助你理解这种简单的方法。  Filter-Hook 驱动  像我刚才所说的,在Microsoft Windows 2000 DDK中介绍了Filter-Hook Driver, 事实上,它不是一种新的网络驱动,它只是扩展了IP过滤驱动(IP Filter Driver)的功能。  实际上,Filter-Hook Driver并不是网络驱动,它是一种内核模式驱动(Kernel Mode Driver). 大致上是这样的:在Filter-Hook Driver中我们提供回调函数(callback),然后使用IP Filter Driver注册回调函数。这样当数据包发送和接收时,IP Filter Driver会调用回调函数。那么我们到底该如何实现这些步骤呢?总结如下:  1) 建立Filter-Hook Driver.我们必须建立内核模式驱动,你可以选择名称,DOS名称和其它驱动特性,这些不是必须的,但我建议使用描述名称。  2) 如果我们要安装过滤函数,首先我们必须得到指向IP Filter Driver的指针,这是第二步。  3) 我们已经取得了指针,现在我们可以通过发送特殊的IRP来安装过滤函数,该"消息"传递的数据包含了过滤函数的指针。  4) 过滤数据包!!!  5) 当我们想结束过滤,我们必须撤销过滤函数。这通过传递null指针作为过滤函数指针来实现。  哦,只有五个步骤,这看起来非常容易,但...如何生成内核模式驱动?如何得到IP Filter Driver指针,如何..... 是的,请稍等,我现在将解释这些步骤并提供源代码:P  创建内核模式驱动(Kernel Mode Driver)  Filter-Hook Driver属于内核模式驱动,因此我们要创建内核模式驱动。这篇文章不是“如何仅用5分钟开发内核模式驱动” 这样的指南,因此我假设读者已经有了关于此的相关知识。  Filter-Hook Driver结构是典型的内核模式驱动的结构:  1) 一个创建设备的驱动程序入口,为通讯创建符号连接和处理IRPs(分派,加载,卸载,创建...)的标准例程。  2)在标准例程里管理IRPs.在开始编码前,我建议先思考一下哪些IOCTL你需要从设备驱动中暴露给应用程序。 在我的例子中,我实现了四个IOCTL代码:START_IP_HOOK(注册过滤函数),STOP_IP_HOOK(注销过滤函数), ADD_FILTER(安装新的过滤规则),CLEAR_FILTER(清除所有规则).  3)对于我们的驱动,我们必须实现多个用于过滤的函数。  我推荐你使用工具程序来产生内核驱动基本框架,这样你只需往里添加代码。例如,我在工程中使用的是QuickSYS。  下面是驱动结构的实现代码: NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath){//....dprintf("DrvFltIp.SYS: entering DriverEntry\n");//我们必须创建设备RtlInitUnicodeString(&deviceNameUnicodeString, NT_DEVICE_NAME);ntStatus = IoCreateDevice(DriverObject,0,&deviceNameUnicodeString, FILE_DEVICE_DRVFLTIP,0,FALSE,&deviceObject);if ( NT_SUCCESS(ntStatus) ){ // 创建符号连接使win32应用程序可以处理驱动与设备RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);ntStatus = IoCreateSymbolicLink(&deviceLinkUnicodeString, &deviceNameUnicodeString);//....// 创建用于控制、创建、关闭的dispatch指针DriverObject->MajorFunction[IRP_MJ_CREATE] =DriverObject->MajorFunction[IRP_MJ_CLOSE] =DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DrvDispatch;DriverObject->DriverUnload = DrvUnload;}if ( !NT_SUCCESS(ntStatus) ){dprintf("Error in initialization. Unloading...");DrvUnload(DriverObject);}return ntStatus;}NTSTATUS DrvDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){// ....switch (irpStack->MajorFunction){case IRP_MJ_CREATE:dprintf("DrvFltIp.SYS: IRP_MJ_CREATE\n");break;case IRP_MJ_CLOSE:dprintf("DrvFltIp.SYS: IRP_MJ_CLOSE\n");break;case IRP_MJ_DEVICE_CONTROL:dprintf("DrvFltIp.SYS: IRP_MJ_DEVICE_CONTROL\n");ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;switch (ioControlCode){// 启动过滤的ioctl代码case START_IP_HOOK:{SetFilterFunction(cbFilterFunction);break;}// 关闭过滤的ioctlcase STOP_IP_HOOK:{SetFilterFunction(NULL);break;}// 添加过滤规则的ioctlcase ADD_FILTER:{if(inputBufferLength == sizeof(IPFilter)){IPFilter *nf;nf = (IPFilter *)ioBuffer;AddFilterToList(nf);}break;}// 释放过滤规则列表的ioctlcase CLEAR_FILTER:{ClearFilterList();break;}default:Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;dprintf("DrvFltIp.SYS: unknown IRP_MJ_DEVICE_CONTROL\n");break;}break;}ntStatus = Irp->IoStatus.Status;IoCompleteRequest(Irp, IO_NO_INCREMENT);// 我们不会有未决的操作,所以总是返回状态码return ntStatus;}VOID DrvUnload(IN PDRIVER_OBJECT DriverObject){UNICODE_STRING deviceLinkUnicodeString;dprintf("DrvFltIp.SYS: Unloading\n");SetFilterFunction(NULL);// 释放所有资源ClearFilterList();// 删除符号连接RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);IoDeleteSymbolicLink(&deviceLinkUnicodeString);// 删除设备对象IoDeleteDevice(DriverObject->DeviceObject);}  我们已经编写了驱动的主代码,下面我们继续实现Filter-Hook Driver zmbbs=1;共2页。 1 2 : 下载本文示例代码


用VC开发Win2000/XP下的防火墙用VC开发Win2000/XP下的防火墙用VC开发Win2000/XP下的防火墙用VC开发Win2000/XP下的防火墙用VC开发Win2000/XP下的防火墙用VC开发Win2000/XP下的防火墙用VC开发Win2000/XP下的防火墙用VC开发Win2000/XP下的防火墙用VC开发Win2000/XP下的防火墙用VC开发Win2000/XP下的防火墙用VC开发Win2000/XP下的防火墙用VC开发Win2000/XP下的防火墙用VC开发Win2000/XP下的防火墙用VC开发Win2000/XP下的防火墙用VC开发Win2000/XP下的防火墙
阅读(148) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~