阅读:1879回复:0
求助。。。关于修改包的问题。。。
以下代码里 《// 在这里对包的内容进行你自己的处理,如果修改了内容的话,由于这是在协议栈之下,
// 所以要重新修正CheckSum。调整MyBuffer,和MyPacket相关信息,如长度等。 // 注意,这里的数据已经是网络字节数据,所以在x86的处理器上要注意字节顺序的问题 // 对于少量内容的修改,重新扫描整个Buffer修正CheckSum是不值得的。 // RFC关于Nat的文档中详细描述了基于差异分析的修正CheckSum的方法,并给出了具体算法实现。 // 把新的包描述符存放到新的包描述符中的MiniportReserved中去,原因在DestroyMyPacket中解释 》这段文字描述的代码,轻大侠贴出来啊。。。 该怎么改mypacket 包里的信息啊。。????? BOOLEAN BuildMyPacket( IN PADAPT pAdapt, IN PNDIS_PACKET original_packet, OUT PNDIS_PACKET MyPacket ) { PSEND_RSVD SendRsvd; NDIS_STATUS Status; NDIS_PHYSICAL_ADDRESS phyaddr = {-1}; PVOID pcontent = NULL; ULONG total_length = 0, current_length = 0; PNDIS_BUFFER MyBuffer; // 分配新的内存 Status = NdisAllocateMemory((PVOID)&pcontent, 2014, 0, phyaddr); if (NDIS_STATUS_SUCCESS != Status) return FALSE; NdisZeroMemory(pcontent, 2014); // 把包中的数据Copy到自己的Buffer中来。 NdisQueryPacket(packet, NULL, NULL, &ndis_buffer, &total_length); while (NULL != ndis_buffer) { NdisQueryBufferSafe(ndis_buffer, &address, ¤t_length, NormalPagePriority); NdisMoveMemory(pcontent, address, current_length); (PUCHAR)pcontent += current_length; NdisGetNextBuffer(ndis_buffer, &ndis_buffer); } // 分配新的一个Buffer描述符 NdisAllocateBuffer(&Status, &MyBuffer, pAdapt->SendPacketPoolHandle, pcontent, total_length); if (NDIS_STATUS_SUCCESS != Status) { NdisFreeMemory(pcontent, 2014, 0); return FALSE; } // 在这里对包的内容进行你自己的处理,如果修改了内容的话,由于这是在协议栈之下, // 所以要重新修正CheckSum。调整MyBuffer,和MyPacket相关信息,如长度等。 // 注意,这里的数据已经是网络字节数据,所以在x86的处理器上要注意字节顺序的问题 // 对于少量内容的修改,重新扫描整个Buffer修正CheckSum是不值得的。 // RFC关于Nat的文档中详细描述了基于差异分析的修正CheckSum的方法,并给出了具体算法实现。 // 把新的包描述符存放到新的包描述符中的MiniportReserved中去,原因在DestroyMyPacket中解释 SendRsvd = (SEND_RSVD)MyPacket->MiniportReserved; SendRsvd->OriginalPkt = MyPacket; NdisChainBufferAtFront(MyPacket, MyBuffer); return TRUE; } |
|