trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1494回复:10

一些理解,需指正

楼主#
更多 发布于:2002-08-12 13:14
初学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

最新喜欢:

ABUABUABUABU
我不仅要金子,我还要点石成金的手指!
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-12 13:23
谁能说说NDis的结构,我指得是要完成封包过滤,要对Protocol和Miniport完成些接口,用哪些数据结构(说个名称就OK了).另外在Protocol和Miniport中和NDIS有联系的一些数据结构和组织方式(指连表,数组什么的) :P
我不仅要金子,我还要点石成金的手指!
smallbarrow
驱动小牛
驱动小牛
  • 注册日期2002-06-05
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-08-12 15:36
小猪猪,你的理解有些不太对。如果你需要了解ndis或者在下面作东西,最好先看一看ddk,让xppassthru的例子加上dbgprint跑跑就明白的多。大家给你说了,你的理解可能没那么深刻,况且,有些时候有些人的说法可能没有那么准确,相信你自己。
嗒嗒的,是那马蹄 是我的心声 别了 一瞬间的花朵
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-12 16:16
恩,我试试看,不过大家能谈谈看法肯定对我很有好处,不管你们怎么理解,对还是不对,说说吧。或者在这里大家讨论讨论,关于NDIS的结构我查了很多资料好像都没怎么说,DDK也不祥,主要是介绍函数功能。
我不仅要金子,我还要点石成金的手指!
smallbarrow
驱动小牛
驱动小牛
  • 注册日期2002-06-05
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2002-08-12 16:27
首先,我要说的是不要将miniport.c和protocol.c分开看,它们是两个功能模块,但是它们两个并不是不搭界,是有联系的,至于说怎么样的联系,还是上面说的,需要你自己去实际跑了来体会。
如果你要是作一个单纯的nic驱动,可以参考其他的网卡驱动的例子。
祝你好运。
嗒嗒的,是那马蹄 是我的心声 别了 一瞬间的花朵
moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
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

按第一贴的“给分”键,给分。
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-08-12 17:07
最后的那个流程图不好看,能附个附件吗?还有没有文章,这篇看了有点power up 呵呵 :D
我不仅要金子,我还要点石成金的手指!
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-08-12 20:36
多谢斑竹转载好的文章,以后有什么好文章也不要忘了哟:)
中英文都好
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-08-13 13:19
链接看不了阿
我不仅要金子,我还要点石成金的手指!
moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-08-13 13:26
up2
按第一贴的“给分”键,给分。
sunnnn
驱动牛犊
驱动牛犊
  • 注册日期2002-01-30
  • 最后登录2009-03-20
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-08-14 10:55
好文章,看完这篇文章之后,我才知道IMD如何与上层协议捆绑,原来,判断介质类型,并返回给Ndis的过程,实际上就完成了IMD到Protocol的绑定。

我这样说不知对不对?请指正。
游客

返回顶部