阅读:1646回复:4
为什么在老式网卡上调通的mpsend到新式网卡上就不能用了呢?
在论坛上看的一个修改发包的源码,修改了MPSend和PTSendComplete的程序,在老式网卡上是可以运行的,好像是zuozi写的吧,但是到了intel的新网卡上就不灵了,我已经在passthru.c中把MPSendPackets给注释掉了呀,不修改包的内容的话没有问题,修改完后连收包都收不到了,事情很急,那位碰上过这种情况给指点一下吧,郁闷了好久了
|
|
沙发#
发布于:2004-06-19 07:25
Intel的网卡很可能是通过MPSendPackets发送包的。MPSendPackets与MPSend只有一个会工作,具体情况取决于网卡的型号,asmsys在谈到MPReceivePackets与MPReceive的区别时讲得很详细。
|
|
|
板凳#
发布于:2004-06-19 10:21
首先谢谢canoe982的回答。下面是我的调试过程,希望能把问题说得明白一些。
我是这样调试的,首先不改动MS的passthru例程,在passthru.c里面确实只有MChars.SendHandler = MPSend; (MChars.SendPacketsHandler = MPSendPackets;)这句是被注释掉的,我打印调试信息出来后,确实只走MPSend;然后我又将PChars.ReceivePacketHandler = PtReceivePacket;修改为 PChars.ReceivePacketHandler = NULL;修改后收包发包也没有任何问题,也不走PtReceivePacket了,只从PtReceive中经过。 然后我在PTReceive中修改收到的包也没有问题,用Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);得到的Packet是不为空的,但是当我把在MPSend中修改发包的模块一弄上去,并且修改PTSendComplete,程序就不正常工作了。我试着连一台ftp服务器,并在那台服务器上抓包,发现客户端在不停的发SYN包,但是服务器端却不回应。在MPSend中我只是新生成了一个与原来内容相同的包,还没有改包的内容呢。 |
|
地板#
发布于:2004-06-19 16:07
我想可能你修改了之后,根本就没有转发。Passthru本身实现的就是这种功能,只是把包拷贝了一份,然后转发出去。你可以认真的分析一些整个过程。
|
|
|
地下室#
发布于:2004-06-20 16:37
当同时注册MPSend和MPSendPackets, NDIS从不调用MPSend, 而只会调用MPSendPackets! 初步估计你在MPSend中从新组PACKET有问题! 注意, 从上层传递来的PACKET是"只读"的, 不能够修改它! 你必须从新分配内存来复制原来的PACKET, 再发送出去! 另外, 这与接收PACKET没有关系.
|
|