阅读:1260回复:0
欧想在passthru中实现数据包的重构,请指教!
下面是一段源代码,我想要添加的东东想写在
#if MODIFY #endif 之间,不知道该如何下手,请各位指点一二 //bow 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 ) /*++ Routine Description: LBFO - need to use primary for all receives Arguments: Return Value: --*/ { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; PNDIS_PACKET MyPacket, Packet; NDIS_STATUS Status = NDIS_STATUS_SUCCESS; UINT BufferCount; UINT BufferLength; UINT i,j; PNDIS_BUFFER CurrentBuffer,NextBuffer,BufferVA; #if DBGOUT DbgPrint(\"=> PtReceive is called ...\\n\"); #endif if(!pAdapt->MiniportHandle) { Status = NDIS_STATUS_FAILURE; } else do { // // We should not be getting Receives on a Secondary, this is just specific to our LBFO driver // if(pAdapt->isSecondary) { ASSERT(0); DbgBreakPoint(); } // // If this was indicated by the miniport below as a packet, then get that packet pointer and indicate // it as a packet as well(with appropriate status). This way the OOB stuff is accessible to the // transport above us. // Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext); if(Packet != NULL) { // //DbgPrint(\"==> @PtReceive: Packet is not NULL\\n\"); // // // Get a packet off the pool and indicate that up // NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle); if(Status == NDIS_STATUS_SUCCESS) { // //DbgPrint(\"==> @PtReceive: Statuse is NDIS_STATUS_SUCCESS\\n\"); // MyPacket->Private.Head = Packet->Private.Head; MyPacket->Private.Tail = Packet->Private.Tail; // // Get the original packet(it could be the same packet as one received or a different one // based on # of layered MPs) and set it on the indicated packet so the OOB stuff is visible // correctly at the top. // NDIS_SET_ORIGINAL_PACKET(MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet)); NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize); // // Set Packet Flags // //NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet); NdisSetPacketFlags(MyPacket, NdisGetPacketFlags(Packet)); // // Make sure the status is set to NDIS_STATUS_RESOURCES. // NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES); #if MPACKETDISPLAY // // Display the information of the packet // DbgPrint(\"\\n======PACKET INFORMATION@PtReceive Before Relocated========\\n\"); // // Get the number of the buffer // NdisQueryPacket(MyPacket, NULL, &BufferCount, &CurrentBuffer, NULL); // // Display the BufferCount // DbgPrint(\"\\t* BufferCount is %d\\n\",BufferCount); if(BufferCount == 0) { DbgPrint(\"==>REPORT@PtReceive: BufferCount is Zero\\n\"); } else do { for(i = 0; i < BufferCount; i ++) { // // Display No. i Buffer // DbgPrint(\"\\n\\t* i = %d\\n\",i); NdisQueryBuffer(CurrentBuffer, &BufferVA, &BufferLength); for(j = 0; j < BufferLength; j ++) { DbgPrint(\"%2X \",((PUCHAR)(BufferVA))[j]); if(j && ((j + 1) % 16 == 0)) DbgPrint(\"\\n\"); } DbgPrint(\"\\n\"); NdisGetNextBuffer(CurrentBuffer, &NextBuffer); if(NextBuffer == NULL) { if(i < (BufferCount - 1)) DbgPrint(\"==>Error Report@PtReceive: NextBuffer is Null\\n\"); break; } CurrentBuffer = NextBuffer; } DbgPrint(\"\\n\"); } while(FALSE); #endif #if MODIFY // // Todo: ... // #endif #if PACKETDISPLAY // // Display the information of the packet // DbgPrint(\"\\n========PACKET INFORMATION@PtReceive Relocated=========\\n\"); // // Get the number of the buffer // NdisQueryPacket(MyPacket, NULL, &BufferCount, &CurrentBuffer, NULL); // // Display the BufferCount // DbgPrint(\"\\t* BufferCount is %d\\n\",BufferCount); if(BufferCount == 0) { DbgPrint(\"==>REPORT@PtReceive: BufferCount is Zero\\n\"); } else do { for(i = 0; i < BufferCount; i ++) { // // Display No. i Buffer // DbgPrint(\"\\n\\t* i = %d\\n\",i); NdisQueryBuffer(CurrentBuffer, &BufferVA, &BufferLength); for(j = 0; j < BufferLength; j ++) { DbgPrint(\"%2X \",((PUCHAR)(BufferVA))[j]); if(j && ((j + 1) % 16 == 0)) DbgPrint(\"\\n\"); } DbgPrint(\"\\n\"); NdisGetNextBuffer(CurrentBuffer, &NextBuffer); if(NextBuffer == NULL) { if(i < (BufferCount - 1)) DbgPrint(\"==>Error Report@PtReceive: NextBuffer is Null\\n\"); break; } CurrentBuffer = NextBuffer; } DbgPrint(\"\\n\"); } while(FALSE); #endif NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); ASSERT(NDIS_GET_PACKET_STATUS(MyPacket) == NDIS_STATUS_RESOURCES); NdisDprFreePacket(MyPacket); break; } DbgPrint(\"==> @PtReceive: Statuse is not NDIS_STATUS_SUCCESS\\n\"); } // // Fall through if the miniport below us has either not indicated a packet or we could not // allocate one // pAdapt->IndicateRcvComplete = TRUE; switch(pAdapt->Medium) { case NdisMedium802_3: NdisMEthIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); break; case NdisMedium802_5: NdisMTrIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); break; case NdisMediumFddi: NdisMFddiIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); break; default: ASSERT(0); break; } } while(FALSE); |
|