20楼#
发布于: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); } } } |
|
|
21楼#
发布于:2002-03-12 16:39
请问xemexzj,huyg,在PtTransferDataComplete例程里面
pAdapt = pAdapt->pPrimaryAdapt; pPrimaryAdapt是怎么得到的?在北京吗?我请你吃饭!!!! |
|
22楼#
发布于: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); } */ } |
|
23楼#
发布于:2002-03-13 15:31
诸位大虾,你们为什么不伸出你们的救援之手呀?
|
|
24楼#
发布于:2002-03-14 09:38
?
|
|
25楼#
发布于:2002-03-14 15:48
我要等高人的指点!!!
|
|
26楼#
发布于:2004-04-23 16:08
老大,问题解决了吗?
|
|
上一页
下一页