qiqiu
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2005-06-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3394回复:26

为什么不调用NdisReturnPackets?

楼主#
更多 发布于:2003-10-08 15:57
在passthr中,PtreceivePacket在调用NdisMIndicatepacket后立即释放自己分配的packet,但是为什么不紧接着调用NdisReturnPacket通知底层释放传来的Packet呢?

最新喜欢:

temptemptempte...
HONGLIN
驱动牛犊
驱动牛犊
  • 注册日期2002-04-04
  • 最后登录2010-03-17
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望12点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-10-09 12:51
答案就在你说的中哦!
不再困惑
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-09 15:51
大案在这里:
An NDIS intermediate driver should call NdisReturnPackets as soon as possible after its ProtocolReceivePacket or ProtocolCoReceivePacket function has returned control。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
qiqiu
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2005-06-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-10-09 20:28
这两个函数返回控制后到哪儿了啊?
Flstar
驱动牛犊
驱动牛犊
  • 注册日期2002-11-03
  • 最后登录2005-01-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-10-13 13:53
在passthr中,PtreceivePacket在调用NdisMIndicatepacket后立即释放自己分配的packet,但是为什么不紧接着调用NdisReturnPacket通知底层释放传来的Packet呢?


我跟踪调试的结果是这样的:

如果你Packet的Status设置为NDIS_STATUS_SUCCESS,那么在你调用
NdisMIndicateReceivePacket后ndis会自动调用你提供的MPReturnPacket,其中传给MPReturnPacket的Packet就是你传给NdisMIndicateReceivePacket的Packet,在MPReturnPacket里面你可以释放你自己分配的Packet,然后再调用NdisReturnPacket,返回下层传给你的Packet;
如果Packet的Status设置为NDIS_STATUS_RESOURCES,那么ndis不会自动调用你的MPReturnPacket,这时,需要你在PtReceivePacket里面释放自己分配的Packet,然后调用NdisReturnPacket,返回下层传给你的包
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-10-13 15:00
NdisReturnPacket不是在receivepacket里面调用的。
其他的问题你自己看ddk好了,我就不在你面前装版主了。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
Flstar
驱动牛犊
驱动牛犊
  • 注册日期2002-11-03
  • 最后登录2005-01-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-10-13 15:35
NdisReturnPacket不是在receivepacket里面调用的。
其他的问题你自己看ddk好了,我就不在你面前装版主了。

真不想骂你,你tmd懂不懂?老子做的防火墙都卖出100多套了,每套25k卖的,我说的都是有根据的,你整个一SB啊,不解答人家的问题还在这里说风凉话,去你妈的蛋吧
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-10-13 16:03
[quote]NdisReturnPacket不是在receivepacket里面调用的。
其他的问题你自己看ddk好了,我就不在你面前装版主了。

真不想骂你,你tmd懂不懂?老子做的防火墙都卖出100多套了,每套25k卖的,我说的都是有根据的,你整个一SB啊,不解答人家的问题还在这里说风凉话,去你妈的蛋吧 [/quote]

你说的有道理,呵呵,有道理。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-10-13 21:29
[quote]NdisReturnPacket不是在receivepacket里面调用的。
其他的问题你自己看ddk好了,我就不在你面前装版主了。

真不想骂你,你tmd懂不懂?老子做的防火墙都卖出100多套了,每套25k卖的,我说的都是有根据的,你整个一SB啊,不解答人家的问题还在这里说风凉话,去你妈的蛋吧 [/quote]
:o好羡慕啊


MPReturnPacket是在TCPIP。SYS调用NDISRETURNPACKET的时候才被
调用。也就是说你INDICATEPACKET后由系统调用
(今天喝多了,头晕得不行了)
还有拜托不要进行人身攻击:)

放弃瘟草,现吃李草
fuq_dddd
驱动老牛
驱动老牛
  • 注册日期2002-10-15
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分331分
  • 威望57点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-10-13 21:47
呵呵,Mike遇到高人了

不过,拜托别骂人
我们只谈技术

话说完了,闪人
星星之火 可以燎原 每一个光亮 都可能是黎明 [img]http://joke.tom.com/img/assets/1/gaoxiao_80_910.gif[/img]
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-10-13 23:22
[quote]NdisReturnPacket不是在receivepacket里面调用的。
其他的问题你自己看ddk好了,我就不在你面前装版主了。

真不想骂你,你tmd懂不懂?老子做的防火墙都卖出100多套了,每套25k卖的,我说的都是有根据的,你整个一SB啊,不解答人家的问题还在这里说风凉话,去你妈的蛋吧 [/quote]
真不想骂你,你tmd懂不懂?
老子NDIS版主不是白做的,老子的防火墙已经卖出100K套,现在连邦软件,茂立软件行,国外网站上到处都有的买。这么简单的问题还他妈的要回答,连这个都不懂还写什么程序。


我思故我在,脑袋不会坏.
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-10-14 09:31
忍不住插一句.

骂人的事谁都不想做,不过这位mikeluo版主说风凉话,哥们也不是见过一次两次了.我想骂人的话说出来的确是有些粗鄙,不过说风凉话的就更叫人可气了.不是当了版主就有些资格说吧?

我这算不算是人身攻击?
写驱动不如买足彩!!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-10-14 09:43
忍不住插一句.
骂人的事谁都不想做,不过这位mikeluo版主说风凉话,哥们也不是见过一次两次了.我想骂人的话说出来的确是有些粗鄙,不过说风凉话的就更叫人可气了.不是当了版主就有些资格说吧?
我这算不算是人身攻击?


除了回答问题我说的就只有让大家好好看看ddk而已,这里太多的问题都是ddk里面ndis的文档很明确的写着的,如果这也是风凉话的话那估计我只会说风凉话了。

至于Flstar不知是何方高人,既然是高人就来当版主好了,免得我在这里说风凉话。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
qiqiu
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2005-06-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-10-14 10:08
大家不要吵嘛,都是出来混的,都不容易,消消气.
我的主要疑惑是:PtReceivePacket中如果设置自己分配的转发包状态NDIS_STATUS_RESOURCE,那么indicat后,IM开发者自己立刻调用free,将自己分配的转发包释放,这时候上层在接收转发数据后就不会调用MpReturnPacket了,但是问题来了,底层如何知道何时释放他负责分配的传给了上层的包(就是PtReceivePacket中的参数)?所以我觉的在这种情况下应该紧接着调用NdisReturnpackets通知底层释放资源.
还有PtReceive中的资源headbuffer,lookaheadbuffer也是底层分配的,在IM也存在通知底层释放的问题吧?这又是怎么通知的呢?
不好意思,ddk看了,但是这些问题总是相不通.拿位大虾能指点一下谢谢!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-10-14 10:18
根据ptreceive和ptreceivepacket的返回值。
在ptreceivepacket里面,如果你已经处理完了packet,想要告诉底层释放资源的话,直接返回0就可以了。如果在ptreceivepacket里面没有处理完,要在其他的地方处理,然后调用ndisreturnpacket来通知底层释放资源的话,那就要在ptreceivepacket里面返回对于这个packet你要调用的ndisreturnpacket的次数,一般都是1次吧,所以passthru里面返回的是1,如果你有特殊情况要调用ndisreturnpacket多次那就返回具体的次数。

ptreceive有个返回值NDIS_STATUS来说明状态,ddk中的说明是只能返回两个值之一:NDIS_STATUS_NOT_ACCEPTED 和NDIS_STATUS_SUCCESS ,不管返回那个底层都会释放资源了,所以如果要在ptrecieve的外面处理的话就一定要把buffer的内容copy出来(其实要处理就要copy buffer,不管在哪里)
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-10-14 10:40
[quote]忍不住插一句.
骂人的事谁都不想做,不过这位mikeluo版主说风凉话,哥们也不是见过一次两次了.我想骂人的话说出来的确是有些粗鄙,不过说风凉话的就更叫人可气了.不是当了版主就有些资格说吧?
我这算不算是人身攻击?


除了回答问题我说的就只有让大家好好看看ddk而已,这里太多的问题都是ddk里面ndis的文档很明确的写着的,如果这也是风凉话的话那估计我只会说风凉话了。

至于Flstar不知是何方高人,既然是高人就来当版主好了,免得我在这里说风凉话。 [/quote]

大伙儿很多问题都是因为看了DDK还是不明白才来问的,或者是DDK本来讲的明白,但还是没有看懂,也不妨来问一下,你能给讲讲清楚最好,不想讲就拉倒,说句去看DDK不是风凉话也是废话.

如果大伙都说去看DDK,那还来这儿干吗?! 如果一句去看DDK就把什么问题都挡回去的话,这里很多关于Passthru的接收发送讲的很不错的帖子如何能够积累起来?mikeluo老大,你不觉得说句去看DDK对初来乍到的人很是打击么?

你老大是不是觉得有些问题过于入门,不值得一答?岂不知 lu0 大哥说的\"请不要在本论坛提出过于入门话题\"的范围也只不过是/如何BUILD APP/如何BUILD DRIVER/如何使用VC.

所以我想你想回答问题就耐心回答,不想回答就找地儿歇会儿,实在没必要说什么去看DDK.
写驱动不如买足彩!!
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-10-14 10:44
大家不要吵嘛,都是出来混的,都不容易,消消气.
我的主要疑惑是:PtReceivePacket中如果设置自己分配的转发包状态NDIS_STATUS_RESOURCE,那么indicat后,IM开发者自己立刻调用free,将自己分配的转发包释放,这时候上层在接收转发数据后就不会调用MpReturnPacket了,但是问题来了,底层如何知道何时释放他负责分配的传给了上层的包(就是PtReceivePacket中的参数)?所以我觉的在这种情况下应该紧接着调用NdisReturnpackets通知底层释放资源.
还有PtReceive中的资源headbuffer,lookaheadbuffer也是底层分配的,在IM也存在通知底层释放的问题吧?这又是怎么通知的呢?
不好意思,ddk看了,但是这些问题总是相不通.拿位大虾能指点一下谢谢!


不明白你为什么要把Packet的状态设为NDIS_STATUS_RESOURCE再Indicate?NDIS_STATUS_RESOURCE是个失败状态,一般表示分配资源不成功吧.如果分配不成功,该清理的资源清理一下,然后返回0就好了吧,我觉得没必要再做什么处理.

[编辑 -  10/14/03 by  SharpShooter]
写驱动不如买足彩!!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-10-14 11:41
[quote]大家不要吵嘛,都是出来混的,都不容易,消消气.
我的主要疑惑是:PtReceivePacket中如果设置自己分配的转发包状态NDIS_STATUS_RESOURCE,那么indicat后,IM开发者自己立刻调用free,将自己分配的转发包释放,这时候上层在接收转发数据后就不会调用MpReturnPacket了,但是问题来了,底层如何知道何时释放他负责分配的传给了上层的包(就是PtReceivePacket中的参数)?所以我觉的在这种情况下应该紧接着调用NdisReturnpackets通知底层释放资源.
还有PtReceive中的资源headbuffer,lookaheadbuffer也是底层分配的,在IM也存在通知底层释放的问题吧?这又是怎么通知的呢?
不好意思,ddk看了,但是这些问题总是相不通.拿位大虾能指点一下谢谢!


不明白你为什么要把Packet的状态设为NDIS_STATUS_RESOURCE再Indicate?NDIS_STATUS_RESOURCE是个失败状态,一般表示分配资源不成功吧.如果分配不成功,该清理的资源清理一下,然后返回0就好了吧,我觉得没必要再做什么处理.

[编辑 -  10/14/03 by  SharpShooter] [/quote]

我还是忍不住要对你说:看ddk的时候仔细一点(既然你说你看ddk)。

最后一次,一边待着去了。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-10-15 00:49
呵呵,怎么吵起来了,我帮大家找找ddk吧
The miniport driver can set the Status member of the out-of-band data block to NDIS_STATUS_RESOURCES if it needs to retain ownership of the packet descriptor and buffer descriptors of some element in a particular indication. Setting NDIS_STATUS_RESOURCES forces NDIS to indicate each such packet, one at a time, to bound protocols\' ProtocolReceive functions, thereby forcing each protocol to copy the packet data and release each packet to be returned back to the miniport driver.
大概意思就是,底层的资源不是一直都有的,miniport驱动的rfd什么的都是有限的,如果网络包来的太快太多难免枯竭.所以它就会设置 NDIS_STATUS_RESOURCES来告诉上层,这个包我要保留,你悠着点.上层也得遵守一下,不占用这个包(分配自己的packet,并拷贝数据),然后就把这个包返回.接着miniport就会释放这个包,以保证有足够的rfd来截收网络包,尽量避免丢包
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-10-15 09:26
呵呵,怎么吵起来了,我帮大家找找ddk吧
The miniport driver can set the Status member of the out-of-band data block to NDIS_STATUS_RESOURCES if it needs to retain ownership of the packet descriptor and buffer descriptors of some element in a particular indication. Setting NDIS_STATUS_RESOURCES forces NDIS to indicate each such packet, one at a time, to bound protocols\' ProtocolReceive functions, thereby forcing each protocol to copy the packet data and release each packet to be returned back to the miniport driver.
大概意思就是,底层的资源不是一直都有的,miniport驱动的rfd什么的都是有限的,如果网络包来的太快太多难免枯竭.所以它就会设置 NDIS_STATUS_RESOURCES来告诉上层,这个包我要保留,你悠着点.上层也得遵守一下,不占用这个包(分配自己的packet,并拷贝数据),然后就把这个包返回.接着miniport就会释放这个包,以保证有足够的rfd来截收网络包,尽量避免丢包
 


惭愧,惭愧,实在是惭愧得很,惭愧的很。
兄弟已经放弃IM很长时间了,原本也就是看懂点皮毛,还在这儿乱讲,实在是惭愧之极。

多谢dshadow79老兄指点,多谢多谢。
写驱动不如买足彩!!
上一页
游客

返回顶部