阅读:2773回复:5
NDIS PtReceivePacket如何数据包进行处理
由于PtReceivePacket()接收的不是完整的包,如果我要对包进行处理,比如说改包的目的ip的话,改如何进行呢?谢谢大牛!
|
|
沙发#
发布于:2009-12-28 13:55
up下
|
|
板凳#
发布于:2009-12-28 13:56
Re: PtReceivePacket()和PtReceive()分别在什么情况下调用呢?
|
|
地板#
发布于:2010-01-09 00:27
PtReceivePacket()应该是默认调用的函数,而PtReceive()是在NIC资源不足调用ndisMxxxindicate()向上指示数据时才调用,处于兼容性考虑微软保留对这个函数的支持。PtReceive()有个参数是前视缓冲区,里面是接收到的数据,有可能是完整的数据也有可能是部分数据,调用 NdisGetReceivedPacket()函数如果成功证明前视缓冲里是完整的数据包,直接拷过来操作就行了,如果不是完整的数据包上层协议驱动会调用NdisTransferData()获取剩下的数据。如果在这两个函数里获取的是以太网数据,那么这个包的内容就是个完整的数据帧,前14字节是源MAC、目的MAC和两字节的协议类型,如果是IP协议就是0 8,紧接着是20字节(有可能更长,根据IP头里的长度参数计算)的IP头,可以修改IP地址,记住修改完之后重新计算一下校验和,如果是TCP包而且要修改数据包内容的话还要对数据重新计算校验和,要不然协议驱动会给你丢掉的。不过你都接收到数据了还改目的IP干什么?
|
|
地下室#
发布于:2010-02-06 18:56
对每个包内部指针,使用MmIsAddressValid都可以发现是无效指针.这种情况大量存在,不应该是正常情况.
|
|
5楼#
发布于:2010-02-06 19:46
|
|
|