阅读:1921回复:4
弱弱的问题,请大牛指点
对于大牛来说很简单的一个问题,看过以前有朋友发过的帖子关于接收包,转发包,最近我也遇到这样的问题,请大牛指教
我现在引用以前驱动网里面的代码,现在我把接收到的包过滤,只处理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了 |
|
沙发#
发布于: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的时候指定的。 |
|
板凳#
发布于: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; |
|
地板#
发布于: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; |
|
地下室#
发布于:2012-12-25 15:04
回 zhangfresh 的帖子
非常感谢 zhangfresh ,圣诞快乐 |
|