阅读:2111回复:11
天哪!谁能告诉我这是为什么???
为了在windows me下拦截到receive的UDP包,hook了protocol里的receivehandler和receivepackethandler。可是实践证明这两个函数都没有拦截到这个包。
看了一下pcausa的程序,模仿它,把hook receivepackethandler,并把它指向一个空指针(NULL)。则可以在receivehandler拦截到上述的UDP包了。 pcausa的解释是,由于receivepackethandler=NULL,NDIS被迫采用receivehandler接收所有消息。这个解释是说得过去的。可是,为什么非要把receivepackethandler设置为NULL不可呢?到底这个UDP包原本传给了receivehandler,还是receivepackethandler? 有人碰过这种现象吗?? |
|
|
沙发#
发布于:2002-10-29 16:36
没有研究过hook protocol
|
|
板凳#
发布于:2002-10-29 16:37
看来以后要研究研究了。
|
|
地板#
发布于:2002-10-29 16:37
你就当我灌水好了。
|
|
地下室#
发布于:2002-10-30 10:28
为了在windows me下拦截到receive的UDP包,hook了protocol里的receivehandler和receivepackethandler。可是实践证明这两个函数都没有拦截到这个包。 NDIS MINIPORT在上传数据包时 使用NdisMIndicatePacket后,就去找NDIS_OPEN_block里的ReceivePacketHandler,一看是不是NULL,把包扔给它。 是NULL,就是扔给ReceiveHandler就这么简单。 而使用NdisMethindicatereceive时就是调用ReceiveHandle不管ReceivePacketHandler |
|
|
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 后者的方式)。 有劳斑竹指教了!!!再回答两个问题我就把分给你。:) |
|
|
6楼#
发布于:2002-10-31 09:37
[quoteNDIS MINIPORT在上传数据包时 使用NdisMIndicatePacket后,就去找NDIS_OPEN_block里的ReceivePacketHandler,一看是不是NULL,把包扔给它。 有两点不明白: 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] |
|
|
7楼#
发布于:2002-10-31 10:12
[quote]为了在windows me下拦截到receive的UDP包,hook了protocol里的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。 |
|
|
8楼#
发布于:2002-10-31 10:28
把数据包都“逼”到receivehandler上,会带有什么后遗症吗? 正常情况下,receivehandler和receivepackethandler分别接收什么数据包? 谢谢斑竹! |
|
|
9楼#
发布于:2002-10-31 17:06
因为如果pool紧张的话,就只分配一个packet,自然调用receivehandler,receivepackethandler是多包接收的,
如何判断pool是否紧张呢? |
|
|
10楼#
发布于:2002-11-01 12:56
[quote] 因为如果pool紧张的话,就只分配一个packet,自然调用receivehandler,receivepackethandler是多包接收的,
如何判断pool是否紧张呢? [/quote] No,当只有一个packet的时候,也会倾向于调用 receivepacket而不是receive。 pool池有一个下限啊,你仔细看看这个分配函数。 |
|
|
11楼#
发布于:2002-11-01 13:48
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是如何管理的, |
|
|