20楼#
发布于:2003-03-14 13:08
NdisTransferData(&Status, pAdapt->BindingHandle,
MacReceiveContext, LookBufSize + 1,PacketSize - LookBufSize, Packet, &btCount); if (Status == NDIS_STATUS_SUCCESS || Status == NDIS_STATUS_PENDING){ 这个判断有问题吧。如果是pending,就一定要调用complete,如果不是,一定不会调用complete, 你在调用NdisTransferData的时候接收的是从lookaheadbuffersize+1处开始的内容,你在交给协议的packet中包括headbuffer和lookaheadbuffer里面的内容了么?? |
|
|
21楼#
发布于:2003-03-14 13:25
现在是当收到包长度和预览区的数据相等时,就不用调用NdisTransferData了,向上指数据也应该成功呀!可是现在什么都没有反映!
我当然要把头中的数据和预览区的数据考备到Packet 中了。 我也不知怎么办好了! 苦呀!!! :( :( |
|
22楼#
发布于:2003-03-14 14:01
[quote]我觉得没有这个必要吧!我试试!等一会!! 非常的有必要,看DDK文档。 [/quote] 绝对没有必要! |
|
|
23楼#
发布于:2003-03-14 14:40
按你所说,我调用了。 你的代码我没细看,不过如果加载了你的Passthru,不当机的话真是菩萨保佑了! 先给你指出两个毛病: 1.你在收包的时候分配的Packet竟然用了全局变量!如果系统接连调用了两次或者多次PtReceive,然后再调用PtReceiveComplete的话,你怎么保证你的全局变量MyPacket里面的东西是好的?还有句话,你在这儿试过SpinLock,放心好了,SpinLock保护不了你的数据! 以前有过这方面的讨论,SpinLock讲的是CPU的拥有权,当一个CPU拥有一个SpinLock的时候,另一个CPU无法拥有它,但同一个CPU对同一个SpinLock的重复Acquire永远是可以成功的! 我想你使用全局变量的想法是因为PtReceiveComplete只有一个参数进来,那就是BindingContext,这个问题有两个办法解决。比较好的做法是初始化的时候分配一个Packet链,需要的时候Pop一个出来用,用完一个Push回去一个。链的Entry放到Adapt里面,说到这儿想到句话,就算你要用全局变量,为什么不考虑放在ADAPT里?再一个办法很简单,就是仿照Send过程,还是每次分配一个Packet,用局部变量就可以了,然后你不是想要Packet参数吗?那就不要处理PtReceiveComplete了,PtReceiveComplete里一句代码都不要,如果收到了整包,直接在PtReceive里Indicate上去,如果不是整包,就在TransferComplete里Indicate。 2. 收包如果收到整包,你必须记录你收到的Packet,就是OriginalPacket了,一般在Packet的ProtocolReserved域,然后在MPReturnPacket的时候作为参数向下调用NdisReturnPacket,让下面的驱动释放它的资源,这个我上回说的很清楚了吧。你的代码里原先也有,结果都被你注掉了! 还有,如果你总是整包向上递,则不需要支持MPTransferData,这个已经说过了,同样,在你的PtTransferDataComplete中也没有必要调用NdisMTransferDataComplete,直接Indicate了就可以了。 我觉得你的代码现在问题太多,还不到分析为什么不通的时候,静下心来好好理一理再说吧,关键要自己理解了流程。 |
|
|
24楼#
发布于:2003-03-14 14:45
调用NdisTransferData后,MiniPortTransDataComplete就没有响应过。(我保持原来的Passthru的部分没有动!) 哥哥,你这是笔误还是真的?你还有MiniPortTransDataComplete? 我什么时候说过有这玩意儿?大伙儿写的都是ProtocolTransferDataComplete! |
|
|
25楼#
发布于:2003-03-18 11:22
MiniPortTransDataComplete我是写错了,当时急呀!
我的发送数据的部分以前没有问题。只是当初在写收数据时,没有通,就乱改一通了。所以很乱。 不过你写得还满牛的。 我正在试!谢谢!! 我也是刚学,现在还不到一个月。(刚好有一个月了)头儿崔得又紧。所以搞得很乱。真是谢谢!你在北京吗?方便的话请你吃饭了。还有上面的兄弟们。我再按你的方法试试,有什么问题再问你好吗? 3kS!!!!!!!!!!!! 对了,我看DDK上说对于接收和发送还有数据处理时,应该在初始化时分配好资源,所以我用了全局变量。你有什么处理办法吗? |
|
26楼#
发布于:2003-03-18 12:25
你在北京吗?方便的话请你吃饭了。还有上面的兄弟们。 什么时候你准备了鲍翅大餐再通知大伙儿吧,我想大伙儿都会去的,呵呵。
前面我说了: 比较好的做法是初始化的时候分配一个Packet链,需要的时候Pop一个出来用,用完一个Push回去一个。链的Entry放到Adapt里面。 不过这个办法到底好还是不好,也不好说了,相关的函数有:ExInterlockedPopEntrySList,ExInterlockedPushEntrySList,ExInterlockedInsertTailList,ExInterlockedRemoveHeadList等可以用,以及两个常用的宏:FIELD_OFFSET、CONTAINING_RECORD也是很有用的。 |
|
|
27楼#
发布于:2003-03-18 17:01
我想我是没有这样的机会请大家了。不得把我吃成了穷光蛋呀!
按你所说得我又改了,可是还是不通。 主要是向上传数据,调用了NidsMIndicateReceivePacket()后就没有了反应。 头儿今天又向我要东东了。说最晚不得超过20号,我可怎么办呀! 按你所说,如果成功上传数据后,我的程序会有问题。可是现在我上传后就没有了反应。 苦呀!! 把你的上传数据代码让我借鉴一下好吗?(如果有的话!!!) 谢谢!!!!:D :D :D :( :( :( :( |
|
28楼#
发布于:2003-03-18 17:15
还有我发现,调用NdisTransferData()时,Packet有问题。
我分配的Packet内的Buffer链如下: 14 LookAheadBufferSize PakcetSize - LookAheadBufferSize 也就是三个。 我先HeaderBuffer和LookAheadBuffer的数据拷贝到Packet 中 每当PakcetSize > LookAheadBufferSize时调用NdisTransferData() 它会成功(状态是NDIS_STATUS_SUCCESS)反回(收到的数据是其它的机器的广播数据)。此时Packet 的数据是这样的,剩余的数据不是放在第三个Buffer 上而是从第一个Buffer 开始。我又看了一下MiniPortTransferData()中的Packet中的数据,与上面的情况一致! 真是苦脑呀!!大家有没有成功的代码吗?给我一小部分,就可以呀,还需要花银子吗??? 我快要翘缏子了! :( :( :( :( :( :( :( :( [编辑 - 3/18/03 by bluetiger] |
|
29楼#
发布于:2003-03-18 17:57
你已经看到数据从第一个Buffer开始,就配合它一下好了:进入PtReceive如果NdisGetReceivedPacket失败,不要急着Copy数据,先判断PacketSize和LookAheadBufferSize的大小,如果需要NdisTransferData,则直接分配一个足够大的Buffer,记住就一个,不要做成Mdl链(如果预先分配的话就给个合适的大小了,比如1514)。然后再往这个Buffer里Copy已有的数据,将偏移量填在NdisTransferData的参数里就好了。 总之一句话,传递给NdisTransferData的Packet上就挂一个Buffer! |
|
|
30楼#
发布于:2003-03-18 18:09
好累!
我的代码牵扯太多,本想整理个清晰点的给你,实在是哥们也忙得很,经常加班到半夜,不过你也不用非要我的吧,论坛里贴代码的帖子也不少,离你不到三步远不就有代码嘛,别人贴出来的,肯定是好的。 http://www.driverdevelop.com/forum/html_36566.html?1047981523 |
|
|
31楼#
发布于:2003-03-19 09:56
谢谢!!!
真是谢谢!!! 看来你比我还苦呀! 等我看完了,我试试!等通过了。真得请你吃饭了!! :D :D :D :D :D :D :D :D :cool: :cool: :cool: :cool: :cool: :cool: :cool: |
|
32楼#
发布于:2003-03-19 12:50
成功了!!哈哈!真是乐开怀呀!
:cool: :cool: :cool: :cool: :P :P :P :P :o :o :o :o :D :D :D :D :D :D :) :) :) :D :D :D |
|
33楼#
发布于:2003-03-19 22:09
成功了!!哈哈!真是乐开怀呀! 又是一个没看文档的 |
|
|
上一页
下一页