2btoo
驱动牛犊
驱动牛犊
  • 注册日期2001-11-03
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:4628回复:25

关于PtReceive和PtReceivePacket

楼主#
更多 发布于:2001-11-21 20:38
各位前辈:

    究竟是调用PtReceive还是PtReceivePacket是由网卡决定的?

    会不会和接收的是什么包有关系?同时MPSend和MPSendPackets我也有这样的疑问。

再有一问:

    我想在发送某一特定类型的包时,将其拦住,同时做一个假的包来欺骗准备接收返回包的应用程序,我先改了发送的包的内容再直接调用PtReceivePacket返回发送的包,结果对应用程序来说没有用,那位前辈给我指条明路!!先谢了!!

最新喜欢:

xiaojian521xiaoji... ljmmaryljmmar... raphyerraphye...
什么也不懂
jukebox
驱动牛犊
驱动牛犊
  • 注册日期2001-08-25
  • 最后登录2002-03-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-11-21 21:28
我的理解:

1.调用PtReceive还是PtReceivePacket?
绝大多数情况下调用PtReceivePacket,只有少数情况下调用PtReceive.例如:网卡处于混杂模式时;系统资源不足时.

2.如果你是要欺骗本机的话,我觉得这样应该可以的.
你返回的包应用程序能识别么?
具体是怎么不行的?没反应还是错误?

2btoo
驱动牛犊
驱动牛犊
  • 注册日期2001-11-03
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2001-11-22 10:14
就是没反应

我发的UDP广播包,因为广播本机也有一份,到不了IM就收到一个原包,在MPSend时我返回了发送失败,于是又收到一个原包

我改了以太头,IP头和UDP头没改,端口没错,返回的包可以收到
可是不是我改过的包,两个都是原包。
 
什么也不懂
.X.T.I.M.
驱动大牛
驱动大牛
  • 注册日期2001-09-22
  • 最后登录2021-08-25
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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的例子,还有许多,不过都是只见雷声不见雨点的东西!一般是要收费的(某某洋网站上的!),不知道谁知道哪有免费的?或哪位能贡献一个??先谢了我这~~~ :)
<IMG src="http://www.microsoft.com/traincert/images/logos/mcp.gif" border=0> <IMG src="http://www.microsoft.com/traincert/images/logos/mcdba.gif" border=0><br> <IMG src="http://www.microsoft.com/traincert/images/logos/mcse.gif" border=0> <IMG src="http://www.microsoft.com/traincert/images/logos/mcsd.gif" border=0>
.X.T.I.M.
驱动大牛
驱动大牛
  • 注册日期2001-09-22
  • 最后登录2021-08-25
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-11-22 11:24
另外passthru的函数的调用是由兵部尚书NDIS决定的,网卡这小奴隶只有干活的份了不起打打小报告!决定??不是造反么这??哪块网卡敢决定的??出来~~~~TNND老子车裂了它(卸载) :D
<IMG src="http://www.microsoft.com/traincert/images/logos/mcp.gif" border=0> <IMG src="http://www.microsoft.com/traincert/images/logos/mcdba.gif" border=0><br> <IMG src="http://www.microsoft.com/traincert/images/logos/mcse.gif" border=0> <IMG src="http://www.microsoft.com/traincert/images/logos/mcsd.gif" border=0>
jukebox
驱动牛犊
驱动牛犊
  • 注册日期2001-08-25
  • 最后登录2002-03-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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的策略,是因为我害怕单凭记忆会对
你产生误导。 \"


2btoo
驱动牛犊
驱动牛犊
  • 注册日期2001-11-03
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2001-11-22 12:30
据说,“调用PtReceive还是PtReceivePacket是由网卡决定的,比较老的网卡会调用PtReceive”我忘了哪位大侠说的了,而且我也信了,在Windows 2000 Server上我还试了passthru 的 DbgPrint也确实是调用的PtReceivePacket,“相信我没错的”。

我的理解是,以前的网卡可能比较“傻”,不太会用PtReceivePacket这是由先天不足引起的(硬件问题)?而新的营养比较好会思考选择,所以都会调用?

其实我觉得调用哪个都无所谓,只要处理包的函数接口设计的好都一样,我的问题是返回不了假包,ndis他老人家太牛逼,眼里不揉沙子,假包全掐死在摇篮里了。
什么也不懂
jukebox
驱动牛犊
驱动牛犊
  • 注册日期2001-08-25
  • 最后登录2002-03-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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重新装载,这一句居然能够设断点(单步时也能执行)

这是怎么回事?

谢谢
jukebox
驱动牛犊
驱动牛犊
  • 注册日期2001-08-25
  • 最后登录2002-03-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2001-11-22 14:17
to 2btoo:
贴出你的相关源码吧,说不清楚了
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2001-11-22 22:12
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重新装载,这一句居然能够设断点(单步时也能执行)

这是怎么回事?

谢谢


这是因为你的SOFTICE里面LOAD的SYMBOL是老版本的。
你重新生成SYMBOL,然后LOAD。
不再回忆从前,我已经生活在幸福当中。
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
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特别的地方。


不再回忆从前,我已经生活在幸福当中。
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
11楼#
发布于:2001-11-22 22:57
就是没反应

我发的UDP广播包,因为广播本机也有一份,到不了IM就收到一个原包,在MPSend时我返回了发送失败,于是又收到一个原包

我改了以太头,IP头和UDP头没改,端口没错,返回的包可以收到
可是不是我改过的包,两个都是原包。
  


到本机的数据包不过网卡,也不过IMD的MINIPORT。
所以你这样做几乎没戏
不再回忆从前,我已经生活在幸福当中。
.X.T.I.M.
驱动大牛
驱动大牛
  • 注册日期2001-09-22
  • 最后登录2021-08-25
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2001-11-22 23:21
首先再次感谢斑竹为我做了如此详细的回答!另外问问这几个函数里的包是不是都没MAC头??
<IMG src="http://www.microsoft.com/traincert/images/logos/mcp.gif" border=0> <IMG src="http://www.microsoft.com/traincert/images/logos/mcdba.gif" border=0><br> <IMG src="http://www.microsoft.com/traincert/images/logos/mcse.gif" border=0> <IMG src="http://www.microsoft.com/traincert/images/logos/mcsd.gif" border=0>
2btoo
驱动牛犊
驱动牛犊
  • 注册日期2001-11-03
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2001-11-23 08:45
To Hu大侠

这是一个广播包,要广播出去肯定是要过网卡的丫,我在MPSend里面也可以得到这个包,SoftICE里DbgPrint可以看到这个包的内容。??
什么也不懂
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
14楼#
发布于:2001-11-23 10:41
To Hu大侠

这是一个广播包,要广播出去肯定是要过网卡的丫,我在MPSend里面也可以得到这个包,SoftICE里DbgPrint可以看到这个包的内容。??


你自己主机上得到的那个包估计不是过网卡的那个。
回环地址的数据包都不经过网卡的。
不再回忆从前,我已经生活在幸福当中。
2btoo
驱动牛犊
驱动牛犊
  • 注册日期2001-11-03
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2001-11-23 10:49

你自己主机上得到的那个包估计不是过网卡的那个。
回环地址的数据包都不经过网卡的。


我觉得也不是,因为不是我改过的包。我有什么办法能做一个假包返回给本机吗?
什么也不懂
2btoo
驱动牛犊
驱动牛犊
  • 注册日期2001-11-03
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2001-11-23 10:52
to Top

我看过的包都是有MAC头的,在PtReceivePacket和MPSend里是这样,在MPSendPAckets和PtReceive里也应该是这样吧!
什么也不懂
jukebox
驱动牛犊
驱动牛犊
  • 注册日期2001-08-25
  • 最后登录2002-03-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2001-11-23 12:28
请问胡版主:
headbuffer和lookaheadbuffer是什么关系?
lookaheadbuffer包括headbuffer?

packet里的buffer chain中的第一个buffer是从headbuffer开始,还是lookaheadbuffer开始?

谢谢...
Nouk
驱动中牛
驱动中牛
  • 注册日期2001-08-22
  • 最后登录2006-10-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2001-11-23 13:06
I crack all PCAUSA Sample:)
Taiwan's Driver Developer
2btoo
驱动牛犊
驱动牛犊
  • 注册日期2001-11-03
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
19楼#
发布于:2001-11-23 13:22
I crack all PCAUSA Sample:)


你指啥?是有PCAUSA所有sample的源码吗?那你牛逼了!  :cool:

[编辑 -  11/23/01 作者: 2btoo]
什么也不懂
上一页
游客

返回顶部