阅读:2029回复:3
NdisMSendComplete 调用含糊不清
IMD的miniport层 MiniportSend 函数 里面会调用NdisMSendComplete函数, 根据DDK说明,NdisMSendComplete函数又会自动调用
ProtocolSendComplete函数, ProtocolSendComplete函数里面又会调用NdisMSendComplete函数。。。 搞不明白为什么MiniportSend调用NdisMSendComplete, ProtocolSendComplete也调用了NdisMSendComplete函数? |
|
沙发#
发布于: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 也不会被调用的! |
|
板凳#
发布于:2008-09-08 11:31
先谢谢楼上老大。 我刚才说错了,是MiniportSendPackets里面调用了NdisMSendComplete,ProtocolSendComplete也调用了NdisMSendComplete函数。 这该是重复调用了。
还是很不清楚为什么调用两次。 我看的是DDK自带的passthru例子 |
|
地板#
发布于:2008-09-12 16:45
dahubaobao解释的比较清楚了,
你说的“MiniportSendPackets里面调用了NdisMSendComplete”我猜应该是有条件的吧,比如 在NdisSend后 if (Status != NDIS_STATUS_PENDING) 这其实对应着dahubaobao说的发送同步完成的情况,在这种情况下,ProtocolSendComplete将不再会被调用。 |
|