40楼#
发布于:2003-12-13 10:45
[quote][quote]感谢你的文章。 这两天真的是有点忙,忙的连留点时间给自己都是那么的困难。看来这位兄弟对NDIS还是很感兴趣,实在是性情中人,呵呵! NDIS是一个标准,实际上是为了在Windows平台下统一Network Device Interface。关于NDIS的应用,也就是我们使用NDIS开发东西,微软的文档已经足已解决所有的问题,包括后来由GJP公布出的2K与XP下的HOOK技术,这个东西等他公布了之后,你确实能在ndis.h文件中找到一些启发,但是真正第一个将它实现的就是GJP了,这就是高人的不同,呵呵! 我写的东西和实际开发已经没有多少关系了,更多的是在讨论NDIS这个软件包的软件架构,他和NDIS这个标准的最终结构是不同的。NDIS标准的最终架构就是Minipot和Protocol,可是这个软件包的架构是什么样子的呢,这个软件的设计上是什么样子的呢?这就是我这篇文章要讨论的东西。就好象TCP/IP协议的架构大家都是明白的,可是在Windows中这个TCP/IP软件包的架构又是什么样子的呢?这是不同的概念。 对NDIS架构进行深入地分析,我们会讨厌去看源代码的。NDIS的源码有多少?这个问题我一直在想,但是我一直认为不会很多。NDIS并不是一个非常神奇、非常不可思议的东西;相反,他是在继承了分层驱动模型这个基础上做出来的。分层驱动模型这个东西,大家都知道吧,做这样的设备管理器不需要太多的代码,但是需要好的设计。分层模型仍然使用了微软的惯用“伎俩”――回调函数。我不知道你是否意识到,回调函数可以说是微软最基本、也是最常用的一个东西,从Application到Kernel,那个没有回调函数的影子?分层的管理器不需要太多的代码,那么网络特性是否需要很多代码呢?网络特性主要是网卡PNP、电源、路由,以及协议的PNP。这些东西我觉得也不会有太多的代码!呵呵,总之,我觉得代码量不会非常的大! 对了,说到这里我还得感谢fracer和mikeluo以前对我的帮助,真的感谢二位,我也说哪句话吧,“兄弟,来沈阳我一定好好请你吃顿饭。”呵呵! [/quote] 你把我看的太高了,我不是一个高人,充其量是一个NDIS编程的熟练工,对于NDIS HOOK的技术,我也是从NORTON那里看来的。 对于NDIS,说到底就是一个面向低端平台的网络接口规范。我最痛恨的就是他的效率,整个NDIS流程就是数据包的传递其实就是在COPY MEMORY中进行的。以至于当别人在同样配置的LINUX平台上用SYN FLOOD 攻击你的系统时,你只能苦笑。 [/quote] 两位老大又都出来了,好爽啊!哈哈哈哈哈哈! 不过为什么大家都变的这么谦虚了,是不是该是我狂妄的时候了! :D :D :D :D :D 实在话,我第一次接触NDIS是看Hu老大公布的98下的源码,我记得哪个时候Hu老大还说我好那个,主要是那个时候98很少人去看了。然后第一次领悟到HOOK这个东西就是GJP老大的那篇文章,我记得是很早就发的一个帖子,记得当时还和Hu老大争论了起来,我还记得哪个时候的GJP叫现在这个名字,头像是一个人在弹琴。我忘了太多东西,可是这些给我重大影响,帮我很多的东西我记得很清楚。对NDIS的认识我基本是从Hu老大的教导中开始的,尽管Hu老大没有直接教我什么,但是他的帖子很有价值!对于核心编程中的HOOK就是GJP给了我很多的想法,还有很多关于编程的认识基本上都是从你们的帖子中得到的!来驱坛混的几年是我人生的一大快事! 不过我仍然坚持那个观点,“软件只是一种工具,是体现我们思想的工具。”在安全领域尤其如此!呵呵! |
|
|
41楼#
发布于:2003-12-12 20:23
[quote]感谢你的文章。 这两天真的是有点忙,忙的连留点时间给自己都是那么的困难。看来这位兄弟对NDIS还是很感兴趣,实在是性情中人,呵呵! NDIS是一个标准,实际上是为了在Windows平台下统一Network Device Interface。关于NDIS的应用,也就是我们使用NDIS开发东西,微软的文档已经足已解决所有的问题,包括后来由GJP公布出的2K与XP下的HOOK技术,这个东西等他公布了之后,你确实能在ndis.h文件中找到一些启发,但是真正第一个将它实现的就是GJP了,这就是高人的不同,呵呵! 我写的东西和实际开发已经没有多少关系了,更多的是在讨论NDIS这个软件包的软件架构,他和NDIS这个标准的最终结构是不同的。NDIS标准的最终架构就是Minipot和Protocol,可是这个软件包的架构是什么样子的呢,这个软件的设计上是什么样子的呢?这就是我这篇文章要讨论的东西。就好象TCP/IP协议的架构大家都是明白的,可是在Windows中这个TCP/IP软件包的架构又是什么样子的呢?这是不同的概念。 对NDIS架构进行深入地分析,我们会讨厌去看源代码的。NDIS的源码有多少?这个问题我一直在想,但是我一直认为不会很多。NDIS并不是一个非常神奇、非常不可思议的东西;相反,他是在继承了分层驱动模型这个基础上做出来的。分层驱动模型这个东西,大家都知道吧,做这样的设备管理器不需要太多的代码,但是需要好的设计。分层模型仍然使用了微软的惯用“伎俩”――回调函数。我不知道你是否意识到,回调函数可以说是微软最基本、也是最常用的一个东西,从Application到Kernel,那个没有回调函数的影子?分层的管理器不需要太多的代码,那么网络特性是否需要很多代码呢?网络特性主要是网卡PNP、电源、路由,以及协议的PNP。这些东西我觉得也不会有太多的代码!呵呵,总之,我觉得代码量不会非常的大! 对了,说到这里我还得感谢fracer和mikeluo以前对我的帮助,真的感谢二位,我也说哪句话吧,“兄弟,来沈阳我一定好好请你吃顿饭。”呵呵! [/quote] 你把我看的太高了,我不是一个高人,充其量是一个NDIS编程的熟练工,对于NDIS HOOK的技术,我也是从NORTON那里看来的。 对于NDIS,说到底就是一个面向低端平台的网络接口规范。我最痛恨的就是他的效率,整个NDIS流程就是数据包的传递其实就是在COPY MEMORY中进行的。以至于当别人在同样配置的LINUX平台上用SYN FLOOD 攻击你的系统时,你只能苦笑。 |
|
|
42楼#
发布于:2003-12-12 20:11
[quote][quote]先回复一下,有时间在仔细讨论。 为了保持对ndis3的兼容性,多了一堆垃圾,增加了复杂性。 但是居然还兼容了,这是我认为非常了不起的地方。 讲一个细节: 对于ndis的接收发送函数,原来的设计是由ndis来做同步, ndissetattribute(serial),导致ndis部分地方不能重入, 简化了编码,却降低了效率。 nt4 sp3之后,这个地方也改过来了,现在send/recv都可 重入,特别是多cpu和多网卡。 如上种种,是我在好几年以前,到几年以前(我有2年没 仔细看过ddk了)的学习过程中,体会最深的一些事情。 包括还有那句关于内存分配的经典描述: “谁分配,谁释放” 这是安全的,代码清晰的,同时也带来了许多的回调过程, 又让代码变得看起来混乱起来。 核心异步处理的方法本质是回调,这成了我自己后来编写 代码的一个思维方式。 我的道路可能颇为奇怪,我是在学习win32的同时学习driver 的,抛开最早用vb学习写win程序那段历史,我记不清楚我是 先用win32写的第一个win程序还是用ddk写的第一个driver。 最后花在ndis上面的时间最多,所幸的是,那段时间的学习, 不只是给了我ndis得知识,也许更值得怀念的是从中学习到 的编程思想。 nt的核心是面向对象的,驱动程序也是面向对象的,只不过 是用c写出来的而已,一直以来,我都在写着这样的应用程序, 也许那些年来对ndis的阅读和思考在我心中带来了太深的烙印 吧。 [/quote] 再说一点体会。 从前,我很在意看某个函数该如何使用,后来我很在意看那些 参数的含义,特别是类似FLAG这样的参数。 此外,每个函数的调用IRQL_LEVEL和工作的LEVEL,也是我特别 在意的地方了,因为就只这一个信息,都足够告诉我很多了,大致 也能猜测到一些内部实现机制。 前段时间花了一些精力把原来的driver都改成SMP Safe了, 为了快速重现错误,为此弄了台至强的机器来,2 ht cpu。 让我对其中的一些细节了解又多了一些。 [/quote] 严重同意ing 每当看到一个函数或一个结构,一个FLAGS时,我做的第一件事是去看能不能在WIN95,NT4。0,NDIS3.0上运行,是不是MANDATORY COMMAND。 |
|
|
43楼#
发布于:2003-12-11 20:40
monkeyy就是比较刻苦!敬佩
做技术的,一定要想的深一些,不能只注重简单的功能实现,难得就是“认真”啊! 呵呵,仅是我的感想。 |
|
|
44楼#
发布于:2003-12-11 19:28
DDK的描述真的是很不错的,确实写这个东西应该也只有微软了!以前也常有人说NDIS应该看看Linux下的东西,但是终究没有非常仔细的去看过,既然兄弟再次提到这个东西,看来真的该抽时间去看看了!
看来老大就是老大,我看到这些调用IRQL_LEVEL和工作的LEVEL的时候基本猜不出任何东西,只知道这个东西很重要,一定要小心处理。 “谁分配,谁释放”这个东西在设计上确实不错的,尤其在NDIS中的那些PACKET环境中,恐怕这样做是最好的方式了!不知道谁是否有更好的方法可以来处理这个问题吗?我是想不出来了,呵呵! 对于NDIS架构,我原来有这样一个理解,不就是一个回调函数的集合吗?说白了不就是去管理这些回调函数吗?后来才发现绝对不要这么去理解,这肯定是不行的,但是这是最容易说清楚流程的一个说法。对于我刚开始说的NDIS架构,我真正的启发在于看ATM这个东西的时候,以前没有想过两种介质,但是在涉及到ATM哪个东西后,就发现了问题。如果系统本身有两个网卡,那么NDIS中的IMD就应该告诉TCP/IP有两个网卡,这才符合逻辑。碰到ATM后就发现,IMD不仅要告诉TCP/IP有两个网卡,并且每个网卡的性质必须是继承的,也就是说IMD中的Mniport必须继承真实网卡的所有信息,这同样这才符合逻辑。所以我得出了在网卡设备的管理上实际是分层的,因为分层是解决这个问题最简单的方法,同时它又是Windows其它驱动模型的本质。 我对NDIS的很多感悟对于写NDIS驱动并没有太多的价值,因为我喜欢软件中体现的思想,而不是这个软件做出来是什么样子,不过这些东西对于了解Windows的网络组件结构确实还略微有点用处。 |
|
|
45楼#
发布于:2003-12-11 15:04
[quote]先回复一下,有时间在仔细讨论。 为了保持对ndis3的兼容性,多了一堆垃圾,增加了复杂性。 但是居然还兼容了,这是我认为非常了不起的地方。 讲一个细节: 对于ndis的接收发送函数,原来的设计是由ndis来做同步, ndissetattribute(serial),导致ndis部分地方不能重入, 简化了编码,却降低了效率。 nt4 sp3之后,这个地方也改过来了,现在send/recv都可 重入,特别是多cpu和多网卡。 如上种种,是我在好几年以前,到几年以前(我有2年没 仔细看过ddk了)的学习过程中,体会最深的一些事情。 包括还有那句关于内存分配的经典描述: “谁分配,谁释放” 这是安全的,代码清晰的,同时也带来了许多的回调过程, 又让代码变得看起来混乱起来。 核心异步处理的方法本质是回调,这成了我自己后来编写 代码的一个思维方式。 我的道路可能颇为奇怪,我是在学习win32的同时学习driver 的,抛开最早用vb学习写win程序那段历史,我记不清楚我是 先用win32写的第一个win程序还是用ddk写的第一个driver。 最后花在ndis上面的时间最多,所幸的是,那段时间的学习, 不只是给了我ndis得知识,也许更值得怀念的是从中学习到 的编程思想。 nt的核心是面向对象的,驱动程序也是面向对象的,只不过 是用c写出来的而已,一直以来,我都在写着这样的应用程序, 也许那些年来对ndis的阅读和思考在我心中带来了太深的烙印 吧。 [/quote] 再说一点体会。 从前,我很在意看某个函数该如何使用,后来我很在意看那些 参数的含义,特别是类似FLAG这样的参数。 此外,每个函数的调用IRQL_LEVEL和工作的LEVEL,也是我特别 在意的地方了,因为就只这一个信息,都足够告诉我很多了,大致 也能猜测到一些内部实现机制。 前段时间花了一些精力把原来的driver都改成SMP Safe了, 为了快速重现错误,为此弄了台至强的机器来,2 ht cpu。 让我对其中的一些细节了解又多了一些。 |
|
|
46楼#
发布于:2003-12-11 14:54
先回复一下,有时间在仔细讨论。 为了保持对ndis3的兼容性,多了一堆垃圾,增加了复杂性。 但是居然还兼容了,这是我认为非常了不起的地方。 讲一个细节: 对于ndis的接收发送函数,原来的设计是由ndis来做同步, ndissetattribute(serial),导致ndis部分地方不能重入, 简化了编码,却降低了效率。 nt4 sp3之后,这个地方也改过来了,现在send/recv都可 重入,特别是多cpu和多网卡。 如上种种,是我在好几年以前,到几年以前(我有2年没 仔细看过ddk了)的学习过程中,体会最深的一些事情。 包括还有那句关于内存分配的经典描述: “谁分配,谁释放” 这是安全的,代码清晰的,同时也带来了许多的回调过程, 又让代码变得看起来混乱起来。 核心异步处理的方法本质是回调,这成了我自己后来编写 代码的一个思维方式。 我的道路可能颇为奇怪,我是在学习win32的同时学习driver 的,抛开最早用vb学习写win程序那段历史,我记不清楚我是 先用win32写的第一个win程序还是用ddk写的第一个driver。 最后花在ndis上面的时间最多,所幸的是,那段时间的学习, 不只是给了我ndis得知识,也许更值得怀念的是从中学习到 的编程思想。 nt的核心是面向对象的,驱动程序也是面向对象的,只不过 是用c写出来的而已,一直以来,我都在写着这样的应用程序, 也许那些年来对ndis的阅读和思考在我心中带来了太深的烙印 吧。 |
|
|
47楼#
发布于:2003-12-09 19:07
作架构真的是很难的东东。需要的是经验,智慧。看ndis是很久以前的事情了,印象最深刻的,并不在于它的这些架构,而是它能在文档中把这些架构讲解的非常清楚。这个可不容易。我个人觉得,能够作OS的人和公司都不在少数。但是能够把DDK做出来的人,我觉得只有微软。
另外,关于ndis,有一个建议,有时间看看linux下网络堆栈的实现,大有好处,二者结合比对,感悟更多。 |
|
48楼#
发布于:2003-12-07 19:12
感谢你的文章。 这两天真的是有点忙,忙的连留点时间给自己都是那么的困难。看来这位兄弟对NDIS还是很感兴趣,实在是性情中人,呵呵! NDIS是一个标准,实际上是为了在Windows平台下统一Network Device Interface。关于NDIS的应用,也就是我们使用NDIS开发东西,微软的文档已经足已解决所有的问题,包括后来由GJP公布出的2K与XP下的HOOK技术,这个东西等他公布了之后,你确实能在ndis.h文件中找到一些启发,但是真正第一个将它实现的就是GJP了,这就是高人的不同,呵呵! 我写的东西和实际开发已经没有多少关系了,更多的是在讨论NDIS这个软件包的软件架构,他和NDIS这个标准的最终结构是不同的。NDIS标准的最终架构就是Minipot和Protocol,可是这个软件包的架构是什么样子的呢,这个软件的设计上是什么样子的呢?这就是我这篇文章要讨论的东西。就好象TCP/IP协议的架构大家都是明白的,可是在Windows中这个TCP/IP软件包的架构又是什么样子的呢?这是不同的概念。 对NDIS架构进行深入地分析,我们会讨厌去看源代码的。NDIS的源码有多少?这个问题我一直在想,但是我一直认为不会很多。NDIS并不是一个非常神奇、非常不可思议的东西;相反,他是在继承了分层驱动模型这个基础上做出来的。分层驱动模型这个东西,大家都知道吧,做这样的设备管理器不需要太多的代码,但是需要好的设计。分层模型仍然使用了微软的惯用“伎俩”――回调函数。我不知道你是否意识到,回调函数可以说是微软最基本、也是最常用的一个东西,从Application到Kernel,那个没有回调函数的影子?分层的管理器不需要太多的代码,那么网络特性是否需要很多代码呢?网络特性主要是网卡PNP、电源、路由,以及协议的PNP。这些东西我觉得也不会有太多的代码!呵呵,总之,我觉得代码量不会非常的大! 对了,说到这里我还得感谢fracer和mikeluo以前对我的帮助,真的感谢二位,我也说哪句话吧,“兄弟,来沈阳我一定好好请你吃顿饭。”呵呵! |
|
|
49楼#
发布于:2003-12-07 13:34
很荣幸加入了NDIS驱动开发这个光荣的队伍中,希望能在这片土地上创造出辉煌 非常感谢! |
|
50楼#
发布于:2003-12-05 19:56
很荣幸加入了NDIS驱动开发这个光荣的队伍中,希望能在这片土地上创造出辉煌
|
|
51楼#
发布于:2003-12-05 17:07
的确,用来形容HOOK更准确.和API的文挡比较,NDIS不是很明了,当然也和我水平低有关.
|
|
52楼#
发布于:2003-12-05 17:04
可其实,其可是,看不到源代码,终究有隔靴搔痒的感觉。
|
|
53楼#
发布于:2003-12-05 14:37
感谢你的文章。 你说的是hook,不是ndis,ndis就是ms推出来的架构。ndis在ddk里面是有文档的。大多数的开发他的文档里面都写的很清楚了,已经够利用。不公开的只是ndis本身的源代码而已。 |
|
|
54楼#
发布于:2003-12-05 13:44
感谢你的文章。
NDIS很象斜派武功。厉害,实用。易走火入魔(挂),不好练。 不被名们正派(MICROSOFT)推崇(却在偷偷的用而不公布核心的文挡)。 [编辑 - 12/5/03 by asmsys] |
|
55楼#
发布于:2003-12-05 11:38
非常好,多谢!
|
|
56楼#
发布于:2003-12-04 16:45
先回复一下,有时间在仔细讨论。
至少到目前为止,我认为ndis的架构是目前几个操作系统中最优秀的一个。唯一的不足就是隐藏了太多的东西。 给你置顶一下,大家慢慢讨论。 |
|
|
上一页
下一页