阅读:4315回复:26
为什么得到的packet为空?
在imd中,用NdisGetReceivedPacket得到的packet为null,但是,我可以正常上网。我用softice监视了很长时间,得到的全是null。此问题,有人提出过。但是没有合适的答案。
[编辑 - 3/3/02 作者: KungFu] |
|
|
沙发#
发布于:2004-04-23 16:08
老大,问题解决了吗?
|
|
板凳#
发布于:2002-03-14 15:48
我要等高人的指点!!!
|
|
地板#
发布于:2002-03-14 09:38
?
|
|
地下室#
发布于:2002-03-13 15:31
诸位大虾,你们为什么不伸出你们的救援之手呀?
|
|
5楼#
发布于:2002-03-12 17:56
大侠们,再不指点两手,我都快给憋死了.xemexzj的代码我也试过,huyg的代码我也试过,都是不行!你们的代码在你们的机器上工作都正常吗?
pPrimaryAdapt问题解决了,你用的是2k上的sample.我用的是xp上的.现在我也用2k上的了. 我把代码贴出来,请帮忙分析一下.谢谢! 注释掉的是xemexzj和微软的源吗,别的是HUYG和微软的. ......... NdisAllocateBufferPool( Status, &pAdapt->RecvBufferPoolHandle, MAX_RECV_PACKET_POOL_SIZE); .......... do{ //PADAPT pOpenContext; PNDIS_PACKET MyPacket, MyPacket2; PUCHAR pPacketContent, pBakBuffer; UINT BytesTransferred; PNDIS_BUFFER PacketBuffer, OffsetBuffer; PRSVD Resvd; ULONG PacketLen, OffsetSize; NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress; HighestAcceptableAddress.LowPart = -1; HighestAcceptableAddress.HighPart = -1; //pOpenContext = (PADAPT)ProtocolBindingContext; //NUIO_STRUCT_ASSERT(pOpenContext, oc); //pRcvPacket = NULL; //pRcvData = NULL; Status = NDIS_STATUS_SUCCESS; if(PacketSize <= LookAheadBufferSize) { DbgPrint(\"pAdapt->Medium = %d\\n\", pAdapt->Medium); NdisMEthIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); break; } // // fall here, the PacketSize > LookAhdeadBufferSize // Status = NdisAllocateMemory( &pPacketContent, 2000, 0, HighestAcceptableAddress); if (Status != NDIS_STATUS_SUCCESS ) { DbgPrint(\"ptreceive :ndisallocatememory failed\\n\"); Status = NDIS_STATUS_NOT_ACCEPTED; break; } if(pPacketContent == NULL) { DbgPrint(\"ptreceive:pPacketContent == NULL\\n\"); Status = NDIS_STATUS_NOT_ACCEPTED; break; } 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\"); Status = NDIS_STATUS_NOT_ACCEPTED; break; } 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 ); } }while(0); /* MyPacket = NULL; do{ NdisDprAllocatePacket( &Status, &MyPacket, pAdapt->RecvPacketPoolHandle ); if( Status != NDIS_STATUS_SUCCESS ) break; phyAddr.QuadPart = -1; Status = NdisAllocateMemory( &pData, HeaderBufferSize + PacketSize, 0, phyAddr ); if( Status != NDIS_STATUS_SUCCESS ) break; NdisMoveMappedMemory( pData, HeaderBuffer, HeaderBufferSize ); NdisAllocateBuffer( &Status, &pHeadBuffer, //pAdapt->hRcvBufferPoolHandle, pAdapt->RecvBufferPoolHandle, pData, HeaderBufferSize ); if( Status != NDIS_STATUS_SUCCESS )break; pHeadBuffer->Next = NULL; ((PRSVD)(MyPacket->MiniportReserved))->pHeadBuffer = pHeadBuffer; ((PRSVD)(MyPacket->MiniportReserved))->OriginalPkt = NULL; NDIS_SET_PACKET_HEADER_SIZE( MyPacket, HeaderBufferSize ); MyPacket->Private.Head = NULL; MyPacket->Private.Tail = NULL; if( PacketSize > LookAheadBufferSize ) { nTransfer = PacketSize; NdisAllocateBuffer( &Status, &pDataBuffer, //pAdapt->hRcvBufferPoolHandle, pAdapt->RecvBufferPoolHandle, //((PUCHAR)pData) + HeaderBufferSize, (PVOID)(pData + HeaderBufferSize), nTransfer ); pDataBuffer->Next = NULL; if( Status != NDIS_STATUS_SUCCESS ) break; NdisChainBufferAtFront( MyPacket, pDataBuffer ); NdisTransferData( &Status, pAdapt->BindingHandle, MacReceiveContext, 0, nTransfer, MyPacket, &nBytesTransfered ); } else{ NdisMoveMemory( (CHAR *)pData + HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize ); NdisAllocateBuffer( &Status, &pDataBuffer, //pAdapt->hRcvBufferPoolHandle, pAdapt->RecvBufferPoolHandle, (PUCHAR)pData + HeaderBufferSize, LookAheadBufferSize ); if( Status != NDIS_STATUS_SUCCESS ) break; NdisChainBufferAtFront( MyPacket, pDataBuffer ); } }while(FALSE); if( Status == NDIS_STATUS_SUCCESS ) { //NdisChainBufferAtFront( MyPacket, pHeadBuffer ); //NDIS_SET_PACKET_STATUS( MyPacket, NDIS_STATUS_RESOURCES ); //NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1 ); PtTransferDataComplete( pAdapt, MyPacket, Status, HeaderBufferSize + PacketSize ); break; } if( Status != NDIS_STATUS_SUCCESS && Status != NDIS_STATUS_PENDING ); { if( MyPacket ) NdisDprFreePacket(MyPacket); if( pHeadBuffer ) NdisFreeBuffer( pHeadBuffer ); if( pDataBuffer ) NdisFreeBuffer( pDataBuffer ); if( pData ) NdisFreeMemory( pData, HeaderBufferSize + PacketSize, 0 ); } break; */ /* NdisMEthIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); */ VOID PtTransferDataComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred ) /*++ Routine Description: Same as the Send above, all sends need to be completed on the Primary\'s MiniportHandle Arguments: Return Value: --*/ { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; PUCHAR pPacketContent; PRSVD Resvd; UINT OffsetSize; UINT result; UINT PacketLen; PNDIS_BUFFER PacketBuffer; PNDIS_PACKET OffsetPacket; PNDIS_BUFFER OffsetBuffer; PUCHAR pBakContent; UINT bufLength; NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress; NDIS_STATUS status = NDIS_STATUS_SUCCESS; DBGPRINT((\"in PtTransferDataComplete\\n\")); HighestAcceptableAddress.LowPart = -1; HighestAcceptableAddress.HighPart = -1; // // Returning the Send on the Primary, will point to itself if there is no LBFO // pAdapt = pAdapt->pPrimaryAdapt; Resvd = (PRSVD)(Packet->MiniportReserved); OffsetPacket = (PNDIS_PACKET)Resvd->OriginalPkt; if(pAdapt->MiniportHandle) { if (OffsetPacket==NULL) { NdisMTransferDataComplete(pAdapt->MiniportHandle, Packet, Status, BytesTransferred); } else { PNDIS_MINIPORT_BLOCK h = (PNDIS_MINIPORT_BLOCK)pAdapt->MiniportHandle;//->PacketIndicateHandler; UINT HdrSize = NDIS_GET_PACKET_HEADER_SIZE(Packet); DbgBreakPoint(); status = NdisAllocateMemory( &pPacketContent, 2000, 0, HighestAcceptableAddress); CopyPacket2Buf(OffsetPacket,pPacketContent,&OffsetSize); CopyPacket2Buf(Packet,pPacketContent+OffsetSize,&PacketLen);//packetlen == bytestransferred PacketLen+=OffsetSize; // 手动释放offsetpacket NdisUnchainBufferAtFront( OffsetPacket,&OffsetBuffer ); NdisQueryBufferSafe(OffsetBuffer,&pBakContent,&bufLength, 32 ); NdisFreeBuffer(OffsetBuffer); NdisFreeMemory(pBakContent,2000,0); NdisFreePacket(OffsetPacket); memset(Packet->MiniportReserved,0,sizeof(Packet->MiniportReserved)); //result = RecvProcess(pAdapt,pPacketContent,&PacketLen); //if( result == PACKET_REFUSE ) //{ // MPReturnPacket((NDIS_HANDLE)pAdapt,Packet); // DbgPrint(\"recvprocess return packet_refuse\\n\"); // return; //} NdisUnchainBufferAtFront( Packet,&PacketBuffer ); NdisQueryBufferSafe(PacketBuffer,&pBakContent,&bufLength,32); NdisFreeBuffer(PacketBuffer); NdisFreeMemory(pBakContent,2000,0); NdisAllocateBuffer(&status,&PacketBuffer,pAdapt->RecvBufferPoolHandle,pPacketContent,PacketLen); NdisChainBufferAtFront(Packet,PacketBuffer); Packet->Private.Head->Next =NULL; Packet->Private.Tail=NULL; //NDIS_SET_PACKET_HEADER_SIZE(Packet,14); NDIS_SET_PACKET_HEADER_SIZE(Packet,15); NdisMIndicateReceivePacket(pAdapt->MiniportHandle ,&Packet,1); if(NDIS_GET_PACKET_STATUS(Packet) != NDIS_STATUS_PENDING) { MPReturnPacket((NDIS_HANDLE)pAdapt,Packet); } } } /* PADAPT pAdapt =(PADAPT)ProtocolBindingContext; PNDIS_BUFFER pBuffer=0, pNextBuffer=0; UINT nBufferLen, nTotalLen = 0; PVOID pVirtualAddr = 0; // // Returning the Send on the Primary, will point to itself if there is no LBFO // pAdapt = pAdapt->pPrimaryAdapt; if(pAdapt->MiniportHandle) { NdisQueryPacket( Packet, NULL, NULL, &pBuffer, NULL); while( pBuffer ) { NdisQueryBuffer( pBuffer, NULL, &nBufferLen ); nTotalLen += nBufferLen; NdisGetNextBuffer( pBuffer, &pNextBuffer ); NdisFreeBuffer( pBuffer ); pBuffer = pNextBuffer; } pBuffer = ((PRSVD)(Packet->MiniportReserved))->pHeadBuffer; NdisQueryBuffer( pBuffer, &pVirtualAddr, &nBufferLen ); nTotalLen += nBufferLen; NdisAdjustBufferLength( pBuffer, nTotalLen ); Packet->Private.Head = NULL; Packet->Private.Tail = NULL; pBuffer->Next = NULL; NdisChainBufferAtFront( Packet, pBuffer ); NdisMIndicateReceivePacket( pAdapt->MiniportHandle, &Packet, 1 ); if( NDIS_GET_PACKET_STATUS(Packet) != NDIS_STATUS_PENDING ) { MPReturnPacket((NDIS_HANDLE)pAdapt,Packet); } } */ /* PADAPT pAdapt =(PADAPT)ProtocolBindingContext; // // Returning the Send on the Primary, will point to itself if there is no LBFO // pAdapt = pAdapt->pPrimaryAdapt; if(pAdapt->MiniportHandle) { NdisMTransferDataComplete(pAdapt->MiniportHandle, Packet, Status, BytesTransferred); } */ } |
|
6楼#
发布于:2002-03-12 16:39
请问xemexzj,huyg,在PtTransferDataComplete例程里面
pAdapt = pAdapt->pPrimaryAdapt; pPrimaryAdapt是怎么得到的?在北京吗?我请你吃饭!!!! |
|
7楼#
发布于:2002-03-11 16:30
to: ysy case NdisMedium802_3: MyPacket = NULL; do{ NdisDprAllocatePacket( &Status, &MyPacket, pAdapt->RecvPacketPoolHandle ); if( Status != NDIS_STATUS_SUCCESS ) break; phyAddr.QuadPart = -1; Status = NdisAllocateMemory( &pData, HeaderBufferSize + PacketSize, 0, phyAddr ); if( Status != NDIS_STATUS_SUCCESS ) break; NdisMoveMappedMemory( pData, HeaderBuffer, HeaderBufferSize ); NdisAllocateBuffer(&Status, &pHeadBuffer, pAdapt->hRcvBufferPoolHandle, pData, HeaderBufferSize ); if( Status != NDIS_STATUS_SUCCESS )break; pHeadBuffer->Next = NULL; ((PRSVD)(MyPacket->MiniportReserved))->pHeadBuffer = pHeadBuffer; ((PRSVD)(MyPacket->MiniportReserved))->OriginalPkt = NULL; NDIS_SET_PACKET_HEADER_SIZE( MyPacket, HeaderBufferSize ); MyPacket->Private.Head = NULL; MyPacket->Private.Tail = NULL; if( PacketSize > LookAheadBufferSize ) { nTransfer = PacketSize; NdisAllocateBuffer( &Status, &pDataBuffer, pAdapt->hRcvBufferPoolHandle, ((PUCHAR)pData) + HeaderBufferSize, nTransfer ); pDataBuffer->Next = NULL; if( Status != NDIS_STATUS_SUCCESS ) break; NdisChainBufferAtFront( MyPacket, pDataBuffer ); NdisTransferData( &Status, pAdapt->BindingHandle, MacReceiveContext, 0, nTransfer, MyPacket, &nBytesTransfered ); } else{ NdisMoveMemory( (CHAR *)pData + HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize ); NdisAllocateBuffer( &Status, &pDataBuffer, pAdapt->hRcvBufferPoolHandle, (PUCHAR)pData + HeaderBufferSize, LookAheadBufferSize ); if( Status != NDIS_STATUS_SUCCESS ) break; NdisChainBufferAtFront( MyPacket, pDataBuffer ); } }while(FALSE); if( Status == NDIS_STATUS_SUCCESS ) { //NdisChainBufferAtFront( MyPacket, pHeadBuffer ); //NDIS_SET_PACKET_STATUS( MyPacket, NDIS_STATUS_RESOURCES ); //NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1 ); PtTransferDataComplete( pAdapt, MyPacket, Status, HeaderBufferSize + PacketSize ); break; } if( Status != NDIS_STATUS_SUCCESS && Status != NDIS_STATUS_PENDING ); { if( MyPacket ) NdisDprFreePacket(MyPacket); if( pHeadBuffer ) NdisFreeBuffer( pHeadBuffer ); if( pDataBuffer ) NdisFreeBuffer( pDataBuffer ); if( pData ) NdisFreeMemory( pData, HeaderBufferSize + PacketSize, 0 ); } break; VOID PtTransferDataComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred ) { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; PNDIS_BUFFER pBuffer=0, pNextBuffer=0; UINT nBufferLen, nTotalLen = 0; PVOID pVirtualAddr = 0; // // Returning the Send on the Primary, will point to itself if there is no LBFO // pAdapt = pAdapt->pPrimaryAdapt; if(pAdapt->MiniportHandle) { NdisQueryPacket(Packet, NULL, NULL, &pBuffer, NULL); while( pBuffer ) { NdisQueryBuffer( pBuffer, NULL, &nBufferLen ); nTotalLen += nBufferLen; NdisGetNextBuffer( pBuffer, &pNextBuffer ); NdisFreeBuffer( pBuffer ); pBuffer = pNextBuffer; } pBuffer = ((PRSVD)(Packet->MiniportReserved))->pHeadBuffer; NdisQueryBuffer( pBuffer, &pVirtualAddr, &nBufferLen ); nTotalLen += nBufferLen; NdisAdjustBufferLength( pBuffer, nTotalLen ); Packet->Private.Head = NULL; Packet->Private.Tail = NULL; pBuffer->Next = NULL; NdisChainBufferAtFront( Packet, pBuffer ); NdisMIndicateReceivePacket( pAdapt->MiniportHandle, &Packet, 1 ); if( NDIS_GET_PACKET_STATUS(Packet) != NDIS_STATUS_PENDING ) { MPReturnPacket((NDIS_HANDLE)pAdapt,Packet); } } } |
|
|
8楼#
发布于:2002-03-11 12:03
to: ysy
对于Packet==NULL我就是没有解决呀!否则也不用敬仰别人了! |
|
9楼#
发布于:2002-03-11 11:05
老胡呀,诸位能决问题的大虾呀,你看看这个问题怎么解决...
代码就是上面老胡铁出来的那部分: PtTransferDataComplete(...) { ... Packet->Private.Tail=NULL; NDIS_SET_PACKET_HEADER_SIZE(Packet,14); NdisMIndicateReceivePacket( pAdapt->MiniportHandle , &Packet, 1); .... } 当执行NdisMIndicateReceivePacket时候,出现PageFault,你说该怎么办? NdisMIndicateReceivePacket是不是就是执行((PNDIS_MINIPORT_BLOCK)(_H))->PacketIndicateHandler它呢? |
|
10楼#
发布于:2002-03-07 14:56
请问版主,NdisMIndicateReceivePacket(...)中的Packet只能带一个buffer吗?
|
|
|
11楼#
发布于:2002-03-06 20:36
老大,不要拿兄弟们开涮好不好?如果我精于此道的话,我也就不问了!!唉,惨呀,这个如肉强食的世界!!!:(
|
|
12楼#
发布于:2002-03-06 19:06
非常简单:在产品说明书中注明:为保证本产品性能,请使用D-Link, 3COM等100M/10M自适应网卡。(请避免使用Realtek等品牌10M老式网卡) 这真是太有创意了,我简直受不了了。还有很多56k的moden 也用ndisxxxindicatepacket,那怎么办? |
|
|
13楼#
发布于:2002-03-06 16:18
非常简单:在产品说明书中注明:为保证本产品性能,请使用D-Link, 3COM等100M/10M自适应网卡。(请避免使用Realtek等品牌10M老式网卡)
|
|
14楼#
发布于:2002-03-06 10:14
blue老大,您说的是什么意思?是您也碰到了这问题吗?既然您已经解决了,能帮兄弟一把吗?谢谢!
|
|
15楼#
发布于:2002-03-05 16:07
Huyg: 我对你的敬仰有如江水,连绵不绝;又有如...
去年为解决这个问题,花了我一个月时间,但还是...,只好换卡。 受益非浅!!! |
|
16楼#
发布于:2002-03-05 13:22
我用的是xp ddk的passthru,在2k上编译通过。
这是ptreceive里的一段代码,是huyg斑竹给的: ptreceive(...) { ... pAdapt->IndicateRcvComplete = TRUE; switch (pAdapt->Medium) { case NdisMedium802_3: case NdisMediumWan: do{ //PADAPT pOpenContext; PNDIS_PACKET MyPacket, MyPacket2; PUCHAR pPacketContent, pBakBuffer; UINT BytesTransferred; PNDIS_BUFFER PacketBuffer, OffsetBuffer; PRSVD Resvd; ULONG PacketLen, OffsetSize; NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress; HighestAcceptableAddress.LowPart = -1; HighestAcceptableAddress.HighPart = -1; //pOpenContext = (PADAPT)ProtocolBindingContext; //NUIO_STRUCT_ASSERT(pOpenContext, oc); //pRcvPacket = NULL; //pRcvData = NULL; Status = NDIS_STATUS_SUCCESS; if(PacketSize <= LookAheadBufferSize) { DBGPRINT((\"pAdapt->Medium = %d\\n\", pAdapt->Medium)); NdisMEthIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); break; } // // fall here, the PacketSize > LookAhdeadBufferSize // Status = NdisAllocateMemory( &pPacketContent, 2000, 0, HighestAcceptableAddress); if (Status != NDIS_STATUS_SUCCESS ) { DbgPrint(\"ptreceive :ndisallocatememory failed\\n\"); Status = NDIS_STATUS_NOT_ACCEPTED; break; } if(pPacketContent == NULL) { DbgPrint(\"prreceive:pPacketContent == NULL\\n\"); Status = NDIS_STATUS_NOT_ACCEPTED; break; } 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\"); Status = NDIS_STATUS_NOT_ACCEPTED; break; } 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 ); } }while(0); break; ... } 下面也是huyg斑竹给的,是pttransfercomplet,其中我注释掉了一部分。 VOID PtTransferDataComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred ) /*++ Routine Description: Entry point called by NDIS to indicate completion of a call by us to NdisTransferData. See notes under SendComplete. Arguments: Return Value: --*/ { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; PUCHAR pPacketContent; PRSVD Resvd; UINT OffsetSize; UINT result; UINT PacketLen; PNDIS_BUFFER PacketBuffer; PNDIS_PACKET OffsetPacket; PNDIS_BUFFER OffsetBuffer; PUCHAR pBakContent; UINT bufLength; NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress; NDIS_STATUS status = NDIS_STATUS_SUCCESS; DBGPRINT((\"in PtTransferDataComplete\\n\")); HighestAcceptableAddress.LowPart = -1; HighestAcceptableAddress.HighPart = -1; // // Returning the Send on the Primary, will point to itself if there is no LBFO // // pAdapt = pAdapt->pPrimaryAdapt; Resvd = (PRSVD)(Packet->MiniportReserved); OffsetPacket = (PNDIS_PACKET)Resvd->OriginalPkt; if(pAdapt->MiniportHandle) { if (OffsetPacket==NULL) { NdisMTransferDataComplete(pAdapt->MiniportHandle, Packet, Status, BytesTransferred); } else { //status = NdisAllocateMemory( // &pPacketContent, // 2000, // 0, // HighestAcceptableAddress); //CopyPacket2Buf(OffsetPacket,pPacketContent,&OffsetSize); //CopyPacket2Buf(Packet,pPacketContent+OffsetSize,&PacketLen);//packetlen == bytestransferred //PacketLen+=OffsetSize; // 手动释放offsetpacket NdisUnchainBufferAtFront( OffsetPacket,&OffsetBuffer ); NdisQueryBufferSafe(OffsetBuffer,&pBakContent,&bufLength, 32 ); NdisFreeBuffer(OffsetBuffer); NdisFreeMemory(pBakContent,2000,0); NdisFreePacket(OffsetPacket); memset(Packet->MiniportReserved,0,sizeof(Packet->MiniportReserved)); MPReturnPacket((NDIS_HANDLE)pAdapt,Packet); return; //result = RecvProcess(pAdapt,pPacketContent,&PacketLen); //if( result == PACKET_REFUSE ) //{ // MPReturnPacket((NDIS_HANDLE)pAdapt,Packet); // DbgPrint(\"recvprocess return packet_refuse\\n\"); // return; //} NdisUnchainBufferAtFront( Packet,&PacketBuffer ); NdisQueryBufferSafe(PacketBuffer,&pBakContent,&bufLength,32); NdisFreeBuffer(PacketBuffer); NdisFreeMemory(pBakContent,2000,0); NdisAllocateBuffer(&status,&PacketBuffer,pAdapt->RecvBufferPoolHandle,pPacketContent,PacketLen); NdisChainBufferAtFront(Packet,PacketBuffer); Packet->Private.Head->Next =NULL; Packet->Private.Tail=NULL; NDIS_SET_PACKET_HEADER_SIZE(Packet,14); NdisMIndicateReceivePacket(pAdapt->MiniportHandle ,&Packet,1); if(NDIS_GET_PACKET_STATUS(Packet) != NDIS_STATUS_PENDING) { MPReturnPacket((NDIS_HANDLE)pAdapt,Packet); } } } 一旦加载这个驱动,page fault。还请hu大虾看看是怎么回事?谢谢! |
|
17楼#
发布于:2002-03-04 18:16
的确如此,您上面贴出的code是放在ndisXXXindicatepacket后面呢还是前面? 忘掉那行ndisXXXindicatepacket吧。很简单,删掉它,以及那个 switch,因为我们不再需要它了。我们要对所有的medium做通用 处理,只需要用ndisindicatepacket。整个函数的结构如下: if (ndisgetpacket!=null) { //第一种情况 ndisindicatepacket } else if (PacketSize <= LookAheadBufferSize) { //第二种情况 switch(medium) { case 802.3: setpacketheadsize(14); case fddi: } ndisindicatepacket } else { //第三种情况 case 802.3: setpacketheadsize(14); case fddi: ndistransferdata(); if ( Status != NDIS_STATUS_PENDING ) { PtTransferDataComplete( (NDIS_HANDLE)pAdapt, MyPacket, Status, BytesTransferred ); } } VOID PtTransferDataComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred ) /*++ Routine Description: Same as the Send above, all sends need to be completed on the Primary\'s MiniportHandle Arguments: Return Value: --*/ { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; PUCHAR pPacketContent; PRSVD Resvd; UINT OffsetSize; UINT result; UINT PacketLen; PNDIS_BUFFER PacketBuffer; PNDIS_PACKET OffsetPacket; PNDIS_BUFFER OffsetBuffer; PUCHAR pBakContent; UINT bufLength; NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress; NDIS_STATUS status = NDIS_STATUS_SUCCESS; DBGPRINT(\"in PtTransferDataComplete\\n\"); HighestAcceptableAddress.LowPart = -1; HighestAcceptableAddress.HighPart = -1; // // Returning the Send on the Primary, will point to itself if there is no LBFO // pAdapt = pAdapt->pPrimaryAdapt; Resvd = (PRSVD)(Packet->MiniportReserved); OffsetPacket = (PNDIS_PACKET)Resvd->OriginalPkt; if(pAdapt->MiniportHandle) { if (OffsetPacket==NULL) { NdisMTransferDataComplete(pAdapt->MiniportHandle, Packet, Status, BytesTransferred); } else { status = NdisAllocateMemory( &pPacketContent, 2000, 0, HighestAcceptableAddress); CopyPacket2Buf(OffsetPacket,pPacketContent,&OffsetSize); CopyPacket2Buf(Packet,pPacketContent+OffsetSize,&PacketLen);//packetlen == bytestransferred PacketLen+=OffsetSize; // 手动释放offsetpacket NdisUnchainBufferAtFront( OffsetPacket,&OffsetBuffer ); NdisQueryBufferSafe(OffsetBuffer,&pBakContent,&bufLength, 32 ); NdisFreeBuffer(OffsetBuffer); NdisFreeMemory(pBakContent,2000,0); NdisFreePacket(OffsetPacket); memset(Packet->MiniportReserved,0,sizeof(Packet->MiniportReserved)); result = RecvProcess(pAdapt,pPacketContent,&PacketLen); if( result == PACKET_REFUSE ) { MPReturnPacket((NDIS_HANDLE)pAdapt,Packet); DbgPrint(\"recvprocess return packet_refuse\\n\"); return; } NdisUnchainBufferAtFront( Packet,&PacketBuffer ); NdisQueryBufferSafe(PacketBuffer,&pBakContent,&bufLength,32); NdisFreeBuffer(PacketBuffer); NdisFreeMemory(pBakContent,2000,0); NdisAllocateBuffer(&status,&PacketBuffer,pAdapt->RecvBufferPoolHandle,pPacketContent,PacketLen); NdisChainBufferAtFront(Packet,PacketBuffer); Packet->Private.Head->Next =NULL; Packet->Private.Tail=NULL; NDIS_SET_PACKET_HEADER_SIZE(Packet,14); NdisMIndicateReceivePacket(pAdapt->MiniportHandle ,&Packet,1); if(NDIS_GET_PACKET_STATUS(Packet) != NDIS_STATUS_PENDING) { MPReturnPacket((NDIS_HANDLE)pAdapt,Packet); } } } } |
|
|
18楼#
发布于:2002-03-04 17:33
MPTransferData与在ptreceive里面调用NdisTransferData有关系吗?
|
|
19楼#
发布于:2002-03-04 17:28
huyg别见笑,这是我在PtTransferDataComplete里面做的工作。但是问题出在哪里呢?
VOID PtTransferDataComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred ) /*++ Routine Description: Entry point called by NDIS to indicate completion of a call by us to NdisTransferData. See notes under SendComplete. Arguments: Return Value: --*/ { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; DBGPRINT((\"Transfer complete\\n\")); // if(pAdapt->MiniportHandle) // { // NdisMTransferDataComplete(pAdapt->MiniportHandle, // Packet, // Status, // BytesTransferred); // } do{ PNDIS_PACKET MyPacket, MyPacket2; PUCHAR pPacketContent, pBakBuffer; UINT BytesTransferred; PNDIS_BUFFER PacketBuffer, OffsetBuffer; ULONG BufferLength, TotalLength; PRSVD Resvd; MyPacket = Packet; Resvd =(PRSVD)(MyPacket->MiniportReserved); MyPacket2 = (PNDIS_PACKET)Resvd->OriginalPkt; NdisGetFirstBufferFromPacket( MyPacket2, &OffsetBuffer, (PVOID *)&pBakBuffer, &BufferLength, &TotalLength); if(pAdapt->MiniportHandle) { NdisMTransferDataComplete(pAdapt->MiniportHandle, MyPacket2, Status, BufferLength); } // NdisFreePacket(MyPacket2); // NdisFreeBuffer(OffsetBuffer); // NdisFreeMemory( // pBakBuffer, // 0, // 0 // ); NdisGetFirstBufferFromPacket( MyPacket, &PacketBuffer, (PVOID *)&pPacketContent, &BufferLength, &TotalLength); NdisFreePacket(MyPacket); NdisFreeBuffer(PacketBuffer); NdisFreeMemory( pPacketContent, 0, 0 ); //pAdapt->RecvPacketPoolHandle }while(0); // PtTransferDataCompleteFreeMydata( // ProtocolBindingContext, // Packet, // Status, // BytesTransferred // ); } |
|
上一页
下一页