plgundam
驱动牛犊
驱动牛犊
  • 注册日期2007-09-17
  • 最后登录2011-03-18
  • 粉丝1
  • 关注0
  • 积分11分
  • 威望79点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
阅读:2233回复:3

如何才能修改数据包呢?

楼主#
更多 发布于:2007-11-19 14:16
我就是在msendpacket中加入这段程序,功能是将发出的数据包重新赋值
高手帮忙看看我写的有什么问题啊,一运行就重启?


BOOLEAN IMBuildMyPacket(
    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,ndis_buffer;
  PVOID address = NULL;
  PVOID pNewData;
  PUCHAR pData;
  pEthHdr pEhr;
  UINT i;
     // 分配新的内存
     Status = NdisAllocateMemory((PVOID)&pcontent, 2014, 0, phyaddr);
     if (NDIS_STATUS_SUCCESS != Status)
         return FALSE;
     NdisZeroMemory(pcontent, 2014);
    
     // 把包中的数据Copy到自己的Buffer中来。
     NdisQueryPacket(original_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);
     }
  Status  = NdisAllocateMemory((PVOID)&pNewData,total_length,0,phyaddr);
      if (NDIS_STATUS_SUCCESS != Status)
          return FALSE;
      NdisZeroMemory(pNewData, total_length);
  NdisMoveMemory(pNewData, pcontent, current_length);
  
  pEhr  = (pEthHdr)pNewData;
  pData = (PUCHAR)(pEhr+1);
  for (i = 0;i < (total_length-sizeof(EthHdr)); i++)
  {
         *pData++ = (UCHAR)i;//重新赋值
  }
     // 分配新的一个Buffer描述符                    
     NdisAllocateBuffer(&Status, &MyBuffer, pAdapt->SendPacketPoolHandle,
          pNewData, total_length);            
     if (NDIS_STATUS_SUCCESS != Status)
     {
         NdisFreeMemory(pcontent, 2014, 0);
         return FALSE;
     }

    
         SendRsvd = (PSEND_RSVD)(MyPacket->MiniportReserved);
     SendRsvd->OriginalPkt = MyPacket;
     NdisChainBufferAtFront(MyPacket, MyBuffer);
     return TRUE;
}

cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2007-11-19 16:09
内存错误,检查一下,或者softice调一下。

最明显的错误就是下面:

如果数据超过2k,怎么办? 你没有处理。

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);
    }
走走看看开源好 Solaris vs Linux
plgundam
驱动牛犊
驱动牛犊
  • 注册日期2007-09-17
  • 最后登录2011-03-18
  • 粉丝1
  • 关注0
  • 积分11分
  • 威望79点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-12-06 11:12
确实在取包的地方有问题
 while(BuffDT!=(PNDIS_BUFFER)NULL)
 {
  //NdisQueryBuffer(BuffDT,&BuffVA,&BuffLen);
  NdisQueryBufferSafe(BuffDT,&BuffVA,&BuffLen,NormalPagePriority);
  RtlCopyMemory(pBuff,BuffVA,BuffLen);  
  //NdisMoveMemory(pBuff,BuffVA,BuffLen);   //irql =disptch_level(2)就会出错
  pBuff=pBuff+BuffLen;
  *pLength+=BuffLen;
  NdisGetNextBuffer(BuffDT,&BuffDT);
 }
 if (BuffVA!=NULL)
  NdisFreeMemory(BuffVA,BUFFER_SIZE,0);

可到了free的地方就出c2错误(BAD_POOL_CALLER)
numenshane
驱动牛犊
驱动牛犊
  • 注册日期2007-07-12
  • 最后登录2009-09-28
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望37点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-12-06 19:46
写的很好!
gsasd fs agds sadgsa asfdas df
游客

返回顶部