raingl
驱动牛犊
驱动牛犊
  • 注册日期2005-07-07
  • 最后登录2008-02-28
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1631点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
阅读:2695回复:25

大家看看这个方案

楼主#
更多 发布于:2005-07-15 11:00
大家好,这是我在这里的第二贴。
在“这个项目该怎么做?”那个贴子里,我介绍了我手头一个项目的内容,得到了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上做一个板子的演示程序)
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-07-19 17:43
下面是引用raingl于2005-07-19 12:03发表的:
今天跟主管交流了一下,项目可以到下月初正式启动,前期给我时间调研,所以要搞得深入一点。只好再厚着脸皮麻烦大家。

像我这种要求:要在中间层过滤掉所有原来windows的包,同时又要向应用层提供通讯功能(读、写一个帧,有可能的话再加上中断功能),难度有多大?大概要多长时间开发?

可能的话可否告诉我具体参考什么例子?我看到现在过滤包的例子不少,但同时绕开windows上层直接应用层通讯的(比如可以调用ReadFile,WriteFile读写帧)的好像不多。
.......

xpddk的passthru,最合适。
pcausa的passthru也可以。
raingl
驱动牛犊
驱动牛犊
  • 注册日期2005-07-07
  • 最后登录2008-02-28
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1631点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-19 12:03
今天跟主管交流了一下,项目可以到下月初正式启动,前期给我时间调研,所以要搞得深入一点。只好再厚着脸皮麻烦大家。

像我这种要求:要在中间层过滤掉所有原来windows的包,同时又要向应用层提供通讯功能(读、写一个帧,有可能的话再加上中断功能),难度有多大?大概要多长时间开发?

可能的话可否告诉我具体参考什么例子?我看到现在过滤包的例子不少,但同时绕开windows上层直接应用层通讯的(比如可以调用ReadFile,WriteFile读写帧)的好像不多。

斑竹和asmsys真是个热心人,希望有天像你们一样,为驱动网多做贡献!
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-07-19 09:07
讨论结果,对usb网卡,有可能,对一般网卡,没有可能实现,还是应该采用imd
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2005-07-18 14:38
>>在MINIPORT的回调函数里,要实现数据的下行,就是通过对PCI总线发IRP实现的。
这话就不对,看看ddk里的miniport 代码,e100bex,ne2000的代码,就直接安装中断了,哪里还用往下传了.
你用不用msn,发到zhao_ck@sohu.com,我们好好讨论一下这个问题,我认为你说的很成问题,实现不了.
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-07-18 14:10
windows所有的设备都遵循设备栈的层次结构,在这个层次结构中就一定有IRP,网卡也不会例外。
“函数指针直接调用”,该指针就是MINIPORT提供的回调函数。
在MINIPORT的回调函数里,要实现数据的下行,就是通过对PCI总线发IRP实现的。
事实上,在WINDOWS的分层体系中,不管是协议栈,还是设备栈,每一层对上一层提供的接口都是一个或一些函数指针。
在IMD这一层,所有的操作就到此指针为止了。但并不说明下面没有IRP的操作。
IMD按OSI模型来说,应该是位于数据链路层了吧,在这一层看不到IRP,这是很应该的。但是在物理层就会有IRP。
至于实现,所有对针对PCI设备的FILTER,都可以拿来修改。而且不要太多的改动,就能跑起来。
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2005-07-18 13:04
协议绑定到minipor后,会生成一个OpenBlock,以后的收,发都是一个函数指针直接调用,在这个层次上,还哪里有irp呢?我很想知道你的具体实现,请教了?
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-07-18 12:44
下面是引用zhaock于2005-07-18 12:10发表的:
这么做是应该没有问题,但是真正发包,收包,和这个基本没有关系,如果你没有真正实现过,我认为这么做,不能实现截获数据包,还要写imd.

最终数据还是通过IRP流动的,怎么能说没有关系呢,只不过在这一层看到的数据组织形式和在IMD看到不一样而已。只是我们都习惯了处理IMD格式的数据包。
这个很好实现,只要改动几行代码就能把数据拦下。
我认为IMD在这个话题所说的问题中不太适用,因为IMD暴露的MINIPORT必须被协议绑定,而这里的协议又不在系统里,所以只能绑定系统的协议了,这时就要区分是系统协议的包,还是自己协议的包了,事实上这个区分是有困难的。
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2005-07-18 12:38
1.可以采用通用的办法,自己创建一个Control Object,建立一个SymbolicName,上层应用程序CreateFle,ReadFile,WriteFile,DeviceIoControl和驱动通讯的就可以了
2.调用NdisMRegisterDevice,ms推荐的方法,具体看xpddk 的passthru.
raingl
驱动牛犊
驱动牛犊
  • 注册日期2005-07-07
  • 最后登录2008-02-28
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1631点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-07-18 12:11
能不能提示一下,在中间层怎么和应用层直接通讯
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2005-07-18 12:10
这么做是应该没有问题,但是真正发包,收包,和这个基本没有关系,如果你没有真正实现过,我认为这么做,不能实现截获数据包,还要写imd.
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-07-18 11:57
IoGetDeviceObjectPointer然后filter IRP。
网卡作为一个一般意义的设备,肯定也有PDO,fdo,既然有这些object,我们就可以hook.
我对网卡没有这么作过,但其他的设备这么做是完全可以的。
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2005-07-18 11:19
to:asmsys
你说的filter怎么做,,能不能说具体点,我没有见过这么做的,请教一下?
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-07-18 08:54
to:zhaock
hyg早就不出现了,我好象是最近才看到的。
我所说的FILTER是直接找网卡驱动的FDO做我们的PDO,也就是最常用的那种。
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2005-07-15 14:52
对asmsys:我不是,那个是老胡
另外所说的网卡的驱动的filter是什么,不是imd吗?
raingl
驱动牛犊
驱动牛犊
  • 注册日期2005-07-07
  • 最后登录2008-02-28
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1631点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-07-15 14:27
其实我就是想在一个网卡上跑我自己的一套协议栈,而且只要我这一个程序可以使用。可能是我想的太不现实了VMWare那样的功能确实很诱人,如果能那样当然好,不过现在看来至少对我不现实。

下面是asmsys的原话:
“就是写一个常规网卡驱动的FILTER,把系统发到该网卡的PACKET统统DROP掉,防止干扰你的协议。然后开一个接口给你的应用界面,这样就可以在应用层实现你的TCPIP协议,驱动只是一个转发的作用”

我决定就采用这种方案。

多谢两位的帮助,帮我澄清了不少概念。
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-07-15 14:18
下面是引用zhaock于2005-07-15 14:10发表的:
肯定收不上来。我觉的具体需求还是说得不明确。是不是类似于vmvare.你的simulator自己的网卡,有独立的ip网段,本机实现一个虚拟网卡,和你的simulate的网卡通讯,还能进行转发,是不是要实现这样一个功能?

说白了他就是想替换系统的tcpip.sys。只不过有点复杂,所以想别的办法了。
btw:zhaock你是白云的那个吗?
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-07-15 14:13
MAC地址过滤,在网卡的硬件电路里就完成了,但设置为混杂模式是可以收网络上所有的包,如SNIFFER,但处理的不好。系统会受不了的,或许是挂了。
而且混杂模式也是不正常的工作模式。
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2005-07-15 14:10
肯定收不上来。我觉的具体需求还是说得不明确。是不是类似于vmvare.你的simulator自己的网卡,有独立的ip网段,本机实现一个虚拟网卡,和你的simulate的网卡通讯,还能进行转发,是不是要实现这样一个功能?
raingl
驱动牛犊
驱动牛犊
  • 注册日期2005-07-07
  • 最后登录2008-02-28
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1631点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-07-15 14:08
看来我的想法确实不行。刚看了一下手头的RTL8019AS的datasheet,接受哪个地址确实是要配置网卡的,这个好像在PC上就比较困难了吧。看来只能让网卡只为这一个程序服务了。
上一页
游客

返回顶部