阅读:3941回复:41
(急)采用ndis hook技术,Win2k和xp下结果不同,why?
采用ndis hook技术(同费尔),Win2k能够通信,但是在xp下ping不通,为什么?
|
|
|
沙发#
发布于:2005-06-09 23:25
问题是:为什么每个协议会有NDIS_OPEN_BLOCK结构连表呢?按道理应该是该协议只拥有一个NDIS_OPEN_BLOCK结构即可,但是ProtocolNextOpen明显是连表,到底是什么含义呢?
回复:一个协议可以绑定到多块网卡上,当然需要一个链表来保存NDIS_OPEN_BLOCK了! |
|
板凳#
发布于:2005-06-09 15:10
[quote]_NDIS_OPEN_BLOCK应该是每个网卡对应一个吧? _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] |
|
|
地板#
发布于:2005-06-09 14:29
_NDIS_OPEN_BLOCK应该是每个网卡对应一个吧? _NDIS_OPEN_BLOCK应该是NtOpenAdapter就会生成一个,如果两个协议,分别绑定到一块网卡,就应该是两个 |
|
地下室#
发布于:2005-06-09 14:07
_NDIS_OPEN_BLOCK应该是每个网卡对应一个吧?
每个网卡都要调用NdisOpenAdapter函数,这样就会为每个网卡创建一个_NDIS_OPEN_BLOCK,理解没有错误吧? 我得机器有两个网卡,数据连续调用发送函数两次?为什么会这样? [编辑 - 6/9/05 by cyliu] |
|
|
5楼#
发布于:2005-06-09 11:45
1 那么可以这样认为如果ReceiveHandle没有接收完数据情况下,首次接收默认所有头部数据已经接收完全了(如数据是tcp数据,那么frame,ip,tcp头部都至少接收完整了,有没有tcp数据没有接收到的情况啊?),仅是数据没有接收完整,是这样吗? 1.其实ReceiveHandle没有收全的情况很就很少见,至少我没有见过连tcp头部都接收不全的情况。这样的网卡,好像非常少见了。但是从理论上讲,还是要自己处理TransferData,才保险。 2.你指的是什么头部,仅仅是以太网802.3的头部?那肯定是。如果包括ip,tcp头部,那理论上不一定 |
|
6楼#
发布于:2005-06-09 10:40
1 那么可以这样认为如果ReceiveHandle没有接收完数据情况下,首次接收默认所有头部数据已经接收完全了(如数据是tcp数据,那么frame,ip,tcp头部都至少接收完整了,有没有tcp数据没有接收到的情况啊?),仅是数据没有接收完整,是这样吗?
2 另一问题系统每次对头部数据要么完全接收了,要么都没有接收? |
|
|
7楼#
发布于:2005-06-08 19:40
1。你可以看一下ddk里面的ndisuio,什么时候调用TransferDatahandler,PacketSize > LookaheadBufferSize的时候.高手,在哪里看啊? 1.看ddk\\src\\network\\ndis\\ndisuio的Receive的处理 2.如果你想得到完整数据,先解密就要按照a处理,如果你是防火墙,根据头部就可以判断了,无需把包收全,就可以按照b处理 3.除了802.3的格式,你还想处理其他格式的包吗?我们一般就只处理802。3格式的包 |
|
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] |
|
|
9楼#
发布于:2005-06-08 18:14
现在还有一个地方有些不明白。 你最后一句不能调用ReceiveHandle函数,指的是你hook的ReceiveHandle吧?对于你这种要对数据进行修改,是的 |
|
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] |
|
|
11楼#
发布于:2005-06-08 17:36
好的。
谢谢! 现在我得问题大概出在多网卡的环境上。 |
|
|
12楼#
发布于:2005-06-08 17:21
编辑后,没有反应,又贴了一遍
好像不一样。NDIS_OPEN_BLOCK中的ReceiveHandler会调用PNDIS_PROTOCOL_BLOCK中的ReceiveHandler,你可以用ice设个断点,加上ndis的symbol,确认一下 [编辑 - 6/8/05 by zhaock] |
|
13楼#
发布于:2005-06-08 16:43
确定一个问题: 好像不一样。NDIS_OPEN_BLOCK中的ReceiveHandler会调用PNDIS_PROTOCOL_BLOCK中的ReceiveHandler,你可以用ice设个断点,加上ndis的symbol,确认一下 [编辑 - 6/8/05 by zhaock] [编辑 - 6/8/05 by zhaock] |
|
14楼#
发布于:2005-06-08 16:28
确定一个问题:
NDIS_OPEN_BLOCK中的关于ReceiveHandler,ReceivePacketHandler应该与PNDIS_PROTOCOL_BLOCK中的ReceiveHandler,ReceivePacketHandler是同一个吧? |
|
|
15楼#
发布于:2005-06-08 16:01
zhaock,系统什么时候调用TransferDataHandler? 1。你可以看一下ddk里面的ndisuio,什么时候调用TransferDatahandler,PacketSize > LookaheadBufferSize的时候 2。应该要hook ip协议的 TransferDataHandler 回调函数,因为如果出现这种情况,你必须调用NdisTransferData把包收全,才能解密 |
|
16楼#
发布于:2005-06-08 15:39
zhaock,系统什么时候调用TransferDataHandler?
他是否需要hook? 确定一个问题: NDIS_OPEN_BLOCK中的关于ReceiveHandler,ReceivePacketHandler应该与PNDIS_PROTOCOL_BLOCK中的ReceiveHandler,ReceivePacketHandler是同一个吧? [编辑 - 6/8/05 by cyliu] |
|
|
17楼#
发布于:2005-06-08 13:35
谢谢!
现在发现一个问题,正在验证。稍后给出验证结果,我们再讨论该问题。 |
|
|
18楼#
发布于:2005-06-08 13:29
1 CoReceivePacketHandler 是做什么的? 1.你可以看看ndis ddk的帮助,CoReceivePacketHander与wan相关, 如果你是802.3的网卡,不用考虑 2.ProtocolBindingContext仅仅是协议驱动调用NdisOpenAdapter的时候,传的一个参数,后面的ndis 调用协议驱动注册的函数如PtReceive的时候,把这个参数传回来,至于这个参数的具体解释,完全由协议程序自己定义,这种方法在windows驱动里非常常见。 至于NdisBindingContext类似于ProtocolBindingContext,只是ndis内部用的,如果想知道具体含义,就要进行反汇编跟踪了,但一般没有必要关心 |
|
19楼#
发布于:2005-06-08 12:44
1 CoReceivePacketHandler 是做什么的?
2 NdisBindingContext与ProtocolBindingContext是什么结构啊? zhaock, 请先告诉我这俩个问题吧? |
|
|
上一页
下一页