阅读:1538回复:5
PtReceive处理流程(旧案新解,今日做个了断)
到这边没几天,今天刚用了搜索,查到我所关注的PtReceive函数处理的几片文章,其中去年3月HuYuguang斑竹(现在还是吧)回答ysy网友的一片帖子(http://www.driverdevelop.com/forum/viewthread.php?tid=8559#pid34492)讲的最为深入。但最后ysy借用斑竹的源码仍然没有调通,我最近也在搞这个东西,看了这篇贴子测试后也还有一些问题不明白。请各位老大不吝援手。
斑竹的源码里我最关注最后一种情况,就是packetsize》lookaheadbuffersize时的处理,下面是斑竹的源码 2、 需要调用transferdata的。 Status = NdisAllocateMemory( &pPacketContent, 2000, 0, HighestAcceptableAddress); if (Status != NDIS_STATUS_SUCCESS ) { DbgPrint(\"ptreceive :ndisallocatememory failed\\n\"); return NDIS_STATUS_NOT_ACCEPTED ; } if(pPacketContent == NULL) { DbgPrint(\"prreceive:pPacketContent == NULL\\n\"); return NDIS_STATUS_NOT_ACCEPTED ; } RtlZeroMemory(pPacketContent, 2000 ); NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle); NdisAllocateMemory( &pBakBuffer, 2000, 0, HighestAcceptableAddress); if(Status != NDIS_STATUS_SUCCESS) { DbgPrint(\"ptreceive:allcate bak buffer failed\\n\"); return NDIS_STATUS_NOT_ACCEPTED; } NdisMoveMemory(pBakBuffer,HeaderBuffer,HeaderBufferSize); NdisMoveMemory(pBakBuffer+HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize); PacketLen = HeaderBufferSize + PacketSize; NdisAllocateBuffer(&Status,&PacketBuffer,pAdapt->RecvBufferPoolHandle,pPacketContent,PacketSize-LookAheadBufferSize); NdisChainBufferAtFront( MyPacket, PacketBuffer ); MyPacket->Private.Head->Next=NULL; MyPacket->Private.Tail=NULL; OffsetSize = HeaderBufferSize + LookAheadBufferSize; NdisDprAllocatePacket(&Status, &MyPacket2, pAdapt->RecvPacketPoolHandle); NdisAllocateBuffer(&Status,&OffsetBuffer,pAdapt->RecvBufferPoolHandle ,pBakBuffer,OffsetSize); NdisChainBufferAtFront(MyPacket2,OffsetBuffer); Resvd =(PRSVD)(MyPacket->MiniportReserved); Resvd->OriginalPkt = (PNDIS_PACKET)MyPacket2; NDIS_SET_PACKET_HEADER_SIZE( MyPacket, HeaderBufferSize ); NdisTransferData(&Status, pAdapt->BindingHandle , MacReceiveContext, LookAheadBufferSize, PacketSize-LookAheadBufferSize , MyPacket, &BytesTransferred); if ( Status != NDIS_STATUS_PENDING ) { PtTransferDataComplete( (NDIS_HANDLE)pAdapt, MyPacket, Status, BytesTransferred ); } 这里我理解是构造一个packet用transfer函数发出,但有几个问题 1:NdisAllocateBuffer(&Status,&OffsetBuffer,pAdapt->RecvBufferPoolHandle ,pBakBuffer,OffsetSize); 我编译时不通过原因是说passthru.h里没有RecvBufferPoolHandle成员函数,是否因为ndis版本问题?如何安装高版本? 2:PtTransferDataComplete应该是transfer后的善后处理,可不可以直接把处理过程放在PtReceive里? 3:原passthru是do循环处理数据的,按现在的修改是否一次后直接跳出,还是继续循环 4:PtReceive这些函数是谁调用的?MP※※※呢? |
|
最新喜欢:ljmmar... |
沙发#
发布于:2003-12-01 21:27
1、自己在PtBindingAdapt的时候用NdisAllocateBufferPool分配一个poolhandle。
2、当status != PENDING的时候,就可以,Hu版就是这样的。否则你可以当此请求正处理中,这时候当然不能PtTransferDataComplete。等处理完了会“自动”调用你的PtTransferDataComplete的。 3、什么do?是说do {...}while(FALSE)吗?注意是个FASLE,就是说只执行一次。这样,发现错误了(如分配buffer失败等),可以直接用break跳到错误处理。 4、NDIS 最后,建议多看看DDK network drivers的内容。 |
|
板凳#
发布于:2003-12-01 22:29
1。分配以后怎样在PtPreceive中引用呢,直接分配不行吗
还有VOID NdisAllocateBufferPool( OUT PNDIS_STATUS Status, OUT PNDIS_HANDLE PoolHandle, IN UINT NumberOfDescriptors//这个参数是干什么的 ); |
|
地板#
发布于:2003-12-02 11:04
看DDK关于NdisAllocateBufferPool、NdisAllocateBuffer的说明呀,就能知道了。
别人告诉你的没有自己看来的记的牢。 |
|
地下室#
发布于:2003-12-02 16:07
我装的ddk怎么好像没有帮助文档
|
|
5楼#
发布于:2003-12-03 21:57
我装的ddk怎么好像没有帮助文档 重装DDK,在装的时候选择装帮助文件就行了。 |
|
|