阅读:2318回复:13
求救!!!!在passthru里面的ptreceive函数中采用ndis发送自定义包的问题!!!!大侠们,看一眼吧!50分!
我用passthru做包的判断转发,在ptreceive里面截获包然后解析包头,当发现特定包的时候,就组装一个自己的包发出去,现在我其他的地方都基本完成了,就是每次调用NdisSend()就直接重起了,也没有蓝屏,下面是我程序的几个改动passthru的地方
1。截获包和包的解析都是按照论坛上以前有的思路做的,没有问题。 2。参看以前的文章,据说因为mpsend和ptsendcomplete的分配释放资源格式问题,如果直接在ptreceive调用ndissend会蓝屏,所以我修改了mpsend和ptsendcomplete函数,让他们也和截获包时候的处理一样,对于mpsend所收到的包,不是将一个packet指针连到原包上发送,而是重新分配内存,将整个包copy过去之后再发送我所拷贝的包,然后根据是否返回pending选择在mpsend或者是ptsendcomplete中释放我所分配的资源。修改完后,我调试了一下,发现没有问题,都很正常。 3。最后我在ptreceive中做判断,收到满足特定条件的包的时候就调用自己的发包函数。这个函数中,我自己分配一段memory,填写mac头,ip头,tcp头,数据,然后调用ndissend,然后根据返回值在这个函数或者是ptsendcomplete中释放自分配的资源。 4。当我把ndissend语句删掉时,一切都很正常,可以看到我自己定义的资源分配然后释放,就是一加上ndissend就直接重起了。 各位大侠分析看看会是什么原因?多谢了!!! 另外,我自己怀疑问题出在ndissend的调用参数上,这里我有一个问题一直不懂,在mpsend中发包的时候,ndissend的handle应该是这样的:padapt=(PADAPT)MiniportAdapterContext->pSecondaryAdapt ndissend(&Status,pAdapt->BindingHandle, MyPacket); 然而在ptreceive中我们得到的是pAdapt =(PADAPT)ProtocolBindingContext,那我们在这里应该怎样得到MiniportAdapterContext哪?我就一直搞不明白,得不到的话,调用ndissend的时候第二个参数怎么写哪??我的英文比较差,看ddk看得不太明白,这两个Context到底是什么关系,又是怎么使用的,我一直不太明白。 希望各位大侠指点!!!!!小弟这里有礼了!!!! [编辑 - 4/19/03 by zuozi] |
|
沙发#
发布于:2003-04-20 20:13
为什么没人理我呀,大侠们?呜呜~~~~ 我现在是直接用ptreceive中间得到的pAdapt来做的,就是把这个pAdapt->BindingHandle作为参数用了,现在是不死机了,但是收不到包:(我在ptsendcomplete里面跟踪到了发送包的状态是success但是在目的机器上就是收不到包。 我实验用的包是把ping包拷贝了一下,然后发到对方那里去,但是就是收不到,哪位大侠能够讲讲为什么?多谢!! 另外我想知道mac头上的目的地址和源地址都怎么写呀,直接写网卡的mac地址是么?可是我用sniffer看我得机子上ping包的mac地址好像不是网卡的mac地址呀,这是为什么? 如果我直接用网卡的mac地址让两台机子之间互相跑,可以么? 各位指点迷津呀!!! |
|
板凳#
发布于:2003-04-21 01:31
我也在学习中,路真艰难。求人不如求己。
你的情况也许和别人不一样,无从下手。解决之后就是升华。 |
|
地板#
发布于:2003-04-21 09:13
zuozi老兄,我正在做一个程序,很需要你的经验!
如果可以的话,请联系! QQ:8289990 email:cyran@sohu.com |
|
地下室#
发布于:2003-04-21 16:26
各位大侠出来帮忙呀,现在我已经几乎肯定问题出在哪里了,可是就是不会改正 :(
我今天用ad hoc的网卡,直接在包头写mac地址对着发包,但是发现我自己定义的发包函数虽然返回pending并且在ptsendcomplete中返回success,但是实际上对方并不能接收到包,但是我把mpsend改掉发同样的包时,发现可以发出去并且成功的接收到,因此我觉得我得问题是在调用NdisSend时的第二个参数有问题。 我参照passthru里面的源代码,mpsend调用Ndissend的时候用的是系统给的MiniportAdapterContext。然后采用了: pAdapt=(PADAPT)MiniportAdapterContext pAdapt->pSecondaryAdapt ndissend(&Status,pAdapt->BindingHandle, MyPacket); 然而在ptreceive中我们得到的是ProtocolBindingContext。这时有 pAdapt =(PADAPT)ProtocolBindingContext 那么这个时候调用NdisSend函数的话,第二个参数怎么写呢? 以前的帖子有大侠说可以在ptreceive里面用ndissend,但是没有讲如何得到MiniportAdapterContext,我是菜鸟,各位指点一下吧,我真的很郁闷呀 :(多谢!!! |
|
5楼#
发布于:2003-04-21 16:39
zuozi兄,如果可以的话,把你的联系方式留一下
|
|
6楼#
发布于:2003-04-21 19:08
mail:yangfanzuoz99@mails.tsinghua.edu.cn
|
|
7楼#
发布于:2003-04-22 10:27
你干吗用padapt=(PADAPT)MiniportAdapterContext->pSecondaryAdapt
ndissend(&Status,pAdapt->BindingHandle, MyPacket); 你为什么要pSecondaryAdapt????你收发包用的不是一块网卡么?还是你做的LBFO?? |
|
|
8楼#
发布于:2003-04-22 12:25
mail:yangfanzuoz99@mails.tsinghua.edu.cn zuozi老兄,你的这个邮箱我的邮件无法送达 麻烦您再给个邮箱!thx |
|
9楼#
发布于:2003-04-23 11:50
在PtBindAdapter中调用的NdisOpenAdapter这个返回的应该是一个
小端口的hanle :) |
|
|
10楼#
发布于:2003-04-23 16:56
To mikeluo大侠:多谢你的建议,我今天发现问题了,我的机子上装了两块网卡,一块有线一块无线,我做的东西在无线网卡上面跑,但是我没有把有线网卡禁用掉,所以就收不到包了,不过我现在还是有点不大理解,为什么不把有线网卡禁用就看不到包呢,passthru应该可以截获所有的包才对吧
顺便放分,多谢! |
|
11楼#
发布于:2003-04-23 16:56
To mikeluo大侠:多谢你的建议,我今天发现问题了,我的机子上装了两块网卡,一块有线一块无线,我做的东西在无线网卡上面跑,但是我没有把有线网卡禁用掉,所以就收不到包了,不过我现在还是有点不大理解,为什么不把有线网卡禁用就看不到包呢,passthru应该可以截获所有的包才对吧
顺便放分,多谢! To cyran:不好意思,我写错了,是yangfanzuozi99@mails.tsinghua.edu.cn |
|
12楼#
发布于:2003-04-23 17:22
你的passthru binding到那块有线网卡上了么?
|
|
|
13楼#
发布于:2003-04-23 18:46
我加载passthru的时候好像自动就把两块网卡都绑定了
|
|