cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
20楼#
发布于:2005-06-08 09:10
hook了以下涵数:
OPEN_ADAPTER_COMPLETE_HANDLER m_pTcpipOpenAdapterComplete = NULL;

RECEIVE_HANDLER m_pTcpipNdisReceive = NULL;
RECEIVE_PACKET_HANDLER m_pTcpipReceivePacket = NULL;
RECEIVE_HANDLER m_pTcpipNtReceive = NULL;

SEND_HANDLER m_pTcpipSendHandler = NULL;
SEND_PACKETS_HANDLER m_pTcpipSendPackets = NULL;

其他环境都没有问题啊?

1 CoReceivePacketHandler 是做什么的?

2 NdisBindingContext与ProtocolBindingContext是什么结构啊?

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

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

[编辑 -  6/8/05 by  cyliu]
走走看看开源好 Solaris vs Linux
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
21楼#
发布于:2005-06-08 12:03
up
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
22楼#
发布于:2005-06-08 12:21
把问题分开看吧,你说ping可以通,udp可以通,tcp就不通了那种情况。能确认是tcp连接的时候,哪个包出了问题吗?如何确认是tcp checksum不对的?按照你的叙述,应该和tcp checksum没有关系
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
23楼#
发布于:2005-06-08 12:44
1 CoReceivePacketHandler 是做什么的?

2 NdisBindingContext与ProtocolBindingContext是什么结构啊?

zhaock, 请先告诉我这俩个问题吧?
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
24楼#
发布于: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分
25楼#
发布于:2005-06-08 13:35
谢谢!

现在发现一个问题,正在验证。稍后给出验证结果,我们再讨论该问题。
走走看看开源好 Solaris vs Linux
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
26楼#
发布于: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
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
27楼#
发布于: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分
28楼#
发布于: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分
  • 社区居民
29楼#
发布于: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]
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
30楼#
发布于:2005-06-08 17:21
编辑后,没有反应,又贴了一遍
好像不一样。NDIS_OPEN_BLOCK中的ReceiveHandler会调用PNDIS_PROTOCOL_BLOCK中的ReceiveHandler,你可以用ice设个断点,加上ndis的symbol,确认一下


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

谢谢!

现在我得问题大概出在多网卡的环境上。
走走看看开源好 Solaris vs Linux
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
32楼#
发布于: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
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
33楼#
发布于: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分
34楼#
发布于: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分
  • 社区居民
35楼#
发布于: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分
36楼#
发布于: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分
  • 社区居民
37楼#
发布于: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分
38楼#
发布于: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分
  • 社区居民
39楼#
发布于:2005-06-09 14:29
_NDIS_OPEN_BLOCK应该是每个网卡对应一个吧?

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

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

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

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

返回顶部