summer
驱动牛犊
驱动牛犊
  • 注册日期2001-04-16
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3845回复:12

还是Passthru的问题!!

楼主#
更多 发布于:2001-08-03 14:51
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是不是就查不到包了!!??

(将会连续给分)

最新喜欢:

sourensouren raphyerraphye... fsbfsb
数据载入中....请稍等
abraham
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2002-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-08-03 17:29
我记得我在前面说过,packet为null是因为还没有将packet descriptor 和buffer descriptor连起来,你在程序调用NdisChainBufferAtFront之后就可以发现poacket不为null了,记得给分哦!
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-08-03 18:33
Packet 是不是NULL,与“调用NdisChainBufferAtFront”是没有关系的,Packet能不能取到值是与网卡类型相关的,具我所知,象RealTek 8139系列网卡为NULL, 而D-Link TX530 就可以取到值。而在Packet==NULL时,可以使用"调用NdisChainBufferAtFront"之类的函数以及一系列的手段,来取出包中的数据重组Packet。你可以查找以前的相关话题。你最好还是先换网卡。
zjb
zjb
驱动牛犊
驱动牛犊
  • 注册日期2001-04-13
  • 最后登录2004-05-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-08-03 19:10
blue,你可以试一下嘛,我认为跟ndischainbufferatfront有关系,跟网卡是没有关系,packet为空,是没有与buffer连起来。不管什么网卡,都会取到数据的,packet与之无关。至少rtl8139是可行的
guest
驱动牛犊
驱动牛犊
  • 注册日期2001-06-12
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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的注意呢...






HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2001-08-04 00:16
我faint,上篇贴子我没有敲ID/PASSWD,居然也贴上去了,
请把分给我,不要扔掉了。
不再回忆从前,我已经生活在幸福当中。
summer
驱动牛犊
驱动牛犊
  • 注册日期2001-04-16
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-08-04 10:51
版主确实厉害!!小生实在佩服!!

上面的解释中虽然还有很多地方有待学习,但是至少给了我不少信心!!多谢多谢!!

希望大家就这些问题继续讨论,我将连续给分。谢谢!(另开贴子专门给分)
数据载入中....请稍等
summer
驱动牛犊
驱动牛犊
  • 注册日期2001-04-16
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-08-06 14:26
有没有调用NdisTransferData得到后续包数据的例子???
数据载入中....请稍等
sc_wolf
驱动小牛
驱动小牛
  • 注册日期2006-09-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分35分
  • 威望278点
  • 贡献值1点
  • 好评度150点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-06-20 22:00
几年前的东西了,我现在才学....还没有学会...谢谢版主
baggio2010
驱动牛犊
驱动牛犊
  • 注册日期2007-03-07
  • 最后登录2008-03-26
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-06-26 17:53
我是新手,作课题的需要,开始研究驱动,请高手指点一下,调试驱动的方法?
还有怎么显示?(对于驱动比较迷茫)谢谢指点,感激不尽!
temptemp
驱动牛犊
驱动牛犊
  • 注册日期2004-02-26
  • 最后登录2008-03-11
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-07-16 15:24
学习中。。。
numby
驱动牛犊
驱动牛犊
  • 注册日期2007-03-09
  • 最后登录2010-06-14
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望32点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-03-15 14:56
guest 写的很清晰阿,现在来看也获益匪浅。
lianzi
驱动牛犊
驱动牛犊
  • 注册日期2007-01-18
  • 最后登录2009-08-24
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望135点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2008-12-22 22:09
ndis调用protocolreceive,又在哪些情况
ndis调用protocolreceive,又在哪些情况
下调用protocolreceivepacket呢
游客

返回顶部