阅读:3845回复:12
还是Passthru的问题!!
1.我按照Huyg大侠以前在BBS上给出的代码修改Passthru例子中Protocol.c中 ptReceive函数中的代码,结果出现问题!一到网络连接的时候就死机了,我也没办法调试,我想请那位大侠把他编好并且调试成功的一个简单的例子给我看看,至少包含用DbgPrint输出包内容的语句。
2.还有就是我在很多函数中加入了DBGPRINT("函数名"),结果用DBGVIEW看,发现几乎只有ptReceive、ptSendComplete和ptSendComplete这几个字符串的输出。我在BBS上看到的贴子中说,ptReceivePacket也会有调用,这是什么原因呢?是和我的网卡有关吗? 3.我在用Soft ice 进行源代码调试时发现,几乎每次的到这一句条件判断时: if(Packet != NULL) 其判断结果Packet都等于NULL了,这是为什么,那我用NdisQueryPacket是不是就查不到包了!!?? (将会连续给分) |
|
|
沙发#
发布于:2001-08-03 17:29
我记得我在前面说过,packet为null是因为还没有将packet descriptor 和buffer descriptor连起来,你在程序调用NdisChainBufferAtFront之后就可以发现poacket不为null了,记得给分哦!
|
|
板凳#
发布于:2001-08-03 18:33
Packet 是不是NULL,与“调用NdisChainBufferAtFront”是没有关系的,Packet能不能取到值是与网卡类型相关的,具我所知,象RealTek 8139系列网卡为NULL, 而D-Link TX530 就可以取到值。而在Packet==NULL时,可以使用"调用NdisChainBufferAtFront"之类的函数以及一系列的手段,来取出包中的数据重组Packet。你可以查找以前的相关话题。你最好还是先换网卡。
|
|
地板#
发布于:2001-08-03 19:10
blue,你可以试一下嘛,我认为跟ndischainbufferatfront有关系,跟网卡是没有关系,packet为空,是没有与buffer连起来。不管什么网卡,都会取到数据的,packet与之无关。至少rtl8139是可行的
|
|
地下室#
发布于:2001-08-04 00:14
本来人变得越来越懒,什么事情都不想做,一个晚上想的都是
如何吸引一个小妹妹的注意,可惜努力了一个星期了还是毫无 收获。干脆过来re一篇贴子,顺便捞点分。 第一个问题我没有办法在这里解决,贴出我的source来也太长 第二个问题解答如下: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的策略,是因为我害怕单凭记忆会对 你产生误导。 咳,真是郁闷。如何才能吸引那个小mm的注意呢... |
|
5楼#
发布于:2001-08-04 00:16
我faint,上篇贴子我没有敲ID/PASSWD,居然也贴上去了,
请把分给我,不要扔掉了。 |
|
|
6楼#
发布于:2001-08-04 10:51
版主确实厉害!!小生实在佩服!!
上面的解释中虽然还有很多地方有待学习,但是至少给了我不少信心!!多谢多谢!! 希望大家就这些问题继续讨论,我将连续给分。谢谢!(另开贴子专门给分) |
|
|
7楼#
发布于:2001-08-06 14:26
有没有调用NdisTransferData得到后续包数据的例子???
|
|
|
8楼#
发布于:2007-06-20 22:00
几年前的东西了,我现在才学....还没有学会...谢谢版主
|
|
9楼#
发布于:2007-06-26 17:53
我是新手,作课题的需要,开始研究驱动,请高手指点一下,调试驱动的方法?
还有怎么显示?(对于驱动比较迷茫)谢谢指点,感激不尽! |
|
10楼#
发布于:2007-07-16 15:24
学习中。。。
|
|
11楼#
发布于:2008-03-15 14:56
guest 写的很清晰阿,现在来看也获益匪浅。
|
|
12楼#
发布于:2008-12-22 22:09
ndis调用protocolreceive,又在哪些情况
ndis调用protocolreceive,又在哪些情况 下调用protocolreceivepacket呢 |
|