edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2336回复:21

胡大侠请进,一直以来有个疑问想要搞清楚!

楼主#
更多 发布于:2002-11-29 15:20
我有一点点 9x 下的 NDIS Hook 经验,正在看修正版的那个 XP Passthru。

OOB 数据、Media specific 信息、per packet info 这些东西的作用到底是什么啊,9x 里面没有见过,能简单的解释一下吗?

如果我要自己构造一个包用于发送的话这些东西怎么处理?谢谢!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-29 15:40
如果这个包是你自己凭空造出来的,就不用管这些数据,如果是你从别人那里copy出来的,就要管了
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-29 15:56
就是,我也一直在想这个问题。好象没有用似的。
高手指教!
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-29 15:57
那么原因呢?

 
如果这个包是你自己凭空造出来的,就不用管这些数据,如果是你从别人那里copy出来的,就要管了


为什么是这样?

还有这些东西的作用和意义又是什么呢?

呵呵,我喜欢把不明白的东西彻底搞清楚!
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-29 17:39
那么原因呢?

 [quote] 如果这个包是你自己凭空造出来的,就不用管这些数据,如果是你从别人那里copy出来的,就要管了


为什么是这样?

还有这些东西的作用和意义又是什么呢?

呵呵,我喜欢把不明白的东西彻底搞清楚! [/quote]

这下又有福气了。。。

 :D :D :D
[color=red]大头鬼! :P[/color]
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-29 17:49
OOB数据是2k下增加的,存储的是packet的辅助信息,看看DDK的定义:
typedef struct _NDIS_PACKET_OOB_DATA
{
union
{
ULONGLONG TimeToSend;
ULONGLONG TimeSent;
};
ULONGLONG TimeReceived;
UINT HeaderSize;
UINT SizeMediaSpecificInfo;
PVOID MediaSpecificInformation;

NDIS_STATUS Status;
} NDIS_PACKET_OOB_DATA, *PNDIS_PACKET_OOB_DATA;

有几个宏是来操作这个东西的,还有那个什么perpacket的函数也是干这个的,另外好像记得那个ndisgetreceivepacket主要也是取道的这些东西,机器坏过以后什么都没了,郁闷吖
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-29 18:16
呵呵,这些俺也知道啊,我想知道的是这些东西的作用和意义,说白了就是他们的用处,为什么要用这些东西,用了之后起到了什么作用?
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2002-11-29 18:22
我有一点点 9x 下的 NDIS Hook 经验,正在看修正版的那个 XP Passthru。

OOB 数据、Media specific 信息、per packet info 这些东西的作用到底是什么啊,9x 里面没有见过,能简单的解释一下吗?

如果我要自己构造一个包用于发送的话这些东西怎么处理?谢谢!


你自己从0开始构造包,不需要管oob data。

不再回忆从前,我已经生活在幸福当中。
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-29 18:47
呵呵,胡哥终于等到你了,那你能简单的说一下这些数据的作用吗?
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2002-11-30 16:34
呵呵,胡哥终于等到你了,那你能简单的说一下这些数据的作用吗?


这些东西主要的作用是为了实现qos,task_offload等等功能。
而且这些东西保留了对一个数据包的扩展功能。有了这个之后,
ndis可以很容易的兼容性的升级。

ndis4到ndis5的一个非常大的改变就是这个,98虽然支持ndis5,
不过是ndis5--,缺乏的就是这些东西。

大家可以注意到w2k下的imd的protocolreceive函数中会
调用getreceivepacket,而这个函数是win98/se/me不支持
的。为什么会这样,原因就是9x不支持oob data。大家注意
到protocolreceive和protocolreceivepacket不同,上传
的不是一个完整的ndis_packet,而是一个数据指针和数据长度,
那么为什么imd首先要调用getreceivepacket去获得对应的
ndis_packet?因为仅仅是数据指针和数据长度不足以表达
所有信息(只能表达数据包信息,但是无法表达qos和taskoffload
信息)。

至于为什么ndis会提供两种接收函数,一方面是历史遗留问题,
ndis3主要用protocolreceive而不是protocolreceivepacket,
这主要是因为当时主要是慢速网络设备,而且内存比较紧张。
但是后来这些都变化了,所以protocolreceviepacket成为了
首选。还有一方面是ndis_packet数据结构后来扩展了,和ndis3
不一样了,这里面涉及到非常多的东西。我也只是从以前的开发
经验中胡乱摸索的。

不再回忆从前,我已经生活在幸福当中。
moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-30 20:16
我谈一点儿对protocolreceviepacket和protocolrecevie函数的理解。
可能会有一些错误的地方。
这两个函数似乎对应着两种不同性能的网卡:前一个函数对应的是高性能同时也是高价位的网卡,(假如你们公司的服务器上用的网卡不支持这个函数我想你还是最好换一块。)后一个函数对应的是一种低性能同时也应该是低价位的网卡(这类网卡不能支持包队列)
  oob数据应该是走protocolrecevie的路径,因为这样设计oob可以不用排队。
按第一贴的“给分”键,给分。
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
11楼#
发布于:2002-11-30 20:31
我谈一点儿对protocolreceviepacket和protocolrecevie函数的理解。
可能会有一些错误的地方。
这两个函数似乎对应着两种不同性能的网卡:前一个函数对应的是高性能同时也是高价位的网卡,(假如你们公司的服务器上用的网卡不支持这个函数我想你还是最好换一块。)后一个函数对应的是一种低性能同时也应该是低价位的网卡(这类网卡不能支持包队列)
  oob数据应该是走protocolrecevie的路径,因为这样设计oob可以不用排队。



不完全,

1、使用哪一个函数只是NDIS的选择,而且也取决于网卡驱动程序的
选择。
2、所有的网卡驱动都必须实现ProtocolReceive
3、所有的网卡驱动都可以实现ProtocolReceivePacket
4、只要网卡驱动实现了ProtocolReveivePacket并且indicatepacket
的时候指示了全部数据并且Status !=NDIS_RESOURCE,那么
ndis都会调用ProtocolReceivePacket。(或者网卡的filter
被sniffer设置为了promisc)
5、即使网卡并不真正支持oob,但是也可以在驱动种支持。
6、即使网卡以及驱动真正支持某些oob,也可以在imd种告诉协议
不支持
7、不支持oob的驱动也可以indicate一个ndis_packet而不是只是
一段buffer
8、我见过的最老的ne2000兼容的网卡都有32个环形包队列
9、可能某些古老的moden会的确由于速度考虑,这么变态
10、不排除某些驱动作者的确变态------我的笔记本reltek
的网卡就是这种网卡,lookaheadlen!=packetsize。

说了半天,好像都说的是废话,总之,你什么都无法控制,
什么都必须考虑,否则就可能发生不可预知的事情。
不再回忆从前,我已经生活在幸福当中。
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-12-02 18:10
谢谢诸位高人!
timesanzi
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2011-07-11
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-12-04 17:12
唉,看一点网络基础知识书吧!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-12-04 17:18
唉,看一点网络基础知识书吧!


这个oob和TCP的带外数据是不一样的
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-12-04 17:27
同意 mikeluo!我想这个应该跟操作系统的网络栈实现有关系,跟网基关系不大。
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-12-04 17:29
[quote]我谈一点儿对protocolreceviepacket和protocolrecevie函数的理解。
可能会有一些错误的地方。
这两个函数似乎对应着两种不同性能的网卡:前一个函数对应的是高性能同时也是高价位的网卡,(假如你们公司的服务器上用的网卡不支持这个函数我想你还是最好换一块。)后一个函数对应的是一种低性能同时也应该是低价位的网卡(这类网卡不能支持包队列)
  oob数据应该是走protocolrecevie的路径,因为这样设计oob可以不用排队。



不完全,

1、使用哪一个函数只是NDIS的选择,而且也取决于网卡驱动程序的
选择。
2、所有的网卡驱动都必须实现ProtocolReceive
3、所有的网卡驱动都可以实现ProtocolReceivePacket
4、只要网卡驱动实现了ProtocolReveivePacket并且indicatepacket
的时候指示了全部数据并且Status !=NDIS_RESOURCE,那么
ndis都会调用ProtocolReceivePacket。(或者网卡的filter
被sniffer设置为了promisc)
5、即使网卡并不真正支持oob,但是也可以在驱动种支持。
6、即使网卡以及驱动真正支持某些oob,也可以在imd种告诉协议
不支持
7、不支持oob的驱动也可以indicate一个ndis_packet而不是只是
一段buffer
8、我见过的最老的ne2000兼容的网卡都有32个环形包队列
9、可能某些古老的moden会的确由于速度考虑,这么变态
10、不排除某些驱动作者的确变态------我的笔记本reltek
的网卡就是这种网卡,lookaheadlen!=packetsize。

说了半天,好像都说的是废话,总之,你什么都无法控制,
什么都必须考虑,否则就可能发生不可预知的事情。 [/quote]
好像胡大侠说的也不完全对吧,ProtocolReceive函数和ProtocolReceivePacket函数是Protocol应该实现的,对于一个网卡的Miniport来说它使用NdisInidicateReceive还是使用NdisInidicateReceivePacket函数都可以,不一定要都实现,但Protocol则需要两个接口都实现。还有老外做的一些比较特殊的网卡很多都是lookaheadlen!=packetsize,比如一些DVB_S卫星卡。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-12-04 17:39
不实现protocolreceviepacket是没有问题的,
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
timesanzi
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2011-07-11
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-12-05 11:50
不实现protocolreceviepacket是没有问题的,

嘿,才一会你就成了资深会员了,恭喜!恭喜!恭喜!散分吧!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-12-05 12:00
不好意思啊:)
不知道为什么我的一个帖子现在只能最多给20分,:(
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
上一页
游客

返回顶部