CooSet
驱动牛犊
驱动牛犊
  • 注册日期2012-12-23
  • 最后登录2013-06-06
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望101点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1840回复:4

弱弱的问题,请大牛指点

楼主#
更多 发布于:2012-12-23 17:04
对于大牛来说很简单的一个问题,看过以前有朋友发过的帖子关于接收包,转发包,最近我也遇到这样的问题,请大牛指教

我现在引用以前驱动网里面的代码,现在我把接收到的包过滤,只处理IP数据包
先定义自己的数据包
     PNDIS_PACKET    MyPacket;
     PNDIS_BUFFER   MyBuffer;
       Resvd =(PRSVD)(MyPacket->MiniportReserved);  
        Resvd->OriginalPkt = Packet;  
  
        MyPacket->Private.Head = Packet->Private.Head;   //把源数据包数据的头拷贝到自己的包中
        MyPacket->Private.Tail = Packet->Private.Tail;  //把源数据包数据的尾拷贝到自己的包中

    //这个函数创建一个缓冲区描述符,映射指定的虚拟范围或子范围内已分配的内存块
     NdisAllocateBuffer(&Status3,&MyBuffer,pAdapt->SendPacketPoolHandle,pPacketContent,i);  
  
            if (Status3==NDIS_STATUS_SUCCESS )    
            {  
                NdisChainBufferAtFront(MyPacket, MyBuffer);  //把内存缓冲区挂到自己的包上
                Resvd =(PRSVD)(MyPacket->ProtocolReserved);  
                Resvd->OriginalPkt = MyPacket;  
                NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);  
                NdisReturnPackets(&Packet, 1);  
                MyPacket->Private.Head->Next=NULL;  
                MyPacket->Private.Tail=NULL;  
                Resvd->IsPrivate = 1;  
                Resvd->pMyBuffer=&MyBuffer;  
                Resvd->  pMyContent=&pPacketContent;  
                NdisSend(&Status4,pAdapt->BindingHandle,MyPacket);      
                if(Status4!=NDIS_STATUS_PENDING)  
                {  
                    NdisUnchainBufferAtFront(MyPacket,&MyBuffer);  
                    NdisQueryBufferSafe(MyBuffer,&pPacketContent,&BufLength,32);  
                    if(pPacketContent != NULL)
                    NdisFreeMemory(pPacketContent,BufLength,0);  
                    NdisFreeBuffer(MyBuffer);  
                    NdisDprFreePacket(MyPacket);      
                  
                 }            
                return 0;          
            }
我不懂的地方是,现在MyBuffer这个结构体变量中还没有任何赋值,这样发送出去,在接收方,收到的是不是都是乱码?
还有最主要的是,这个结构体变量MyBuffer 如何赋值?请大牛指点,这个问题困扰我很9了
zhangfresh
驱动牛犊
驱动牛犊
  • 注册日期2008-07-21
  • 最后登录2023-01-09
  • 粉丝1
  • 关注2
  • 积分94分
  • 威望871点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2012-12-24 11:20
这段代码有两个地方不懂。
1、 PNDIS_PACKET    MyPacket; 只是一个指针,没有经过NdisAllocatePacket初始化,怎么后面就用起MyPacket来了?
2、NdisChainBufferAtFront把MyBuffer和MyPacket绑定,本质上就是MyPacket->Private.Head->Next=MyBuffer;怎么后面居然
MyPacket->Private.Head->Next=NULL;  
                MyPacket->Private.Tail=NULL;
这样MyPacket不是没有buffer了?

至于lz的问题,buffer的信息,是存储在它指向的内存块里面,具体而言,就是pPacketContent,NdisAllocateBuffer的时候指定的。
CooSet
驱动牛犊
驱动牛犊
  • 注册日期2012-12-23
  • 最后登录2013-06-06
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望101点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2012-12-24 16:01
回 zhangfresh 的帖子


先谢谢大哥在百忙之中来帮忙,第一个问题中没有“NdisAllocatePacket”函数,我用NdisDprAllocatePacket函数代替了,不知道对不对呢?

还有就是第二个问题了,既然MyPacket->Private.Head->Next=MyBuffer,那么我还没有给这个MyBuffer赋值,那怎么知道哪里是数据头,哪里是数据尾?
  PNDIS_BUFFER   MyBuffer;  这个MyBuffer是结构体指针,如何给这个MyBuffer赋值呢?我还是没有明白。
MyBuffer = “............”是这样直接赋值

还是像下面这样,每一项,每一项赋值呢?
        MyBuffer->ByteCount;
    MyBuffer->ByteOffset;
    MyBuffer->MappedSystemVa;
    MyBuffer->MdlFlags;
    MyBuffer->Next;
    MyBuffer->Size;
    MyBuffer->StartVa;
zhangfresh
驱动牛犊
驱动牛犊
  • 注册日期2008-07-21
  • 最后登录2023-01-09
  • 粉丝1
  • 关注2
  • 积分94分
  • 威望871点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2012-12-25 09:10
buffer本质上是一个mdl,MyBuffer = “............”肯定是错误的。
 NdisAllocateBuffer(&Status3,&MyBuffer,pAdapt->SendPacketPoolHandle,pPacketContent,i);  
以上这个函数就将buffer指向具体的内存块pPacketContent,也就是说,以下操作一股脑儿搞定了:
MyBuffer->ByteCount;
    MyBuffer->ByteOffset;
    MyBuffer->MappedSystemVa;
    MyBuffer->MdlFlags;
    MyBuffer->Next;
    MyBuffer->Size;
    MyBuffer->StartVa;

CooSet
驱动牛犊
驱动牛犊
  • 注册日期2012-12-23
  • 最后登录2013-06-06
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望101点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2012-12-25 15:04
回 zhangfresh 的帖子
非常感谢 zhangfresh ,圣诞快乐
游客

返回顶部