slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
阅读:2361回复:16

Passthru的问题,不要以为很简单哦,也许你也不知道!!!

楼主#
更多 发布于:2003-03-08 21:53
楔子:

1、我看了本论坛上大多数贴子,几乎大家都通过判断HeaderBuffer的后两个字节是否为0x0800来判断这个包是否IP包。
2、我的电脑通过ADSL上网,安装了PoET。通过查资料,得知PoET也采用中间层驱动(PPPoE),PPPoE的上层是NDISWAN。NDISWAN本身也是一个中间层驱动。
  
   而中间层驱动是分层次的,因此我曾经假设在我的电脑上数据流动流程如下:
  
    TCPIP.SYS <=> **Passthru** <=> NDISWAN <=> PPPoE <=> NIC
  
但是今天经过测试,我发现上面的理解是错的。在PtReceive()里边,HeaderBuffer的后两个字节只有0x8864和0x8863两个值。相应的,LookAheadBuffer指向的也不是IP包,而是PPPoE包,即LookAheadBuffer格式如下:

    PPPoE头  + PPP头 + IP头 + IP数据

似乎数据流动流程应该是这样:

    TCPIP.SYS <=> NDISWAN <=> PPPoE <=> **Passthru** <=> NIC


显然通过PPPoE包来确定IP包的位置不是很容易。

我想问的是:

1、NDIS通过什么来确定Passthru的插入位置???

2、到底如何才能让NDIS把Passthru插在NDISWAN的上面和TCPIP.SYS的下面???即如下所示:

    TCPIP.SYS <=> *Passthru* <=> NDISWAN <=> PPPoE <=> NIC
  
这样LookAheadBuffer就直接指向IP包了。

  
另:我采用缺省的INF文件,只是把DLL相关部分取消掉了。  
  

最新喜欢:

zackaryzackar...
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-03-08 22:48
你肯定没有全过程的跟踪,你是把passthru同时帮定到了虚拟网卡和真实网卡上,把真实网卡的那个帮定去掉就好了。自己好好理解一下ddk吧,还有,不是所有的adsl拨号软件都是用的中间层,好像也很少是用的中间层。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-03-08 22:51
估计你要问如何取消帮定,简单的就是在网络属性里面去掉就行了,或者你自己去看ddk里面的例子是如何动态帮定的吧
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-03-09 09:33
1、
你肯定没有全过程的跟踪,你是把passthru同时帮定到了虚拟网卡和真实网卡上,把真实网卡的那个帮定去掉就好了。自己好好理解一下ddk吧,还有,不是所有的adsl拨号软件都是用的中间层,好像也很少是用的中间层。


依你的意思是同时绑定。

好,既然是同时绑定,那PtBindAdapter()始是不是至少应该被调用“两次”呢?

经过跟踪发现,PtBindAdapter()始终“只被调用一次”,那个DeviceName是“\\DEVICE\\{9DB0DCDB-CA46-4227-868D-D7233D2B9B5F}”,
这个值在注册表的位置如下:

HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\0000\\Linkage

Export     : \\Device\\{9DB0DCDB-CA46-4227-868D-D7233D2B9B5F}
RootDevice : {9DB0DCDB-CA46-4227-868D-D7233D2B9B5F}
UpperBind  : Sfilter

DeviceName就是那个Export字符串。

上面那个“0000”的DriverDesc值为“Realtek RTL8139(A) PCI Fast Ethernet Adapter”。

似乎真的是绑定到真实网卡了,老大意见如何?

==================

估计你要问如何取消帮定,简单的就是在网络属性里面去掉就行了,或者你自己去看ddk里面的例子是如何动态帮定的吧

=========

哪个网络属性?我单击Sample Filter的时候,那个“属性”按钮不可用,还有哪个地方可以修改?



mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-03-09 10:21
不知道你用的是哪个adsl拨号软件,如果那个adsl也是使用中间层实现的,那么就只能让你的中间层在他的中间层上面了。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-03-09 11:33
不知道你用的是哪个adsl拨号软件,如果那个adsl也是使用中间层实现的,那么就只能让你的中间层在他的中间层上面了。


ADSL拨号软件是Win PoET v4.0。

问题就在这里,如何让我的中间层在它的中间层的上面???

因为根据LookAheadBuffer格式,似乎我的中间层是在它的中间层的下面,而不是上面。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-03-10 09:21
winpoet是用中间层做的么?我没有自己研究过,不过应该不是。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-03-10 11:54
winpoet是用中间层做的么?我没有自己研究过,不过应该不是。


好吧,现在我们先不讨论Win PoET是否采用了中间层。

只是为什么在我的Passthru里边,HeaderBuffer的后两个字节始终只为0x8864或者0x8863两种值,而不是大家经常见到的0x0800,相应的LookAheadBuffer是以PPPoE帧格式开头,而不是以IP帧开头??????

奇怪,难道大家都没有碰到过这种情况?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-03-10 13:52
你的这个问题是因为winpoet引起来的,你不研究他的实现方式怎么解决问题???你换别的拨号软件现象又不一样了。你还是没有搞明白那些层次关系。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-03-10 17:01
楔子:

1、我看了本论坛上大多数贴子,几乎大家都通过判断HeaderBuffer的后两个字节是否为0x0800来判断这个包是否IP包。
2、我的电脑通过ADSL上网,安装了PoET。通过查资料,得知PoET也采用中间层驱动(PPPoE),PPPoE的上层是NDISWAN。NDISWAN本身也是一个中间层驱动。
  
   而中间层驱动是分层次的,因此我曾经假设在我的电脑上数据流动流程如下:
  
    TCPIP.SYS <=> **Passthru** <=> NDISWAN <=> PPPoE <=> NIC
  
但是今天经过测试,我发现上面的理解是错的。在PtReceive()里边,HeaderBuffer的后两个字节只有0x8864和0x8863两个值。相应的,LookAheadBuffer指向的也不是IP包,而是PPPoE包,即LookAheadBuffer格式如下:

    PPPoE头  + PPP头 + IP头 + IP数据

似乎数据流动流程应该是这样:

    TCPIP.SYS <=> NDISWAN <=> PPPoE <=> **Passthru** <=> NIC


显然通过PPPoE包来确定IP包的位置不是很容易。

我想问的是:

1、NDIS通过什么来确定Passthru的插入位置???

2、到底如何才能让NDIS把Passthru插在NDISWAN的上面和TCPIP.SYS的下面???即如下所示:

    TCPIP.SYS <=> *Passthru* <=> NDISWAN <=> PPPoE <=> NIC
  
这样LookAheadBuffer就直接指向IP包了。

  
另:我采用缺省的INF文件,只是把DLL相关部分取消掉了。  
  
 


一般中间层的绑定有个联接问题,会不会是绑定联结先后的问题呢??如果先绑定Passthru,后绑定PPPoE的话,则数据应该是
TCPIP.SYS <=> NDISWAN <=> PPPoE <=> **Passthru** <=> NIC
如果相反的话则是
TCPIP.SYS <=> *Passthru* <=> NDISWAN <=> PPPoE <=> NIC

cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-03-10 17:05
[quote]不知道你用的是哪个adsl拨号软件,如果那个adsl也是使用中间层实现的,那么就只能让你的中间层在他的中间层上面了。


ADSL拨号软件是Win PoET v4.0。

问题就在这里,如何让我的中间层在它的中间层的上面???

因为根据LookAheadBuffer格式,似乎我的中间层是在它的中间层的下面,而不是上面。 [/quote]

如果是VXD的话,还知道怎么控制,但是WDM的话,你看看WDM的设计原理的书,好象有,我不记得了。。。
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-03-10 17:37
一般中间层的绑定有个联接问题,会不会是绑定联结先后的问题呢??如果先绑定Passthru,后绑定PPPoE的话,则数据应该是
TCPIP.SYS <=> NDISWAN <=> PPPoE <=> **Passthru** <=> NIC
如果相反的话则是
TCPIP.SYS <=> *Passthru* <=> NDISWAN <=> PPPoE <=> NIC

 


就算是这样的原因,我们又如何控制这个连接的顺序呢?

真是烦啊 :( :( :(
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-03-11 10:35
[quote]一般中间层的绑定有个联接问题,会不会是绑定联结先后的问题呢??如果先绑定Passthru,后绑定PPPoE的话,则数据应该是
TCPIP.SYS <=> NDISWAN <=> PPPoE <=> **Passthru** <=> NIC
如果相反的话则是
TCPIP.SYS <=> *Passthru* <=> NDISWAN <=> PPPoE <=> NIC

 


就算是这样的原因,我们又如何控制这个连接的顺序呢?

真是烦啊 :( :( :( [/quote]

要控制顺序的话,就要控制驱动程序加载的顺序,这个问题的话,以前在VXD下的我还记得怎么解决,但是这个,我现在就不知道了,你去查下WDM开发的书吧。。。里面应该有的。。。
conglin
驱动牛犊
驱动牛犊
  • 注册日期2001-12-12
  • 最后登录2003-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-04-13 10:25
Win2k DDK中的Passthru目前是不支持NDISWAN的,因为在程序/INF都如此,如果要支持需要改动程序以及INF文件。

是否有人做过PPPOE/PPP的LBFO?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-04-17 10:16
关于控制IMD的加载顺序,如果是passthru的话,把FilterClass 设为scheduler,这样就在这一层的最上面了。


如果你的驱动是mux的,那么肯定在passthru的下面
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
flyearly
驱动牛犊
驱动牛犊
  • 注册日期2003-01-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-04-17 13:20
学习!
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-04-17 19:48
其实解决方法很简单,就是使用XP Passthru就可以了。当然,这样就多出一个Passthru实例,因此实际情况如下:

TCPIP.SYS <=> Passthru实例1 <=> NDISWAN <=> PPPoE <=> Passthru实例2 <=> NIC

游客

返回顶部