aldsd
驱动牛犊
驱动牛犊
  • 注册日期2004-02-26
  • 最后登录2005-05-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1383回复:4

关于接受数据的问题(50分)

楼主#
更多 发布于:2004-07-14 15:03
在协议驱动程序中,网卡接收到数据后,进入
PacketReceiveIndicate (
    IN NDIS_HANDLE ProtocolBindingContext,
    IN NDIS_HANDLE MacReceiveContext,
    IN PVOID       HeaderBuffer,
    IN UINT        HeaderBufferSize,
    IN PVOID       LookAheadBuffer,
    IN UINT        LookaheadBufferSize,
    IN UINT        PacketSize
)函数。请问,在这里怎样得到接收到的数据包的内容?
aldsd
ririri
驱动牛犊
驱动牛犊
  • 注册日期2004-06-02
  • 最后登录2005-07-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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]
ygmlq
驱动牛犊
驱动牛犊
  • 注册日期2002-05-27
  • 最后登录2014-11-07
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望23点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-26 11:53
再请问,怎么分析数据包,能不能举个简单的例子,在此谢过.
生死有命,富贵由天
IoriKingdom
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望23点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-07-26 12:15
如果包是齐全的就是LookAheadBuffer这个缓冲区里面的了
如果不全,得找其他函数把函数取完
NdisTransferData先
天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。
ygmlq
驱动牛犊
驱动牛犊
  • 注册日期2002-05-27
  • 最后登录2014-11-07
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望23点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-07-26 15:39
在PacketReceive里用Packet=NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext)得到的Packet为NULL,
这种情况下怎么获得包的内容?谢谢.
生死有命,富贵由天
游客

返回顶部