阅读:1494回复:10
一些理解,需指正
初学NDIS,有很多问题,下面是我的一点理解,大家指正一下(可能错的很离谱,见笑)
我看的例子是xpassthru 我的理解是 Ndis是界于protocol层和Miniport层。完成一些封包的过滤。Ndis有两个功能。 一个是面向Portocol层,表现的作用就像Miniport(或者是虚拟Miniport,不知道我这概念是否正确)。需要完成的是封包的发送。 1、用NdisIMRegisterLayerMiniport注册MiniportXxx系列功能函数。(针对Protocol?下传的封包此时调用的函数被替换?) 2、既然要“虚拟”Miniport,就要获得Miniport的Context,用 NdisIMGetDeviceContext()得到。 通过NdisMSetAttributeEx()函数修改该环境。 (这些主要是针对Miniport层?) 另一个是面向Miniport层,表现出来的功能是Portocol层。主要完成接受功能 。 1、用NdisRegisterProtocol函数注册ProtocolXxx系列函数。 2、获得Protocol的Config。 NdisOpenProtocolConfiguration() NdisReadConfiguration() 3、NdisOpenAdapter() 好像是将protocol绑定到底层的NIC,是把? 但作为Miniport时,怎么用NdisIMRegisterLayerMiniport一个函数就够了? 以上是我的一些理解和认为关键的函数。大家校正一下,肯定还漏了一些函数,能给我指出来并说说作用吗? 谢了先 :D |
|
最新喜欢:ABUABU
|
沙发#
发布于:2002-08-12 13:23
谁能说说NDis的结构,我指得是要完成封包过滤,要对Protocol和Miniport完成些接口,用哪些数据结构(说个名称就OK了).另外在Protocol和Miniport中和NDIS有联系的一些数据结构和组织方式(指连表,数组什么的) :P
|
|
|
板凳#
发布于:2002-08-12 15:36
小猪猪,你的理解有些不太对。如果你需要了解ndis或者在下面作东西,最好先看一看ddk,让xppassthru的例子加上dbgprint跑跑就明白的多。大家给你说了,你的理解可能没那么深刻,况且,有些时候有些人的说法可能没有那么准确,相信你自己。
|
|
|
地板#
发布于:2002-08-12 16:16
恩,我试试看,不过大家能谈谈看法肯定对我很有好处,不管你们怎么理解,对还是不对,说说吧。或者在这里大家讨论讨论,关于NDIS的结构我查了很多资料好像都没怎么说,DDK也不祥,主要是介绍函数功能。
|
|
|
地下室#
发布于:2002-08-12 16:27
首先,我要说的是不要将miniport.c和protocol.c分开看,它们是两个功能模块,但是它们两个并不是不搭界,是有联系的,至于说怎么样的联系,还是上面说的,需要你自己去实际跑了来体会。
如果你要是作一个单纯的nic驱动,可以参考其他的网卡驱动的例子。 祝你好运。 |
|
|
5楼#
发布于:2002-08-12 16:33
给你粘一个清华bbs上的文章吧。
发信人: Immortal1015 (后处理~列拷贝专家), 信区: DriverDev 标 题: Passthru阅读笔记(一) IMDriver的绑定与卸载过程 发信站: BBS 水木清华站 (Thu Aug 16 22:34:31 2001) 涂鸦第一篇 IMDriver的绑定与卸载过程 一、绑定过程 首先是Protocol端和下层NIC驱动绑定。NDIS调用PtBindAdapter, 在PtBindAdapter中调用NdisOpenAdapter,并等待PtOpenAdapterComplete 执行,在这里用到了NDIS_EVENT。然后调用NdisIMInitializeDeviceInstanceEx 来触发Miniport端与上层协议的绑定。 在调试的时候有一个疑问,居然跟踪不到DriverEntry的调用 份特死我了。 PtBindAdapter中有用的参数主要是DeviceName和SystemSpecific1,其中 DeviceName是下层NIC驱动的服务名,SystemSpecific1可以用来 读取注册表中相关的值。 1.调用NdisOpenProtocolConfiguration,参数是SystemSpecific1 获得ConfigHandle. 2.调用NdisReadConfiguration(Status, &Param, ConfigHandle, &DeviceStr---\"Upperbind\", NdisParameterString); 来获得注册表里相关的绑定信息。 3.再调用NdisReadConfiguration来获得BundleID,其实这段可以不要, 如果你不需要LBFO的话。 4.调用NdisOpenAdapter,参数DeviceName来绑定底层NIC驱动。 5.调用NdisImInitializeDeviceInstanceEx来触发MpInitialize的调用。 在MpInitialize里面主要做两件事情: 1.判断介质类型 2.调用NdisMSetAttributesEx设置一些特性,其中NDIS_ATTRIBUTE_DESERILIZE 和NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER值得注意。 二、卸载过程 1.首先注意到,在DriverEntry部分: NdisMInitializeWrapper | | NdisIMRegisterLayeredMIniport | | NdisMRegisterUnloadHandler 这个函数为驱动注册一个卸载函数PtUnload,在PtUnload里面调用 NdisDeregisterProtocol来取消注册Protocol端 2.看看相关的Protocol端和Miniport端都做些什么工作。 Miniport: **HaltHandler:这个处理函数当底层NIC已经time out且 NDIS中止NIC驱动时,或者操作系统关机时被调用。 Protocol: **UnbindAdapterHandler **CloseAdapterCompleteHandler 当点击卸载IM时,ndis首先调用PtUnBindAdapter,在这个 函数里面: 1)判断IM Driver 的Miniport Handle是否为空。 2)如果不为空,则调用NdisImDeInitializeDeviceInstance来出发MpHalt的执行。 3)如果为空,则调用NdisCloseAdapter,然后等待CloseAdapterCompleteHandler 的触发。还是用了事件来等待。 4)释放分配的资源。 在MpHalt函数里面执行上面的第3,4。 卸载的流程大体如下: PtUnbindAdapter | Yes MiniportHandle==NULL?------------------ | | |No | | | NdisImDeInitializeDeviceInstance | | | | | | | MpHalt | |<------------------------------| | NdisCloseAdapter | | PtCloseAdapterComplete | | PtUnload |
|
|
6楼#
发布于:2002-08-12 17:07
最后的那个流程图不好看,能附个附件吗?还有没有文章,这篇看了有点power up 呵呵 :D
|
|
|
7楼#
发布于:2002-08-12 20:36
多谢斑竹转载好的文章,以后有什么好文章也不要忘了哟:)
中英文都好 |
|
|
8楼#
发布于:2002-08-13 13:19
链接看不了阿
|
|
|
9楼#
发布于:2002-08-13 13:26
up2
|
|
|
10楼#
发布于:2002-08-14 10:55
好文章,看完这篇文章之后,我才知道IMD如何与上层协议捆绑,原来,判断介质类型,并返回给Ndis的过程,实际上就完成了IMD到Protocol的绑定。
我这样说不知对不对?请指正。 |
|