jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1461回复:3

yangmin26,请问你以前发的代码相关问题,关于包的修改与转发!也请其他高手帮帮忙了!

楼主#
更多 发布于:2004-04-26 21:33
以下是miniport模块的mpsend部分代码,基于篇幅考虑,省略了小部分代码,我想问的问题是,在释放pPacketContent(NdisFreeMemory(pPacketContent, 2000, 0);)之前,怎样将pPacketContent缓冲区的能容重新封包再进行转发,而不是用微软的封包方式进行转发?我想修改pPacketcontent缓冲区的内容,然后对它进行封包,再转发出去?谢谢
NDIS_STATUS
MPSend(
IN NDIS_HANDLE MiniportAdapterContext,
IN PNDIS_PACKET Packet,
IN UINT Flags
)
{
DbgPrint(\"MPSend\\n\");
NdisQueryPacket(Packet,NULL,NULL,NULL,&PacketSize);
ntStatus = NdisAllocateMemory(&pPacketContent,2000,0,HighestAcceptableMax);
if(ntStatus != NDIS_STATUS_SUCCESS)
{
return ntStatus;
}
NdisZeroMemory(pPacketContent,2000);
NdisQueryBufferSafe(Packet->Private.Head,&pBuf,&BufLength,32);
NdisMoveMemory(pPacketContent,pBuf,BufLength);
i = BufLength;
pNext = Packet->Private.Head;
for(;;)
{
if(pNext == Packet->Private.Tail)
break;
pNext = pNext->Next;
if(pNext == NULL)
break;
NdisQueryBufferSafe(pNext,&pBuf,&BufLength,32);
NdisMoveMemory(pPacketContent+i,pBuf,BufLength);
i+=BufLength;
}
PacketBuffer=pPacketContent;
PacketBufferLen=i;
DbgPrint(\"包大小%d\\n\",i);

memset(buffer,0,256);
sprintf(buffer,\"对方MAC %02X-%02X-%02X-%02X-%02X-%02X\\n\",
((PETHHDR)pPacketContent)->eh_dst[0],
((PETHHDR)pPacketContent)->eh_dst[1],
((PETHHDR)pPacketContent)->eh_dst[2],
((PETHHDR)pPacketContent)->eh_dst[3],
((PETHHDR)pPacketContent)->eh_dst[4],
((PETHHDR)pPacketContent)->eh_dst[5]);
        DbgPrint(buffer);

memset(buffer,0,256);
sprintf(buffer,\"本地MAC %02X-%02X-%02X-%02X-%02X-%02X\\n\",
((PETHHDR)pPacketContent)->eh_src[0],
((PETHHDR)pPacketContent)->eh_src[1],
((PETHHDR)pPacketContent)->eh_src[2],
((PETHHDR)pPacketContent)->eh_src[3],
((PETHHDR)pPacketContent)->eh_src[4],
((PETHHDR)pPacketContent)->eh_src[5]);

        DbgPrint(buffer);
memset(buffer,0,256);
sprintf(buffer,\"0x%02X%02X\",((PETHHDR)pPacketContent)->eh_type[0],((PETHHDR)pPacketContent)->eh_type[1]);
DbgPrint(\"%s\",buffer);
if(strcmp(buffer,IP)==0)//IP数据包
{
DbgPrint(\"IP GET!\\n\");
pIPHeader=(PIPHeader)((PCHAR)pPacketContent+14);
{
memset(buffer,0,256);
sprintf(buffer,\" IPv %d \",(pIPHeader->ver_len>>4)&15);
DbgPrint(\"\\n%s\", buffer);
memset(buffer,0,256);
//发送端地址
memset(buffer,0,256);
sprintf(buffer,\" 源地址:%d.%d.%d.%d \",pIPHeader->src_addr[0],pIPHeader->src_addr[1],pIPHeader->src_addr[2],pIPHeader->src_addr[3]);
DbgPrint(\"%s\", buffer);
//接收端地址
memset(buffer,0,256);
sprintf(buffer,\" 目标地址:%d.%d.%d.%d \",pIPHeader->des_addr[0],pIPHeader->des_addr[1],pIPHeader->des_addr[2],pIPHeader->des_addr[3]);
DbgPrint(\"%s\", buffer);
            }
switch(pIPHeader->protocol)
{
case PROT_ICMP:
DbgPrint(\"ICMP\\n\");
break;
case PROT_IGMP:
DbgPrint(\"IGMP\\n\");
   break;
   case PROT_TCP:
   DbgPrint(\"TCP\\n\");
{
pTCPHeader=(PTCPHeader)((PCHAR)pIPHeader+((pIPHeader->ver_len&15)*32/8));
//发送端端口
memset(buffer,0,256);
sprintf(buffer,\" 发送端端口:%d \",pTCPHeader->src_port[0]*0x100+pTCPHeader->src_port[1]);
DbgPrint(\"%s\",buffer);
//接收端端口
memset(buffer,0,256);
sprintf(buffer,\" 接收端端口:%d \",pTCPHeader->des_port[0]*0x100+pTCPHeader->des_port[1]);
DbgPrint(\"%s\",buffer);

//在释放pPacketContent之前,怎样将pPacketContent缓冲区的能容重新封包,而不是用下面的微软的封包方式进行?
NdisFreeMemory(pPacketContent, 2000, 0);

ASSERT (pAdapt->pSecondaryAdapt);

pAdapt = pAdapt->pSecondaryAdapt;


if (IsIMDeviceStateOn (pAdapt) == FALSE)
{
return NDIS_STATUS_FAILURE;
}


NdisAllocatePacket(&Status,
  &MyPacket,
  pAdapt->SendPacketPoolHandle);

if (Status == NDIS_STATUS_SUCCESS)
{

PNDIS_PACKET_EXTENSION Old, New;

Rsvd = (PRSVD)(MyPacket->ProtocolReserved);
Rsvd->OriginalPkt = Packet;
MyPacket->Private.Flags = Flags;

MyPacket->Private.Head = Packet->Private.Head;
MyPacket->Private.Tail = Packet->Private.Tail;
NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);

NdisIMCopySendPerPacketInfo(MyPacket, Packet); NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet,
&MediaSpecificInfo,
&MediaSpecificInfoSize);

if (MediaSpecificInfo || MediaSpecificInfoSize)
{
NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(MyPacket,
MediaSpecificInfo,
MediaSpecificInfoSize);
}


NdisSend(&Status,
pAdapt->BindingHandle,
MyPacket);


if (Status != NDIS_STATUS_PENDING)
{
NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket);
NdisFreePacket(MyPacket);
}
}
return(Status);
}

在释放pPacketContent(NdisFreeMemory(pPacketContent, 2000, 0);)之前,怎样将pPacketContent缓冲区的能容重新封包再进行转发,而不是用下面的微软的封包方式进行?
NdisAllocatePacket(&Status,&MyPacket,pAdapt->SendPacketPoolHandle);
if (Status == NDIS_STATUS_SUCCESS)
{

PNDIS_PACKET_EXTENSION Old, New;

Rsvd = (PRSVD)(MyPacket->ProtocolReserved);
Rsvd->OriginalPkt = Packet;
MyPacket->Private.Flags = Flags;

MyPacket->Private.Head = Packet->Private.Head;
MyPacket->Private.Tail = Packet->Private.Tail;
NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);
.....................
谢谢!


[编辑 -  4/26/04 by  jackieky]
start
驱动小牛
驱动小牛
  • 注册日期2001-11-05
  • 最后登录2010-09-03
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望27点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-27 10:51
NdisChainBufferAtBack
second
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-27 21:42
start:你看这个思路对吗?但是编译的时候出错:
错误如下:
c:\\xpassthru\\SEND.C(329) : error C2039: \'SendBufferPoolHandle\' : is not a member of \'_ADAPT\'
        c:\\xpassthru\\xpassthru.h(54) : see declaration of \'_ADAPT\'
c:\\xpassthru\\SEND.C(330) : warning C4022: \'NdisAllocateBuffer\' : pointer mismatch for actual parameter 4
c:\\xpassthru\\SEND.C(330) : error C2198: \'NdisAllocateBuffer\' : too few actual parameters

部分代码如下:
NdisAllocateBuffer(&Status,
          &pPacketBuffer,
          pAdapt->SendBufferPoolHandle,
          pPacketContent,
          PacketBufferLen);
         if (Status == NDIS_STATUS_SUCCESS)
        {   DbgPrint(\"\\n copy packet\\n\");
          NdisChainBufferAtBack(MyPacket,pPacketBuffer);
          NdisSend(&Status, pAdapt->BindingHandle, MyPacket);
      if (Status != NDIS_STATUS_PENDING)
     {
  NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket);
NdisFreeBuffer(pPacketBuffer);
               NdisFreeMemory(pPacketContent, 2000, 0);

  NdisFreePacket(MyPacket);

     }
         }
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-07 08:38
上面这个问题解决了,但是一装上驱动后机器就立刻重起,重新开机后说什么查找到新硬件,发现机器上多了一个新的网络设备,但是他的驱动是有问题的,搞得我上网都上不了了,费了好大的劲才能把它给卸掉。以前也碰到过类似问题,不知道是为何。
游客

返回顶部