daisyboy
驱动小牛
驱动小牛
  • 注册日期2002-10-24
  • 最后登录2012-05-21
  • 粉丝3
  • 关注0
  • 积分599分
  • 威望140点
  • 贡献值1点
  • 好评度56点
  • 原创分0分
  • 专家分0分
阅读:2111回复:11

天哪!谁能告诉我这是为什么???

楼主#
更多 发布于:2002-10-29 16:10
为了在windows me下拦截到receive的UDP包,hook了protocol里的receivehandler和receivepackethandler。可是实践证明这两个函数都没有拦截到这个包。

看了一下pcausa的程序,模仿它,把hook receivepackethandler,并把它指向一个空指针(NULL)。则可以在receivehandler拦截到上述的UDP包了。

pcausa的解释是,由于receivepackethandler=NULL,NDIS被迫采用receivehandler接收所有消息。这个解释是说得过去的。可是,为什么非要把receivepackethandler设置为NULL不可呢?到底这个UDP包原本传给了receivehandler,还是receivepackethandler?

有人碰过这种现象吗??
合作c/c++/ndis/pppoe/802.1x!
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
沙发#
发布于:2002-10-29 16:36
没有研究过hook protocol
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
板凳#
发布于:2002-10-29 16:37
看来以后要研究研究了。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
地板#
发布于:2002-10-29 16:37
你就当我灌水好了。
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-30 10:28
为了在windows me下拦截到receive的UDP包,hook了protocol里的receivehandler和receivepackethandler。可是实践证明这两个函数都没有拦截到这个包。

看了一下pcausa的程序,模仿它,把hook receivepackethandler,并把它指向一个空指针(NULL)。则可以在receivehandler拦截到上述的UDP包了。

pcausa的解释是,由于receivepackethandler=NULL,NDIS被迫采用receivehandler接收所有消息。这个解释是说得过去的。可是,为什么非要把receivepackethandler设置为NULL不可呢?到底这个UDP包原本传给了receivehandler,还是receivepackethandler?

有人碰过这种现象吗??

NDIS MINIPORT在上传数据包时 使用NdisMIndicatePacket后,就去找NDIS_OPEN_block里的ReceivePacketHandler,一看是不是NULL,把包扔给它。
是NULL,就是扔给ReceiveHandler就这么简单。
而使用NdisMethindicatereceive时就是调用ReceiveHandle不管ReceivePacketHandler
我思故我在,脑袋不会坏.
daisyboy
驱动小牛
驱动小牛
  • 注册日期2002-10-24
  • 最后登录2012-05-21
  • 粉丝3
  • 关注0
  • 积分599分
  • 威望140点
  • 贡献值1点
  • 好评度56点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-30 11:52
[quoteNDIS MINIPORT在上传数据包时 使用NdisMIndicatePacket后,就去找NDIS_OPEN_block里的ReceivePacketHandler,一看是不是NULL,把包扔给它。
是NULL,就是扔给ReceiveHandler就这么简单。
而使用NdisMethindicatereceive时就是调用ReceiveHandle不管ReceivePacketHandler [/quote]

有两点不明白:
1. 按这么说,[假设所有的接收包不是丢给ReceivePacketHandle,就是丢给ReceiveHandler],如果ReceivePacketHandler不是NULL,那么它就应该能接受到我所说的UDP包(因为该包在ReceiveHandler接收不到)。可是,我做了多次实验,它都没有接收到。

2.NDIS_OPEN_block里的 ReceiveHandler/ReceivePacketHandler跟NdisRegisterProtocol里的ReceiveHandler/ReceivePacketHandler是一个函数吗?如果不是,它们有什么区别?(我现在采用的是HOOK 后者的方式)。

有劳斑竹指教了!!!再回答两个问题我就把分给你。:)
合作c/c++/ndis/pppoe/802.1x!
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-31 09:37
[quoteNDIS MINIPORT在上传数据包时 使用NdisMIndicatePacket后,就去找NDIS_OPEN_block里的ReceivePacketHandler,一看是不是NULL,把包扔给它。
是NULL,就是扔给ReceiveHandler就这么简单。
而使用NdisMethindicatereceive时就是调用ReceiveHandle不管ReceivePacketHandler


有两点不明白:
1. 按这么说,[假设所有的接收包不是丢给ReceivePacketHandle,就是丢给ReceiveHandler],如果ReceivePacketHandler不是NULL,那么它就应该能接受到我所说的UDP包(因为该包在ReceiveHandler接收不到)。可是,我做了多次实验,它都没有接收到。

MINIPORT 使用NdisMethindicatereceive向上层传数据包时就调用ReceiveHandle不管ReceivePacketHandler 是否为NULL

2.NDIS_OPEN_block里的 ReceiveHandler/ReceivePacketHandler跟NdisRegisterProtocol里的ReceiveHandler/ReceivePacketHandler是一个函数吗?如果不是,它们有什么区别?(我现在采用的是HOOK 后者的方式)。
miniport 在向上层传数据时,使用的是NDIS_OPEN_BLOCK里的函数表里的RECEIVEHANDLE和RECEIVEPACKETHANDLER,所以后者改了,没有用。

有劳斑竹指教了!!!再回答两个问题我就把分给你。:) [/quote]
我思故我在,脑袋不会坏.
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2002-10-31 10:12
[quote]为了在windows me下拦截到receive的UDP包,hook了protocol里的receivehandler和receivepackethandler。可是实践证明这两个函数都没有拦截到这个包。

看了一下pcausa的程序,模仿它,把hook receivepackethandler,并把它指向一个空指针(NULL)。则可以在receivehandler拦截到上述的UDP包了。

pcausa的解释是,由于receivepackethandler=NULL,NDIS被迫采用receivehandler接收所有消息。这个解释是说得过去的。可是,为什么非要把receivepackethandler设置为NULL不可呢?到底这个UDP包原本传给了receivehandler,还是receivepackethandler?

有人碰过这种现象吗??

NDIS MINIPORT在上传数据包时 使用NdisMIndicatePacket后,就去找NDIS_OPEN_block里的ReceivePacketHandler,一看是不是NULL,把包扔给它。
是NULL,就是扔给ReceiveHandler就这么简单。
而使用NdisMethindicatereceive时就是调用ReceiveHandle不管ReceivePacketHandler [/quote]

除此之外,如果ndis的packet pool紧张,那么也会调用receive,
而不是receivepacket。

此外,如果miniport的packet pool紧张,可以设置packet的
status为resource,那么不管miniport调用哪个函数,ndis
都调用receviehandler。
不再回忆从前,我已经生活在幸福当中。
daisyboy
驱动小牛
驱动小牛
  • 注册日期2002-10-24
  • 最后登录2012-05-21
  • 粉丝3
  • 关注0
  • 积分599分
  • 威望140点
  • 贡献值1点
  • 好评度56点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-10-31 10:28

除此之外,如果ndis的packet pool紧张,那么也会调用receive,
而不是receivepacket。

此外,如果miniport的packet pool紧张,可以设置packet的
status为resource,那么不管miniport调用哪个函数,ndis
都调用receviehandler。


把数据包都“逼”到receivehandler上,会带有什么后遗症吗?
正常情况下,receivehandler和receivepackethandler分别接收什么数据包?

谢谢斑竹!
合作c/c++/ndis/pppoe/802.1x!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-10-31 17:06
 

把数据包都“逼”到receivehandler上,会带有什么后遗症吗?
正常情况下,receivehandler和receivepackethandler分别接收什么数据包?

因为如果pool紧张的话,就只分配一个packet,自然调用receivehandler,receivepackethandler是多包接收的,


除此之外,如果ndis的packet pool紧张,那么也会调用receive,
而不是receivepacket。

此外,如果miniport的packet pool紧张,可以设置packet的
status为resource,那么不管miniport调用哪个函数,ndis
都调用receviehandler


如何判断pool是否紧张呢?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
10楼#
发布于:2002-11-01 12:56
[quote]
把数据包都“逼”到receivehandler上,会带有什么后遗症吗?
正常情况下,receivehandler和receivepackethandler分别接收什么数据包?

因为如果pool紧张的话,就只分配一个packet,自然调用receivehandler,receivepackethandler是多包接收的,


除此之外,如果ndis的packet pool紧张,那么也会调用receive,
而不是receivepacket。

此外,如果miniport的packet pool紧张,可以设置packet的
status为resource,那么不管miniport调用哪个函数,ndis
都调用receviehandler


如何判断pool是否紧张呢? [/quote]

No,当只有一个packet的时候,也会倾向于调用
receivepacket而不是receive。

pool池有一个下限啊,你仔细看看这个分配函数。
不再回忆从前,我已经生活在幸福当中。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-01 13:48

No,当只有一个packet的时候,也会倾向于调用
receivepacket而不是receive。

pool池有一个下限啊,你仔细看看这个分配函数。


DDK当中的解释是说receive接单包,receivepacet接收多包,当miniport传送的是多个包的时候,ndis会调用protocolreceivepacket这个函数,但是传给这个函数的还是一个包,是由ndis在一个包指针的数组里面提取出来的。

98DDK有下面这个结构,在2k和xp下面就没有了,我想应该是通过这样的结构来管理packetpool的
typedef struct _NDIS_PACKET_POOL {
    UINT Signature;                     //character signature for debug \"NPPL\"
    NDIS_SPIN_LOCK SpinLock;
    struct _NDIS_PACKET *FreeList;  // linked list of free  slots in pool
    UINT PacketLength;                  // amount needed in each packet
    UCHAR Buffer[1];                    // actual pool emory
} NDIS_PACKET_POOL, * PNDIS_PACKET_POOL;  
NdisAllocatePacketPool函数中指定了pool中packet的个数,〕在这个结构中好像没有反映,我还是没有搞明白这个pool是如何管理的,
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
游客

返回顶部