第八讲 NDIS协议驱动程序设计(下).ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实习内容 NDIS协议驱动程序 数据包的解析 实习环境 实习的意义与要求 NDIS协议驱动程序 数据接收部分的实现—— read.c 当NIC从网络上接收到数据并通知NDIS时,作为已经在protocolChar结构中注册过的函数,NDIS将调用PacketReceiveIndicate或PacketReceivePacket二者之一作为接收处理函数将NIC从网络上接收到的数据缓存起来。其中,PacketReceiveIndicate作为协议驱动程序的ProtocolReceive函数是必须要提供的,而PacketReceivePacket作为协议驱动程序的ProtocolReceivePacket函数提供与否是可选的。二者的主要区别在于当NIC支持一次接收多个数据包时使用ProtocolReceivePacket更富效率。 NDIS协议驱动程序 数据接收部分的实现—— read.c 在进入函数PacketReceiveIndicate之后,首先由ProtocolBindingContext这一参数得到保存了诸多重要数据的open结构,这里维护着packet驱动程序的运行时状态信息。 在这之后的IoIncrement用于对设备的使用情况计数并负责同步。 接下来再作一个简单的判断,我们只关心和处理以太网的数据包,如果不是的话则直接返回。 PacketReceiveIndicate 下面的工作是构造一个packet,用来接收NIC从网络上接收到的数据包。第一步先调用NdisAllocatePacket从PacketPool里请求分配一个packet descriptor。这里,PacketPool是在PacketBindAdapter中通过调用NdisAllocatePacketPool而得到的。如果调用NdisAllocatePacket请求分配packet descriptor失败的话,说明用来保存数据包的缓冲区已满,直接通过goto语句跳转至ERROR处,等待善后处理。 第二步由HeaderBufferSize和 PacketSize相加得到整个数据包的大小,并通过NdisAllocateMemory为其分配存储空间。 第三步调用NdisAllocateBuffer请求分配一个buffer descriptor来描述刚刚通过调用NdisAllocateMemory而得到的存储空间。 最后一步是将该buffer descriptor链接到先前得到的packet descriptor上。 NDIS协议驱动程序 数据接收部分的实现—— read.c PacketReceiveIndicate 下面的工作是数据传输。 由于NIC设计的原因,从以太网上接收到的数据包被分成包头和数据两部分分别传输。NdisMoveMappedMemory函数负责把包头部分拷贝到前面组装好的packet之中,之后再调用NdisTransferData将数据部分拷贝过来。 如果NdisTransferData返回的status值为NDIS_STATUS_PENDING,那么NDIS将负责自动调用PacketTransferDataComplete函数,否则的话控制流继续向下,由PacketReceiveIndicate负责调用PacketTransferDataComplete。总之,不论在哪种情况下PacketTransferDataComplete这一函数都会被用到。 NDIS协议驱动程序 数据接收部分的实现—— read.c PacketReceiveIndicate PacketTransferDataComplete函数的实现非常简单,如果先前调用NdisTransferData传输数据成功完成的话,则将packet插入缓冲队列中,等待上层应用程序读取。然后再调用IoDecrement,这就是我们前面提到过的善后工作,IoIncrement和IoDecrement这两个函数必须成对使用。 NDIS协议驱动程序 数据接收部分的实现—— read.c PacketTransferDataComplete PacketReceivePacket所完成的工作与PacketReceiveIndicate和PacketTransferDataComplete这两个函数共同完成的工作相同,因此当NIC支持同时接收多个数据包时使用PacketReceivePacket更富效率。 二者的不同点在于当NDIS调用PacketReceivePacket时是将包头和数据作为一个整体一起交付的,因此没有必要像在PacketReceiveIndicate中的做法那样,将包头和数据分别拷贝到packet中。这里,我们可以使用NDIS提供的NdisCopy

文档评论(0)

开心就好 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档