阅读:1383回复:4
关于接受数据的问题(50分)
在协议驱动程序中,网卡接收到数据后,进入
PacketReceiveIndicate ( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookaheadBufferSize, IN UINT PacketSize )函数。请问,在这里怎样得到接收到的数据包的内容? |
|
|
沙发#
发布于:2004-07-15 08:19
在ProtocolReceive()例程中可使用NdisGetReceivedPacket得到数据包:
PNDIS_PACKET MyPacket; //pAdapt->BindingHandle 指向DeviceName所代表的下层设备的句柄(这里一般是一个中间层以下的其他层,比如网卡或微端口) //NdisGetReceivedPacket(低层被绑定的NIC,NDIS系统给ProtocolReceive()的一个入口参数) //它返回低层收到的一个数据包的描述符指针 MyPacket = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext); 在ProtocolReceivePacket()例程中得到数据包: PNDIS_PACKET MyPacket; //从接收缓冲池分配并初始化一个收包空间,用包描述符MyPacket保存 NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle ); if (Status == NDIS_STATUS_SUCCESS) { Resvd = (PRSVD)(MyPacket->MiniportReserved); Resvd->OriginalPkt = Packet; MyPacket->Private.Head = Packet->Private.Head; MyPacket->Private.Tail = Packet->Private.Tail; // // Get the original packet(it could be the same packet as one received or a different one // based on # of layered MPs) and set it on the indicated packet so the OOB stuff is visible // correctly at the top. // NDIS_SET_ORIGINAL_PACKET(MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet)); // // Set Packet Flags // NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet); Status = NDIS_GET_PACKET_STATUS(Packet); NDIS_SET_PACKET_STATUS(MyPacket, Status); NDIS_SET_PACKET_HEADER_SIZE(MyPacket, NDIS_GET_PACKET_HEADER_SIZE(Packet)); //向上提交数据包 NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); if (Status == NDIS_STATUS_RESOURCES) //如果提交成功,则可以释放Mypacket { NdisDprFreePacket(MyPacket); } //如果上面的if语句释放包没有成功,则会返回1,这样在包处理完后会激发调用MiniProtReturnPacket()例程 //MiniProtReturnPacket()中,会调用系统函数NdisReturnPackets(),去释放包描述符Mypacket的内存。 return((Status != NDIS_STATUS_RESOURCES) ? 1 : 0); [编辑 - 7/15/04 by ririri] |
|
板凳#
发布于:2004-07-26 11:53
再请问,怎么分析数据包,能不能举个简单的例子,在此谢过.
|
|
|
地板#
发布于:2004-07-26 12:15
如果包是齐全的就是LookAheadBuffer这个缓冲区里面的了
如果不全,得找其他函数把函数取完 NdisTransferData先 |
|
|
地下室#
发布于:2004-07-26 15:39
在PacketReceive里用Packet=NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext)得到的Packet为NULL,
这种情况下怎么获得包的内容?谢谢. |
|
|