cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
阅读:3941回复:41

(急)采用ndis hook技术,Win2k和xp下结果不同,why?

楼主#
更多 发布于:2005-06-01 20:31
采用ndis hook技术(同费尔),Win2k能够通信,但是在xp下ping不通,为什么?
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-06-09 23:25
问题是:为什么每个协议会有NDIS_OPEN_BLOCK结构连表呢?按道理应该是该协议只拥有一个NDIS_OPEN_BLOCK结构即可,但是ProtocolNextOpen明显是连表,到底是什么含义呢?

回复:一个协议可以绑定到多块网卡上,当然需要一个链表来保存NDIS_OPEN_BLOCK了!
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
板凳#
发布于:2005-06-09 15:10
[quote]_NDIS_OPEN_BLOCK应该是每个网卡对应一个吧?

每个网卡都要调用NdisOpenAdapter函数,这样就会为每个网卡创建一个_NDIS_OPEN_BLOCK,理解没有错误吧?

我得机器有两个网卡,数据连续调用发送函数两次?为什么会这样?

[编辑 -  6/9/05 by  cyliu]

_NDIS_OPEN_BLOCK应该是NtOpenAdapter就会生成一个,如果两个协议,分别绑定到一块网卡,就应该是两个 [/quote]

我的理解是这样的:
首先,系统调用NdisRegisterProtocol函数,注册每个协议,形成一个协议表.

然后,只要存在一个网卡,就会调用一次NdisOpenAdapter函数,两个网卡就会调用两次,依次类推.其中参数NdisProtocolHandle应该是协议链句柄,NdisBindingHandle将会返回NIC的NDIS_OPEN_BLOCK1.

问题是:为什么每个协议_NDIS_PROTOCOL_BLOCK
会有NDIS_OPEN_BLOCK结构连表呢?按道理应该是一个协议_NDIS_PROTOCOL_BLOCK 只拥有一个NDIS_OPEN_BLOCK结构即可,但是ProtocolNextOpen明显是连表,到底是什么含义呢?

我在多网卡环境中替换了所有的NDIS_OPEN_BLOCK中发送函数,结果是在双网卡条件下调用了两次SendHandle函数,如果是三个就有可能调用三次SendHandle函数,为什么?

谢谢!

[编辑 -  6/9/05 by  cyliu]
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-06-09 14:29
_NDIS_OPEN_BLOCK应该是每个网卡对应一个吧?

每个网卡都要调用NdisOpenAdapter函数,这样就会为每个网卡创建一个_NDIS_OPEN_BLOCK,理解没有错误吧?

我得机器有两个网卡,数据连续调用发送函数两次?为什么会这样?

[编辑 -  6/9/05 by  cyliu]

_NDIS_OPEN_BLOCK应该是NtOpenAdapter就会生成一个,如果两个协议,分别绑定到一块网卡,就应该是两个
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
地下室#
发布于:2005-06-09 14:07
_NDIS_OPEN_BLOCK应该是每个网卡对应一个吧?

每个网卡都要调用NdisOpenAdapter函数,这样就会为每个网卡创建一个_NDIS_OPEN_BLOCK,理解没有错误吧?

我得机器有两个网卡,数据连续调用发送函数两次?为什么会这样?

[编辑 -  6/9/05 by  cyliu]
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2005-06-09 11:45
1 那么可以这样认为如果ReceiveHandle没有接收完数据情况下,首次接收默认所有头部数据已经接收完全了(如数据是tcp数据,那么frame,ip,tcp头部都至少接收完整了,有没有tcp数据没有接收到的情况啊?),仅是数据没有接收完整,是这样吗?

2 另一问题系统每次对头部数据要么完全接收了,要么都没有接收?
 

1.其实ReceiveHandle没有收全的情况很就很少见,至少我没有见过连tcp头部都接收不全的情况。这样的网卡,好像非常少见了。但是从理论上讲,还是要自己处理TransferData,才保险。
2.你指的是什么头部,仅仅是以太网802.3的头部?那肯定是。如果包括ip,tcp头部,那理论上不一定
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
6楼#
发布于:2005-06-09 10:40
1 那么可以这样认为如果ReceiveHandle没有接收完数据情况下,首次接收默认所有头部数据已经接收完全了(如数据是tcp数据,那么frame,ip,tcp头部都至少接收完整了,有没有tcp数据没有接收到的情况啊?),仅是数据没有接收完整,是这样吗?

2 另一问题系统每次对头部数据要么完全接收了,要么都没有接收?
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2005-06-08 19:40
1。你可以看一下ddk里面的ndisuio,什么时候调用TransferDatahandler,PacketSize > LookaheadBufferSize的时候.高手,在哪里看啊?

2 可不可以这样理解:
  a 如果hookReceiveHandle涵数检测数据是否PacketSize > LookaheadBufferSize,是则我们调用TransferDatahandler涵数,以保证数据全部接收完成再向上传数据。这样一来tcpip.sys就没有机会调用TransferDatahandler涵数,因为他得到的数据都是完整的.

  b 或者无论hookReceiveHandle是否接收数据完整都上传到tcpip.sys,然后由tcpip.sys来调用TransferDatahandler涵数获得完整数据.

3 另一问题是hookReceiveHandle接收到不完整数据时,但他的HeaderBuffer数据都是完整的,至少包含了Frame的头数据?我又如何判断Frame格式是802.3格式呢?

谢谢了!



[编辑 -  6/8/05 by  cyliu]

1.看ddk\\src\\network\\ndis\\ndisuio的Receive的处理
2.如果你想得到完整数据,先解密就要按照a处理,如果你是防火墙,根据头部就可以判断了,无需把包收全,就可以按照b处理
3.除了802.3的格式,你还想处理其他格式的包吗?我们一般就只处理802。3格式的包
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
8楼#
发布于:2005-06-08 19:02
1。你可以看一下ddk里面的ndisuio,什么时候调用TransferDatahandler,PacketSize > LookaheadBufferSize的时候.高手,在哪里看啊?

2 可不可以这样理解:
  a 如果hookReceiveHandle涵数检测数据是否PacketSize > LookaheadBufferSize,是则我们调用TransferDatahandler涵数,以保证数据全部接收完成再向上传数据。这样一来tcpip.sys就没有机会调用TransferDatahandler涵数,因为他得到的数据都是完整的.

  b 或者无论hookReceiveHandle是否接收数据完整都上传到tcpip.sys,然后由tcpip.sys来调用TransferDatahandler涵数获得完整数据.

3 另一问题是hookReceiveHandle接收到不完整数据时,但他的HeaderBuffer数据都是完整的,至少包含了Frame的头数据?我又如何判断Frame格式是802.3格式呢?

谢谢了!



[编辑 -  6/8/05 by  cyliu]
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2005-06-08 18:14
现在还有一个地方有些不明白。

如在调用ReceiveHandle,得到的数据LookaheadBufferSize < PacketSize时,要调用TransferDataHandler或者TransferDataCompleteHandler函数接收剩余的数据。

按这个理解,那么ReceiveHandle,TransferDataHandler或者TransferDataCompleteHandler应该是个串行操作,一旦ReceiveHandle得到的数据LookaheadBufferSize < PacketSize时,就必须要调用TransferDataHandler函数,而不能调用ReceiveHandle函数.

是否这样?

你最后一句不能调用ReceiveHandle函数,指的是你hook的ReceiveHandle吧?对于你这种要对数据进行修改,是的

cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
10楼#
发布于:2005-06-08 17:57
现在还有一个地方有些不明白。

如在调用ReceiveHandle,得到的数据LookaheadBufferSize < PacketSize时,要调用TransferDataHandler或者TransferDataCompleteHandler函数接收剩余的数据。

按这个理解,那么ReceiveHandle,TransferDataHandler或者TransferDataCompleteHandler应该是个串行操作,一旦ReceiveHandle得到的数据LookaheadBufferSize < PacketSize时,就必须要调用TransferDataHandler函数,而不能调用ReceiveHandle函数.

是否这样?

1。你可以看一下ddk里面的ndisuio,什么时候调用TransferDatahandler,PacketSize > LookaheadBufferSize的时候

高手,在哪里看啊?

[编辑 -  6/8/05 by  cyliu]
走走看看开源好 Solaris vs Linux
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
11楼#
发布于:2005-06-08 17:36
好的。

谢谢!

现在我得问题大概出在多网卡的环境上。
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2005-06-08 17:21
编辑后,没有反应,又贴了一遍
好像不一样。NDIS_OPEN_BLOCK中的ReceiveHandler会调用PNDIS_PROTOCOL_BLOCK中的ReceiveHandler,你可以用ice设个断点,加上ndis的symbol,确认一下


[编辑 -  6/8/05 by  zhaock]
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2005-06-08 16:43
确定一个问题:

NDIS_OPEN_BLOCK中的关于ReceiveHandler,ReceivePacketHandler应该与PNDIS_PROTOCOL_BLOCK中的ReceiveHandler,ReceivePacketHandler是同一个吧?
 

好像不一样。NDIS_OPEN_BLOCK中的ReceiveHandler会调用PNDIS_PROTOCOL_BLOCK中的ReceiveHandler,你可以用ice设个断点,加上ndis的symbol,确认一下

[编辑 -  6/8/05 by  zhaock]

[编辑 -  6/8/05 by  zhaock]
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
14楼#
发布于:2005-06-08 16:28
确定一个问题:

NDIS_OPEN_BLOCK中的关于ReceiveHandler,ReceivePacketHandler应该与PNDIS_PROTOCOL_BLOCK中的ReceiveHandler,ReceivePacketHandler是同一个吧?
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2005-06-08 16:01
zhaock,系统什么时候调用TransferDataHandler?

他是否需要hook?

1。你可以看一下ddk里面的ndisuio,什么时候调用TransferDatahandler,PacketSize > LookaheadBufferSize的时候
2。应该要hook ip协议的 TransferDataHandler 回调函数,因为如果出现这种情况,你必须调用NdisTransferData把包收全,才能解密

cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
16楼#
发布于:2005-06-08 15:39
zhaock,系统什么时候调用TransferDataHandler?

他是否需要hook?

确定一个问题:

NDIS_OPEN_BLOCK中的关于ReceiveHandler,ReceivePacketHandler应该与PNDIS_PROTOCOL_BLOCK中的ReceiveHandler,ReceivePacketHandler是同一个吧?

[编辑 -  6/8/05 by  cyliu]
走走看看开源好 Solaris vs Linux
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
17楼#
发布于:2005-06-08 13:35
谢谢!

现在发现一个问题,正在验证。稍后给出验证结果,我们再讨论该问题。
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2005-06-08 13:29
1 CoReceivePacketHandler 是做什么的?

2 NdisBindingContext与ProtocolBindingContext是什么结构啊?

zhaock, 请先告诉我这俩个问题吧?

1.你可以看看ndis ddk的帮助,CoReceivePacketHander与wan相关,
如果你是802.3的网卡,不用考虑
2.ProtocolBindingContext仅仅是协议驱动调用NdisOpenAdapter的时候,传的一个参数,后面的ndis 调用协议驱动注册的函数如PtReceive的时候,把这个参数传回来,至于这个参数的具体解释,完全由协议程序自己定义,这种方法在windows驱动里非常常见。
至于NdisBindingContext类似于ProtocolBindingContext,只是ndis内部用的,如果想知道具体含义,就要进行反汇编跟踪了,但一般没有必要关心
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
19楼#
发布于:2005-06-08 12:44
1 CoReceivePacketHandler 是做什么的?

2 NdisBindingContext与ProtocolBindingContext是什么结构啊?

zhaock, 请先告诉我这俩个问题吧?
走走看看开源好 Solaris vs Linux
上一页
游客

返回顶部