阅读:4628回复:25
关于PtReceive和PtReceivePacket
各位前辈:
究竟是调用PtReceive还是PtReceivePacket是由网卡决定的? 会不会和接收的是什么包有关系?同时MPSend和MPSendPackets我也有这样的疑问。 再有一问: 我想在发送某一特定类型的包时,将其拦住,同时做一个假的包来欺骗准备接收返回包的应用程序,我先改了发送的包的内容再直接调用PtReceivePacket返回发送的包,结果对应用程序来说没有用,那位前辈给我指条明路!!先谢了!! |
|
|
沙发#
发布于:2001-11-21 21:28
我的理解:
1.调用PtReceive还是PtReceivePacket? 绝大多数情况下调用PtReceivePacket,只有少数情况下调用PtReceive.例如:网卡处于混杂模式时;系统资源不足时. 2.如果你是要欺骗本机的话,我觉得这样应该可以的. 你返回的包应用程序能识别么? 具体是怎么不行的?没反应还是错误? |
|
板凳#
发布于:2001-11-22 10:14
就是没反应
我发的UDP广播包,因为广播本机也有一份,到不了IM就收到一个原包,在MPSend时我返回了发送失败,于是又收到一个原包 我改了以太头,IP头和UDP头没改,端口没错,返回的包可以收到 可是不是我改过的包,两个都是原包。 |
|
|
地板#
发布于:2001-11-22 11:11
不会吧??我怎么没见调用过ptrecvpacket啊??都是调用ptrecv的啊!可以用dbgprint来论证这点,用改包的方法好象也太麻烦了!要说资源不足我就不理解了!什么情况下才叫资源不足??80%内存被利用?80%CPU被利用?好象和着两个函数的调用没有太直接的关系!在我的机子上就没调用过ptrecvpacket!好奇怪!如果有会输出dbgpring的信息的!我在开机的时候也就是在driverentry的时候就开始断一次!看有什么函数被调用!而且加了个记数来记录他们调用了几次!可以到了最后一次都没!于是我又加了个函数专门统计每个函数的调用次数和次序!可是也没发现ptrecvpacket的调用!现在都蒙了!DDK上面说的是:ptrecvpacket是个可选的函数(就是可要可不要!!),但是ptrecv是必选的函数!!,而且和多包接受有关!于是我打开了mpsnedpackets函数!从此mpsend下岗了(DDK上是这么说的!事实也是!)按道理是该调用ptrecvpacket了?可是又不见它来报到!还是由ptrecv在忙!看来passthru的包的流程真的很乱!不知道谁那还有其他IM驱动的例子?如果能有多个参考可能就容易明白了!希望哪位大虾不吝赠阅!贴在附件里让大家都进步进步!听说有好几个叫IPBLOCK、IMDRV、IMSIMP什么的都是IM的例子,还有许多,不过都是只见雷声不见雨点的东西!一般是要收费的(某某洋网站上的!),不知道谁知道哪有免费的?或哪位能贡献一个??先谢了我这~~~ :)
|
|
|
地下室#
发布于:2001-11-22 11:24
另外passthru的函数的调用是由兵部尚书NDIS决定的,网卡这小奴隶只有干活的份了不起打打小报告!决定??不是造反么这??哪块网卡敢决定的??出来~~~~TNND老子车裂了它(卸载) :D
|
|
|
5楼#
发布于:2001-11-22 12:27
我是从论坛里看来的,以前胡版主总结过.原文如下:
\"其实对于绝大多数的网卡的一般情况来说,ndis是不会调用protocolreceive的,一般是调用protocolreceivepacket,特别的几种情况ndis才调用protocolreceive,这些特别的情况我记得我曾经在这个版面里面总结过,或者在bbs.whnet.edu.cn上也曾经说过。\" \"protocolreceivepacket函数ndis推荐 实现,但是请注意是推荐实现。因为这样可以提高高级网卡 效率(所谓高级网卡的意思是指,网卡可以一次接受多个 数据包,并且可以一次上传多个包,目前的网卡芯片都 是这样的网卡,不过我的若干台机器上的一块97年的网卡 不是这样的)如果实现了protocolreceivepacket,ndis 会调用protocolreceivepacket。ndis指定protocolreceive 必选,如果是老卡,那么miniport调用的函数和新卡是不同 的,ndis也会调用相应的protocol函数。如果你的protocol 没有实现protocolrecievpacket,那也没有关系,ndis会 一次次的调用protoclrecievpacket。此外,还有一些时机 在实现了protoclrecievpacket之后也调用protocolrecive, 这些情况发生在miniport 通知数据包的时候用 nt_status_resource,因为protocolreceive只是上传一个 指针,协议不能修改数据内容,这些数据是所有协议共享的, 协议如果要修改内容,必须自己分配。如果是protocolrecievpacket 那么协议得到的数据是一份copy,所以可以理解当内存不 太多的时候,ndis选择protocolreceive而不是 protoclreceivepacket。上面这种情况是ndis说明的, 此外,还有一种情况是ndis没有说的,就是当底层网卡 的oid_filter为all_local或者promisc的时候。之所以 ndis这么做,我猜想是因为这种情况收到大量不是本机 的数据包,用protoclreceivepacket,ndis必须为每个 协议分配内存,太浪费了。 关于这些微妙的区别,一方面是仔细看ddk document, 另一方面也需要一些实际经验,第2种情况我直到今年 的5月份才在实际工作中遇到。关于这些内容的另外一些 资料,可以在whnet bbs上我的老窝中找到。 第三个问题:首先请你注意,protocolreceive和 protocolreceivepaket的参数是完全不同的,protocolrecevie 只是给了一个lookahead和全包长,protoclreceviepacket 给的却是一个packet结构。这两者是有区别的。我认为 之所以ndis保留ptreceive,主要是因为兼容问题,因为 ndis3来说,是不支持所谓oob数据的,我的大多数ndis经验 也停留在ndis3上面,对于ndis5,我也是去年3月份才开始 学习的。当然估计ms保留receive这个接口,还有一部分 是效率的原因。然后我们来看看raw data和packet结构 有什么不同。无疑,packet结构中包含了raw data,但是 同时还包含了其他一些东西,最主要的就是oob data。 我们都知道,tcp其实并非真正支持带外数据,那么这个 out of band又是什么意思呢?ms在oob_data数据结构中 存放了许多和这个包在发送接受过程中miniport和protocol 应该采取的策略,例如time_out,ipchksum,tcpchksm等等。 因为protocolrecieve只是上传raw data,那么,oob数据 怎么得到呢?ms于是设计了一个函数,叫做NdisGetReceivedPacket, 这样,你就可以在这个函数中得到oob数据。如果你的网卡 根本就不支持oob的高级功能,那么得到一个null也就不奇怪 了。这个函数好像是ndis5的新功能,因为我的记忆中,ndis3 没有oob,当然也就不存在这个函数了。 当NdisGetReceivedPacket返回null,就是说,你不能够 这么简单的得到数据包了。这个时候,你只能用ndis3的老 方法老老实实的判断headlen和packetsize的关系,对于 绝大多数网卡和morden来说,headbuf就是所有的包数据, 但是对于非常非常老的网卡和慢速猫来说,你还必须调用 transferdata来得到后续数据。这种设计我在学习ndis3 的时候觉得很精妙,因为如果一个协议发现这个数据根本 就不是自己感兴趣的包,就不需要后续数据了,但是现在 看来,网卡都是主dma的,这个过程并不消耗cpu时间。 在哪些情况下ndis调用protocolreceive,又在哪些情况 下调用protocolreceivepacket呢?具体调用的时候又 会发生什么事情呢,我前段时间做了一个工作总结,曾经 总结过,资料不在手头上,下次有空再发吧。 由于手头上没有资料,所有的东西都单凭记忆,我不能 保证上面的回答没有细节上的错误,此外,上面的回答 有些地方有些含混,例如有些地方我没有具体指出调用 的函数和miniport的策略,是因为我害怕单凭记忆会对 你产生误导。 \" |
|
6楼#
发布于:2001-11-22 12:30
据说,“调用PtReceive还是PtReceivePacket是由网卡决定的,比较老的网卡会调用PtReceive”我忘了哪位大侠说的了,而且我也信了,在Windows 2000 Server上我还试了passthru 的 DbgPrint也确实是调用的PtReceivePacket,“相信我没错的”。
我的理解是,以前的网卡可能比较“傻”,不太会用PtReceivePacket这是由先天不足引起的(硬件问题)?而新的营养比较好会思考选择,所以都会调用? 其实我觉得调用哪个都无所谓,只要处理包的函数接口设计的好都一样,我的问题是返回不了假包,ndis他老人家太牛逼,眼里不揉沙子,假包全掐死在摇篮里了。 |
|
|
7楼#
发布于: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重新装载,这一句居然能够设断点(单步时也能执行) 这是怎么回事? 谢谢 |
|
8楼#
发布于:2001-11-22 14:17
to 2btoo:
贴出你的相关源码吧,说不清楚了 |
|
9楼#
发布于:2001-11-22 22:12
to top: 这是因为你的SOFTICE里面LOAD的SYMBOL是老版本的。 你重新生成SYMBOL,然后LOAD。 |
|
|
10楼#
发布于: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特别的地方。 |
|
|
11楼#
发布于:2001-11-22 22:57
就是没反应 到本机的数据包不过网卡,也不过IMD的MINIPORT。 所以你这样做几乎没戏 |
|
|
12楼#
发布于:2001-11-22 23:21
首先再次感谢斑竹为我做了如此详细的回答!另外问问这几个函数里的包是不是都没MAC头??
|
|
|
13楼#
发布于:2001-11-23 08:45
To Hu大侠
这是一个广播包,要广播出去肯定是要过网卡的丫,我在MPSend里面也可以得到这个包,SoftICE里DbgPrint可以看到这个包的内容。?? |
|
|
14楼#
发布于:2001-11-23 10:41
To Hu大侠 你自己主机上得到的那个包估计不是过网卡的那个。 回环地址的数据包都不经过网卡的。 |
|
|
15楼#
发布于:2001-11-23 10:49
我觉得也不是,因为不是我改过的包。我有什么办法能做一个假包返回给本机吗? |
|
|
16楼#
发布于:2001-11-23 10:52
to Top
我看过的包都是有MAC头的,在PtReceivePacket和MPSend里是这样,在MPSendPAckets和PtReceive里也应该是这样吧! |
|
|
17楼#
发布于:2001-11-23 12:28
请问胡版主:
headbuffer和lookaheadbuffer是什么关系? lookaheadbuffer包括headbuffer? packet里的buffer chain中的第一个buffer是从headbuffer开始,还是lookaheadbuffer开始? 谢谢... |
|
18楼#
发布于:2001-11-23 13:06
I crack all PCAUSA Sample:)
|
|
|
19楼#
发布于:2001-11-23 13:22
I crack all PCAUSA Sample:) 你指啥?是有PCAUSA所有sample的源码吗?那你牛逼了! :cool: [编辑 - 11/23/01 作者: 2btoo] |
|
|
上一页
下一页