king00star
驱动牛犊
驱动牛犊
  • 注册日期2006-08-17
  • 最后登录2014-04-19
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望92点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
阅读:1921回复:3

看了以前的帖子,但还是不明白MPSendPackets为什么要调用NdisMSendComplete?

楼主#
更多 发布于:2008-08-28 15:03
看了帖子:
http://bbs.driverdevelop.com/read.php?tid-4770-keyword-NdisMSendComplete.html
http://bbs.driverdevelop.com/simple/index.php?t5317.html

我想流程应该是:
MPSend 始终不调用NdisMSendComplete,该函数返回ndis_status_pending时,系统调用我们注册的PtSendComplete,返回其它就不会调用PtSendComplete
MPSendPackets没有返回值,系统肯定会调用PtSendComplete。但是既然系统肯定会调用PtSendComplete,我们干吗要在MPSendPackets函数里调用NdisMSendComplete?PtSendComplete也调用NdisMSendComplete,这样不是重复处理吗?

我修改了MPSendPackets函数,发送ICMP报文时将内容随便改了一下,实际也只发出来了修改后的报文,PING的机器也能收到我修改后的报文,但是很奇怪本机上用wireshark抓包为什么能看到发送两个ICMP报文,一个是没有修改内容的,一个是修改内容的。wireshark(WINCAP)不是工作在协议层吗?我在中间层修改的报文为什么能抓到呢
boysmiling
驱动牛犊
驱动牛犊
  • 注册日期2007-12-12
  • 最后登录2009-12-02
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望37点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-08-29 10:26
我理解流程是这样:
当MPSend 函数返回ndis_status_pending时,系统调用NdisMSendComplete,ndis调用我们注册的PtSendComplete,返回其它就不会调用PtSendComplete
MPSendPackets 中调用NdisMSendComplete的目的应该是通知上层协议packet已经发送可以释放资源了
king00star
驱动牛犊
驱动牛犊
  • 注册日期2006-08-17
  • 最后登录2014-04-19
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望92点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-08-29 11:05
我理解流程是这样:
当MPSend 函数返回ndis_status_pending时,系统调用NdisMSendComplete,ndis调用我们注册的PtSendComplete,返回其它就不会调用PtSendComplete
MPSendPackets 中调用NdisMSendComplete的目的应该是通知上层协议packet已经发送可以释放资源了  ====>>但是由于MPSendPackets 肯定会导致系统调用PtSendComplete,而PtSendComplete又调用了NdisMSendComplete,这样岂不是通知两遍?
qq274559697
驱动牛犊
驱动牛犊
  • 注册日期2008-02-20
  • 最后登录2009-07-30
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望9点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-09-04 11:32
Re:看了以前的帖子,但还是不明白MPSendPackets为什么要调用NdisMSend
http://bbs.driverdevelop.com/read.php?tid-4770-keyword-NdisMSendComplete.html

这个链接的三楼已经说的很清楚了,你去仔细看一下就知道了
游客

返回顶部