阅读:1303回复:2
对passthru做的修改,帮忙看看
我把passthru中的PtReceive和PtTransferDataComplete做了一些改动,安装后所有的网络连接都不能用了,请帮忙看看这些破代码有什么问题,谢谢!!!
VOID PtTransferDataComplete( IN NDIS_HANDLEProtocolBindingContext, IN PNDIS_PACKETPacket, IN NDIS_STATUSStatus, IN UINTBytesTransferred ) /*++ Routine Description: Same as the Send above, all sends need to be completed on the Primary\'s MiniportHandle Arguments: Return values: --*/ { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; PRSVD Resvd; PNDIS_PACKET MyPacket; UINT bufLength; UINT bytesTransfered = 0; NDIS_STATUS status = NDIS_STATUS_SUCCESS; DbgPrint(\"==>PtTransferDataComplete(...)\\n\"); // Returning the Send on the Primary, will point to itself if there is no LBFO pAdapt = pAdapt->pPrimaryAdapt; if(pAdapt->MiniportHandle) { NDIS_SET_PACKET_STATUS(Packet, NDIS_STATUS_RESOURCES); NDIS_SET_PACKET_HEADER_SIZE(Packet, 14); NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &Packet, 1); if(NDIS_GET_PACKET_STATUS(Packet) != NDIS_STATUS_PENDING) { NdisDprFreePacket(Packet); } } DbgPrint(\"<==PtTransferDataComplete(...)\\n\"); } NDIS_STATUS PtReceive( IN NDIS_HANDLEProtocolBindingContext, IN NDIS_HANDLEMacReceiveContext, IN PVOIDHeaderBuffer, IN UINTHeaderBufferSize, IN PVOIDLookAheadBuffer, IN UINTLookAheadBufferSize, IN UINTPacketSize ) /*++ Routine Description: LBFO - need to use primary for all receives Arguments: Return values: --*/ { PADAPTpAdapt =(PADAPT)ProtocolBindingContext; PNDIS_PACKETMyPacket, Packet; NDIS_STATUSStatus = NDIS_STATUS_SUCCESS; //****************************************************** UINT PacketLen, OffsetSize, BytesTransferred; PRSVD Resvd; NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress; PUCHAR pPacketContent; PNDIS_BUFFER PacketBuffer, pBakBuffer, OffsetBuffer; //****************************************************** DbgPrint(\"==>PtReceive()\\n\"); if(!pAdapt->MiniportHandle) { Status = NDIS_STATUS_FAILURE; } else do { if(pAdapt->isSecondary) { DBGPRINT(\"PASSTHRU GETTING RECIEVES ON SECONDARY\\n\"); ASSERT(0); } //*************************************************************************************** HighestAcceptableAddress.LowPart = -1; HighestAcceptableAddress.HighPart = -1; if(PacketSize <= LookAheadBufferSize) { DbgPrint(\"PacketSize <= LookAheadBufferSize\\n\"); 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); RtlCopyMemory(pPacketContent,HeaderBuffer,HeaderBufferSize); RtlCopyMemory(pPacketContent+HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize); PacketLen = PacketSize+HeaderBufferSize; NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle); if(Status != NDIS_STATUS_SUCCESS) { DbgPrint(\"NdisDprAllocatePacket failed!\\n\"); return NDIS_STATUS_NOT_ACCEPTED; } if(Status == NDIS_STATUS_SUCCESS) { NdisAllocateBuffer(&Status, &PacketBuffer, pAdapt->RecvBufferPoolHandle, pPacketContent,PacketLen); NdisChainBufferAtFront(MyPacket, PacketBuffer); NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize); NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES); NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); if(NDIS_GET_PACKET_STATUS(MyPacket) != NDIS_STATUS_PENDING) { NdisFreeBuffer(PacketBuffer); NdisFreeMemory(pPacketContent,2000,0); NdisDprFreePacket(MyPacket); } return NDIS_STATUS_SUCCESS; } } 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); NdisAllocateBuffer(&Status,&PacketBuffer,pAdapt->RecvBufferPoolHandle,pPacketContent,PacketSize); NdisChainBufferAtFront(MyPacket, PacketBuffer); NdisTransferData(&Status, pAdapt->BindingHandle, MacReceiveContext, 0, PacketSize, MyPacket, &BytesTransferred); if ( Status != NDIS_STATUS_PENDING ) { NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize); NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES); NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); if(NDIS_GET_PACKET_STATUS(MyPacket) != NDIS_STATUS_PENDING) { NdisFreeBuffer(PacketBuffer); NdisFreeMemory(pPacketContent,2000,0); NdisDprFreePacket(MyPacket); } return NDIS_STATUS_SUCCESS; } } } while(FALSE); return Status; } |
|
最新喜欢:![]() |
沙发#
发布于:2002-04-11 08:58
NdisTransferData只是传递在LookaheadBuffer中没有出现的数据内容,不是传递这个包。
且NdisTransferData函数只会将数据传递到Packet的第一个Buffer,即使它所传的数据不是开始的数据。 |
|
板凳#
发布于:2002-04-12 11:19
多谢!!!
|
|