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