antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1856回复:14

200分!希望大虾解释:ptsendcomplete为何不被NDIS调用?

楼主#
更多 发布于:2003-06-25 11:47
200分也许并不算什么,但是我确实非常希望你的解答。
如果你不想回答,那么发一份类似代码到我邮箱也好。,谢谢了。
我的思路是这样的:因为在passthru中收包总共有4中可能。

1。PTRECEIVERPACKET


2。Ptreceive
在第2中又分为3种情况。
a 我现在只处理一种情况:那就是当packet==NULL,并且lookaheadsize>=pakcetsize  时,此时不要transferdata,也就是说没有OOB数据。
我根据headerbuffer和lookaheadbuffer中的内容,构造一个PACKET,
b 然后做NAT函数,在NAT中调用NDISSEND函数,返回NTSTATUS。
 B.1)  如果NDISSEND返回不是PENDING时
我就在ptreceive释放我构造的packet和PAKCETBUFFER,及存放headerbuffer和lookaheadbuffer数据的 packetcontant!,然后
ptreceive返回NDIS―STATUS-SUCCESS
B.2) 如果返回是PENDING 时那么我在ptreceive中建立一个链表存放我要释放的数据的指针。然后ptreceiver返回NDIS-STATUS-SUCCESS;!当NDIS调用ptsendcomplete时,那么我根据ptsendcomplete中PACKET的值,在链表中找到对应的项,将数据释放。

现在的问题是:我调用NDISSEND时,每次返回都是PENDING,所以必须在ptsendcomplete中释放我的申请的内存,但是我仔细观察发现、系统几乎没有调用 ptsendcomplete函数,所以我的资源也没有释放,这样导致系统内存马上被耗光了。
所以我现在怀疑   问题1是不是我发的包是错误的?要不怎么每次都是返回PENDING呢?
问题2:而返回PENDING后又不调用 ptsendcomplete ?
难道系统对发包也有要求吗?
在发包前时:我应该/怎样,设置包的各种FLAG和标志?
高手都说在返回PDNDING时ptsendcomplete中释放自己的资源就可以,但是我的问题时,返回PENDING ,NDIS并不调用  ptsendcomplete,所以资源释放不了啊!!!
描述了这么多:我现在认为主要归结为2个问题:
1。因为我发的包是错误的,所以每次返回都是PENDING??
2。为什么返回PENDING后,系统不调用 ptsendcomplete 我就无论如何不知道为什么了?  

你要回答的也就两个问题:
1。发包的返回值,或者说成不成功与 packet的状态和内容有关?如果有关,有什么关系?应该怎么设置呢?
2。为何在返回PENDING时NDIS不调用 ptsendcomplete?
   罗罗梭梭说了这么多,希望你答复。
                        致
     礼!
                                                                                                      antspower

顺便问一下:OOB数据是不是在protocolresvd中?

[编辑 -  6/25/03 by  antspower]
放弃瘟草,现吃李草
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-25 12:01
非常仔细的检查了流程,自认为没有错误了。百思不解。
我申请包的顺序是:
ndisallocarememory,ndisdprallocatepacket,ndisallcatebuffer,
释放包的顺序为:buffer,memory,packet
难道是顺序不对??我仔细看了以前HUYG斑竹的帖子,也是这样释放的啊。
放弃瘟草,现吃李草
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-25 13:23
一个建议,你把packet的状态设成resource,看ndisesend返回的是什么状态。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-25 13:37
oob数据不是在protocolresvd里面的,在private里面
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-25 13:57
private包含一下:
physicalcounnt
totallength
head   //我的buffer的地址
tail
pool//应该是recvpacketpool的地址
count
flags
ndispacketflag      
ndispackettooboffset // ??这个项在初始化时就是0x40,是不是说
//OOB数据是40个BYTE?
OOB数据是  pool +ndispackettooboffset得到 的地址吗?
OOB到底在哪里?
问题时我现在 并不需要OOB啊,?
MIKE,继续出手!
放弃瘟草,现吃李草
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-25 17:03
谢谢!
呵呵,等下开帖给分,
对了怎么一帖最多只能给20,怎么回事啊?
放弃瘟草,现吃李草
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-25 17:34
你的问题解决了??
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-06-25 18:15

我发现在经常调用N次NDISSEND后,才调用ptsendcomplete函数,
但好象回在以后不停的ptsendcomplete,直到和NDISSEND的次数相等
后想有个延时一样。
难道不是先调用了NDISSEND后,NDIS马上调养PTsendcomplete吗?





[编辑 -  6/25/03 by  antspower]
放弃瘟草,现吃李草
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-06-25 22:41
因为send会被中断,所以才会有pending出现,这个时候他是先把那几个receive完成才开始send的,应该在你的sendcomplete之前有一个receivecomplete上来吧。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-06-26 08:46

我发现在经常调用N次NDISSEND后,才调用ptsendcomplete函数,
但好象回在以后不停的ptsendcomplete,直到和NDISSEND的次数相等
后想有个延时一样。
难道不是先调用了NDISSEND后,NDIS马上调养PTsendcomplete吗?

[编辑 -  6/25/03 by  antspower]

我的上述观察是错误的。
当我把NDISSEND的包的状态设为:resource时
首先:ptreceive4次
ptreceivercomplete1次???为什么只调用一次
ptsendcomplete4次
然后开始重复。

[编辑 -  6/26/03 by  antspower]
放弃瘟草,现吃李草
jinsin
驱动牛犊
驱动牛犊
  • 注册日期2002-11-12
  • 最后登录2005-05-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-06-26 13:18
ptreceivercomplete本来就是不和ptrecievie一一对应的,这个数字是随机的,在网络繁忙的时候高,在网络负载低的时候,数字就低。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-06-26 14:54
ptreceivecomplete表明的是一次收包过程结束,不是一个包结束。
在一个收包的过程没有结束的情况下,miniport不会发包,所以你发包的状态是pending,一个send对应一个sendcomplete
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-06-26 15:25
谢谢各位老大!.


问题好象解决了.,
因为我将PASSTHRU当服务安装后,发现系统地资源一下达到了100%
我只好重起,重起后发现在passthru在网络控制面版中,没有passthru
,但是奇怪的时用DBGview却看到了 passthru的输出信息.
并且注册表中当然也有passthru的项.
也就是说PASSTHRU在运行,可以在服务中却没有.

对了,我怎么将PASSTHRU当做协议安装?
再次谢谢mike和jinsin的回答
放弃瘟草,现吃李草
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-06-26 16:16
看一下mux里面带的那个notify object的说明,就可以直接把passthru做协议安装了。

你的2k是不是没有装sp??
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-06-26 18:13
看一下mux里面带的那个notify object的说明,就可以直接把passthru做协议安装了。

你的2k是不是没有装sp??

如果装SP3那么,SOFTICE不能用
所以没有装。
mux里面带的那个notify object的说明??
等下去看看在DDK里面吗
放弃瘟草,现吃李草
游客

返回顶部