yann_nanhai
驱动牛犊
驱动牛犊
  • 注册日期2008-05-28
  • 最后登录2008-10-29
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望22点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1893回复:4

请教:NDIS中间层网络驱动如何取得IP头信息?

楼主#
更多 发布于:2008-07-13 11:16

大家好:

请问在NDIS中间层网络驱动如何取得IP头中 各个域的信息? 谢谢!!
havegone
驱动牛犊
驱动牛犊
  • 注册日期2008-01-17
  • 最后登录2012-03-13
  • 粉丝1
  • 关注1
  • 积分29分
  • 威望229点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-07-14 15:37
在中间层驱动中获得的数据包,如果是以太网数据包的话,那么数据包是一个完整的包括mac地址等信息,只要自己对各部分进行定义,进行类型转换就可以了。尝试做一下就明白了。
yann_nanhai
驱动牛犊
驱动牛犊
  • 注册日期2008-05-28
  • 最后登录2008-10-29
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望22点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-07-17 15:05
谢谢你!
我明白你的意思。
但在细节上
能不能告诉一下这方面哪里有参考资料
谢谢
kkkhmy
驱动牛犊
驱动牛犊
  • 注册日期2008-04-21
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望198点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-07-30 19:43
你应该先了解一下网络数据包的结构才能够更快的了解里面的内容,比如数据包的组成:以太头+IP头+TCP头或者UDP头……等等
推荐看下tcp详解卷1……

你的问题……这样回答应该可以了吧?再详细的资料需要自己去GOOGLE和BAIDU

NDIS获取的数据包含有以太头,你只需要将获得的包数据的首地址赋值给定义好的结构体指针就可以访问相应值了,比如你获得的首地址是0001,那么你可以 PETH ethed=(PETH) 0001; 这样 ethed->eth_dest[0]~[5]就是目标的MAC地址了。当然,对IP头你也可以同样操作,只不过要在0001之前,加上以太头的长度,就是 PIP_HEADER iphed=(PIP_HEADER) 0001+14。那么iphed->iph_src[0]~[3]
就是源IP了,前面的14就是sizeof(ETH)。

需要注意的是IP头的长度是需要计算的……

iplen=(iphed->iph_verlen&0xf)*4;
就是这样……

// 以太头
typedef struct _ETH {
UCHAR eth_dest[6]; // 目标MAC地址
UCHAR eth_src[6]; // 源MAC地址
union {
USHORT eth_type; // Ethernet type field.
USHORT eth_len; // 802.3 length field.
};
} ETH, *PETH;

//IP头
typedef struct IP_HEADER
{
UCHAR iph_verlen; // 版本 (4 bits) + 首部长度 (4 bits)
UCHAR iph_tos; // 8位服务类型(Type of service)
USHORT iph_length; // 16位总长(Total length)
USHORT iph_id; // 16位标识(Identification)
USHORT iph_offset; // 3位标志位(Flags) (3 bits) + 段偏移量(Fragment offset) (13 bits)
UCHAR iph_ttl; // 8位存活时间(Time to live)
UCHAR iph_protocol; // 8位协议(Protocol)
USHORT iph_xsum; // 16位首部校验和(Header checksum)
UCHAR iph_src[4]; // 32位源地址(Source address)
UCHAR iph_dest[4]; // 32位目的地址(Destination address)
} IP_HEADER, *PIP_HEADER;


//UDP头
typedef struct UDP_HEADER{
USHORT sport; // 源端口(Source port)
USHORT dport; // 目的端口(Destination port)
USHORT len; // UDP数据包长度(Datagram length)
USHORT crc; // 校验和(Checksum)
}UDP_HEADER,*PUDP_HEADER;
yann_nanhai
驱动牛犊
驱动牛犊
  • 注册日期2008-05-28
  • 最后登录2008-10-29
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望22点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-08-14 10:17

太感谢你了!
游客

返回顶部