阅读:1856回复:14
200分!希望大虾解释:ptsendcomplete为何不被NDIS调用?
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] |
|
|
沙发#
发布于:2003-06-25 12:01
非常仔细的检查了流程,自认为没有错误了。百思不解。
我申请包的顺序是: ndisallocarememory,ndisdprallocatepacket,ndisallcatebuffer, 释放包的顺序为:buffer,memory,packet 难道是顺序不对??我仔细看了以前HUYG斑竹的帖子,也是这样释放的啊。 |
|
|
板凳#
发布于:2003-06-25 13:23
一个建议,你把packet的状态设成resource,看ndisesend返回的是什么状态。
|
|
|
地板#
发布于:2003-06-25 13:37
oob数据不是在protocolresvd里面的,在private里面
|
|
|
地下室#
发布于: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,继续出手! |
|
|
5楼#
发布于:2003-06-25 17:03
谢谢!
呵呵,等下开帖给分, 对了怎么一帖最多只能给20,怎么回事啊? |
|
|
6楼#
发布于:2003-06-25 17:34
你的问题解决了??
|
|
|
7楼#
发布于:2003-06-25 18:15
我发现在经常调用N次NDISSEND后,才调用ptsendcomplete函数, 但好象回在以后不停的ptsendcomplete,直到和NDISSEND的次数相等 后想有个延时一样。 难道不是先调用了NDISSEND后,NDIS马上调养PTsendcomplete吗? [编辑 - 6/25/03 by antspower] |
|
|
8楼#
发布于:2003-06-25 22:41
因为send会被中断,所以才会有pending出现,这个时候他是先把那几个receive完成才开始send的,应该在你的sendcomplete之前有一个receivecomplete上来吧。
|
|
|
9楼#
发布于:2003-06-26 08:46
我的上述观察是错误的。 当我把NDISSEND的包的状态设为:resource时 首先:ptreceive4次 ptreceivercomplete1次???为什么只调用一次 ptsendcomplete4次 然后开始重复。 [编辑 - 6/26/03 by antspower] |
|
|
10楼#
发布于:2003-06-26 13:18
ptreceivercomplete本来就是不和ptrecievie一一对应的,这个数字是随机的,在网络繁忙的时候高,在网络负载低的时候,数字就低。
|
|
11楼#
发布于:2003-06-26 14:54
ptreceivecomplete表明的是一次收包过程结束,不是一个包结束。
在一个收包的过程没有结束的情况下,miniport不会发包,所以你发包的状态是pending,一个send对应一个sendcomplete |
|
|
12楼#
发布于:2003-06-26 15:25
谢谢各位老大!.
问题好象解决了., 因为我将PASSTHRU当服务安装后,发现系统地资源一下达到了100% 我只好重起,重起后发现在passthru在网络控制面版中,没有passthru ,但是奇怪的时用DBGview却看到了 passthru的输出信息. 并且注册表中当然也有passthru的项. 也就是说PASSTHRU在运行,可以在服务中却没有. 对了,我怎么将PASSTHRU当做协议安装? 再次谢谢mike和jinsin的回答 |
|
|
13楼#
发布于:2003-06-26 16:16
看一下mux里面带的那个notify object的说明,就可以直接把passthru做协议安装了。
你的2k是不是没有装sp?? |
|
|
14楼#
发布于:2003-06-26 18:13
看一下mux里面带的那个notify object的说明,就可以直接把passthru做协议安装了。 如果装SP3那么,SOFTICE不能用 所以没有装。 mux里面带的那个notify object的说明?? 等下去看看在DDK里面吗 |
|
|