kok5168
驱动牛犊
驱动牛犊
  • 注册日期2010-03-07
  • 最后登录2010-06-06
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望211点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1787回复:0

求助。。。关于修改包的问题。。。

楼主#
更多 发布于:2010-04-15 10:44
以下代码里 《// 在这里对包的内容进行你自己的处理,如果修改了内容的话,由于这是在协议栈之下,

    // 所以要重新修正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, &current_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;
}
游客

返回顶部