阅读:1776回复:5
onreceive()partial函数如何得到整个包的内容?
我用network 为模板生成imdelay结构的packet包过滤函数,用softice发现接受packet包的是onreceive()partial函数(onreceive()根本没被调用?),则以下问题油然而生:
1。onreceive()partial函数中的headbuffer 和lookaheadbuffer两个参数在哪定义的? 2。headbuffer就是指向内存中存储packet包内容的首地址吗? 3。lookaheadbuffer有何用? 4。如何用这两个参数进一步得到packet包的整个内容?(这是最最重要的!) 5。哪里有关于如何得到ip包内容的源代码?(最好使用network生成) 望各位大虾积极出手,这苯bird真是不胜感激呀! |
|
沙发#
发布于:2002-04-18 14:49
onreceive应该是你主动调用的。
send是被动的 |
|
|
板凳#
发布于:2002-04-20 08:50
那我如何主动调用onreceive()函数来接受packet包?而不是用onreceive()partial函数来接受(因为我根本还没弄懂这个函数的调用机理)?
|
|
地板#
发布于:2002-04-20 09:03
那我如何主动调用onreceive()函数,而不是onreceive()partial函数来接受packet包?因为我还没弄懂onreceive()partila函数的调用机理,我觉得还是前一个函数比较好处理。
|
|
地下室#
发布于:2002-04-28 19:49
OnReceive partial、OnReceive都是回调例程,由框架调用的,而不是自己手动调用。通常,当下层的驱动程序指示imdelay接收数据包时,NDIS会调用DS的框架类里的相应的Receive函数,而框架类又调用你的派生类的OnReceive partial或者OnReceive。
在OnReceive中,收到的是完整的Packet,自然要好处理得多,这是当下层驱动调用NdisMIndicateReceivePacket时才被调用的。遗憾的是,下层驱动似乎总是调用NdisMXxxIndicateReceivePacket来进行指示,所以imdelay中似乎总是OnReceive partial被调用。DDK文档里说,某些情况下,在调用NdisMIndicateReceivePacket之前,由于Packet的Status被设置成NDIS_STATUS_RESOURCES,在OnReceive里面通过NdisGetReceivedPacket可以获得完整的包,但是我从来没有发现这种情形。我在好几台机器上试过,都是下面两种情况: 1.OnReceive partial被调用,而且LookAheadBufferSize == PacketSize; 2.OnReceive partial被调用,而且LookAheadBufferSize < PacketSize。 第一种情况下,把两部分合起来就是一个完整的包的数据。第二种情况下,需要TransferData。但是DS框架下的tranferdata似乎很难做,还不如DDK。在DS框架下,要让KNdisProtocolWrapper最后调用NdisTransferData,似乎只能从OnReceive partial里返回NDIS_STATUS_NOT_ACCEPTED,并且要把那个partial Set一下(看一下KNdisFilterBinding和KNdisProtocolWrapper的源码就会明白),而后面的处理更麻烦。 [编辑 - 4/28/02 作者: falwind] |
|
5楼#
发布于:2002-04-30 20:03
谢谢你的答复,我很想给你分,可是我得到的回答是:\"你给出得分超过本贴的分数\",可是我确信没有超出呀,你能告诉我该怎么给分吗?
|
|