阅读:4627回复:25
关于PtReceive和PtReceivePacket
各位前辈:
究竟是调用PtReceive还是PtReceivePacket是由网卡决定的? 会不会和接收的是什么包有关系?同时MPSend和MPSendPackets我也有这样的疑问。 再有一问: 我想在发送某一特定类型的包时,将其拦住,同时做一个假的包来欺骗准备接收返回包的应用程序,我先改了发送的包的内容再直接调用PtReceivePacket返回发送的包,结果对应用程序来说没有用,那位前辈给我指条明路!!先谢了!! |
|
|
沙发#
发布于:2004-07-01 12:04
本来就是有两种方式,但如果你的ndis版本很底,那就只有PtReceive了
|
|
|
板凳#
发布于:2004-07-01 11:06
确实经典帖子,我刚巧碰到这几种情况,我的一块RTL8139网卡只能调用ptreceive,而Intel pro/100 网卡则有少量ptreceive的调用,更多的是调用ptreceivepacket.
|
|
|
地板#
发布于:2002-06-02 22:51
很有价值的一贴,需要好好学习。
|
|
|
地下室#
发布于:2002-01-07 21:26
请问版主:
当NdisGetReceivedPacket返回null时,如何使用transferdata来得到后续数据? 能不能提供一些源码? |
|
5楼#
发布于:2001-11-27 14:28
To 2bToo:
我自己只有一台机器,我也在MPSEND中仿造PACKET发回去,不过我是自己做一个新的PACKET包,用NDISMINDICATEPACKET()发回去的,注意的是一些CHECKSUM,TIMESTAMP的设置,和一定要先仿造ARP,ICMP应答包,我试过可以接收(仿造了几个以太地址和IP地址,用PING命令执行很好), 不过我不知在哪释放内存(NDIS_BUFFER指向的数据),因为如果在RETURNPACKET()处释放,会当机(并不是马上当机),可能过后NDIS会自动释放,对么? 另外对于自返回的PACKET(127.0.0.1)是不过IM的. |
|
|
6楼#
发布于:2001-11-25 17:18
弄个来给大家参考参考啊!!
|
|
|
7楼#
发布于:2001-11-23 13:22
I crack all PCAUSA Sample:) 你指啥?是有PCAUSA所有sample的源码吗?那你牛逼了! :cool: [编辑 - 11/23/01 作者: 2btoo] |
|
|
8楼#
发布于:2001-11-23 13:06
I crack all PCAUSA Sample:)
|
|
|
9楼#
发布于:2001-11-23 12:28
请问胡版主:
headbuffer和lookaheadbuffer是什么关系? lookaheadbuffer包括headbuffer? packet里的buffer chain中的第一个buffer是从headbuffer开始,还是lookaheadbuffer开始? 谢谢... |
|
10楼#
发布于:2001-11-23 10:52
to Top
我看过的包都是有MAC头的,在PtReceivePacket和MPSend里是这样,在MPSendPAckets和PtReceive里也应该是这样吧! |
|
|
11楼#
发布于:2001-11-23 10:49
我觉得也不是,因为不是我改过的包。我有什么办法能做一个假包返回给本机吗? |
|
|
12楼#
发布于:2001-11-23 10:41
To Hu大侠 你自己主机上得到的那个包估计不是过网卡的那个。 回环地址的数据包都不经过网卡的。 |
|
|
13楼#
发布于:2001-11-23 08:45
To Hu大侠
这是一个广播包,要广播出去肯定是要过网卡的丫,我在MPSend里面也可以得到这个包,SoftICE里DbgPrint可以看到这个包的内容。?? |
|
|
14楼#
发布于:2001-11-22 23:21
首先再次感谢斑竹为我做了如此详细的回答!另外问问这几个函数里的包是不是都没MAC头??
|
|
|
15楼#
发布于:2001-11-22 22:57
就是没反应 到本机的数据包不过网卡,也不过IMD的MINIPORT。 所以你这样做几乎没戏 |
|
|
16楼#
发布于:2001-11-22 22:55
不会吧??我怎么没见调用过ptrecvpacket啊??都是调用ptrecv的啊!可以用dbgprint来论证这点,用改包的方法好象也太麻烦了!要说资源不足我就不理解了!什么情况下才叫资源不足??80%内存被利用?80%CPU被利用?好象和着两个函数的调用没有太直接的关系!在我的机子上就没调用过ptrecvpacket!好奇怪!如果有会输出dbgpring的信息的!我在开机的时候也就是在driverentry的时候就开始断一次!看有什么函数被调用!而且加了个记数来记录他们调用了几次!可以到了最后一次都没!于是我又加了个函数专门统计每个函数的调用次数和次序!可是也没发现ptrecvpacket的调用!现在都蒙了!DDK上面说的是:ptrecvpacket是个可选的函数(就是可要可不要!!),但是ptrecv是必选的函数!!,而且和多包接受有关!于是我打开了mpsnedpackets函数!从此mpsend下岗了(DDK上是这么说的!事实也是!)按道理是该调用ptrecvpacket了?可是又不见它来报到!还是由ptrecv在忙!看来passthru的包的流程真的很乱!不知道谁那还有其他IM驱动的例子?如果能有多个参考可能就容易明白了!希望哪位大虾不吝赠阅!贴在附件里让大家都进步进步!听说有好几个叫IPBLOCK、IMDRV、IMSIMP什么的都是IM的例子,还有许多,不过都是只见雷声不见雨点的东西!一般是要收费的(某某洋网站上的!),不知道谁知道哪有免费的?或哪位能贡献一个??先谢了我这~~~ :) 我来回答你所有的问题: 你没有看到过PTRECEIVEPACKET是因为你没有在不同环境中作过 实验。 RECVPACKET的调用和MPSEND/PACKETS毫无关系。 RECVPACKET还是RECV被调用,关键在于MINIPORT使用 哪个函数INDICATE。你看看PASSTHRU里面的RECV和 RECVPACKET,里面是否有两个INDICATE函数? 一个是INDICATEPACKET,还有一个是介质相关的 ETH/WAN/TOKEN/INDICATEPACKET。 当使用介质无关的INDICATE的时候,一般NDIS会 调用RECVPACKET,否则就是RECV。 前面说一般情况下如此,还有的情况是NDIS_RESOURCE 的情况。当PACKET的STATUS == NDIS_RESOURCE 的时候,NDIS也调用RECV。此外还有网卡的 FILTER设置为PROMISIC/ALL LOCAL等情况时。 RECV和RECVPACKET实际上是有细微差别的。 NDIS内部的内存操作并不相同。 最后说清楚MPSEND/PACKET,并非有了MPSENDPACKETS MPSEND就会下岗,当网卡本身没有能力一次发多个包 的时候,还是MPSEND。 什么情况才叫资源不足?不是CPU用了多少,也不是 MEMORY用了多少,而是MINIPORT的PACKET_POOL快 用完了,或者NDIS的PACKET_POOL用的太多。 最后一个问题,哪里有FREE的SAMPLE。我个人见解, PASSTHRU对于理解NDIS5的IMD以及NDIS5来说,是一个 非常好的SAMPLE,关键是要吃透每行代码的意思。 我以前对NDIS3/4理解比较多,没有在意PASSTHRU, 结果对NDIS5的许多特性都没有搞清楚,看过PASSTHRU 之后感觉清楚多了。NT4的IMD到处都找的到,IMSAMP, JIM MATTER写的。W2K的IMD PCAUSA上有,这个站点上 也有,不过需要高级用户才能下。我大致看了看,没有 发现比PASSTHRU特别的地方。 |
|
|
17楼#
发布于:2001-11-22 22:12
to top: 这是因为你的SOFTICE里面LOAD的SYMBOL是老版本的。 你重新生成SYMBOL,然后LOAD。 |
|
|
18楼#
发布于:2001-11-22 14:17
to 2btoo:
贴出你的相关源码吧,说不清楚了 |
|
19楼#
发布于:2001-11-22 14:06
to top:
请教两个问题 1.我用driver monitor看passthru,先open driver,再start driver.结果报错Error:The driver is marked as disabled(start=4)in its service database entry. 这里应该修改哪里才能用呢? 2.我用softice调试passthru的时候,在PtReceivePacket里设断点.发现有一些语句不能设断点(单步的时候也跳过去了). 相反,我把NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);这句用//注释掉,重新编译,安装驱动,softice重新装载,这一句居然能够设断点(单步时也能执行) 这是怎么回事? 谢谢 |
|
上一页
下一页