forward813
驱动牛犊
驱动牛犊
  • 注册日期2009-10-28
  • 最后登录2011-03-27
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望121点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2615回复:5

NDIS PtReceivePacket如何数据包进行处理

楼主#
更多 发布于:2009-12-21 22:14
  由于PtReceivePacket()接收的不是完整的包,如果我要对包进行处理,比如说改包的目的ip的话,改如何进行呢?谢谢大牛!
forward813
驱动牛犊
驱动牛犊
  • 注册日期2009-10-28
  • 最后登录2011-03-27
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望121点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-12-28 13:55
up下
forward813
驱动牛犊
驱动牛犊
  • 注册日期2009-10-28
  • 最后登录2011-03-27
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望121点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-12-28 13:56
Re:   PtReceivePacket()和PtReceive()分别在什么情况下调用呢?
CC_dbger
驱动牛犊
驱动牛犊
  • 注册日期2009-01-01
  • 最后登录2015-02-04
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望211点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-01-09 00:27
PtReceivePacket()应该是默认调用的函数,而PtReceive()是在NIC资源不足调用ndisMxxxindicate()向上指示数据时才调用,处于兼容性考虑微软保留对这个函数的支持。PtReceive()有个参数是前视缓冲区,里面是接收到的数据,有可能是完整的数据也有可能是部分数据,调用 NdisGetReceivedPacket()函数如果成功证明前视缓冲里是完整的数据包,直接拷过来操作就行了,如果不是完整的数据包上层协议驱动会调用NdisTransferData()获取剩下的数据。如果在这两个函数里获取的是以太网数据,那么这个包的内容就是个完整的数据帧,前14字节是源MAC、目的MAC和两字节的协议类型,如果是IP协议就是0 8,紧接着是20字节(有可能更长,根据IP头里的长度参数计算)的IP头,可以修改IP地址,记住修改完之后重新计算一下校验和,如果是TCP包而且要修改数据包内容的话还要对数据重新计算校验和,要不然协议驱动会给你丢掉的。不过你都接收到数据了还改目的IP干什么?
sw1000
驱动牛犊
驱动牛犊
  • 注册日期2005-08-30
  • 最后登录2010-03-12
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望42点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-02-06 18:56
对每个包内部指针,使用MmIsAddressValid都可以发现是无效指针.这种情况大量存在,不应该是正常情况.
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
5楼#
发布于:2010-02-06 19:46
引用第4楼sw1000于2010-02-06 18:56发表的  :
对每个包内部指针,使用MmIsAddressValid都可以发现是无效指针.这种情况大量存在,不应该是正常情况.



理解有误
走走看看开源好 Solaris vs Linux
游客

返回顶部