lskxl
驱动牛犊
驱动牛犊
  • 注册日期2003-05-05
  • 最后登录2009-05-26
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望101点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2192回复:8

中间层驱动程序的概念问题(20分)

楼主#
更多 发布于:2004-04-09 14:22
中间层驱动程序的微端口部分(上边界)必须是非串行的

是不是说MPSend应该处于小于DISPATCH_LEVEL级别
但是我在MPSend中KeGetCurrentIrql 查看
发现MPSend时而处于PASSIVE时而又处于DISPATCH
不知道怎么回事

难道是NDIS调用MPSend的时候,调用者的IRQL的不同吗?????

还有一个问题:
中间层驱动程序的一个示例是LAN仿真中间层驱动程序
按照这个意思,如果在Modem拨号网络中,中间驱动程序应该把Modem传上来的数据转换成LAN格式的数据
但是在中间层接收到的数据就已经是LAN格式的了
难道是Modem做了转换???
或者是NDISWAN做了转换???
请教一下NDISWAN是个什么冬冬,位于NDIS的什么地方
如果是NDISWAN做了转化,难道它是个中间层??
start
驱动小牛
驱动小牛
  • 注册日期2001-11-05
  • 最后登录2010-09-03
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望27点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-09 15:43
ndiswan就是一个中间层驱动的例子,他把上层IP数据转化为ppp的数据报发送。你的理解很对
second
lskxl
驱动牛犊
驱动牛犊
  • 注册日期2003-05-05
  • 最后登录2009-05-26
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望101点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-09 19:04
你的意思是说
NDISWAN是个中间层
我的passthru在NDISWAN的上面了

我怎么才能把自己安装在它的下面呢
或者说能不能把NDISWAN给泄掉
我自己想截获PPP的包
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-09 20:07
你的意思是说
NDISWAN是个中间层
我的passthru在NDISWAN的上面了

我怎么才能把自己安装在它的下面呢
或者说能不能把NDISWAN给泄掉
我自己想截获PPP的包


NDISWAN的任务就是把IP包转换成PPP包。要是把它卸掉,根本就没有PPP包了,你如何截获?

把中间层安装在NDISWAN下面倒是可以的,安装时在.INF中指定UpperBind(?可能记错了,反正就是Upper、Lower相关的那些设置。),有不少PPPoE中间层驱动都是采用这种方式安装的。
lskxl
驱动牛犊
驱动牛犊
  • 注册日期2003-05-05
  • 最后登录2009-05-26
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望101点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-09 21:17
我胡涂了
Modem直接上来的数据格式不是PPP的吗????

数据上传的时候NDISWAN不是将PPP转换成LAN格式的吗

我主要是想自己写一个类似NDISWAN的东西
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-09 23:56
我胡涂了
Modem直接上来的数据格式不是PPP的吗????

数据上传的时候NDISWAN不是将PPP转换成LAN格式的吗

我主要是想自己写一个类似NDISWAN的东西


你说得没错,你的意思就是想在发送时自己把IP包封装成PPP包,然后接收时再自己把PPP包转换成IP包。不过我觉得可行性不大,NDISWAN已经和TCPIP.SYS、NDISTAPI.SYS等这些部件紧密结合在一起了,单独卸掉它,是不是有点困难?另外我看不出你这样做有什么意义?以前就有人说过要自己写一个替代TCPIP.SYS的驱动,结果不了了之。现在大家做的中间层驱动要么在NDISWAN的上面,要么在NDISWAN的下面,很少有替换掉NDISWAN的。
lskxl
驱动牛犊
驱动牛犊
  • 注册日期2003-05-05
  • 最后登录2009-05-26
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望101点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-10 00:34
谢谢slwqw
分已经送上

不过第一个问题还没解决:

中间层驱动程序的微端口部分(上边界)必须是非串行的

是不是说MPSend应该处于小于DISPATCH_LEVEL级别
但是我在MPSend中KeGetCurrentIrql 查看
发现MPSend时而处于PASSIVE时而又处于DISPATCH
不知道怎么回事

难道是NDIS调用MPSend的时候,调用者的IRQL的不同吗?????
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-10 09:20
谢谢slwqw
分已经送上

不过第一个问题还没解决:

中间层驱动程序的微端口部分(上边界)必须是非串行的

是不是说MPSend应该处于小于DISPATCH_LEVEL级别
但是我在MPSend中KeGetCurrentIrql 查看
发现MPSend时而处于PASSIVE时而又处于DISPATCH
不知道怎么回事

难道是NDIS调用MPSend的时候,调用者的IRQL的不同吗?????


看看DDK对MPSend()运行级别的说明:By default, MiniportSend runs at IRQL DISPATCH_LEVEL. 没有理由要NDIS调用MPSend的时候,调用者的IRQL都必须相同。

关于非串行,我觉得DDK说得很明确了:If the caller sets NDIS_ATTRIBUTE_DESERIALIZE in AttributeFlags, NDIS does not queue pending sends for the miniport. Instead, such a deserialized driver must manage its own queueing of subsequent send requests internally whenever it has insufficient resources to transmit an incoming send immediately.

非串行跟MPSend()运行的IRQL好像没有关系吧?
lskxl
驱动牛犊
驱动牛犊
  • 注册日期2003-05-05
  • 最后登录2009-05-26
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望101点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-04-10 10:18
串行和IRQL级别没有关系啊????

我一直以为
串行嘛就是一个一个处理,要处于在DISPATCH
非串行嘛就是可以重入嘛就应该处于比DISPATCH低的级别
游客

返回顶部