kok5168
驱动牛犊
驱动牛犊
  • 注册日期2010-03-07
  • 最后登录2010-06-06
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望211点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1812回复:3

在线等高手解答啊~ 关于MPSendPackets里获取目标ip问题~

楼主#
更多 发布于:2010-04-10 13:38
MPSendPackets(
IN NDIS_HANDLEMiniportAdapterContext,
IN PPNDIS_PACKET PacketArray,
IN UINT NumberOfPackets
)

struct ip IPHeader;
ULONGNumberOfBytesRead;
USHORT IPHeaderLen;
USHORT IpCkSum,IpCkSum1;
//略
FltReadOnPacket(
Packet,
&IPHeader,
sizeof( IPHeader ),
sizeof( struct ether_header ),
&NumberOfBytesRead
);//读取IP包头
DbgPrint("IP包头长度=%d",IPHeader.ip_hl);
DbgPrint("版本=%d",IPHeader.ip_v);
DbgPrint("IP包长度=%d",IPHeader.ip_len);
DbgPrint("生存时间=%d",IPHeader.ip_ttl);
DbgPrint("协议=%d",IPHeader.ip_p);
DbgPrint("头部校验和=%d",IPHeader.ip_sum);
DbgPrint("源IP地址=%d",IPHeader.ip_src);
DbgPrint("目的IP地址=%d",IPHeader.ip_dst);
IpCkSum=IPHeader.ip_sum;//先暂存一下校验和
IPHeaderLen=(IPHeader.ip_hl)*4;
IPHeader.ip_sum = 0; // Clear old IP checksum value.
IpCkSum1=GetIPChecksum((PUSHORT)(&IPHeader), IPHeaderLen);
DbgPrint("头部校验和=%d",IPHeader.ip_sum);//这时=0
DbgPrint("头部校验和=%d",IpCkSum);
IPHeader.ip_sum = IpCkSum1; //我用DbgPrint看到 IpCkSum1和IpCkSum是相等的,但如果用IpCkSum就可以,用 IpCkSum1就不行,奇怪不?
DbgPrint("头部校验和1=%d",IpCkSum1);
DbgPrint("重新计算后头部校验和=%d",IPHeader.ip_sum);
FltWriteOnPacket(
Packet,
&IPHeader,
sizeof( IPHeader ),
sizeof( struct ether_header ),
&NumberOfBytesRead
);//写回原来的数据包中
DbgPrint("写入字节数=%d",NumberOfBytesRead);
//略

USHORT
GetIPChecksum(PUSHORT pIPH, USHORT usIPHdr)
{
ULONG cksum = 0;

while (usIPHdr > 1)
{
cksum += *pIPH++;
usIPHdr -= sizeof(USHORT);
}

cksum = (((cksum >> 16) | (cksum << 16)) + cksum) >> 16;

return (USHORT)~cksum;
}

这个代码里头的struct ip IPHeader;  结构怎么定义呀??
kok5168
驱动牛犊
驱动牛犊
  • 注册日期2010-03-07
  • 最后登录2010-06-06
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望211点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-04-10 13:49
我想MPSendPackets里面 打印出 目标ip地址啊。  哪位高手贴出代码,小生感激不尽!
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
板凳#
发布于:2010-04-12 10:13
ip头结构都不知道,怎么做这个东东?

找本介绍tcp/ip的书,都有ip头结构,最简单就是找rfc里面有详细的ip头结构
走走看看开源好 Solaris vs Linux
yexin218
驱动牛犊
驱动牛犊
  • 注册日期2008-02-22
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分72分
  • 威望384点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-04-12 22:00
typedef struct _TESTPROV_IP4_HEADER
{
    UCHAR       VersionHdrLen;
    UCHAR       TOS;
    UCHAR       TotalLength[2];
    UCHAR       Identifier[2];
    UCHAR       FlagsFragmentOffset[2];
    UCHAR       TTL;
    UCHAR       Protocol;
    UCHAR       HeaderChecksum[2];
    UCHAR       SourceIP[4];
    UCHAR       DestinationIP[4];

} TESTPROV_IP4_HEADER, *PTESTPROV_IP4_HEADER;
游客

返回顶部