monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
阅读:15895回复:56

我在驱坛生涯的回忆(包含NDIS架构简述)

楼主#
更多 发布于:2003-12-04 13:56
by monkeyy 2003-11-29深夜
这篇文章是因为花猫所写的《病毒的本质》这篇文章的触动,让我有了写下自己在驱坛所有感悟的冲动,但是又愿意在那儿做一个荒唐的独白或者是弱智般的宣读教义,所以就写下了自己关于NDIS结构的理解。也包含一点Windows网络组件的结构,但是不多,这个东西太庞大了,就是写一本书也不足为过。为防止有的人觉得很无聊和浪费时间,我告诉大家下面的文字大约有5000字左右。不过关于NDIS架构的描述还是值得你去看看,至少到今天我还没有看到任何关于NDIS架构的文章,如果你有自己的心得,我们的交流将会让我们彼此有所进步,何乐而不为呢?下面就是我写下的文字:

都说人能记得住第一次,并且是一生难忘。我却忘了自己写的第一个程序,写的第一个NDIS驱动,甚至第一次与别人合作别人研究技术。大学四年在我的身上本来有太多的第一次,可是我都忘了,忘的干干净净,记住这些第一次有什么意义呢?人总会去踏出第一步,这一步并不是成功,而是你为了实现成功的第一步。人总是需要去超越自己的环境,自己的背景,不然怎么能算成功呢?或者这就是所谓的酸葡萄效应,我自身的弱智让我难以达到真正的成功,于是我开始这样阿Q起来。这样去讲又有什么意义呢,在乎别人的看法是重要的,但是用别人的观点来约束自己却是不可饶恕的!

驱坛的人也都匆匆的来去,已经不记得谁第一个走,只知道突然有一天胡老大很少露面了,GJP也很少露面了,NDIS版的斑竹只剩下了mikeluo。在驱坛注册是个偶然的机会,可这个机会却改变了我太多,而今我的头儿就是我在驱坛认识的一个网友。还记得那个时候为了查找在Windows下截获数据包的办法,看到很多的RAW Socket,终于在驱坛看到了NDIS这个名词,终于开始了自己的NDIS之旅。我2001年6月在驱坛注册的,那个时候的驱坛可以说代表了我国Windows驱动界的最高水平,Huyuguang、Lu0、GJP等等这些高人几乎天天出没其间。从我第一次登陆驱坛到今天已经3个年头了,在驱坛的日子我一直很少说话,因为知道自己的实力,我一向厌恶误导别人,如果你没有十足的把握,那么你就应该标上讨论的字样,这样总不会有太多的贻害;所以自己一向很少开口。上大学的时候私下里和别人合作研究过技术,最后终于成为了不错的朋友,我仍然喜欢这种人与人的交往,哪怕从来没有见过面,只是在电话的这头听到过他的声音,哪怕自己做的一切都是没有报酬的,哪怕别人只是在电话那头说了一句“来北京,我一定好好请你吃顿饭”,这都无关紧要,我需要的仅仅是技术,而不是报酬。但是我仍然喜欢不多说话,可能有人要说是保守,实际上在Winsdows下进行NDIS驱动开发只要不使用微软反对的方法,一般没有什么高深的。如果你要研究一些Native的话,确实需要很高的技术,我想这个也就是GJP、Lu0、胡老大这些高人可以做了,所以自己也从来不去试图这样的研究。我同意花猫的话,编程需要的是资料和耐性。

我一直以为个人防火墙的检测技术急需更新,现今的个人防火墙检测技术已经无法应对个人网络安全了,怎么去更好的保密数据和系统的完整性已经是最重要的问题了。可是到今天我仍然没有看到天网、诺顿等等这些个人防火墙有什么举措,可能有人要说我狂妄。那么问问在NDIS版兄弟们,做一个天网需要的是什么,除了时间还有别的吗?无论它用NDIS还是TDI甚至是SPI,早就没有什么技术可言了,需要的仅仅是怎么去组合他们。软件只是一种工具,好的软件技术无法替代劣质的软件思想。象天网这样的防火墙纵然是使用TDI与NDIS的双层过滤,纵然是使用我们至今未能知道的NDIS HOOK技术又能怎么样呢?它能弥补它在检测模式上的弱智吗?不能,永远不能。可惜人们已经放弃了在个人防火墙上进行一次检测模式更新,完全放弃了。我仍然同意老莫的话,在网络安全中驱动开发是必须和很小的一部分,加、解密、认证、入侵检测等等才是真正需要掌握的!

说了这么多我并不是要评判什么,我也没有任何权利去干涉别人的工作和生活,就算是对现在才来到NDIS版的朋友们的一点意见吧,希望不会给你们造成太多的误导。

现在来写点东西吧,在网上关于NDIS的文章确实很多了,但是直到今天我还没有在国内的什么地方看到过关于NDIS架构的文章或者是Windows网络组件架构的文章(国外的很久没有去了,以前也没有看到过)。要写点东西还是写点不曾见到的吧,众所周知的文字翻来覆去的描写,除了助长自己嚣张的气焰和满足自己的虚荣可能就没有别的用处。

Windows网络组件的架构确实比较复杂,尤其是在应用太和核心太的交界处,为了实现Sokcet操作的接口统一、减少核心太与应用交互的麻烦与在文件系统中支持网络操作,这个接口做了很多复杂的处理,说起来真的是很繁,再加上在这个交界处我写过的测试程序很少,所以也就不再多言了,只是在下面给出一张Windows网络组件的结构图,这个图当初费了很大的工夫才画出来,画出来后的不久就在PCAUSA看到了,虽然有些出入,但是我相信自己在架构上的理解是没有错误的,那些测试程序给了我信心。
 
Windows网络组件体系结构
对于NDIS结构我觉得已经没有任何必要去谈Miniport或者是Protocol了,如果有疑问的话,就应用自己去找资料或者是看看DDK、MSDN的文档了,在网上关于这个的文字已经很多了。我个人认为对于NDIS结构的理解千万不要过于相信微软的文档,这就是我直到今天一个最大的心得,可以说微软关于NDIS架构的描述有误导的嫌疑。相反,当你自己搞清楚了WDM驱动,更确切的说是微软的驱动模型之后你就会发现,NDIS并不是一个和其它驱动不同的驱动,相反它们的本质结构是一致,不同之处只是因为网络驱动所需特性让微软在原来的驱动模型上做了一些修改,这就是NDIS架构的本质。下面就让我们从微软的误导开始来看NDIS的架构,其中也许存在着谬论,但是我想这样的谬论也还是值得一写的!J

1、关于IMD中Protocol与Miniport的关系,微软说他们是上下层次关系,初一看这明显是错误。从逻辑的角度看他们应该是并行关系,一个为TCP/IP协议送出数据,一个为TCP/IP协议接收数据。如果是上下关系,那这个数据怎么能够顺利的发送、接收呢?实际上在这里微软已经隐约的道出了NDIS架构的实质,但是由于缺乏足够的解释,在这里通常会给Developer们造成一种误导,觉得这个存在矛盾。

2、实际上微软说的并没有错,确实是上下结构,并且就是我们在Device Attach中看到的上下结构。但是在软件的数据流程上,它确实是并行的结构,它只是将原本一条数据通道根据方向的不同改成了两个通道。

3、最有意思的东西就要开始,NDIS同分层驱动模型没有任何的差别,而微软似乎一直在掩盖的东西,它的文档中没有任何关于这个的说明,除了上面提到的那个隐约的说法。以前大家常说的在IMD中存在反向绑定就是一个例子,实际上并不存在反向绑定,那个所谓的反向绑定是对Device Attach的另一种说法。
    要说清楚这个东西,我们就需要来说说真正的虚拟网卡与IMD中Miniport驱动的区别。在IMD中,当Protocol绑定到真正的网卡后会初始化一张虚拟的网卡让TCP/IP协议来绑定,可是我们都知道这个虚拟的网卡并不能在设备管理器中显示出来,我们并不能为它设置IP等等信息,而使用NdisIMRegisterLayeredMiniport这个东西就可以虚拟一张真正的网卡!为什么呢?因为在IMD中并没有建立什么真正的网卡设备,而只是为已经存在的网卡设备建立了一个设备实例,然后将这个实例Attach到真正的网卡设备实例上,这就是典型的Windows下的分层驱动模型。那么我们就应该想到为什么微软要这么做呢,为什么不象TDI或者是其它分层驱动那么直接Attach Device还有搞个Protocol这个东西。我想原因有二,一是为了不破坏NDIS架构的完整性,因为NDIS最基本的架构就是协议和小端口;二是为了保持网络驱动的特性。现在我们来看看网络驱动的特性,网卡设备不是简单的Device Object,因为Device Object是对设备的通用抽象,它无法表示网卡驱动特性。对一个网卡来说最重要的就是Interface概念,在应用程序中,通常不会去指定本地IP地址,比如你用JAVA或者.NET去连接某个主机,这个动作最终转化成Socket动作,Socket根据协议族类型来挑选WSH DLL,然后由WSH DLL负责和协议驱动进行交互,实际上解析Socket的动作是在WSH DLL中进行的。但是在多网卡、多IP的环境中,应用程序无法去选择使用哪个IP作为本地IP,因为它不知道任何的路由信息,所以它只能向协议驱动传送一个通配符地址,然后由协议驱动来选择本地IP和网卡。我想大家都知道了网卡驱动的特性了,那就是路由中关于Interface的问题。如果微软同意我们随意在网卡设备上的Attach Object,同时保持路由,那么整个路由部分将是十分的混乱,所以要开发可以配置IP等网络信息的虚拟网卡需要微软做特殊的处理。我以为这就是微软的工程师们为什么在IMD中并不实现真正的虚拟网卡的原因;主要是路由信息的混乱,IMD中Miniport本身只是一个网卡设备的实例,我们为它添加路由信息是不符合逻辑和无法想象。我们不得不承认微软的工程师在软件结构的设计上确实很厉害,在我看来Linux就要差许多了,至少我没有在Linux中看到任何这样的东西。

上面只是说了TCP/IP协议和网卡在NDIS中的问题,这也是目前我们开发中最常用到的地方,说到这里我突然想起了另一个问题。ATM承载IP网卡的驱动,现在世面上已经存在ATM承载IP的网卡了,它的技术难点又在哪儿呢?我曾经有幸肤浅地做过这样的事情,但不是很深入,只是略知一点点。他们的技术难点主要在于网卡设备类型的转换和具体协议相关动作解析上。ATM和Eternet是不同的网络类型,在数据链路层是完全不同的,那么我们如何将下端的ATM类型的网卡设备转化为以太网卡设备让TCP/IP来绑定,这个实现我一直没有机会去实验,因为没有ATM的网卡,但我觉得应该不是太难,不过这话仍然值得商榷。协议相关动作解析是比较困难和繁琐的事情,比如在ATM中没有MTU的问题,然而在TCP/IP中会向网卡查询MTU,那么这个ATM承载IP的网卡该如何回答TCP/IP协议的查询呢?当然这个例子是比较简单的,比较复杂的应该是ATM中所有信令的模拟,这将消耗Developer许多的精力。

实在话,我很久就不再去崇尚程序设计技术;相反,那么优秀的软件架构更容易引起我的兴趣。所以当我搞清楚Windows网络组件的结构时,真的很惊讶,尤其是从Winsock SPI到WSH DLL这一段结构上的处理,可以说是应用太和核心太交互同时支持多接口的典范。原来我一直在想,在已经存在了Base SPI这个东西之后为什么微软的工程师还要设计出WSH DLL这个东西,在Base SPI中就已经将Socket中的协议族解析结束了,也就是说已经确定了应用程序使用的是TCP/IP协议还是IPX/SPX协议还是NetBEUI协议,他们为什么还有加一个WSH DLL这一层来具体的根据协议类型来解析Socket的动作。后来才发现是为了文件系统直接操作网络的支持和科学的细分模块的需要,在这个中间我确实第一次感到了微软的工程师们在设计上的精湛。关于文件系统支持网络操作,我在做网络组件的探讨时,只是为了找到在Windows中嵌入一个让Winsock支持的全新的协议,并没有说到一定要文件系统也支持该协议,所以没有详细的分析过文件系统对网络支持的具体模型,在这里也就不再多言,所以在上面的图中我也未曾画出来,因为对于这个东西我基本没有写过什么真正的测试代码。

NDIS是一个设计很优秀的接口模块,同时在Windows网络组件中这样的接口至少还有TDI、SPI,但是他们都是各有区别,在细节上都有一些不同。我真的很佩服微软的工程师在软件架构上的设计,所以我觉得我们不应该只去研究他们的实现以后的东西、怎么去找到一个undocument函数、怎么去突破一种限制,我们应该去研究一些他们实现的架构,这些架构真的是很精湛。或许是我的弱智才认为这个东西很神奇,但是你还是应该去尝试一下,这会给你带来很多的惊喜!

实际上Windows网络组件是一个很庞大的结构,我真的很难去了解太多,我仅仅是一个比较能吃苦的程序员而已。同时由于内容很多,很繁杂,所以很难用文字的方式将它表述的很清楚,所以我觉得自己不可能去写书,呵呵!

希望能有高手来讲解一下Windows网络组件中优秀的架构设计!这里面真地有许多值得我们学习和借鉴的!

这篇文章是为了回花猫的,他写了一个《病毒的本质》,希望大家不要迷信病毒编写是多么的神奇。我是写这个东西,想告诉大家我的一点看法。对于Windows下的NDIS驱动开发是很简单的,不要去迷信神话,但是对NDIS架构的掌握是不容易的,所以胡老大是我一直很尊敬的人。同时,我们不应该只去研究微软已经实现的东西,应该也抽点时间去看看他们的总体结构,看看他们的软件架构,这同样是我们应该学习的!

如果有什么意见和建议,或者是想要讨论些什么东西,请使用我在驱坛留下的邮件地址给我留言!不过如果因为很忙也没有时间来得及给你回信的话,请你能够见谅!

最新喜欢:

lipengyilipeng... alenyangalenya... wingmanwingma...
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
hz_linuxer
驱动牛犊
驱动牛犊
  • 注册日期2005-01-11
  • 最后登录2005-04-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-04-27 09:03
厉害
ljmmary
驱动牛犊
驱动牛犊
  • 注册日期2004-07-06
  • 最后登录2007-04-10
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望6点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-04-04 23:23
看了几天的ndis文档,头都大了,到目前为止还是一片模糊,有哪位老大有空出来讲解讲解,正所谓 \"听君一席话,胜读十年书\" !
xiaoming
wwww2
驱动牛犊
驱动牛犊
  • 注册日期2002-04-29
  • 最后登录2016-09-08
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-03-30 18:43
看了高手们的话,好好学习
ac97eric
驱动牛犊
驱动牛犊
  • 注册日期2004-11-30
  • 最后登录2006-03-30
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-11 09:00
潜水很久,获益匪浅。
第一帖,向各位版主大佬致敬!
特别关注:HuYuGuang 师兄,小弟乃新手上路。

各位大虾可否留下HuYuGuang 的MSN,不胜感激! ;)
buptjay
驱动牛犊
驱动牛犊
  • 注册日期2005-02-22
  • 最后登录2005-03-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-03-06 17:07
向前辈致敬
看了一下
收获不小
马上慢慢研读
buptjay
驱动牛犊
驱动牛犊
  • 注册日期2005-02-22
  • 最后登录2005-03-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-03-06 17:03
呵呵
竟然有这么多人都是刚刚开始接触网络驱动就在这里留贴
我也留名
刚才看资料看的郁闷
上来转两圈
发了这个处女贴
报个到先
yyffei
驱动牛犊
驱动牛犊
  • 注册日期2005-01-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分610分
  • 威望82点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-03-05 21:42
向大家学习,向楼主致敬!!
pupilforever
驱动牛犊
驱动牛犊
  • 注册日期2004-11-23
  • 最后登录2005-03-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-02-02 13:38
都是一些老帖子,很有价值,我就丛看帖子,开始学习吧
small
驱动牛犊
驱动牛犊
  • 注册日期2003-10-02
  • 最后登录2005-03-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-01-27 14:28
哎,看不清他的思路,可能是差距太大了。
twtmonkey
驱动牛犊
驱动牛犊
  • 注册日期2004-01-01
  • 最后登录2009-04-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-01-22 11:02
谢谢各位驱动大牛所写文档,对我的帮助,谢谢

在驱网混了一年了,还什么都不懂,呵呵,可能是我人太懒,基础差的原因吧,看来得好好拼命干了

凛凛将军令已行,八荒四海要澄清。 提来剑气干牛斗,洗荡氛埃见太平。
xxcat1220
驱动牛犊
驱动牛犊
  • 注册日期2004-01-19
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-01-12 10:22
先收藏在慢慢看 :D
xh428
驱动牛犊
驱动牛犊
  • 注册日期2002-12-19
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-12-31 14:14
微软的这个东西让人很是头痛,我主要实现了两个功能
一个是MINIPORT中间层过滤,一个是虚拟网卡,现在还有些问题
我几乎碰到了所有的问题
例如:返回值不对,造成内存泄露
      一片报文被分成两片收上来(我只在一台机器上win2000   server)上出现这种情况
      利用MIMIPORT支持各种网卡(ethernet,ppp,model)
现在就是还有一个问题,我的MINIPORT一旦安装就会安装到
所以的网卡上,我没有方法使它不安装的特定的网卡上
请版主和各位大侠帮忙看看有没有什么好的方法。
chengxindang
驱动牛犊
驱动牛犊
  • 注册日期2004-08-16
  • 最后登录2011-07-24
  • 粉丝0
  • 关注0
  • 积分157分
  • 威望35点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-12-29 19:47
欢迎大家加入QQ群:8031936;共同探讨网络技术。
爱,使人死亡,情,让人疯狂!
blueHacker
驱动牛犊
驱动牛犊
  • 注册日期2004-11-19
  • 最后登录2009-07-29
  • 粉丝0
  • 关注0
  • 积分102分
  • 威望12点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-12-19 11:28
我觉得这篇文章写的也一般,可能是ndis的架构太难描述,我看完后的感觉就是刚开个头就结束了,没有说出真正独到的东西,ddk中的文档基本上也说道这些东西.ndis的设计虽然很妙,但我认为和linux下面的设计相比增加了太多的复杂性.我更欣赏 linux下设计的简洁性.
gjp的hook文章我没有见过,不知道哪位兄台能告诉我文章的地址,我也想拜读,好好学习
PKU_ECHO
驱动牛犊
驱动牛犊
  • 注册日期2004-11-28
  • 最后登录2005-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-11-30 13:34
各位高手都出来了,希望能多多交流,我看你们对NDIS的分析的都很好,对他的软件架构分析的挺不错的,我是来这里的新手,望获得各位高手们指点,我也在做NDIS的方面的东西,可是最近有点忙,其实linux也有它自己的和好的东西,多多交流!!!
anxyz
驱动牛犊
驱动牛犊
  • 注册日期2004-11-29
  • 最后登录2005-06-24
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-11-29 14:05
准备学习NMID驱动的编写,至今对这个概念并不是很清,才刚开始嘛,所以,加紧学习,还请各路高人多多指点才是
MickeyMouse
驱动牛犊
驱动牛犊
  • 注册日期2004-11-05
  • 最后登录2005-08-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-11-06 18:02
norton是用到了ndis hook技术吗?您是在norton 的哪个资料上看到的?可否共享一下?谢谢!
yuanyuan
驱动大牛
驱动大牛
  • 注册日期2003-01-15
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分1025分
  • 威望300点
  • 贡献值0点
  • 好评度232点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-11-02 16:13
加入队伍,努力不掉队!
satanli1982
驱动牛犊
驱动牛犊
  • 注册日期2004-03-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-10-10 22:07
好帖,学习ing!
上一页
游客

返回顶部