阅读:2695回复:25
大家看看这个方案
大家好,这是我在这里的第二贴。
在“这个项目该怎么做?”那个贴子里,我介绍了我手头一个项目的内容,得到了asmsys 和wonder_2001老兄的建议,还有幸得到了zhaock斑竹的眷顾,再次表示感谢。 我经过几天的学习,对NDIS有了一个大体的印象,总结了各位的意见,自己有了一点想法,想在这里向大家请教一下。 我的想法: 把我的应用程序(也就是simulator,以下简称AP)设计成只接受两种包: 1) 以太网广播包 2) 一个MAC地址跟物理网卡不同的单播报 然后做一个中间层驱动,在这个驱动中对MAC地址进行过滤,是针对windows物理网卡的放过去,针对AP的MAC地址送给AP,广播包复制两份(多播也可以考虑)。 大家觉得这个方案如何?做出来效果如何?如果可以的话,是不是我需要在AP中直接调用这个中间层的API来进行发送和接收,这个可以实现吗? 另外再请大家谈谈这样做的难度如何,有可以参考的比较的接近的例子吗?如果有,请大家指点一下。 希望大家多多指教。 感觉我这个方案是asmsys和wonder_2001两位建议的结合。 [fly]顺便再贴一下我的项目内容: [/fly] 要求在PC上实现自己的TCP/IP协议栈(包括DHCP,DNS,TCP,UDP,IP,ICMP,PPP,PPPoE,ARP),当然包括最上层的演示程序。这样就要求最下层的网卡驱动提供最基本的中断、读、写功能。(大家不要怪我干嘛这么麻烦非要自己做协议栈,因为我是搞嵌入式开发的,要在PC上做一个板子的演示程序) |
|
沙发#
发布于:2005-07-19 17:43
下面是引用raingl于2005-07-19 12:03发表的: xpddk的passthru,最合适。 pcausa的passthru也可以。 |
|
板凳#
发布于:2005-07-19 12:03
今天跟主管交流了一下,项目可以到下月初正式启动,前期给我时间调研,所以要搞得深入一点。只好再厚着脸皮麻烦大家。
像我这种要求:要在中间层过滤掉所有原来windows的包,同时又要向应用层提供通讯功能(读、写一个帧,有可能的话再加上中断功能),难度有多大?大概要多长时间开发? 可能的话可否告诉我具体参考什么例子?我看到现在过滤包的例子不少,但同时绕开windows上层直接应用层通讯的(比如可以调用ReadFile,WriteFile读写帧)的好像不多。 斑竹和asmsys真是个热心人,希望有天像你们一样,为驱动网多做贡献! |
|
地板#
发布于:2005-07-19 09:07
讨论结果,对usb网卡,有可能,对一般网卡,没有可能实现,还是应该采用imd
|
|
地下室#
发布于:2005-07-18 14:38
>>在MINIPORT的回调函数里,要实现数据的下行,就是通过对PCI总线发IRP实现的。
这话就不对,看看ddk里的miniport 代码,e100bex,ne2000的代码,就直接安装中断了,哪里还用往下传了. 你用不用msn,发到zhao_ck@sohu.com,我们好好讨论一下这个问题,我认为你说的很成问题,实现不了. |
|
5楼#
发布于:2005-07-18 14:10
windows所有的设备都遵循设备栈的层次结构,在这个层次结构中就一定有IRP,网卡也不会例外。
“函数指针直接调用”,该指针就是MINIPORT提供的回调函数。 在MINIPORT的回调函数里,要实现数据的下行,就是通过对PCI总线发IRP实现的。 事实上,在WINDOWS的分层体系中,不管是协议栈,还是设备栈,每一层对上一层提供的接口都是一个或一些函数指针。 在IMD这一层,所有的操作就到此指针为止了。但并不说明下面没有IRP的操作。 IMD按OSI模型来说,应该是位于数据链路层了吧,在这一层看不到IRP,这是很应该的。但是在物理层就会有IRP。 至于实现,所有对针对PCI设备的FILTER,都可以拿来修改。而且不要太多的改动,就能跑起来。 |
|
6楼#
发布于:2005-07-18 13:04
协议绑定到minipor后,会生成一个OpenBlock,以后的收,发都是一个函数指针直接调用,在这个层次上,还哪里有irp呢?我很想知道你的具体实现,请教了?
|
|
7楼#
发布于:2005-07-18 12:44
下面是引用zhaock于2005-07-18 12:10发表的: 最终数据还是通过IRP流动的,怎么能说没有关系呢,只不过在这一层看到的数据组织形式和在IMD看到不一样而已。只是我们都习惯了处理IMD格式的数据包。 这个很好实现,只要改动几行代码就能把数据拦下。 我认为IMD在这个话题所说的问题中不太适用,因为IMD暴露的MINIPORT必须被协议绑定,而这里的协议又不在系统里,所以只能绑定系统的协议了,这时就要区分是系统协议的包,还是自己协议的包了,事实上这个区分是有困难的。 |
|
8楼#
发布于:2005-07-18 12:38
1.可以采用通用的办法,自己创建一个Control Object,建立一个SymbolicName,上层应用程序CreateFle,ReadFile,WriteFile,DeviceIoControl和驱动通讯的就可以了
2.调用NdisMRegisterDevice,ms推荐的方法,具体看xpddk 的passthru. |
|
9楼#
发布于:2005-07-18 12:11
能不能提示一下,在中间层怎么和应用层直接通讯
|
|
10楼#
发布于:2005-07-18 12:10
这么做是应该没有问题,但是真正发包,收包,和这个基本没有关系,如果你没有真正实现过,我认为这么做,不能实现截获数据包,还要写imd.
|
|
11楼#
发布于:2005-07-18 11:57
IoGetDeviceObjectPointer然后filter IRP。
网卡作为一个一般意义的设备,肯定也有PDO,fdo,既然有这些object,我们就可以hook. 我对网卡没有这么作过,但其他的设备这么做是完全可以的。 |
|
12楼#
发布于:2005-07-18 11:19
to:asmsys
你说的filter怎么做,,能不能说具体点,我没有见过这么做的,请教一下? |
|
13楼#
发布于:2005-07-18 08:54
to:zhaock
hyg早就不出现了,我好象是最近才看到的。 我所说的FILTER是直接找网卡驱动的FDO做我们的PDO,也就是最常用的那种。 |
|
14楼#
发布于:2005-07-15 14:52
对asmsys:我不是,那个是老胡
另外所说的网卡的驱动的filter是什么,不是imd吗? |
|
15楼#
发布于:2005-07-15 14:27
其实我就是想在一个网卡上跑我自己的一套协议栈,而且只要我这一个程序可以使用。可能是我想的太不现实了VMWare那样的功能确实很诱人,如果能那样当然好,不过现在看来至少对我不现实。
下面是asmsys的原话: “就是写一个常规网卡驱动的FILTER,把系统发到该网卡的PACKET统统DROP掉,防止干扰你的协议。然后开一个接口给你的应用界面,这样就可以在应用层实现你的TCPIP协议,驱动只是一个转发的作用” 我决定就采用这种方案。 多谢两位的帮助,帮我澄清了不少概念。 |
|
16楼#
发布于:2005-07-15 14:18
下面是引用zhaock于2005-07-15 14:10发表的: 说白了他就是想替换系统的tcpip.sys。只不过有点复杂,所以想别的办法了。 btw:zhaock你是白云的那个吗? |
|
17楼#
发布于:2005-07-15 14:13
MAC地址过滤,在网卡的硬件电路里就完成了,但设置为混杂模式是可以收网络上所有的包,如SNIFFER,但处理的不好。系统会受不了的,或许是挂了。
而且混杂模式也是不正常的工作模式。 |
|
18楼#
发布于:2005-07-15 14:10
肯定收不上来。我觉的具体需求还是说得不明确。是不是类似于vmvare.你的simulator自己的网卡,有独立的ip网段,本机实现一个虚拟网卡,和你的simulate的网卡通讯,还能进行转发,是不是要实现这样一个功能?
|
|
19楼#
发布于:2005-07-15 14:08
看来我的想法确实不行。刚看了一下手头的RTL8019AS的datasheet,接受哪个地址确实是要配置网卡的,这个好像在PC上就比较困难了吧。看来只能让网卡只为这一个程序服务了。
|
|
上一页
下一页