阅读:2256回复:2
接上篇--有关Passthru的问题!
这里有关Passthru的问题很多,好像大家现在都再学习DDK中的这例子。
我觉得版主有必要做一个详细的总结让大家也都可以学习一下。 还有,我上篇贴子中的问题在这里继续讨论吧! (不断加分) |
|
|
沙发#
发布于:2001-08-06 21:57
颓废的利害,干什么事情都没有劲,更没有心思贴什么代码,贴完代
码我还要解释,不过我可以给你点思路。 所谓思路,也不过是我自己代码里面的注释... btw,passthru用NdisMEthIndicateReceive,是我说的第一种 方法,imdsample用的第2中方法。第2种方法会改变底层miniport 对协议层的动作,虽然效率高一点,但是不值得推荐。 // 原先的代码是用下面这个函数NdisMEthIndicateReceive,imd的协议层调用该函数,以imd的miniport身份通知ip层来了一个包, // 让ip层去利用packetsize和lookaheadbuffersize确定是否需要调用imd的miniport transferdata // 函数,imd的transfer data直接用imd的协议层的身份调用ndistransferdata,通知真正的miniport // 把剩下的数据发过来,miniport发过来之后调用imd 的协议层的transferdatacomplete,imd的协议层 // 的transferdatacomplete利用imd的miniport身份调用ndismtransferdatacomplete,告诉ip层说我已经 // 把数据给你了,数据就在那些指针里面。 // 在这种结构下,有两种策略,第一种是继续按照原有代码的结构,完全仿真真正的miniport行为, // 继续用transferdata结构,在imd的协议层的transferdatacomplete里面修改包内容,然后调用ndismtransferdatacomlete, // 第2种方案是,屏蔽真正的miniport动作,在下面不调用这个函数,直接用imd的协议身份调用ndistransferdata, // 让ndis去调用miniport的transferdata,miniport driver发送结束后就 // 会调用imd的协议层的transferdatacomplete,这样imd的协议层就得到所有数据,然后修改包内容,然后 // 用imd的miniport身份调用ndismindicatereceivepacket, // 通知ip层说来了一个数据包。这样的话,ip层永远不会调用imd里面的miniport的transferdata函数, // 这样做的效率节省了ip调用imd miniport的transferdata过程,效率相对要高一些。 |
|
|
板凳#
发布于:2001-08-06 22:39
按照microsoft的建议
TransferData的方式迟早要被淘汰 如果写程序还是用NdisMIndicatePackets的方式比较好 而且分析起来也比较简单搞清楚一个NDIS_PACKET结构就 可以了,我觉得如果搞不清楚TransferData也没有什么关系 毕竟现在的网卡很少有注册MiniportTransferDataHandle了 底层都不支持了 上层更不用管了 |
|
|