阅读:1264回复:1
我的一个很简单的源代码,谁帮我看看,我以及郁闷了一个星期了!
这是安装胡大侠所说的方法修改的passthru
功能是 数据包直通 但安装后就是不能上网 大家帮我看看由什么问题? 谢谢 NDIS_STATUS PtReceive( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookAheadBufferSize, IN UINT PacketSize ) { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; PNDIS_PACKET MyPacket, Packet, MyPacket2; NDIS_STATUS Status = NDIS_STATUS_SUCCESS; PNDIS_BUFFER PacketBuffer, OffsetBuffer; PUCHAR pPacketContent,pBakBuffer; UINT PacketLen, OffsetSize; PRSVD Resvd; UINT BytesTransferred; NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress; HighestAcceptableAddress.LowPart = -1; HighestAcceptableAddress.HighPart = -1; if(!pAdapt->MiniportHandle) { Status = NDIS_STATUS_FAILURE; } else do { if(pAdapt->isSecondary) { DBGPRINT(\"PASSTHRU GETTING RECIEVES ON SECONDARY\\n\"); ASSERT(0); } Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext); if(Packet != NULL) { // // Get a packet off the pool and indicate that up // NdisDprAllocatePacket(&Status, &MyPacket,pAdapt->RecvPacketPoolHandle); if(Status == NDIS_STATUS_SUCCESS) { MyPacket->Private.Head = Packet->Private.Head; MyPacket->Private.Tail = Packet->Private.Tail; NDIS_SET_ORIGINAL_PACKET(MyPacket,NDIS_GET_ORIGINAL_PACKET(Packet)); NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize); // // Set Packet Flags // NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet); // // Make sure the status is set to NDIS_STATUS_RESOURCES. //set NDIS_STATUS_RESOURCES 后windows就会拷贝完整的包 //然后就可以直接释放MyPacket ////////////// arp process NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES); NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); ASSERT(NDIS_GET_PACKET_STATUS(MyPacket) == NDIS_STATUS_RESOURCES); NdisDprFreePacket(MyPacket); break; } } else if ( PacketSize <= LookAheadBufferSize)*/ if ( PacketSize <= LookAheadBufferSize) { 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 ; }*/ NdisZeroMemory ( pPacketContent, 2000); NdisMoveMemory ( pPacketContent, HeaderBuffer, HeaderBufferSize); NdisMoveMemory ( pPacketContent+HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize); PacketLen = PacketSize+HeaderBufferSize; NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle); if(Status == NDIS_STATUS_SUCCESS) { NdisAllocateBuffer(&Status, &PacketBuffer, pAdapt->BufferPoolHandle,pPacketContent,PacketLen); NdisChainBufferAtFront( MyPacket, PacketBuffer ); MyPacket->Private.Head->Next=NULL; MyPacket->Private.Tail=NULL; Resvd =(PRSVD)(MyPacket->MiniportReserved); Resvd->OriginalPkt = NULL; NDIS_SET_PACKET_HEADER_SIZE( MyPacket, HeaderBufferSize ); NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); // 这个函数调用之后ndis就只能调用protocol的ptrecievepacket了。 if ( NDIS_GET_PACKET_STATUS( MyPacket ) != NDIS_STATUS_PENDING ) { NdisFreeBuffer( PacketBuffer); NdisFreeMemory( pPacketContent, 2000, 0); NdisFreePacket( MyPacket); } break; } } else { 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; }*/ NdisAllocateBuffer(&Status,&PacketBuffer,pAdapt->BufferPoolHandle, pPacketContent,PacketSize-LookAheadBufferSize); NdisChainBufferAtFront( MyPacket, PacketBuffer ); MyPacket->Private.Head->Next=NULL; MyPacket->Private.Tail=NULL; OffsetSize = HeaderBufferSize + LookAheadBufferSize; NdisMoveMemory(pBakBuffer,HeaderBuffer,HeaderBufferSize); NdisMoveMemory((PVOID)((PUCHAR)pPacketContent+HeaderBufferSize),LookAheadBuffer, LookAheadBufferSize); PacketLen = HeaderBufferSize + PacketSize; NdisDprAllocatePacket(&Status,&MyPacket2, pAdapt->RecvPacketPoolHandle); NdisAllocateBuffer(&Status,&OffsetBuffer,pAdapt->BufferPoolHandle , 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(FALSE); return Status; } |
|
沙发#
发布于:2003-12-07 22:37
对了
对我的 直通 程序 我还发现了一个问题 就是当ping包小的时候可以ping通其他机器 大一点的ping包就ping不通其他机器 大家帮我看看是怎么回事啊? 我都急死了! 此题有50分 |
|