阅读:2361回复:16
Passthru的问题,不要以为很简单哦,也许你也不知道!!!
楔子:
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相关部分取消掉了。 |
|
最新喜欢:zackar... |
沙发#
发布于:2003-03-08 22:48
你肯定没有全过程的跟踪,你是把passthru同时帮定到了虚拟网卡和真实网卡上,把真实网卡的那个帮定去掉就好了。自己好好理解一下ddk吧,还有,不是所有的adsl拨号软件都是用的中间层,好像也很少是用的中间层。
|
|
|
板凳#
发布于:2003-03-08 22:51
估计你要问如何取消帮定,简单的就是在网络属性里面去掉就行了,或者你自己去看ddk里面的例子是如何动态帮定的吧
|
|
|
地板#
发布于: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的时候,那个“属性”按钮不可用,还有哪个地方可以修改? |
|
地下室#
发布于:2003-03-09 10:21
不知道你用的是哪个adsl拨号软件,如果那个adsl也是使用中间层实现的,那么就只能让你的中间层在他的中间层上面了。
|
|
|
5楼#
发布于:2003-03-09 11:33
不知道你用的是哪个adsl拨号软件,如果那个adsl也是使用中间层实现的,那么就只能让你的中间层在他的中间层上面了。 ADSL拨号软件是Win PoET v4.0。 问题就在这里,如何让我的中间层在它的中间层的上面??? 因为根据LookAheadBuffer格式,似乎我的中间层是在它的中间层的下面,而不是上面。 |
|
6楼#
发布于:2003-03-10 09:21
winpoet是用中间层做的么?我没有自己研究过,不过应该不是。
|
|
|
7楼#
发布于:2003-03-10 11:54
winpoet是用中间层做的么?我没有自己研究过,不过应该不是。 好吧,现在我们先不讨论Win PoET是否采用了中间层。 只是为什么在我的Passthru里边,HeaderBuffer的后两个字节始终只为0x8864或者0x8863两种值,而不是大家经常见到的0x0800,相应的LookAheadBuffer是以PPPoE帧格式开头,而不是以IP帧开头?????? 奇怪,难道大家都没有碰到过这种情况? |
|
8楼#
发布于:2003-03-10 13:52
你的这个问题是因为winpoet引起来的,你不研究他的实现方式怎么解决问题???你换别的拨号软件现象又不一样了。你还是没有搞明白那些层次关系。
|
|
|
9楼#
发布于:2003-03-10 17:01
楔子: 一般中间层的绑定有个联接问题,会不会是绑定联结先后的问题呢??如果先绑定Passthru,后绑定PPPoE的话,则数据应该是 TCPIP.SYS <=> NDISWAN <=> PPPoE <=> **Passthru** <=> NIC 如果相反的话则是 TCPIP.SYS <=> *Passthru* <=> NDISWAN <=> PPPoE <=> NIC |
|
10楼#
发布于:2003-03-10 17:05
[quote]不知道你用的是哪个adsl拨号软件,如果那个adsl也是使用中间层实现的,那么就只能让你的中间层在他的中间层上面了。 ADSL拨号软件是Win PoET v4.0。 问题就在这里,如何让我的中间层在它的中间层的上面??? 因为根据LookAheadBuffer格式,似乎我的中间层是在它的中间层的下面,而不是上面。 [/quote] 如果是VXD的话,还知道怎么控制,但是WDM的话,你看看WDM的设计原理的书,好象有,我不记得了。。。 |
|
11楼#
发布于:2003-03-10 17:37
一般中间层的绑定有个联接问题,会不会是绑定联结先后的问题呢??如果先绑定Passthru,后绑定PPPoE的话,则数据应该是 就算是这样的原因,我们又如何控制这个连接的顺序呢? 真是烦啊 :( :( :( |
|
12楼#
发布于:2003-03-11 10:35
[quote]一般中间层的绑定有个联接问题,会不会是绑定联结先后的问题呢??如果先绑定Passthru,后绑定PPPoE的话,则数据应该是 就算是这样的原因,我们又如何控制这个连接的顺序呢? 真是烦啊 :( :( :( [/quote] 要控制顺序的话,就要控制驱动程序加载的顺序,这个问题的话,以前在VXD下的我还记得怎么解决,但是这个,我现在就不知道了,你去查下WDM开发的书吧。。。里面应该有的。。。 |
|
13楼#
发布于:2003-04-13 10:25
Win2k DDK中的Passthru目前是不支持NDISWAN的,因为在程序/INF都如此,如果要支持需要改动程序以及INF文件。
是否有人做过PPPOE/PPP的LBFO? |
|
14楼#
发布于:2003-04-17 10:16
关于控制IMD的加载顺序,如果是passthru的话,把FilterClass 设为scheduler,这样就在这一层的最上面了。
如果你的驱动是mux的,那么肯定在passthru的下面 |
|
|
15楼#
发布于:2003-04-17 13:20
学习!
|
|
16楼#
发布于:2003-04-17 19:48
其实解决方法很简单,就是使用XP Passthru就可以了。当然,这样就多出一个Passthru实例,因此实际情况如下:
TCPIP.SYS <=> Passthru实例1 <=> NDISWAN <=> PPPoE <=> Passthru实例2 <=> NIC 。 |
|