fuwangxi
驱动牛犊
驱动牛犊
  • 注册日期2007-02-03
  • 最后登录2011-04-11
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望6点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:2029回复:3

NdisMSendComplete 调用含糊不清

楼主#
更多 发布于:2008-09-04 15:23
IMD的miniport层 MiniportSend 函数 里面会调用NdisMSendComplete函数, 根据DDK说明,NdisMSendComplete函数又会自动调用
ProtocolSendComplete函数, ProtocolSendComplete函数里面又会调用NdisMSendComplete函数。。。

搞不明白为什么MiniportSend调用NdisMSendComplete, ProtocolSendComplete也调用了NdisMSendComplete函数?
dahubaobao
驱动牛犊
驱动牛犊
  • 注册日期2004-09-25
  • 最后登录2012-03-14
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望80点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-09-04 18:25
NdisMSendComplete是个宏  NDIS很多东西都是宏
不过MiniportSend哪里调用NdisMSendComplete了?

对于MiniportSend 只有2种情况:
1,发送同步完成,释放资源

2,发送没有同步完成 ,资源不会释放(因为下层驱动还需要使用)
直到发送完成后调用ProtocolSendComplete通知可以释放资源了

你的驱动中的ProtocolSendComplete在释放相关资源后
要继续调用NdisMSendComplete通知上层协议驱动释放资源.......

不知道这么说你明白吗............

补充一下:
之所以ProtocolSendComplete中需要调用NdisMSendComplete
是因为在MiniportSend中如果没有同步完成,会返回PENDING的
那么上层驱动也会认为这个包的资源需要放到ProtocolSendComplete
中释放,NdisMSendComplete的用处就是发出这个通知,如果你的
IMD不调用NdisMSendComplete,那么上层驱动的ProtocolSendComplete
也不会被调用的!
fuwangxi
驱动牛犊
驱动牛犊
  • 注册日期2007-02-03
  • 最后登录2011-04-11
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望6点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-09-08 11:31
先谢谢楼上老大。 我刚才说错了,是MiniportSendPackets里面调用了NdisMSendComplete,ProtocolSendComplete也调用了NdisMSendComplete函数。 这该是重复调用了。

还是很不清楚为什么调用两次。 我看的是DDK自带的passthru例子
smilebear
驱动牛犊
驱动牛犊
  • 注册日期2002-06-14
  • 最后登录2010-06-24
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望38点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-09-12 16:45
dahubaobao解释的比较清楚了,
你说的“MiniportSendPackets里面调用了NdisMSendComplete”我猜应该是有条件的吧,比如 在NdisSend后
if (Status != NDIS_STATUS_PENDING)

这其实对应着dahubaobao说的发送同步完成的情况,在这种情况下,ProtocolSendComplete将不再会被调用。
游客

返回顶部