阅读:2192回复:8
中间层驱动程序的概念问题(20分)
中间层驱动程序的微端口部分(上边界)必须是非串行的
是不是说MPSend应该处于小于DISPATCH_LEVEL级别 但是我在MPSend中KeGetCurrentIrql 查看 发现MPSend时而处于PASSIVE时而又处于DISPATCH 不知道怎么回事 难道是NDIS调用MPSend的时候,调用者的IRQL的不同吗????? 还有一个问题: 中间层驱动程序的一个示例是LAN仿真中间层驱动程序 按照这个意思,如果在Modem拨号网络中,中间驱动程序应该把Modem传上来的数据转换成LAN格式的数据 但是在中间层接收到的数据就已经是LAN格式的了 难道是Modem做了转换??? 或者是NDISWAN做了转换??? 请教一下NDISWAN是个什么冬冬,位于NDIS的什么地方 如果是NDISWAN做了转化,难道它是个中间层?? |
|
沙发#
发布于:2004-04-09 15:43
ndiswan就是一个中间层驱动的例子,他把上层IP数据转化为ppp的数据报发送。你的理解很对
|
|
|
板凳#
发布于:2004-04-09 19:04
你的意思是说
NDISWAN是个中间层 我的passthru在NDISWAN的上面了 我怎么才能把自己安装在它的下面呢 或者说能不能把NDISWAN给泄掉 我自己想截获PPP的包 |
|
地板#
发布于:2004-04-09 20:07
你的意思是说 NDISWAN的任务就是把IP包转换成PPP包。要是把它卸掉,根本就没有PPP包了,你如何截获? 把中间层安装在NDISWAN下面倒是可以的,安装时在.INF中指定UpperBind(?可能记错了,反正就是Upper、Lower相关的那些设置。),有不少PPPoE中间层驱动都是采用这种方式安装的。 |
|
地下室#
发布于:2004-04-09 21:17
我胡涂了
Modem直接上来的数据格式不是PPP的吗???? 数据上传的时候NDISWAN不是将PPP转换成LAN格式的吗 我主要是想自己写一个类似NDISWAN的东西 |
|
5楼#
发布于:2004-04-09 23:56
我胡涂了 你说得没错,你的意思就是想在发送时自己把IP包封装成PPP包,然后接收时再自己把PPP包转换成IP包。不过我觉得可行性不大,NDISWAN已经和TCPIP.SYS、NDISTAPI.SYS等这些部件紧密结合在一起了,单独卸掉它,是不是有点困难?另外我看不出你这样做有什么意义?以前就有人说过要自己写一个替代TCPIP.SYS的驱动,结果不了了之。现在大家做的中间层驱动要么在NDISWAN的上面,要么在NDISWAN的下面,很少有替换掉NDISWAN的。 |
|
6楼#
发布于:2004-04-10 00:34
谢谢slwqw
分已经送上 不过第一个问题还没解决: 中间层驱动程序的微端口部分(上边界)必须是非串行的 是不是说MPSend应该处于小于DISPATCH_LEVEL级别 但是我在MPSend中KeGetCurrentIrql 查看 发现MPSend时而处于PASSIVE时而又处于DISPATCH 不知道怎么回事 难道是NDIS调用MPSend的时候,调用者的IRQL的不同吗????? |
|
7楼#
发布于:2004-04-10 09:20
谢谢slwqw 看看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好像没有关系吧? |
|
8楼#
发布于:2004-04-10 10:18
串行和IRQL级别没有关系啊????
我一直以为 串行嘛就是一个一个处理,要处于在DISPATCH 非串行嘛就是可以重入嘛就应该处于比DISPATCH低的级别 |
|